busio.s revision 84615
1/* $FreeBSD: head/sys/pc98/pc98/busio.s 84615 2001-10-07 10:04:18Z nyan $ */
2/*	$NecBSD: busio.s,v 1.16.4.1 1999/08/16 09:06:08 kmatsuda Exp $	*/
3/*	$NetBSD$	*/
4
5/*
6 * [NetBSD for NEC PC-98 series]
7 *  Copyright (c) 1996, 1997, 1998
8 *	NetBSD/pc98 porting staff. All rights reserved.
9 *
10 * [Ported for FreeBSD]
11 *  Copyright (c) 2001
12 *	TAKAHASHI Yoshihiro. All rights reserved.
13 *
14 *  Redistribution and use in source and binary forms, with or without
15 *  modification, are permitted provided that the following conditions
16 *  are met:
17 *  1. Redistributions of source code must retain the above copyright
18 *     notice, this list of conditions and the following disclaimer.
19 *  2. Redistributions in binary form must reproduce the above copyright
20 *     notice, this list of conditions and the following disclaimer in the
21 *     documentation and/or other materials provided with the distribution.
22 *  3. The name of the author may not be used to endorse or promote products
23 *     derived from this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
26 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
27 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28 * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
29 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
30 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
33 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
34 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 */
37
38/*
39 * Copyright (c) 1997, 1998
40 *	Naofumi HONDA.  All rights reserved.
41 */
42
43#include <machine/asm.h>
44
45#include "assym.s"
46
47/***********************************************************
48 * Bus IO access methods (Direct Access)
49 ***********************************************************/
50#define	BUS_ACCESS_ADDR(BSHREG,ADDRREG) \
51	addl BUS_SPACE_HANDLE_BASE/**/(%/**/BSHREG/**/),%/**/ADDRREG
52
53/*
54 *	read_N
55 *	IN:  edx port
56 *	OUT: eax data
57 */
58ENTRY(SBUS_DA_io_space_read_1)
59	BUS_ACCESS_ADDR(ebx,edx)
60	inb	%dx,%al
61	ret
62
63ENTRY(SBUS_DA_io_space_read_2)
64	BUS_ACCESS_ADDR(ebx,edx)
65	inw	%dx,%ax
66	ret
67
68ENTRY(SBUS_DA_io_space_read_4)
69	BUS_ACCESS_ADDR(ebx,edx)
70	inl	%dx,%eax
71	ret
72
73/*
74 *	write_N
75 *	IN:eax DATA
76 *	   edx PORT
77 */
78ENTRY(SBUS_DA_io_space_write_1)
79	BUS_ACCESS_ADDR(ebx,edx)
80	outb	%al,%dx
81	ret
82
83ENTRY(SBUS_DA_io_space_write_2)
84	BUS_ACCESS_ADDR(ebx,edx)
85	outw	%ax,%dx
86	ret
87
88ENTRY(SBUS_DA_io_space_write_4)
89	BUS_ACCESS_ADDR(ebx,edx)
90	outl	%eax,%dx
91	ret
92
93/*
94 *	read_multi_N
95 *	IN: ecx COUNT
96 *	    edx PORT
97 *	    edi BUFP
98 */
99ENTRY(SBUS_DA_io_space_read_multi_1)
100	BUS_ACCESS_ADDR(ebx,edx)
101	cld
102	rep
103	insb
104	ret
105
106ENTRY(SBUS_DA_io_space_read_multi_2)
107	BUS_ACCESS_ADDR(ebx,edx)
108	cld
109	rep
110	insw
111	ret
112
113ENTRY(SBUS_DA_io_space_read_multi_4)
114	BUS_ACCESS_ADDR(ebx,edx)
115	cld
116	rep
117	insl
118	ret
119
120/*
121 *	write_multi_N
122 *	IN: ecx COUNT
123 *	    edx PORT
124 *	    esi BUFP
125 */
126ENTRY(SBUS_DA_io_space_write_multi_1)
127	BUS_ACCESS_ADDR(ebx,edx)
128	cld
129	rep
130	outsb
131	ret
132
133ENTRY(SBUS_DA_io_space_write_multi_2)
134	BUS_ACCESS_ADDR(ebx,edx)
135	cld
136	rep
137	outsw
138	ret
139
140ENTRY(SBUS_DA_io_space_write_multi_4)
141	BUS_ACCESS_ADDR(ebx,edx)
142	cld
143	rep
144	outsl
145	ret
146
147/*
148 *	read_region_N
149 *	IN: ecx COUNT
150 *	    edx PORT
151 *	    edi BUFP
152 */
153ENTRY(SBUS_DA_io_space_read_region_1)
154	BUS_ACCESS_ADDR(ebx,edx)
155	cld
156	pushl	%eax
157	orl	%ecx,%ecx
158	jz	2f
1591:
160	inb	%dx,%al
161	stosb
162	incl	%edx
163	decl	%ecx
164	jnz	1b
1652:
166	popl	%eax
167	ret
168
169ENTRY(SBUS_DA_io_space_read_region_2)
170	BUS_ACCESS_ADDR(ebx,edx)
171	cld
172	pushl	%eax
173	orl	%ecx,%ecx
174	jz	2f
1751:
176	inw	%dx,%ax
177	stosw
178	addl	$2,%edx
179	decl	%ecx
180	jnz	1b
1812:
182	popl	%eax
183	ret
184
185ENTRY(SBUS_DA_io_space_read_region_4)
186	BUS_ACCESS_ADDR(ebx,edx)
187	cld
188	pushl	%eax
189	orl	%ecx,%ecx
190	jz	2f
1911:
192	inl	%dx,%eax
193	stosl
194	addl	$4,%edx
195	decl	%ecx
196	jnz	1b
1972:
198	popl	%eax
199	ret
200
201/*
202 *	write_region_N
203 *	IN: ecx COUNT
204 *	    edx PORT
205 *	    esi BUFP
206 */
207ENTRY(SBUS_DA_io_space_write_region_1)
208	BUS_ACCESS_ADDR(ebx,edx)
209	cld
210	pushl	%eax
211	orl	%ecx,%ecx
212	jz	2f
2131:
214	lodsb
215	outb	%al,%dx
216	incl	%edx
217	decl	%ecx
218	jnz	1b
2192:
220	popl	%eax
221	ret
222
223ENTRY(SBUS_DA_io_space_write_region_2)
224	BUS_ACCESS_ADDR(ebx,edx)
225	cld
226	pushl	%eax
227	orl	%ecx,%ecx
228	jz	2f
2291:
230	lodsw
231	outw	%ax,%dx
232	addl	$2,%edx
233	decl	%ecx
234	jnz	1b
2352:
236	popl	%eax
237	ret
238
239ENTRY(SBUS_DA_io_space_write_region_4)
240	BUS_ACCESS_ADDR(ebx,edx)
241	cld
242	pushl	%eax
243	orl	%ecx,%ecx
244	jz	2f
2451:
246	lodsl
247	outl	%eax,%dx
248	addl	$4,%edx
249	decl	%ecx
250	jnz	1b
2512:
252	popl	%eax
253	ret
254
255/*
256 *	set_multi_N
257 *	IN: eax DATA
258 *	    ecx COUNT
259 *	    edx PORT
260 */
261ENTRY(SBUS_DA_io_space_set_multi_1)
262	BUS_ACCESS_ADDR(ebx,edx)
263	orl	%ecx,%ecx
264	jz	2f
2651:
266	outb	%al,%dx
267	decl	%ecx
268	jnz	1b
2692:
270	ret
271
272ENTRY(SBUS_DA_io_space_set_multi_2)
273	BUS_ACCESS_ADDR(ebx,edx)
274	orl	%ecx,%ecx
275	jz	2f
2761:
277	outw	%ax,%dx
278	decl	%ecx
279	jnz	1b
2802:
281	ret
282
283ENTRY(SBUS_DA_io_space_set_multi_4)
284	BUS_ACCESS_ADDR(ebx,edx)
285	orl	%ecx,%ecx
286	jz	2f
2871:
288	outl	%eax,%dx
289	decl	%ecx
290	jnz	1b
2912:
292	ret
293
294/*
295 *	set_region_N
296 *	IN: eax DATA
297 *	    ecx COUNT
298 *	    edx PORT
299 */
300ENTRY(SBUS_DA_io_space_set_region_1)
301	BUS_ACCESS_ADDR(ebx,edx)
302	orl	%ecx,%ecx
303	jz	2f
3041:
305	outb	%al,%dx
306	incl	%edx
307	decl	%ecx
308	jnz	1b
3092:
310	ret
311
312ENTRY(SBUS_DA_io_space_set_region_2)
313	BUS_ACCESS_ADDR(ebx,edx)
314	orl	%ecx,%ecx
315	jz	2f
3161:
317	outw	%ax,%dx
318	addl	$2,%edx
319	decl	%ecx
320	jnz	1b
3212:
322	ret
323
324ENTRY(SBUS_DA_io_space_set_region_4)
325	BUS_ACCESS_ADDR(ebx,edx)
326	orl	%ecx,%ecx
327	jz	2f
3281:
329	outl	%eax,%dx
330	addl	$4,%edx
331	decl	%ecx
332	jnz	1b
3332:
334	ret
335
336/*
337 *	copy_region_N
338 *	IN: ecx COUNT
339 *	    esi SPORT
340 *	    edi	DPORT
341 */
342ENTRY(SBUS_DA_io_space_copy_region_1)
343	BUS_ACCESS_ADDR(eax,esi)
344	BUS_ACCESS_ADDR(ebx,edi)
345	pushl	%eax
346	pushl	%edx
347	orl	%ecx,%ecx
348	jz	2f
3491:
350	movl	%esi,%edx
351	inb	%dx,%al
352	incl	%esi
353
354	movl	%edi,%edx
355	outb	%al,%dx
356	incl	%edi
357
358	decl	%ecx
359	jnz	1b
3602:
361	popl	%edx
362	popl	%eax
363	ret
364
365ENTRY(SBUS_DA_io_space_copy_region_2)
366	BUS_ACCESS_ADDR(eax,esi)
367	BUS_ACCESS_ADDR(ebx,edi)
368	pushl	%eax
369	pushl	%edx
370	orl	%ecx,%ecx
371	jz	2f
3721:
373	movl	%esi,%edx
374	inw	%dx,%ax
375	addl	$2,%esi
376
377	movl	%edi,%edx
378	outw	%ax,%dx
379	addl	$2,%edi
380
381	decl	%ecx
382	jnz	1b
3832:
384	popl	%edx
385	popl	%eax
386	ret
387
388ENTRY(SBUS_DA_io_space_copy_region_4)
389	BUS_ACCESS_ADDR(eax,esi)
390	BUS_ACCESS_ADDR(ebx,edi)
391	pushl	%eax
392	pushl	%edx
393	orl	%ecx,%ecx
394	jz	2f
3951:
396	movl	%esi,%edx
397	inl	%dx,%eax
398	addl	$4,%esi
399
400	movl	%edi,%edx
401	outl	%eax,%dx
402	addl	$4,%edi
403
404	decl	%ecx
405	jnz	1b
4062:
407	popl	%edx
408	popl	%eax
409	ret
410
411/***********************************************************
412 * Bus Memory access methods (Direct Access)
413 ***********************************************************/
414/*
415 *	read_N
416 */
417ENTRY(SBUS_DA_mem_space_read_1)
418	BUS_ACCESS_ADDR(ebx,edx)
419	movb	(%edx),%al
420	ret
421
422ENTRY(SBUS_DA_mem_space_read_2)
423	BUS_ACCESS_ADDR(ebx,edx)
424	movw	(%edx),%ax
425	ret
426
427ENTRY(SBUS_DA_mem_space_read_4)
428	BUS_ACCESS_ADDR(ebx,edx)
429	movl	(%edx),%eax
430	ret
431
432/*
433 *	write_N
434 */
435ENTRY(SBUS_DA_mem_space_write_1)
436	BUS_ACCESS_ADDR(ebx,edx)
437	movb	%al,(%edx)
438	ret
439
440ENTRY(SBUS_DA_mem_space_write_2)
441	BUS_ACCESS_ADDR(ebx,edx)
442	movw	%ax,(%edx)
443	ret
444
445ENTRY(SBUS_DA_mem_space_write_4)
446	BUS_ACCESS_ADDR(ebx,edx)
447	movl	%eax,(%edx)
448	ret
449
450/*
451 *	read_multi_N
452 */
453ENTRY(SBUS_DA_mem_space_read_multi_1)
454	BUS_ACCESS_ADDR(ebx,edx)
455	cld
456	pushl	%eax
457	orl	%ecx,%ecx
458	jz	2f
4591:
460	movb	(%edx),%al
461	stosb
462	decl	%ecx
463	jnz	1b
4642:
465	popl	%eax
466	ret
467
468ENTRY(SBUS_DA_mem_space_read_multi_2)
469	BUS_ACCESS_ADDR(ebx,edx)
470	cld
471	pushl	%eax
472	orl	%ecx,%ecx
473	jz	2f
4741:
475	movw	(%edx),%ax
476	stosw
477	decl	%ecx
478	jnz	1b
4792:
480	popl	%eax
481	ret
482
483ENTRY(SBUS_DA_mem_space_read_multi_4)
484	BUS_ACCESS_ADDR(ebx,edx)
485	cld
486	pushl	%eax
487	orl	%ecx,%ecx
488	jz	2f
4891:
490	movl	(%edx),%eax
491	stosl
492	decl	%ecx
493	jnz	1b
4942:
495	popl	%eax
496	ret
497
498/*
499 *	write_multi_N
500 */
501ENTRY(SBUS_DA_mem_space_write_multi_1)
502	BUS_ACCESS_ADDR(ebx,edx)
503	cld
504	pushl	%eax
505	orl	%ecx,%ecx
506	jz	2f
5071:
508	lodsb
509	movb	%al,(%edx)
510	decl	%ecx
511	jnz	1b
5122:
513	popl	%eax
514	ret
515
516ENTRY(SBUS_DA_mem_space_write_multi_2)
517	BUS_ACCESS_ADDR(ebx,edx)
518	cld
519	pushl	%eax
520	orl	%ecx,%ecx
521	jz	2f
5221:
523	lodsw
524	movw	%ax,(%edx)
525	decl	%ecx
526	jnz	1b
5272:
528	popl	%eax
529	ret
530
531ENTRY(SBUS_DA_mem_space_write_multi_4)
532	BUS_ACCESS_ADDR(ebx,edx)
533	cld
534	pushl	%eax
535	orl	%ecx,%ecx
536	jz	2f
5371:
538	lodsl
539	movl	%eax,(%edx)
540	decl	%ecx
541	jnz	1b
5422:
543	popl	%eax
544	ret
545
546/*
547 *	read_region_N
548 */
549ENTRY(SBUS_DA_mem_space_read_region_1)
550	BUS_ACCESS_ADDR(ebx,edx)
551	cld
552	pushl	%esi
553	movl	%edx,%esi
554	rep
555	movsb
556	popl	%esi
557	ret
558
559ENTRY(SBUS_DA_mem_space_read_region_2)
560	BUS_ACCESS_ADDR(ebx,edx)
561	cld
562	pushl	%esi
563	movl	%edx,%esi
564	rep
565	movsw
566	popl	%esi
567	ret
568
569ENTRY(SBUS_DA_mem_space_read_region_4)
570	BUS_ACCESS_ADDR(ebx,edx)
571	cld
572	pushl	%esi
573	movl	%edx,%esi
574	rep
575	movsl
576	popl	%esi
577	ret
578
579/*
580 *	write_region_N
581 */
582ENTRY(SBUS_DA_mem_space_write_region_1)
583	BUS_ACCESS_ADDR(ebx,edx)
584	cld
585	pushl	%edi
586	movl	%edx,%edi
587	rep
588	movsb
589	popl	%edi
590	ret
591
592ENTRY(SBUS_DA_mem_space_write_region_2)
593	BUS_ACCESS_ADDR(ebx,edx)
594	cld
595	pushl	%edi
596	movl	%edx,%edi
597	rep
598	movsw
599	popl	%edi
600	ret
601
602ENTRY(SBUS_DA_mem_space_write_region_4)
603	BUS_ACCESS_ADDR(ebx,edx)
604	cld
605	pushl	%edi
606	movl	%edx,%edi
607	rep
608	movsl
609	popl	%edi
610	ret
611
612/*
613 *	set_multi_N
614 */
615ENTRY(SBUS_DA_mem_space_set_multi_1)
616	BUS_ACCESS_ADDR(ebx,edx)
617	orl	%ecx,%ecx
618	jz	2f
6191:
620	movb	%al,(%edx)
621	decl	%ecx
622	jnz	1b
6232:
624	ret
625
626ENTRY(SBUS_DA_mem_space_set_multi_2)
627	BUS_ACCESS_ADDR(ebx,edx)
628	orl	%ecx,%ecx
629	jz	2f
6301:
631	movw	%ax,(%edx)
632	decl	%ecx
633	jnz	1b
6342:
635	ret
636
637ENTRY(SBUS_DA_mem_space_set_multi_4)
638	BUS_ACCESS_ADDR(ebx,edx)
639	orl	%ecx,%ecx
640	jz	2f
6411:
642	movl	%eax,(%edx)
643	decl	%ecx
644	jnz	1b
6452:
646	ret
647
648/*
649 *	set_region_N
650 */
651ENTRY(SBUS_DA_mem_space_set_region_1)
652	BUS_ACCESS_ADDR(ebx,edx)
653	cld
654	pushl	%edi
655	movl	%edx,%edi
656	rep
657	stosb
658	popl	%edi
659	ret
660
661ENTRY(SBUS_DA_mem_space_set_region_2)
662	BUS_ACCESS_ADDR(ebx,edx)
663	cld
664	pushl	%edi
665	movl	%edx,%edi
666	rep
667	stosw
668	popl	%edi
669	ret
670
671ENTRY(SBUS_DA_mem_space_set_region_4)
672	BUS_ACCESS_ADDR(ebx,edx)
673	cld
674	pushl	%edi
675	movl	%edx,%edi
676	rep
677	stosl
678	popl	%edi
679	ret
680
681/*
682 *	copy_region_N
683 */
684ENTRY(SBUS_DA_mem_space_copy_region_1)
685	BUS_ACCESS_ADDR(eax,esi)
686	BUS_ACCESS_ADDR(ebx,edi)
687	cld
688	rep
689	movsb
690	ret
691
692ENTRY(SBUS_DA_mem_space_copy_region_2)
693	BUS_ACCESS_ADDR(eax,esi)
694	BUS_ACCESS_ADDR(ebx,edi)
695	cld
696	rep
697	movsw
698	ret
699
700ENTRY(SBUS_DA_mem_space_copy_region_4)
701	BUS_ACCESS_ADDR(eax,esi)
702	BUS_ACCESS_ADDR(ebx,edi)
703	cld
704	rep
705	movsl
706	ret
707
708#undef	BUS_ACCESS_ADDR
709
710/***********************************************************
711 * Bus IO access methods (Relocate Access)
712 ***********************************************************/
713#define	BUS_ACCESS_ADDR(BSHREG,ADDRREG)	\
714	movl BUS_SPACE_HANDLE_IAT/**/(%/**/BSHREG/**/, %/**/ADDRREG/**/, 4), \
715	     %/**/ADDRREG
716/*
717 *	read_N
718 *	IN:  edx port
719 *	OUT: eax data
720 */
721ENTRY(SBUS_RA_io_space_read_1)
722	BUS_ACCESS_ADDR(ebx,edx)
723	inb	%dx,%al
724	ret
725
726ENTRY(SBUS_RA_io_space_read_2)
727	BUS_ACCESS_ADDR(ebx,edx)
728	inw	%dx,%ax
729	ret
730
731ENTRY(SBUS_RA_io_space_read_4)
732	BUS_ACCESS_ADDR(ebx,edx)
733	inl	%dx,%eax
734	ret
735
736/*
737 *	write_N
738 *	IN:eax DATA
739 *	   edx PORT
740 */
741ENTRY(SBUS_RA_io_space_write_1)
742	BUS_ACCESS_ADDR(ebx,edx)
743	outb	%al,%dx
744	ret
745
746ENTRY(SBUS_RA_io_space_write_2)
747	BUS_ACCESS_ADDR(ebx,edx)
748	outw	%ax,%dx
749	ret
750
751ENTRY(SBUS_RA_io_space_write_4)
752	BUS_ACCESS_ADDR(ebx,edx)
753	outl	%eax,%dx
754	ret
755
756/*
757 *	read_multi_N
758 *	IN: ecx COUNT
759 *	    edx PORT
760 *	    edi BUFP
761 */
762ENTRY(SBUS_RA_io_space_read_multi_1)
763	BUS_ACCESS_ADDR(ebx,edx)
764	cld
765	rep
766	insb
767	ret
768
769ENTRY(SBUS_RA_io_space_read_multi_2)
770	BUS_ACCESS_ADDR(ebx,edx)
771	cld
772	rep
773	insw
774	ret
775
776ENTRY(SBUS_RA_io_space_read_multi_4)
777	BUS_ACCESS_ADDR(ebx,edx)
778	cld
779	rep
780	insl
781	ret
782
783/*
784 *	write_multi_N
785 *	IN: ecx COUNT
786 *	    edx PORT
787 *	    esi BUFP
788 */
789ENTRY(SBUS_RA_io_space_write_multi_1)
790	BUS_ACCESS_ADDR(ebx,edx)
791	cld
792	rep
793	outsb
794	ret
795
796ENTRY(SBUS_RA_io_space_write_multi_2)
797	BUS_ACCESS_ADDR(ebx,edx)
798	cld
799	rep
800	outsw
801	ret
802
803ENTRY(SBUS_RA_io_space_write_multi_4)
804	BUS_ACCESS_ADDR(ebx,edx)
805	cld
806	rep
807	outsl
808	ret
809
810/*
811 *	read_region_N
812 *	IN: ecx COUNT
813 *	    edx PORT
814 *	    edi BUFP
815 */
816ENTRY(SBUS_RA_io_space_read_region_1)
817	BUS_ACCESS_ADDR(ebx,edx)
818	cld
819	pushl	%eax
820	orl	%ecx,%ecx
821	jz	2f
8221:
823	inb	%dx,%al
824	stosb
825	incl	%edx
826	decl	%ecx
827	jnz	1b
8282:
829	popl	%eax
830	ret
831
832ENTRY(SBUS_RA_io_space_read_region_2)
833	BUS_ACCESS_ADDR(ebx,edx)
834	cld
835	pushl	%eax
836	orl	%ecx,%ecx
837	jz	2f
8381:
839	inw	%dx,%ax
840	stosw
841	addl	$2,%edx
842	decl	%ecx
843	jnz	1b
8442:
845	popl	%eax
846	ret
847
848ENTRY(SBUS_RA_io_space_read_region_4)
849	BUS_ACCESS_ADDR(ebx,edx)
850	cld
851	pushl	%eax
852	orl	%ecx,%ecx
853	jz	2f
8541:
855	inl	%dx,%eax
856	stosl
857	addl	$4,%edx
858	decl	%ecx
859	jnz	1b
8602:
861	popl	%eax
862	ret
863
864/*
865 *	write_region_N
866 *	IN: ecx COUNT
867 *	    edx PORT
868 *	    esi BUFP
869 */
870ENTRY(SBUS_RA_io_space_write_region_1)
871	BUS_ACCESS_ADDR(ebx,edx)
872	cld
873	pushl	%eax
874	orl	%ecx,%ecx
875	jz	2f
8761:
877	lodsb
878	outb	%al,%dx
879	incl	%edx
880	decl	%ecx
881	jnz	1b
8822:
883	popl	%eax
884	ret
885
886ENTRY(SBUS_RA_io_space_write_region_2)
887	BUS_ACCESS_ADDR(ebx,edx)
888	cld
889	pushl	%eax
890	orl	%ecx,%ecx
891	jz	2f
8921:
893	lodsw
894	outw	%ax,%dx
895	addl	$2,%edx
896	decl	%ecx
897	jnz	1b
8982:
899	popl	%eax
900	ret
901
902ENTRY(SBUS_RA_io_space_write_region_4)
903	BUS_ACCESS_ADDR(ebx,edx)
904	cld
905	pushl	%eax
906	orl	%ecx,%ecx
907	jz	2f
9081:
909	lodsl
910	outl	%eax,%dx
911	addl	$4,%edx
912	decl	%ecx
913	jnz	1b
9142:
915	popl	%eax
916	ret
917
918/*
919 *	set_multi_N
920 *	IN: eax DATA
921 *	    ecx COUNT
922 *	    edx PORT
923 */
924ENTRY(SBUS_RA_io_space_set_multi_1)
925	BUS_ACCESS_ADDR(ebx,edx)
926	orl	%ecx,%ecx
927	jz	2f
9281:
929	outb	%al,%dx
930	decl	%ecx
931	jnz	1b
9322:
933	ret
934
935ENTRY(SBUS_RA_io_space_set_multi_2)
936	BUS_ACCESS_ADDR(ebx,edx)
937	orl	%ecx,%ecx
938	jz	2f
9391:
940	outw	%ax,%dx
941	decl	%ecx
942	jnz	1b
9432:
944	ret
945
946ENTRY(SBUS_RA_io_space_set_multi_4)
947	BUS_ACCESS_ADDR(ebx,edx)
948	orl	%ecx,%ecx
949	jz	2f
9501:
951	outl	%eax,%dx
952	decl	%ecx
953	jnz	1b
9542:
955	ret
956
957/*
958 *	set_region_N
959 *	IN: eax DATA
960 *	    ecx COUNT
961 *	    edx PORT
962 */
963ENTRY(SBUS_RA_io_space_set_region_1)
964	BUS_ACCESS_ADDR(ebx,edx)
965	orl	%ecx,%ecx
966	jz	2f
9671:
968	outb	%al,%dx
969	incl	%edx
970	decl	%ecx
971	jnz	1b
9722:
973	ret
974
975ENTRY(SBUS_RA_io_space_set_region_2)
976	BUS_ACCESS_ADDR(ebx,edx)
977	orl	%ecx,%ecx
978	jz	2f
9791:
980	outw	%ax,%dx
981	addl	$2,%edx
982	decl	%ecx
983	jnz	1b
9842:
985	ret
986
987ENTRY(SBUS_RA_io_space_set_region_4)
988	BUS_ACCESS_ADDR(ebx,edx)
989	orl	%ecx,%ecx
990	jz	2f
9911:
992	outl	%eax,%dx
993	addl	$4,%edx
994	decl	%ecx
995	jnz	1b
9962:
997	ret
998
999/*
1000 *	copy_region_N
1001 *	IN: ecx COUNT
1002 *	    esi SPORT
1003 *	    edi	DPORT
1004 */
1005ENTRY(SBUS_RA_io_space_copy_region_1)
1006	BUS_ACCESS_ADDR(eax,esi)
1007	BUS_ACCESS_ADDR(ebx,edi)
1008	pushl	%eax
1009	pushl	%edx
1010	orl	%ecx,%ecx
1011	jz	2f
10121:
1013	movl	%esi,%edx
1014	inb	%dx,%al
1015	incl	%esi
1016
1017	movl	%edi,%edx
1018	outb	%al,%dx
1019	incl	%edi
1020
1021	decl	%ecx
1022	jnz	1b
10232:
1024	popl	%edx
1025	popl	%eax
1026	ret
1027
1028ENTRY(SBUS_RA_io_space_copy_region_2)
1029	BUS_ACCESS_ADDR(eax,esi)
1030	BUS_ACCESS_ADDR(ebx,edi)
1031	pushl	%eax
1032	pushl	%edx
1033	orl	%ecx,%ecx
1034	jz	2f
10351:
1036	movl	%esi,%edx
1037	inw	%dx,%ax
1038	addl	$2,%esi
1039
1040	movl	%edi,%edx
1041	outw	%ax,%dx
1042	addl	$2,%edi
1043
1044	decl	%ecx
1045	jnz	1b
10462:
1047	popl	%edx
1048	popl	%eax
1049	ret
1050
1051ENTRY(SBUS_RA_io_space_copy_region_4)
1052	BUS_ACCESS_ADDR(eax,esi)
1053	BUS_ACCESS_ADDR(ebx,edi)
1054	pushl	%eax
1055	pushl	%edx
1056	orl	%ecx,%ecx
1057	jz	2f
10581:
1059	movl	%esi,%edx
1060	inl	%dx,%eax
1061	addl	$4,%esi
1062
1063	movl	%edi,%edx
1064	outl	%eax,%dx
1065	addl	$4,%edi
1066
1067	decl	%ecx
1068	jnz	1b
10692:
1070	popl	%edx
1071	popl	%eax
1072	ret
1073
1074/***********************************************************
1075 * Bus Memory access methods
1076 ***********************************************************/
1077/*
1078 *	read_N
1079 */
1080ENTRY(SBUS_RA_mem_space_read_1)
1081	BUS_ACCESS_ADDR(ebx,edx)
1082	movb	(%edx),%al
1083	ret
1084
1085ENTRY(SBUS_RA_mem_space_read_2)
1086	BUS_ACCESS_ADDR(ebx,edx)
1087	movw	(%edx),%ax
1088	ret
1089
1090ENTRY(SBUS_RA_mem_space_read_4)
1091	BUS_ACCESS_ADDR(ebx,edx)
1092	movl	(%edx),%eax
1093	ret
1094
1095/*
1096 *	write_N
1097 */
1098ENTRY(SBUS_RA_mem_space_write_1)
1099	BUS_ACCESS_ADDR(ebx,edx)
1100	movb	%al,(%edx)
1101	ret
1102
1103ENTRY(SBUS_RA_mem_space_write_2)
1104	BUS_ACCESS_ADDR(ebx,edx)
1105	movw	%ax,(%edx)
1106	ret
1107
1108ENTRY(SBUS_RA_mem_space_write_4)
1109	BUS_ACCESS_ADDR(ebx,edx)
1110	movl	%eax,(%edx)
1111	ret
1112
1113/*
1114 *	read_multi_N
1115 */
1116ENTRY(SBUS_RA_mem_space_read_multi_1)
1117	BUS_ACCESS_ADDR(ebx,edx)
1118	cld
1119	pushl	%eax
1120	orl	%ecx,%ecx
1121	jz	2f
11221:
1123	movb	(%edx),%al
1124	stosb
1125	decl	%ecx
1126	jnz	1b
11272:
1128	popl	%eax
1129	ret
1130
1131ENTRY(SBUS_RA_mem_space_read_multi_2)
1132	BUS_ACCESS_ADDR(ebx,edx)
1133	cld
1134	pushl	%eax
1135	orl	%ecx,%ecx
1136	jz	2f
11371:
1138	movw	(%edx),%ax
1139	stosw
1140	decl	%ecx
1141	jnz	1b
11422:
1143	popl	%eax
1144	ret
1145
1146ENTRY(SBUS_RA_mem_space_read_multi_4)
1147	BUS_ACCESS_ADDR(ebx,edx)
1148	cld
1149	pushl	%eax
1150	orl	%ecx,%ecx
1151	jz	2f
11521:
1153	movl	(%edx),%eax
1154	stosl
1155	decl	%ecx
1156	jnz	1b
11572:
1158	popl	%eax
1159	ret
1160
1161/*
1162 *	write_multi_N
1163 */
1164ENTRY(SBUS_RA_mem_space_write_multi_1)
1165	BUS_ACCESS_ADDR(ebx,edx)
1166	cld
1167	pushl	%eax
1168	orl	%ecx,%ecx
1169	jz	2f
11701:
1171	lodsb
1172	movb	%al,(%edx)
1173	decl	%ecx
1174	jnz	1b
11752:
1176	popl	%eax
1177	ret
1178
1179ENTRY(SBUS_RA_mem_space_write_multi_2)
1180	BUS_ACCESS_ADDR(ebx,edx)
1181	cld
1182	pushl	%eax
1183	orl	%ecx,%ecx
1184	jz	2f
11851:
1186	lodsw
1187	movw	%ax,(%edx)
1188	decl	%ecx
1189	jnz	1b
11902:
1191	popl	%eax
1192	ret
1193
1194ENTRY(SBUS_RA_mem_space_write_multi_4)
1195	BUS_ACCESS_ADDR(ebx,edx)
1196	cld
1197	pushl	%eax
1198	orl	%ecx,%ecx
1199	jz	2f
12001:
1201	lodsl
1202	movl	%eax,(%edx)
1203	decl	%ecx
1204	jnz	1b
12052:
1206	popl	%eax
1207	ret
1208
1209/*
1210 *	read_region_N
1211 */
1212ENTRY(SBUS_RA_mem_space_read_region_1)
1213	BUS_ACCESS_ADDR(ebx,edx)
1214	cld
1215	pushl	%esi
1216	movl	%edx,%esi
1217	rep
1218	movsb
1219	popl	%esi
1220	ret
1221
1222ENTRY(SBUS_RA_mem_space_read_region_2)
1223	BUS_ACCESS_ADDR(ebx,edx)
1224	cld
1225	pushl	%esi
1226	movl	%edx,%esi
1227	rep
1228	movsw
1229	popl	%esi
1230	ret
1231
1232ENTRY(SBUS_RA_mem_space_read_region_4)
1233	BUS_ACCESS_ADDR(ebx,edx)
1234	cld
1235	pushl	%esi
1236	movl	%edx,%esi
1237	rep
1238	movsl
1239	popl	%esi
1240	ret
1241
1242/*
1243 *	write_region_N
1244 */
1245ENTRY(SBUS_RA_mem_space_write_region_1)
1246	BUS_ACCESS_ADDR(ebx,edx)
1247	cld
1248	pushl	%edi
1249	movl	%edx,%edi
1250	rep
1251	movsb
1252	popl	%edi
1253	ret
1254
1255ENTRY(SBUS_RA_mem_space_write_region_2)
1256	BUS_ACCESS_ADDR(ebx,edx)
1257	cld
1258	pushl	%edi
1259	movl	%edx,%edi
1260	rep
1261	movsw
1262	popl	%edi
1263	ret
1264
1265ENTRY(SBUS_RA_mem_space_write_region_4)
1266	BUS_ACCESS_ADDR(ebx,edx)
1267	cld
1268	pushl	%edi
1269	movl	%edx,%edi
1270	rep
1271	movsl
1272	popl	%edi
1273	ret
1274
1275/*
1276 *	set_multi_N
1277 */
1278ENTRY(SBUS_RA_mem_space_set_multi_1)
1279	BUS_ACCESS_ADDR(ebx,edx)
1280	orl	%ecx,%ecx
1281	jz	2f
12821:
1283	movb	%al,(%edx)
1284	decl	%ecx
1285	jnz	1b
12862:
1287	ret
1288
1289ENTRY(SBUS_RA_mem_space_set_multi_2)
1290	BUS_ACCESS_ADDR(ebx,edx)
1291	orl	%ecx,%ecx
1292	jz	2f
12931:
1294	movw	%ax,(%edx)
1295	decl	%ecx
1296	jnz	1b
12972:
1298	ret
1299
1300ENTRY(SBUS_RA_mem_space_set_multi_4)
1301	BUS_ACCESS_ADDR(ebx,edx)
1302	orl	%ecx,%ecx
1303	jz	2f
13041:
1305	movl	%eax,(%edx)
1306	decl	%ecx
1307	jnz	1b
13082:
1309	ret
1310
1311/*
1312 *	set_region_N
1313 */
1314ENTRY(SBUS_RA_mem_space_set_region_1)
1315	BUS_ACCESS_ADDR(ebx,edx)
1316	cld
1317	pushl	%edi
1318	movl	%edx,%edi
1319	rep
1320	stosb
1321	popl	%edi
1322	ret
1323
1324ENTRY(SBUS_RA_mem_space_set_region_2)
1325	BUS_ACCESS_ADDR(ebx,edx)
1326	cld
1327	pushl	%edi
1328	movl	%edx,%edi
1329	rep
1330	stosw
1331	popl	%edi
1332	ret
1333
1334ENTRY(SBUS_RA_mem_space_set_region_4)
1335	BUS_ACCESS_ADDR(ebx,edx)
1336	cld
1337	pushl	%edi
1338	movl	%edx,%edi
1339	rep
1340	stosl
1341	popl	%edi
1342	ret
1343
1344/*
1345 *	copy_region_N
1346 */
1347ENTRY(SBUS_RA_mem_space_copy_region_1)
1348	BUS_ACCESS_ADDR(eax,esi)
1349	BUS_ACCESS_ADDR(ebx,edi)
1350	cld
1351	rep
1352	movsb
1353	ret
1354
1355ENTRY(SBUS_RA_mem_space_copy_region_2)
1356	BUS_ACCESS_ADDR(eax,esi)
1357	BUS_ACCESS_ADDR(ebx,edi)
1358	cld
1359	rep
1360	movsw
1361	ret
1362
1363ENTRY(SBUS_RA_mem_space_copy_region_4)
1364	BUS_ACCESS_ADDR(eax,esi)
1365	BUS_ACCESS_ADDR(ebx,edi)
1366	cld
1367	rep
1368	movsl
1369	ret
1370
1371#undef	BUS_ACCESS_ADDR
1372
1373
1374#include "opt_mecia.h"
1375#ifdef DEV_MECIA
1376
1377/***********************************************************
1378 * NEPC pcmcia 16 bits bus access
1379 ***********************************************************/
1380#define	NEPC_SWITCH_BUS16	\
1381	pushl	%ebp		;\
1382	pushl	%eax		;\
1383	pushl	%edx		;\
1384	movl	$0x2a8e,%edx	;\
1385	inb	%dx,%al		;\
1386	movl	%eax,%ebp	;\
1387	andl	$~0x20,%eax	;\
1388	outb	%al,%dx		;\
1389	popl	%edx		;\
1390	popl	%eax
1391
1392#define	NEPC_BUS_RESTORE	\
1393	pushl	%eax		;\
1394	movl	%ebp,%eax	;\
1395	xchgl	%edx,%ebp	;\
1396	movl	$0x2a8e,%edx	;\
1397	outb	%al,%dx		;\
1398	xchgl	%ebp,%edx	;\
1399	popl	%eax		;\
1400	popl	%ebp
1401
1402/***********************************************************
1403 * NEPC pcmcia 16 bits bus acces (Direct Access)
1404 ***********************************************************/
1405#define	BUS_ACCESS_ADDR(BSHREG,ADDRREG) \
1406	addl BUS_SPACE_HANDLE_BASE/**/(%/**/BSHREG/**/),%/**/ADDRREG
1407
1408ENTRY(NEPC_DA_io_space_read_2)
1409	BUS_ACCESS_ADDR(ebx,edx)
1410	NEPC_SWITCH_BUS16
1411	inw	%dx,%ax
1412	NEPC_BUS_RESTORE
1413	ret
1414
1415
1416ENTRY(NEPC_DA_io_space_write_2)
1417	BUS_ACCESS_ADDR(ebx,edx)
1418	NEPC_SWITCH_BUS16
1419	outw	%ax,%dx
1420	NEPC_BUS_RESTORE
1421	ret
1422
1423ENTRY(NEPC_DA_io_space_read_multi_2)
1424	BUS_ACCESS_ADDR(ebx,edx)
1425	NEPC_SWITCH_BUS16
1426	cld
1427	rep
1428	insw
1429	NEPC_BUS_RESTORE
1430	ret
1431
1432ENTRY(NEPC_DA_io_space_write_multi_2)
1433	BUS_ACCESS_ADDR(ebx,edx)
1434	NEPC_SWITCH_BUS16
1435	cld
1436	rep
1437	outsw
1438	NEPC_BUS_RESTORE
1439	ret
1440
1441ENTRY(NEPC_DA_io_space_read_region_2)
1442	NEPC_SWITCH_BUS16
1443	call SBUS_DA_io_space_read_region_2
1444	NEPC_BUS_RESTORE
1445	ret
1446
1447ENTRY(NEPC_DA_io_space_write_region_2)
1448	NEPC_SWITCH_BUS16
1449	call SBUS_DA_io_space_write_region_2
1450	NEPC_BUS_RESTORE
1451	ret
1452
1453ENTRY(NEPC_DA_io_space_set_multi_2)
1454	NEPC_SWITCH_BUS16
1455	call SBUS_DA_io_space_set_multi_2
1456	NEPC_BUS_RESTORE
1457	ret
1458
1459
1460ENTRY(NEPC_DA_io_space_set_region_2)
1461	NEPC_SWITCH_BUS16
1462	call SBUS_DA_io_space_set_region_2
1463	NEPC_BUS_RESTORE
1464	ret
1465
1466ENTRY(NEPC_DA_io_space_copy_region_2)
1467	NEPC_SWITCH_BUS16
1468	call SBUS_DA_io_space_copy_region_2
1469	NEPC_BUS_RESTORE
1470	ret
1471
1472ENTRY(NEPC_DA_io_space_read_4)
1473	BUS_ACCESS_ADDR(ebx,edx)
1474	NEPC_SWITCH_BUS16
1475	inl	%dx,%eax
1476	NEPC_BUS_RESTORE
1477	ret
1478
1479ENTRY(NEPC_DA_io_space_write_4)
1480	BUS_ACCESS_ADDR(ebx,edx)
1481	NEPC_SWITCH_BUS16
1482	outl	%eax,%dx
1483	NEPC_BUS_RESTORE
1484	ret
1485
1486ENTRY(NEPC_DA_io_space_read_multi_4)
1487	BUS_ACCESS_ADDR(ebx,edx)
1488	NEPC_SWITCH_BUS16
1489	cld
1490	rep
1491	insl
1492	NEPC_BUS_RESTORE
1493	ret
1494
1495ENTRY(NEPC_DA_io_space_write_multi_4)
1496	BUS_ACCESS_ADDR(ebx,edx)
1497	NEPC_SWITCH_BUS16
1498	cld
1499	rep
1500	outsl
1501	NEPC_BUS_RESTORE
1502	ret
1503
1504ENTRY(NEPC_DA_io_space_read_region_4)
1505	NEPC_SWITCH_BUS16
1506	call SBUS_DA_io_space_read_region_4
1507	NEPC_BUS_RESTORE
1508	ret
1509
1510ENTRY(NEPC_DA_io_space_write_region_4)
1511	NEPC_SWITCH_BUS16
1512	call SBUS_DA_io_space_write_region_4
1513	NEPC_BUS_RESTORE
1514	ret
1515
1516ENTRY(NEPC_DA_io_space_set_multi_4)
1517	NEPC_SWITCH_BUS16
1518	call SBUS_DA_io_space_set_multi_4
1519	NEPC_BUS_RESTORE
1520	ret
1521
1522
1523ENTRY(NEPC_DA_io_space_set_region_4)
1524	NEPC_SWITCH_BUS16
1525	call SBUS_DA_io_space_set_region_4
1526	NEPC_BUS_RESTORE
1527	ret
1528
1529ENTRY(NEPC_DA_io_space_copy_region_4)
1530	NEPC_SWITCH_BUS16
1531	call SBUS_DA_io_space_copy_region_4
1532	NEPC_BUS_RESTORE
1533	ret
1534
1535#undef	BUS_ACCESS_ADDR
1536
1537/***********************************************************
1538 * NEPC pcmcia 16 bits bus acces (Relocate Access)
1539 ***********************************************************/
1540#define	BUS_ACCESS_ADDR(BSHREG,ADDRREG)	\
1541	movl BUS_SPACE_HANDLE_IAT/**/(%/**/BSHREG/**/, %/**/ADDRREG/**/, 4), \
1542	     %/**/ADDRREG
1543
1544ENTRY(NEPC_RA_io_space_read_2)
1545	BUS_ACCESS_ADDR(ebx,edx)
1546	NEPC_SWITCH_BUS16
1547	inw	%dx,%ax
1548	NEPC_BUS_RESTORE
1549	ret
1550
1551
1552ENTRY(NEPC_RA_io_space_write_2)
1553	BUS_ACCESS_ADDR(ebx,edx)
1554	NEPC_SWITCH_BUS16
1555	outw	%ax,%dx
1556	NEPC_BUS_RESTORE
1557	ret
1558
1559ENTRY(NEPC_RA_io_space_read_multi_2)
1560	BUS_ACCESS_ADDR(ebx,edx)
1561	NEPC_SWITCH_BUS16
1562	cld
1563	rep
1564	insw
1565	NEPC_BUS_RESTORE
1566	ret
1567
1568ENTRY(NEPC_RA_io_space_write_multi_2)
1569	BUS_ACCESS_ADDR(ebx,edx)
1570	NEPC_SWITCH_BUS16
1571	cld
1572	rep
1573	outsw
1574	NEPC_BUS_RESTORE
1575	ret
1576
1577ENTRY(NEPC_RA_io_space_read_region_2)
1578	NEPC_SWITCH_BUS16
1579	call SBUS_RA_io_space_read_region_2
1580	NEPC_BUS_RESTORE
1581	ret
1582
1583ENTRY(NEPC_RA_io_space_write_region_2)
1584	NEPC_SWITCH_BUS16
1585	call SBUS_RA_io_space_write_region_2
1586	NEPC_BUS_RESTORE
1587	ret
1588
1589ENTRY(NEPC_RA_io_space_set_multi_2)
1590	NEPC_SWITCH_BUS16
1591	call SBUS_RA_io_space_set_multi_2
1592	NEPC_BUS_RESTORE
1593	ret
1594
1595
1596ENTRY(NEPC_RA_io_space_set_region_2)
1597	NEPC_SWITCH_BUS16
1598	call SBUS_RA_io_space_set_region_2
1599	NEPC_BUS_RESTORE
1600	ret
1601
1602ENTRY(NEPC_RA_io_space_copy_region_2)
1603	NEPC_SWITCH_BUS16
1604	call SBUS_RA_io_space_copy_region_2
1605	NEPC_BUS_RESTORE
1606	ret
1607
1608ENTRY(NEPC_RA_io_space_read_4)
1609	BUS_ACCESS_ADDR(ebx,edx)
1610	NEPC_SWITCH_BUS16
1611	inl	%dx,%eax
1612	NEPC_BUS_RESTORE
1613	ret
1614
1615ENTRY(NEPC_RA_io_space_write_4)
1616	BUS_ACCESS_ADDR(ebx,edx)
1617	NEPC_SWITCH_BUS16
1618	outl	%eax,%dx
1619	NEPC_BUS_RESTORE
1620	ret
1621
1622ENTRY(NEPC_RA_io_space_read_multi_4)
1623	BUS_ACCESS_ADDR(ebx,edx)
1624	NEPC_SWITCH_BUS16
1625	cld
1626	rep
1627	insl
1628	NEPC_BUS_RESTORE
1629	ret
1630
1631ENTRY(NEPC_RA_io_space_write_multi_4)
1632	BUS_ACCESS_ADDR(ebx,edx)
1633	NEPC_SWITCH_BUS16
1634	cld
1635	rep
1636	outsl
1637	NEPC_BUS_RESTORE
1638	ret
1639
1640ENTRY(NEPC_RA_io_space_read_region_4)
1641	NEPC_SWITCH_BUS16
1642	call SBUS_RA_io_space_read_region_4
1643	NEPC_BUS_RESTORE
1644	ret
1645
1646ENTRY(NEPC_RA_io_space_write_region_4)
1647	NEPC_SWITCH_BUS16
1648	call SBUS_RA_io_space_write_region_4
1649	NEPC_BUS_RESTORE
1650	ret
1651
1652ENTRY(NEPC_RA_io_space_set_multi_4)
1653	NEPC_SWITCH_BUS16
1654	call SBUS_RA_io_space_set_multi_4
1655	NEPC_BUS_RESTORE
1656	ret
1657
1658
1659ENTRY(NEPC_RA_io_space_set_region_4)
1660	NEPC_SWITCH_BUS16
1661	call SBUS_RA_io_space_set_region_4
1662	NEPC_BUS_RESTORE
1663	ret
1664
1665ENTRY(NEPC_RA_io_space_copy_region_4)
1666	NEPC_SWITCH_BUS16
1667	call SBUS_RA_io_space_copy_region_4
1668	NEPC_BUS_RESTORE
1669	ret
1670
1671#endif /* DEV_MECIA */
1672