184615Snyan/* $FreeBSD$ */ 284615Snyan/* $NecBSD: busio.s,v 1.16.4.1 1999/08/16 09:06:08 kmatsuda Exp $ */ 384615Snyan/* $NetBSD$ */ 484615Snyan 5139825Simp/*- 684615Snyan * [NetBSD for NEC PC-98 series] 784615Snyan * Copyright (c) 1996, 1997, 1998 884615Snyan * NetBSD/pc98 porting staff. All rights reserved. 984615Snyan * 1084615Snyan * [Ported for FreeBSD] 1184615Snyan * Copyright (c) 2001 1284615Snyan * TAKAHASHI Yoshihiro. All rights reserved. 1384615Snyan * 1484615Snyan * Redistribution and use in source and binary forms, with or without 1584615Snyan * modification, are permitted provided that the following conditions 1684615Snyan * are met: 1784615Snyan * 1. Redistributions of source code must retain the above copyright 1884615Snyan * notice, this list of conditions and the following disclaimer. 1984615Snyan * 2. Redistributions in binary form must reproduce the above copyright 2084615Snyan * notice, this list of conditions and the following disclaimer in the 2184615Snyan * documentation and/or other materials provided with the distribution. 2284615Snyan * 3. The name of the author may not be used to endorse or promote products 2384615Snyan * derived from this software without specific prior written permission. 2484615Snyan * 2584615Snyan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 2684615Snyan * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 2784615Snyan * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 2884615Snyan * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 2984615Snyan * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 3084615Snyan * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 3184615Snyan * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3284615Snyan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3384615Snyan * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 3484615Snyan * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3584615Snyan * POSSIBILITY OF SUCH DAMAGE. 3684615Snyan */ 3784615Snyan 3884615Snyan/* 3984615Snyan * Copyright (c) 1997, 1998 4084615Snyan * Naofumi HONDA. All rights reserved. 4184615Snyan */ 4284615Snyan 43122127Snyan#include <machine/asmacros.h> 4484615Snyan 4584615Snyan#include "assym.s" 4684615Snyan 4784615Snyan/*********************************************************** 4884615Snyan * Bus IO access methods (Direct Access) 4984615Snyan ***********************************************************/ 5084615Snyan#define BUS_ACCESS_ADDR(BSHREG,ADDRREG) \ 5184615Snyan addl BUS_SPACE_HANDLE_BASE/**/(%/**/BSHREG/**/),%/**/ADDRREG 5284615Snyan 5384615Snyan/* 5484615Snyan * read_N 5584615Snyan * IN: edx port 5684615Snyan * OUT: eax data 5784615Snyan */ 5884615SnyanENTRY(SBUS_DA_io_space_read_1) 5984615Snyan BUS_ACCESS_ADDR(ebx,edx) 6084615Snyan inb %dx,%al 6184615Snyan ret 6284615Snyan 6384615SnyanENTRY(SBUS_DA_io_space_read_2) 6484615Snyan BUS_ACCESS_ADDR(ebx,edx) 6584615Snyan inw %dx,%ax 6684615Snyan ret 6784615Snyan 6884615SnyanENTRY(SBUS_DA_io_space_read_4) 6984615Snyan BUS_ACCESS_ADDR(ebx,edx) 7084615Snyan inl %dx,%eax 7184615Snyan ret 7284615Snyan 7384615Snyan/* 7484615Snyan * write_N 7584615Snyan * IN:eax DATA 7684615Snyan * edx PORT 7784615Snyan */ 7884615SnyanENTRY(SBUS_DA_io_space_write_1) 7984615Snyan BUS_ACCESS_ADDR(ebx,edx) 8084615Snyan outb %al,%dx 8184615Snyan ret 8284615Snyan 8384615SnyanENTRY(SBUS_DA_io_space_write_2) 8484615Snyan BUS_ACCESS_ADDR(ebx,edx) 8584615Snyan outw %ax,%dx 8684615Snyan ret 8784615Snyan 8884615SnyanENTRY(SBUS_DA_io_space_write_4) 8984615Snyan BUS_ACCESS_ADDR(ebx,edx) 9084615Snyan outl %eax,%dx 9184615Snyan ret 9284615Snyan 9384615Snyan/* 9484615Snyan * read_multi_N 9584615Snyan * IN: ecx COUNT 9684615Snyan * edx PORT 9784615Snyan * edi BUFP 9884615Snyan */ 9984615SnyanENTRY(SBUS_DA_io_space_read_multi_1) 10084615Snyan BUS_ACCESS_ADDR(ebx,edx) 10184615Snyan cld 10284615Snyan rep 10384615Snyan insb 10484615Snyan ret 10584615Snyan 10684615SnyanENTRY(SBUS_DA_io_space_read_multi_2) 10784615Snyan BUS_ACCESS_ADDR(ebx,edx) 10884615Snyan cld 10984615Snyan rep 11084615Snyan insw 11184615Snyan ret 11284615Snyan 11384615SnyanENTRY(SBUS_DA_io_space_read_multi_4) 11484615Snyan BUS_ACCESS_ADDR(ebx,edx) 11584615Snyan cld 11684615Snyan rep 11784615Snyan insl 11884615Snyan ret 11984615Snyan 12084615Snyan/* 12184615Snyan * write_multi_N 12284615Snyan * IN: ecx COUNT 12384615Snyan * edx PORT 12484615Snyan * esi BUFP 12584615Snyan */ 12684615SnyanENTRY(SBUS_DA_io_space_write_multi_1) 12784615Snyan BUS_ACCESS_ADDR(ebx,edx) 12884615Snyan cld 12984615Snyan rep 13084615Snyan outsb 13184615Snyan ret 13284615Snyan 13384615SnyanENTRY(SBUS_DA_io_space_write_multi_2) 13484615Snyan BUS_ACCESS_ADDR(ebx,edx) 13584615Snyan cld 13684615Snyan rep 13784615Snyan outsw 13884615Snyan ret 13984615Snyan 14084615SnyanENTRY(SBUS_DA_io_space_write_multi_4) 14184615Snyan BUS_ACCESS_ADDR(ebx,edx) 14284615Snyan cld 14384615Snyan rep 14484615Snyan outsl 14584615Snyan ret 14684615Snyan 14784615Snyan/* 14884615Snyan * read_region_N 14984615Snyan * IN: ecx COUNT 15084615Snyan * edx PORT 15184615Snyan * edi BUFP 15284615Snyan */ 15384615SnyanENTRY(SBUS_DA_io_space_read_region_1) 15484615Snyan BUS_ACCESS_ADDR(ebx,edx) 15584615Snyan cld 15684615Snyan pushl %eax 15784615Snyan orl %ecx,%ecx 15884615Snyan jz 2f 15984615Snyan1: 16084615Snyan inb %dx,%al 16184615Snyan stosb 16284615Snyan incl %edx 16384615Snyan decl %ecx 16484615Snyan jnz 1b 16584615Snyan2: 16684615Snyan popl %eax 16784615Snyan ret 16884615Snyan 16984615SnyanENTRY(SBUS_DA_io_space_read_region_2) 17084615Snyan BUS_ACCESS_ADDR(ebx,edx) 17184615Snyan cld 17284615Snyan pushl %eax 17384615Snyan orl %ecx,%ecx 17484615Snyan jz 2f 17584615Snyan1: 17684615Snyan inw %dx,%ax 17784615Snyan stosw 17884615Snyan addl $2,%edx 17984615Snyan decl %ecx 18084615Snyan jnz 1b 18184615Snyan2: 18284615Snyan popl %eax 18384615Snyan ret 18484615Snyan 18584615SnyanENTRY(SBUS_DA_io_space_read_region_4) 18684615Snyan BUS_ACCESS_ADDR(ebx,edx) 18784615Snyan cld 18884615Snyan pushl %eax 18984615Snyan orl %ecx,%ecx 19084615Snyan jz 2f 19184615Snyan1: 19284615Snyan inl %dx,%eax 19384615Snyan stosl 19484615Snyan addl $4,%edx 19584615Snyan decl %ecx 19684615Snyan jnz 1b 19784615Snyan2: 19884615Snyan popl %eax 19984615Snyan ret 20084615Snyan 20184615Snyan/* 20284615Snyan * write_region_N 20384615Snyan * IN: ecx COUNT 20484615Snyan * edx PORT 20584615Snyan * esi BUFP 20684615Snyan */ 20784615SnyanENTRY(SBUS_DA_io_space_write_region_1) 20884615Snyan BUS_ACCESS_ADDR(ebx,edx) 20984615Snyan cld 21084615Snyan pushl %eax 21184615Snyan orl %ecx,%ecx 21284615Snyan jz 2f 21384615Snyan1: 21484615Snyan lodsb 21584615Snyan outb %al,%dx 21684615Snyan incl %edx 21784615Snyan decl %ecx 21884615Snyan jnz 1b 21984615Snyan2: 22084615Snyan popl %eax 22184615Snyan ret 22284615Snyan 22384615SnyanENTRY(SBUS_DA_io_space_write_region_2) 22484615Snyan BUS_ACCESS_ADDR(ebx,edx) 22584615Snyan cld 22684615Snyan pushl %eax 22784615Snyan orl %ecx,%ecx 22884615Snyan jz 2f 22984615Snyan1: 23084615Snyan lodsw 23184615Snyan outw %ax,%dx 23284615Snyan addl $2,%edx 23384615Snyan decl %ecx 23484615Snyan jnz 1b 23584615Snyan2: 23684615Snyan popl %eax 23784615Snyan ret 23884615Snyan 23984615SnyanENTRY(SBUS_DA_io_space_write_region_4) 24084615Snyan BUS_ACCESS_ADDR(ebx,edx) 24184615Snyan cld 24284615Snyan pushl %eax 24384615Snyan orl %ecx,%ecx 24484615Snyan jz 2f 24584615Snyan1: 24684615Snyan lodsl 24784615Snyan outl %eax,%dx 24884615Snyan addl $4,%edx 24984615Snyan decl %ecx 25084615Snyan jnz 1b 25184615Snyan2: 25284615Snyan popl %eax 25384615Snyan ret 25484615Snyan 25584615Snyan/* 25684615Snyan * set_multi_N 25784615Snyan * IN: eax DATA 25884615Snyan * ecx COUNT 25984615Snyan * edx PORT 26084615Snyan */ 26184615SnyanENTRY(SBUS_DA_io_space_set_multi_1) 26284615Snyan BUS_ACCESS_ADDR(ebx,edx) 26384615Snyan orl %ecx,%ecx 26484615Snyan jz 2f 26584615Snyan1: 26684615Snyan outb %al,%dx 26784615Snyan decl %ecx 26884615Snyan jnz 1b 26984615Snyan2: 27084615Snyan ret 27184615Snyan 27284615SnyanENTRY(SBUS_DA_io_space_set_multi_2) 27384615Snyan BUS_ACCESS_ADDR(ebx,edx) 27484615Snyan orl %ecx,%ecx 27584615Snyan jz 2f 27684615Snyan1: 27784615Snyan outw %ax,%dx 27884615Snyan decl %ecx 27984615Snyan jnz 1b 28084615Snyan2: 28184615Snyan ret 28284615Snyan 28384615SnyanENTRY(SBUS_DA_io_space_set_multi_4) 28484615Snyan BUS_ACCESS_ADDR(ebx,edx) 28584615Snyan orl %ecx,%ecx 28684615Snyan jz 2f 28784615Snyan1: 28884615Snyan outl %eax,%dx 28984615Snyan decl %ecx 29084615Snyan jnz 1b 29184615Snyan2: 29284615Snyan ret 29384615Snyan 29484615Snyan/* 29584615Snyan * set_region_N 29684615Snyan * IN: eax DATA 29784615Snyan * ecx COUNT 29884615Snyan * edx PORT 29984615Snyan */ 30084615SnyanENTRY(SBUS_DA_io_space_set_region_1) 30184615Snyan BUS_ACCESS_ADDR(ebx,edx) 30284615Snyan orl %ecx,%ecx 30384615Snyan jz 2f 30484615Snyan1: 30584615Snyan outb %al,%dx 30684615Snyan incl %edx 30784615Snyan decl %ecx 30884615Snyan jnz 1b 30984615Snyan2: 31084615Snyan ret 31184615Snyan 31284615SnyanENTRY(SBUS_DA_io_space_set_region_2) 31384615Snyan BUS_ACCESS_ADDR(ebx,edx) 31484615Snyan orl %ecx,%ecx 31584615Snyan jz 2f 31684615Snyan1: 31784615Snyan outw %ax,%dx 31884615Snyan addl $2,%edx 31984615Snyan decl %ecx 32084615Snyan jnz 1b 32184615Snyan2: 32284615Snyan ret 32384615Snyan 32484615SnyanENTRY(SBUS_DA_io_space_set_region_4) 32584615Snyan BUS_ACCESS_ADDR(ebx,edx) 32684615Snyan orl %ecx,%ecx 32784615Snyan jz 2f 32884615Snyan1: 32984615Snyan outl %eax,%dx 33084615Snyan addl $4,%edx 33184615Snyan decl %ecx 33284615Snyan jnz 1b 33384615Snyan2: 33484615Snyan ret 33584615Snyan 33684615Snyan/* 33784615Snyan * copy_region_N 33884615Snyan * IN: ecx COUNT 33984615Snyan * esi SPORT 34084615Snyan * edi DPORT 34184615Snyan */ 34284615SnyanENTRY(SBUS_DA_io_space_copy_region_1) 34384615Snyan BUS_ACCESS_ADDR(eax,esi) 34484615Snyan BUS_ACCESS_ADDR(ebx,edi) 34584615Snyan pushl %eax 34684615Snyan pushl %edx 34784615Snyan orl %ecx,%ecx 34884615Snyan jz 2f 34984615Snyan1: 35084615Snyan movl %esi,%edx 35184615Snyan inb %dx,%al 35284615Snyan incl %esi 35384615Snyan 35484615Snyan movl %edi,%edx 35584615Snyan outb %al,%dx 35684615Snyan incl %edi 35784615Snyan 35884615Snyan decl %ecx 35984615Snyan jnz 1b 36084615Snyan2: 36184615Snyan popl %edx 36284615Snyan popl %eax 36384615Snyan ret 36484615Snyan 36584615SnyanENTRY(SBUS_DA_io_space_copy_region_2) 36684615Snyan BUS_ACCESS_ADDR(eax,esi) 36784615Snyan BUS_ACCESS_ADDR(ebx,edi) 36884615Snyan pushl %eax 36984615Snyan pushl %edx 37084615Snyan orl %ecx,%ecx 37184615Snyan jz 2f 37284615Snyan1: 37384615Snyan movl %esi,%edx 37484615Snyan inw %dx,%ax 37584615Snyan addl $2,%esi 37684615Snyan 37784615Snyan movl %edi,%edx 37884615Snyan outw %ax,%dx 37984615Snyan addl $2,%edi 38084615Snyan 38184615Snyan decl %ecx 38284615Snyan jnz 1b 38384615Snyan2: 38484615Snyan popl %edx 38584615Snyan popl %eax 38684615Snyan ret 38784615Snyan 38884615SnyanENTRY(SBUS_DA_io_space_copy_region_4) 38984615Snyan BUS_ACCESS_ADDR(eax,esi) 39084615Snyan BUS_ACCESS_ADDR(ebx,edi) 39184615Snyan pushl %eax 39284615Snyan pushl %edx 39384615Snyan orl %ecx,%ecx 39484615Snyan jz 2f 39584615Snyan1: 39684615Snyan movl %esi,%edx 39784615Snyan inl %dx,%eax 39884615Snyan addl $4,%esi 39984615Snyan 40084615Snyan movl %edi,%edx 40184615Snyan outl %eax,%dx 40284615Snyan addl $4,%edi 40384615Snyan 40484615Snyan decl %ecx 40584615Snyan jnz 1b 40684615Snyan2: 40784615Snyan popl %edx 40884615Snyan popl %eax 40984615Snyan ret 41084615Snyan 41184615Snyan/*********************************************************** 41284615Snyan * Bus Memory access methods (Direct Access) 41384615Snyan ***********************************************************/ 41484615Snyan/* 41584615Snyan * read_N 41684615Snyan */ 41784615SnyanENTRY(SBUS_DA_mem_space_read_1) 41884615Snyan BUS_ACCESS_ADDR(ebx,edx) 41984615Snyan movb (%edx),%al 42084615Snyan ret 42184615Snyan 42284615SnyanENTRY(SBUS_DA_mem_space_read_2) 42384615Snyan BUS_ACCESS_ADDR(ebx,edx) 42484615Snyan movw (%edx),%ax 42584615Snyan ret 42684615Snyan 42784615SnyanENTRY(SBUS_DA_mem_space_read_4) 42884615Snyan BUS_ACCESS_ADDR(ebx,edx) 42984615Snyan movl (%edx),%eax 43084615Snyan ret 43184615Snyan 43284615Snyan/* 43384615Snyan * write_N 43484615Snyan */ 43584615SnyanENTRY(SBUS_DA_mem_space_write_1) 43684615Snyan BUS_ACCESS_ADDR(ebx,edx) 43784615Snyan movb %al,(%edx) 43884615Snyan ret 43984615Snyan 44084615SnyanENTRY(SBUS_DA_mem_space_write_2) 44184615Snyan BUS_ACCESS_ADDR(ebx,edx) 44284615Snyan movw %ax,(%edx) 44384615Snyan ret 44484615Snyan 44584615SnyanENTRY(SBUS_DA_mem_space_write_4) 44684615Snyan BUS_ACCESS_ADDR(ebx,edx) 44784615Snyan movl %eax,(%edx) 44884615Snyan ret 44984615Snyan 45084615Snyan/* 45184615Snyan * read_multi_N 45284615Snyan */ 45384615SnyanENTRY(SBUS_DA_mem_space_read_multi_1) 45484615Snyan BUS_ACCESS_ADDR(ebx,edx) 45584615Snyan cld 45684615Snyan pushl %eax 45784615Snyan orl %ecx,%ecx 45884615Snyan jz 2f 45984615Snyan1: 46084615Snyan movb (%edx),%al 46184615Snyan stosb 46284615Snyan decl %ecx 46384615Snyan jnz 1b 46484615Snyan2: 46584615Snyan popl %eax 46684615Snyan ret 46784615Snyan 46884615SnyanENTRY(SBUS_DA_mem_space_read_multi_2) 46984615Snyan BUS_ACCESS_ADDR(ebx,edx) 47084615Snyan cld 47184615Snyan pushl %eax 47284615Snyan orl %ecx,%ecx 47384615Snyan jz 2f 47484615Snyan1: 47584615Snyan movw (%edx),%ax 47684615Snyan stosw 47784615Snyan decl %ecx 47884615Snyan jnz 1b 47984615Snyan2: 48084615Snyan popl %eax 48184615Snyan ret 48284615Snyan 48384615SnyanENTRY(SBUS_DA_mem_space_read_multi_4) 48484615Snyan BUS_ACCESS_ADDR(ebx,edx) 48584615Snyan cld 48684615Snyan pushl %eax 48784615Snyan orl %ecx,%ecx 48884615Snyan jz 2f 48984615Snyan1: 49084615Snyan movl (%edx),%eax 49184615Snyan stosl 49284615Snyan decl %ecx 49384615Snyan jnz 1b 49484615Snyan2: 49584615Snyan popl %eax 49684615Snyan ret 49784615Snyan 49884615Snyan/* 49984615Snyan * write_multi_N 50084615Snyan */ 50184615SnyanENTRY(SBUS_DA_mem_space_write_multi_1) 50284615Snyan BUS_ACCESS_ADDR(ebx,edx) 50384615Snyan cld 50484615Snyan pushl %eax 50584615Snyan orl %ecx,%ecx 50684615Snyan jz 2f 50784615Snyan1: 50884615Snyan lodsb 50984615Snyan movb %al,(%edx) 51084615Snyan decl %ecx 51184615Snyan jnz 1b 51284615Snyan2: 51384615Snyan popl %eax 51484615Snyan ret 51584615Snyan 51684615SnyanENTRY(SBUS_DA_mem_space_write_multi_2) 51784615Snyan BUS_ACCESS_ADDR(ebx,edx) 51884615Snyan cld 51984615Snyan pushl %eax 52084615Snyan orl %ecx,%ecx 52184615Snyan jz 2f 52284615Snyan1: 52384615Snyan lodsw 52484615Snyan movw %ax,(%edx) 52584615Snyan decl %ecx 52684615Snyan jnz 1b 52784615Snyan2: 52884615Snyan popl %eax 52984615Snyan ret 53084615Snyan 53184615SnyanENTRY(SBUS_DA_mem_space_write_multi_4) 53284615Snyan BUS_ACCESS_ADDR(ebx,edx) 53384615Snyan cld 53484615Snyan pushl %eax 53584615Snyan orl %ecx,%ecx 53684615Snyan jz 2f 53784615Snyan1: 53884615Snyan lodsl 53984615Snyan movl %eax,(%edx) 54084615Snyan decl %ecx 54184615Snyan jnz 1b 54284615Snyan2: 54384615Snyan popl %eax 54484615Snyan ret 54584615Snyan 54684615Snyan/* 54784615Snyan * read_region_N 54884615Snyan */ 54984615SnyanENTRY(SBUS_DA_mem_space_read_region_1) 55084615Snyan BUS_ACCESS_ADDR(ebx,edx) 55184615Snyan cld 55284615Snyan pushl %esi 55384615Snyan movl %edx,%esi 55484615Snyan rep 55584615Snyan movsb 55684615Snyan popl %esi 55784615Snyan ret 55884615Snyan 55984615SnyanENTRY(SBUS_DA_mem_space_read_region_2) 56084615Snyan BUS_ACCESS_ADDR(ebx,edx) 56184615Snyan cld 56284615Snyan pushl %esi 56384615Snyan movl %edx,%esi 56484615Snyan rep 56584615Snyan movsw 56684615Snyan popl %esi 56784615Snyan ret 56884615Snyan 56984615SnyanENTRY(SBUS_DA_mem_space_read_region_4) 57084615Snyan BUS_ACCESS_ADDR(ebx,edx) 57184615Snyan cld 57284615Snyan pushl %esi 57384615Snyan movl %edx,%esi 57484615Snyan rep 57584615Snyan movsl 57684615Snyan popl %esi 57784615Snyan ret 57884615Snyan 57984615Snyan/* 58084615Snyan * write_region_N 58184615Snyan */ 58284615SnyanENTRY(SBUS_DA_mem_space_write_region_1) 58384615Snyan BUS_ACCESS_ADDR(ebx,edx) 58484615Snyan cld 58584615Snyan pushl %edi 58684615Snyan movl %edx,%edi 58784615Snyan rep 58884615Snyan movsb 58984615Snyan popl %edi 59084615Snyan ret 59184615Snyan 59284615SnyanENTRY(SBUS_DA_mem_space_write_region_2) 59384615Snyan BUS_ACCESS_ADDR(ebx,edx) 59484615Snyan cld 59584615Snyan pushl %edi 59684615Snyan movl %edx,%edi 59784615Snyan rep 59884615Snyan movsw 59984615Snyan popl %edi 60084615Snyan ret 60184615Snyan 60284615SnyanENTRY(SBUS_DA_mem_space_write_region_4) 60384615Snyan BUS_ACCESS_ADDR(ebx,edx) 60484615Snyan cld 60584615Snyan pushl %edi 60684615Snyan movl %edx,%edi 60784615Snyan rep 60884615Snyan movsl 60984615Snyan popl %edi 61084615Snyan ret 61184615Snyan 61284615Snyan/* 61384615Snyan * set_multi_N 61484615Snyan */ 61584615SnyanENTRY(SBUS_DA_mem_space_set_multi_1) 61684615Snyan BUS_ACCESS_ADDR(ebx,edx) 61784615Snyan orl %ecx,%ecx 61884615Snyan jz 2f 61984615Snyan1: 62084615Snyan movb %al,(%edx) 62184615Snyan decl %ecx 62284615Snyan jnz 1b 62384615Snyan2: 62484615Snyan ret 62584615Snyan 62684615SnyanENTRY(SBUS_DA_mem_space_set_multi_2) 62784615Snyan BUS_ACCESS_ADDR(ebx,edx) 62884615Snyan orl %ecx,%ecx 62984615Snyan jz 2f 63084615Snyan1: 63184615Snyan movw %ax,(%edx) 63284615Snyan decl %ecx 63384615Snyan jnz 1b 63484615Snyan2: 63584615Snyan ret 63684615Snyan 63784615SnyanENTRY(SBUS_DA_mem_space_set_multi_4) 63884615Snyan BUS_ACCESS_ADDR(ebx,edx) 63984615Snyan orl %ecx,%ecx 64084615Snyan jz 2f 64184615Snyan1: 64284615Snyan movl %eax,(%edx) 64384615Snyan decl %ecx 64484615Snyan jnz 1b 64584615Snyan2: 64684615Snyan ret 64784615Snyan 64884615Snyan/* 64984615Snyan * set_region_N 65084615Snyan */ 65184615SnyanENTRY(SBUS_DA_mem_space_set_region_1) 65284615Snyan BUS_ACCESS_ADDR(ebx,edx) 65384615Snyan cld 65484615Snyan pushl %edi 65584615Snyan movl %edx,%edi 65684615Snyan rep 65784615Snyan stosb 65884615Snyan popl %edi 65984615Snyan ret 66084615Snyan 66184615SnyanENTRY(SBUS_DA_mem_space_set_region_2) 66284615Snyan BUS_ACCESS_ADDR(ebx,edx) 66384615Snyan cld 66484615Snyan pushl %edi 66584615Snyan movl %edx,%edi 66684615Snyan rep 66784615Snyan stosw 66884615Snyan popl %edi 66984615Snyan ret 67084615Snyan 67184615SnyanENTRY(SBUS_DA_mem_space_set_region_4) 67284615Snyan BUS_ACCESS_ADDR(ebx,edx) 67384615Snyan cld 67484615Snyan pushl %edi 67584615Snyan movl %edx,%edi 67684615Snyan rep 67784615Snyan stosl 67884615Snyan popl %edi 67984615Snyan ret 68084615Snyan 68184615Snyan/* 68284615Snyan * copy_region_N 68384615Snyan */ 68484615SnyanENTRY(SBUS_DA_mem_space_copy_region_1) 68584615Snyan BUS_ACCESS_ADDR(eax,esi) 68684615Snyan BUS_ACCESS_ADDR(ebx,edi) 68784615Snyan cld 68884615Snyan rep 68984615Snyan movsb 69084615Snyan ret 69184615Snyan 69284615SnyanENTRY(SBUS_DA_mem_space_copy_region_2) 69384615Snyan BUS_ACCESS_ADDR(eax,esi) 69484615Snyan BUS_ACCESS_ADDR(ebx,edi) 69584615Snyan cld 69684615Snyan rep 69784615Snyan movsw 69884615Snyan ret 69984615Snyan 70084615SnyanENTRY(SBUS_DA_mem_space_copy_region_4) 70184615Snyan BUS_ACCESS_ADDR(eax,esi) 70284615Snyan BUS_ACCESS_ADDR(ebx,edi) 70384615Snyan cld 70484615Snyan rep 70584615Snyan movsl 70684615Snyan ret 70784615Snyan 70884615Snyan#undef BUS_ACCESS_ADDR 70984615Snyan 71084615Snyan/*********************************************************** 71184615Snyan * Bus IO access methods (Relocate Access) 71284615Snyan ***********************************************************/ 71384615Snyan#define BUS_ACCESS_ADDR(BSHREG,ADDRREG) \ 71484615Snyan movl BUS_SPACE_HANDLE_IAT/**/(%/**/BSHREG/**/, %/**/ADDRREG/**/, 4), \ 71584615Snyan %/**/ADDRREG 716104775Snyan#define BUS_ACCESS_ADDR2(BSHREG,ADDRREG,DSTREG) \ 717104775Snyan movl BUS_SPACE_HANDLE_IAT/**/(%/**/BSHREG/**/, %/**/ADDRREG/**/, 4), \ 718104775Snyan %/**/DSTREG 71984615Snyan/* 72084615Snyan * read_N 72184615Snyan * IN: edx port 72284615Snyan * OUT: eax data 72384615Snyan */ 72484615SnyanENTRY(SBUS_RA_io_space_read_1) 72584615Snyan BUS_ACCESS_ADDR(ebx,edx) 72684615Snyan inb %dx,%al 72784615Snyan ret 72884615Snyan 72984615SnyanENTRY(SBUS_RA_io_space_read_2) 73084615Snyan BUS_ACCESS_ADDR(ebx,edx) 73184615Snyan inw %dx,%ax 73284615Snyan ret 73384615Snyan 73484615SnyanENTRY(SBUS_RA_io_space_read_4) 73584615Snyan BUS_ACCESS_ADDR(ebx,edx) 73684615Snyan inl %dx,%eax 73784615Snyan ret 73884615Snyan 73984615Snyan/* 74084615Snyan * write_N 74184615Snyan * IN:eax DATA 74284615Snyan * edx PORT 74384615Snyan */ 74484615SnyanENTRY(SBUS_RA_io_space_write_1) 74584615Snyan BUS_ACCESS_ADDR(ebx,edx) 74684615Snyan outb %al,%dx 74784615Snyan ret 74884615Snyan 74984615SnyanENTRY(SBUS_RA_io_space_write_2) 75084615Snyan BUS_ACCESS_ADDR(ebx,edx) 75184615Snyan outw %ax,%dx 75284615Snyan ret 75384615Snyan 75484615SnyanENTRY(SBUS_RA_io_space_write_4) 75584615Snyan BUS_ACCESS_ADDR(ebx,edx) 75684615Snyan outl %eax,%dx 75784615Snyan ret 75884615Snyan 75984615Snyan/* 76084615Snyan * read_multi_N 76184615Snyan * IN: ecx COUNT 76284615Snyan * edx PORT 76384615Snyan * edi BUFP 76484615Snyan */ 76584615SnyanENTRY(SBUS_RA_io_space_read_multi_1) 76684615Snyan BUS_ACCESS_ADDR(ebx,edx) 76784615Snyan cld 76884615Snyan rep 76984615Snyan insb 77084615Snyan ret 77184615Snyan 77284615SnyanENTRY(SBUS_RA_io_space_read_multi_2) 77384615Snyan BUS_ACCESS_ADDR(ebx,edx) 77484615Snyan cld 77584615Snyan rep 77684615Snyan insw 77784615Snyan ret 77884615Snyan 77984615SnyanENTRY(SBUS_RA_io_space_read_multi_4) 78084615Snyan BUS_ACCESS_ADDR(ebx,edx) 78184615Snyan cld 78284615Snyan rep 78384615Snyan insl 78484615Snyan ret 78584615Snyan 78684615Snyan/* 78784615Snyan * write_multi_N 78884615Snyan * IN: ecx COUNT 78984615Snyan * edx PORT 79084615Snyan * esi BUFP 79184615Snyan */ 79284615SnyanENTRY(SBUS_RA_io_space_write_multi_1) 79384615Snyan BUS_ACCESS_ADDR(ebx,edx) 79484615Snyan cld 79584615Snyan rep 79684615Snyan outsb 79784615Snyan ret 79884615Snyan 79984615SnyanENTRY(SBUS_RA_io_space_write_multi_2) 80084615Snyan BUS_ACCESS_ADDR(ebx,edx) 80184615Snyan cld 80284615Snyan rep 80384615Snyan outsw 80484615Snyan ret 80584615Snyan 80684615SnyanENTRY(SBUS_RA_io_space_write_multi_4) 80784615Snyan BUS_ACCESS_ADDR(ebx,edx) 80884615Snyan cld 80984615Snyan rep 81084615Snyan outsl 81184615Snyan ret 81284615Snyan 81384615Snyan/* 81484615Snyan * read_region_N 81584615Snyan * IN: ecx COUNT 81684615Snyan * edx PORT 81784615Snyan * edi BUFP 81884615Snyan */ 81984615SnyanENTRY(SBUS_RA_io_space_read_region_1) 82084615Snyan cld 82184615Snyan pushl %eax 822104775Snyan pushl %esi 82384615Snyan orl %ecx,%ecx 82484615Snyan jz 2f 825104775Snyan movl %edx,%esi 82684615Snyan1: 827104775Snyan BUS_ACCESS_ADDR2(ebx,esi,edx) 82884615Snyan inb %dx,%al 82984615Snyan stosb 830104775Snyan incl %esi 83184615Snyan decl %ecx 83284615Snyan jnz 1b 83384615Snyan2: 834104775Snyan popl %esi 83584615Snyan popl %eax 83684615Snyan ret 83784615Snyan 83884615SnyanENTRY(SBUS_RA_io_space_read_region_2) 83984615Snyan cld 84084615Snyan pushl %eax 841104775Snyan pushl %esi 84284615Snyan orl %ecx,%ecx 84384615Snyan jz 2f 844104775Snyan movl %edx,%esi 84584615Snyan1: 846104775Snyan BUS_ACCESS_ADDR2(ebx,esi,edx) 84784615Snyan inw %dx,%ax 84884615Snyan stosw 849104775Snyan addl $2,%esi 85084615Snyan decl %ecx 85184615Snyan jnz 1b 85284615Snyan2: 853104775Snyan popl %esi 85484615Snyan popl %eax 85584615Snyan ret 85684615Snyan 85784615SnyanENTRY(SBUS_RA_io_space_read_region_4) 85884615Snyan cld 85984615Snyan pushl %eax 860104775Snyan pushl %esi 86184615Snyan orl %ecx,%ecx 86284615Snyan jz 2f 863104775Snyan movl %edx,%esi 86484615Snyan1: 865104775Snyan BUS_ACCESS_ADDR2(ebx,esi,edx) 86684615Snyan inl %dx,%eax 86784615Snyan stosl 868104775Snyan addl $4,%esi 86984615Snyan decl %ecx 87084615Snyan jnz 1b 87184615Snyan2: 872104775Snyan popl %esi 87384615Snyan popl %eax 87484615Snyan ret 87584615Snyan 87684615Snyan/* 87784615Snyan * write_region_N 87884615Snyan * IN: ecx COUNT 87984615Snyan * edx PORT 88084615Snyan * esi BUFP 88184615Snyan */ 88284615SnyanENTRY(SBUS_RA_io_space_write_region_1) 88384615Snyan cld 88484615Snyan pushl %eax 885104775Snyan pushl %edi 88684615Snyan orl %ecx,%ecx 88784615Snyan jz 2f 888104775Snyan movl %edx,%edi 88984615Snyan1: 890104775Snyan BUS_ACCESS_ADDR2(ebx,edi,edx) 89184615Snyan lodsb 89284615Snyan outb %al,%dx 893104775Snyan incl %edi 89484615Snyan decl %ecx 89584615Snyan jnz 1b 89684615Snyan2: 897104775Snyan popl %edi 89884615Snyan popl %eax 89984615Snyan ret 90084615Snyan 90184615SnyanENTRY(SBUS_RA_io_space_write_region_2) 90284615Snyan cld 90384615Snyan pushl %eax 904104775Snyan pushl %edi 90584615Snyan orl %ecx,%ecx 90684615Snyan jz 2f 907104775Snyan movl %edx,%edi 90884615Snyan1: 909104775Snyan BUS_ACCESS_ADDR2(ebx,edi,edx) 91084615Snyan lodsw 91184615Snyan outw %ax,%dx 912104775Snyan addl $2,%edi 91384615Snyan decl %ecx 91484615Snyan jnz 1b 91584615Snyan2: 916104775Snyan popl %edi 91784615Snyan popl %eax 91884615Snyan ret 91984615Snyan 92084615SnyanENTRY(SBUS_RA_io_space_write_region_4) 92184615Snyan cld 92284615Snyan pushl %eax 923104775Snyan pushl %edi 92484615Snyan orl %ecx,%ecx 92584615Snyan jz 2f 926104775Snyan movl %edx,%edi 92784615Snyan1: 928104775Snyan BUS_ACCESS_ADDR2(ebx,edi,edx) 92984615Snyan lodsl 93084615Snyan outl %eax,%dx 931104775Snyan addl $4,%edi 93284615Snyan decl %ecx 93384615Snyan jnz 1b 93484615Snyan2: 935104775Snyan popl %edi 93684615Snyan popl %eax 93784615Snyan ret 93884615Snyan 93984615Snyan/* 94084615Snyan * set_multi_N 94184615Snyan * IN: eax DATA 94284615Snyan * ecx COUNT 94384615Snyan * edx PORT 94484615Snyan */ 94584615SnyanENTRY(SBUS_RA_io_space_set_multi_1) 94684615Snyan BUS_ACCESS_ADDR(ebx,edx) 94784615Snyan orl %ecx,%ecx 94884615Snyan jz 2f 94984615Snyan1: 95084615Snyan outb %al,%dx 95184615Snyan decl %ecx 95284615Snyan jnz 1b 95384615Snyan2: 95484615Snyan ret 95584615Snyan 95684615SnyanENTRY(SBUS_RA_io_space_set_multi_2) 95784615Snyan BUS_ACCESS_ADDR(ebx,edx) 95884615Snyan orl %ecx,%ecx 95984615Snyan jz 2f 96084615Snyan1: 96184615Snyan outw %ax,%dx 96284615Snyan decl %ecx 96384615Snyan jnz 1b 96484615Snyan2: 96584615Snyan ret 96684615Snyan 96784615SnyanENTRY(SBUS_RA_io_space_set_multi_4) 96884615Snyan BUS_ACCESS_ADDR(ebx,edx) 96984615Snyan orl %ecx,%ecx 97084615Snyan jz 2f 97184615Snyan1: 97284615Snyan outl %eax,%dx 97384615Snyan decl %ecx 97484615Snyan jnz 1b 97584615Snyan2: 97684615Snyan ret 97784615Snyan 97884615Snyan/* 97984615Snyan * set_region_N 98084615Snyan * IN: eax DATA 98184615Snyan * ecx COUNT 98284615Snyan * edx PORT 98384615Snyan */ 98484615SnyanENTRY(SBUS_RA_io_space_set_region_1) 985104775Snyan pushl %edi 98684615Snyan orl %ecx,%ecx 98784615Snyan jz 2f 988104775Snyan movl %edx,%edi 98984615Snyan1: 990104775Snyan BUS_ACCESS_ADDR2(ebx,edi,edx) 99184615Snyan outb %al,%dx 992104775Snyan incl %edi 99384615Snyan decl %ecx 99484615Snyan jnz 1b 99584615Snyan2: 996104775Snyan popl %edi 99784615Snyan ret 99884615Snyan 99984615SnyanENTRY(SBUS_RA_io_space_set_region_2) 1000104775Snyan pushl %edi 100184615Snyan orl %ecx,%ecx 100284615Snyan jz 2f 1003104775Snyan movl %edx,%edi 100484615Snyan1: 1005104775Snyan BUS_ACCESS_ADDR2(ebx,edi,edx) 100684615Snyan outw %ax,%dx 1007104775Snyan addl $2,%edi 100884615Snyan decl %ecx 100984615Snyan jnz 1b 101084615Snyan2: 1011104775Snyan popl %edi 101284615Snyan ret 101384615Snyan 101484615SnyanENTRY(SBUS_RA_io_space_set_region_4) 1015104775Snyan pushl %edi 101684615Snyan orl %ecx,%ecx 101784615Snyan jz 2f 1018104775Snyan movl %edx,%edi 101984615Snyan1: 1020104775Snyan BUS_ACCESS_ADDR2(ebx,edi,edx) 102184615Snyan outl %eax,%dx 1022104775Snyan addl $4,%edi 102384615Snyan decl %ecx 102484615Snyan jnz 1b 102584615Snyan2: 1026104775Snyan popl %edi 102784615Snyan ret 102884615Snyan 102984615Snyan/* 103084615Snyan * copy_region_N 103184615Snyan * IN: ecx COUNT 103284615Snyan * esi SPORT 103384615Snyan * edi DPORT 103484615Snyan */ 103584615SnyanENTRY(SBUS_RA_io_space_copy_region_1) 103684615Snyan pushl %eax 103784615Snyan pushl %edx 103884615Snyan orl %ecx,%ecx 103984615Snyan jz 2f 104084615Snyan1: 1041104775Snyan BUS_ACCESS_ADDR2(ebx,esi,edx) 104284615Snyan inb %dx,%al 104384615Snyan incl %esi 104484615Snyan 1045104775Snyan BUS_ACCESS_ADDR2(ebx,edi,edx) 104684615Snyan outb %al,%dx 104784615Snyan incl %edi 104884615Snyan 104984615Snyan decl %ecx 105084615Snyan jnz 1b 105184615Snyan2: 105284615Snyan popl %edx 105384615Snyan popl %eax 105484615Snyan ret 105584615Snyan 105684615SnyanENTRY(SBUS_RA_io_space_copy_region_2) 105784615Snyan pushl %eax 105884615Snyan pushl %edx 105984615Snyan orl %ecx,%ecx 106084615Snyan jz 2f 106184615Snyan1: 1062104775Snyan BUS_ACCESS_ADDR2(ebx,esi,edx) 106384615Snyan inw %dx,%ax 106484615Snyan addl $2,%esi 106584615Snyan 1066104775Snyan BUS_ACCESS_ADDR2(ebx,edi,edx) 106784615Snyan outw %ax,%dx 106884615Snyan addl $2,%edi 106984615Snyan 107084615Snyan decl %ecx 107184615Snyan jnz 1b 107284615Snyan2: 107384615Snyan popl %edx 107484615Snyan popl %eax 107584615Snyan ret 107684615Snyan 107784615SnyanENTRY(SBUS_RA_io_space_copy_region_4) 107884615Snyan pushl %eax 107984615Snyan pushl %edx 108084615Snyan orl %ecx,%ecx 108184615Snyan jz 2f 108284615Snyan1: 1083104775Snyan BUS_ACCESS_ADDR2(ebx,esi,edx) 108484615Snyan inl %dx,%eax 108584615Snyan addl $4,%esi 108684615Snyan 1087104775Snyan BUS_ACCESS_ADDR2(ebx,edi,edx) 108884615Snyan outl %eax,%dx 108984615Snyan addl $4,%edi 109084615Snyan 109184615Snyan decl %ecx 109284615Snyan jnz 1b 109384615Snyan2: 109484615Snyan popl %edx 109584615Snyan popl %eax 109684615Snyan ret 109784615Snyan 109884615Snyan/*********************************************************** 109984615Snyan * Bus Memory access methods 110084615Snyan ***********************************************************/ 110184615Snyan/* 110284615Snyan * read_N 110384615Snyan */ 110484615SnyanENTRY(SBUS_RA_mem_space_read_1) 110584615Snyan BUS_ACCESS_ADDR(ebx,edx) 110684615Snyan movb (%edx),%al 110784615Snyan ret 110884615Snyan 110984615SnyanENTRY(SBUS_RA_mem_space_read_2) 111084615Snyan BUS_ACCESS_ADDR(ebx,edx) 111184615Snyan movw (%edx),%ax 111284615Snyan ret 111384615Snyan 111484615SnyanENTRY(SBUS_RA_mem_space_read_4) 111584615Snyan BUS_ACCESS_ADDR(ebx,edx) 111684615Snyan movl (%edx),%eax 111784615Snyan ret 111884615Snyan 111984615Snyan/* 112084615Snyan * write_N 112184615Snyan */ 112284615SnyanENTRY(SBUS_RA_mem_space_write_1) 112384615Snyan BUS_ACCESS_ADDR(ebx,edx) 112484615Snyan movb %al,(%edx) 112584615Snyan ret 112684615Snyan 112784615SnyanENTRY(SBUS_RA_mem_space_write_2) 112884615Snyan BUS_ACCESS_ADDR(ebx,edx) 112984615Snyan movw %ax,(%edx) 113084615Snyan ret 113184615Snyan 113284615SnyanENTRY(SBUS_RA_mem_space_write_4) 113384615Snyan BUS_ACCESS_ADDR(ebx,edx) 113484615Snyan movl %eax,(%edx) 113584615Snyan ret 113684615Snyan 113784615Snyan/* 113884615Snyan * read_multi_N 113984615Snyan */ 114084615SnyanENTRY(SBUS_RA_mem_space_read_multi_1) 114184615Snyan BUS_ACCESS_ADDR(ebx,edx) 114284615Snyan cld 114384615Snyan pushl %eax 114484615Snyan orl %ecx,%ecx 114584615Snyan jz 2f 114684615Snyan1: 114784615Snyan movb (%edx),%al 114884615Snyan stosb 114984615Snyan decl %ecx 115084615Snyan jnz 1b 115184615Snyan2: 115284615Snyan popl %eax 115384615Snyan ret 115484615Snyan 115584615SnyanENTRY(SBUS_RA_mem_space_read_multi_2) 115684615Snyan BUS_ACCESS_ADDR(ebx,edx) 115784615Snyan cld 115884615Snyan pushl %eax 115984615Snyan orl %ecx,%ecx 116084615Snyan jz 2f 116184615Snyan1: 116284615Snyan movw (%edx),%ax 116384615Snyan stosw 116484615Snyan decl %ecx 116584615Snyan jnz 1b 116684615Snyan2: 116784615Snyan popl %eax 116884615Snyan ret 116984615Snyan 117084615SnyanENTRY(SBUS_RA_mem_space_read_multi_4) 117184615Snyan BUS_ACCESS_ADDR(ebx,edx) 117284615Snyan cld 117384615Snyan pushl %eax 117484615Snyan orl %ecx,%ecx 117584615Snyan jz 2f 117684615Snyan1: 117784615Snyan movl (%edx),%eax 117884615Snyan stosl 117984615Snyan decl %ecx 118084615Snyan jnz 1b 118184615Snyan2: 118284615Snyan popl %eax 118384615Snyan ret 118484615Snyan 118584615Snyan/* 118684615Snyan * write_multi_N 118784615Snyan */ 118884615SnyanENTRY(SBUS_RA_mem_space_write_multi_1) 118984615Snyan BUS_ACCESS_ADDR(ebx,edx) 119084615Snyan cld 119184615Snyan pushl %eax 119284615Snyan orl %ecx,%ecx 119384615Snyan jz 2f 119484615Snyan1: 119584615Snyan lodsb 119684615Snyan movb %al,(%edx) 119784615Snyan decl %ecx 119884615Snyan jnz 1b 119984615Snyan2: 120084615Snyan popl %eax 120184615Snyan ret 120284615Snyan 120384615SnyanENTRY(SBUS_RA_mem_space_write_multi_2) 120484615Snyan BUS_ACCESS_ADDR(ebx,edx) 120584615Snyan cld 120684615Snyan pushl %eax 120784615Snyan orl %ecx,%ecx 120884615Snyan jz 2f 120984615Snyan1: 121084615Snyan lodsw 121184615Snyan movw %ax,(%edx) 121284615Snyan decl %ecx 121384615Snyan jnz 1b 121484615Snyan2: 121584615Snyan popl %eax 121684615Snyan ret 121784615Snyan 121884615SnyanENTRY(SBUS_RA_mem_space_write_multi_4) 121984615Snyan BUS_ACCESS_ADDR(ebx,edx) 122084615Snyan cld 122184615Snyan pushl %eax 122284615Snyan orl %ecx,%ecx 122384615Snyan jz 2f 122484615Snyan1: 122584615Snyan lodsl 122684615Snyan movl %eax,(%edx) 122784615Snyan decl %ecx 122884615Snyan jnz 1b 122984615Snyan2: 123084615Snyan popl %eax 123184615Snyan ret 123284615Snyan 123384615Snyan/* 123484615Snyan * read_region_N 123584615Snyan */ 123684615SnyanENTRY(SBUS_RA_mem_space_read_region_1) 123784615Snyan cld 123884615Snyan pushl %esi 1239104775Snyan orl %ecx,%ecx 1240104775Snyan jz 2f 1241104775Snyan1: 1242104775Snyan BUS_ACCESS_ADDR2(ebx,edx,esi) 124384615Snyan movsb 1244104775Snyan incl %edx 1245104775Snyan decl %ecx 1246104775Snyan jnz 1b 1247104775Snyan2: 124884615Snyan popl %esi 124984615Snyan ret 125084615Snyan 125184615SnyanENTRY(SBUS_RA_mem_space_read_region_2) 125284615Snyan cld 125384615Snyan pushl %esi 1254104775Snyan orl %ecx,%ecx 1255104775Snyan jz 2f 1256104775Snyan1: 1257104775Snyan BUS_ACCESS_ADDR2(ebx,edx,esi) 125884615Snyan movsw 1259104775Snyan addl $2,%edx 1260104775Snyan decl %ecx 1261104775Snyan jnz 1b 1262104775Snyan2: 126384615Snyan popl %esi 126484615Snyan ret 126584615Snyan 126684615SnyanENTRY(SBUS_RA_mem_space_read_region_4) 126784615Snyan cld 126884615Snyan pushl %esi 1269104775Snyan orl %ecx,%ecx 1270104775Snyan jz 2f 1271104775Snyan1: 1272104775Snyan BUS_ACCESS_ADDR2(ebx,edx,esi) 127384615Snyan movsl 1274104775Snyan addl $4,%edx 1275104775Snyan decl %ecx 1276104775Snyan jnz 1b 1277104775Snyan2: 127884615Snyan popl %esi 127984615Snyan ret 128084615Snyan 128184615Snyan/* 128284615Snyan * write_region_N 128384615Snyan */ 128484615SnyanENTRY(SBUS_RA_mem_space_write_region_1) 128584615Snyan cld 128684615Snyan pushl %edi 1287104775Snyan orl %ecx,%ecx 1288104775Snyan jz 2f 1289104775Snyan1: 1290104775Snyan BUS_ACCESS_ADDR2(ebx,edx,edi) 129184615Snyan movsb 1292104775Snyan incl %edx 1293104775Snyan decl %ecx 1294104775Snyan jnz 1b 1295104775Snyan2: 129684615Snyan popl %edi 129784615Snyan ret 129884615Snyan 129984615SnyanENTRY(SBUS_RA_mem_space_write_region_2) 130084615Snyan cld 130184615Snyan pushl %edi 1302104775Snyan orl %ecx,%ecx 1303104775Snyan jz 2f 1304104775Snyan1: 1305104775Snyan BUS_ACCESS_ADDR2(ebx,edx,edi) 130684615Snyan movsw 1307104775Snyan addl $2,%edx 1308104775Snyan decl %ecx 1309104775Snyan jnz 1b 1310104775Snyan2: 131184615Snyan popl %edi 131284615Snyan ret 131384615Snyan 131484615SnyanENTRY(SBUS_RA_mem_space_write_region_4) 131584615Snyan cld 131684615Snyan pushl %edi 1317104775Snyan orl %ecx,%ecx 1318104775Snyan jz 2f 1319104775Snyan1: 1320104775Snyan BUS_ACCESS_ADDR2(ebx,edx,edi) 132184615Snyan movsl 1322104775Snyan addl $4,%edx 1323104775Snyan decl %ecx 1324104775Snyan jnz 1b 1325104775Snyan2: 132684615Snyan popl %edi 132784615Snyan ret 132884615Snyan 132984615Snyan/* 133084615Snyan * set_multi_N 133184615Snyan */ 133284615SnyanENTRY(SBUS_RA_mem_space_set_multi_1) 133384615Snyan BUS_ACCESS_ADDR(ebx,edx) 133484615Snyan orl %ecx,%ecx 133584615Snyan jz 2f 133684615Snyan1: 133784615Snyan movb %al,(%edx) 133884615Snyan decl %ecx 133984615Snyan jnz 1b 134084615Snyan2: 134184615Snyan ret 134284615Snyan 134384615SnyanENTRY(SBUS_RA_mem_space_set_multi_2) 134484615Snyan BUS_ACCESS_ADDR(ebx,edx) 134584615Snyan orl %ecx,%ecx 134684615Snyan jz 2f 134784615Snyan1: 134884615Snyan movw %ax,(%edx) 134984615Snyan decl %ecx 135084615Snyan jnz 1b 135184615Snyan2: 135284615Snyan ret 135384615Snyan 135484615SnyanENTRY(SBUS_RA_mem_space_set_multi_4) 135584615Snyan BUS_ACCESS_ADDR(ebx,edx) 135684615Snyan orl %ecx,%ecx 135784615Snyan jz 2f 135884615Snyan1: 135984615Snyan movl %eax,(%edx) 136084615Snyan decl %ecx 136184615Snyan jnz 1b 136284615Snyan2: 136384615Snyan ret 136484615Snyan 136584615Snyan/* 136684615Snyan * set_region_N 136784615Snyan */ 136884615SnyanENTRY(SBUS_RA_mem_space_set_region_1) 136984615Snyan cld 137084615Snyan pushl %edi 1371104775Snyan orl %ecx,%ecx 1372104775Snyan jz 2f 1373104775Snyan1: 1374104775Snyan BUS_ACCESS_ADDR2(ebx,edx,edi) 137584615Snyan stosb 1376104775Snyan incl %edx 1377104775Snyan decl %ecx 1378104775Snyan jnz 1b 1379104775Snyan2: 138084615Snyan popl %edi 138184615Snyan ret 138284615Snyan 138384615SnyanENTRY(SBUS_RA_mem_space_set_region_2) 138484615Snyan cld 138584615Snyan pushl %edi 1386104775Snyan orl %ecx,%ecx 1387104775Snyan jz 2f 1388104775Snyan1: 1389104775Snyan BUS_ACCESS_ADDR2(ebx,edx,edi) 139084615Snyan stosw 1391104775Snyan addl $2,%edx 1392104775Snyan decl %ecx 1393104775Snyan jnz 1b 1394104775Snyan2: 139584615Snyan popl %edi 139684615Snyan ret 139784615Snyan 139884615SnyanENTRY(SBUS_RA_mem_space_set_region_4) 139984615Snyan cld 140084615Snyan pushl %edi 1401104775Snyan orl %ecx,%ecx 1402104775Snyan jz 2f 1403104775Snyan1: 1404104775Snyan BUS_ACCESS_ADDR2(ebx,edx,edi) 140584615Snyan stosl 1406104775Snyan addl $4,%edx 1407104775Snyan decl %ecx 1408104775Snyan jnz 1b 1409104775Snyan2: 141084615Snyan popl %edi 141184615Snyan ret 141284615Snyan 141384615Snyan/* 141484615Snyan * copy_region_N 141584615Snyan */ 141684615SnyanENTRY(SBUS_RA_mem_space_copy_region_1) 1417104775Snyan cld 1418104775Snyan orl %ecx,%ecx 1419104775Snyan jz 2f 1420104775Snyan1: 1421104775Snyan pushl %esi 1422104775Snyan pushl %edi 142384615Snyan BUS_ACCESS_ADDR(eax,esi) 142484615Snyan BUS_ACCESS_ADDR(ebx,edi) 142584615Snyan movsb 1426104775Snyan popl %edi 1427104775Snyan popl %esi 1428104775Snyan incl %esi 1429104775Snyan incl %edi 1430104775Snyan decl %ecx 1431104775Snyan jnz 1b 1432104775Snyan2: 143384615Snyan ret 1434104775Snyan 143584615SnyanENTRY(SBUS_RA_mem_space_copy_region_2) 1436104775Snyan cld 1437104775Snyan orl %ecx,%ecx 1438104775Snyan jz 2f 1439104775Snyan1: 1440104775Snyan pushl %esi 1441104775Snyan pushl %edi 144284615Snyan BUS_ACCESS_ADDR(eax,esi) 144384615Snyan BUS_ACCESS_ADDR(ebx,edi) 144484615Snyan movsw 1445104775Snyan popl %edi 1446104775Snyan popl %esi 1447104775Snyan addl $2,%esi 1448104775Snyan addl $2,%edi 1449104775Snyan decl %ecx 1450104775Snyan jnz 1b 1451104775Snyan2: 145284615Snyan ret 145384615Snyan 145484615SnyanENTRY(SBUS_RA_mem_space_copy_region_4) 1455104775Snyan cld 1456104775Snyan orl %ecx,%ecx 1457104775Snyan jz 2f 1458104775Snyan1: 1459104775Snyan pushl %esi 1460104775Snyan pushl %edi 146184615Snyan BUS_ACCESS_ADDR(eax,esi) 146284615Snyan BUS_ACCESS_ADDR(ebx,edi) 146384615Snyan movsl 1464104775Snyan popl %edi 1465104775Snyan popl %esi 1466104775Snyan addl $4,%esi 1467104775Snyan addl $4,%edi 1468104775Snyan decl %ecx 1469104775Snyan jnz 1b 1470104775Snyan2: 147184615Snyan ret 147284615Snyan 147384615Snyan#undef BUS_ACCESS_ADDR 1474104775Snyan#undef BUS_ACCESS_ADDR2 147584615Snyan 147684615Snyan 147784615Snyan#include "opt_mecia.h" 147884615Snyan#ifdef DEV_MECIA 147984615Snyan 148084615Snyan/*********************************************************** 148184615Snyan * NEPC pcmcia 16 bits bus access 148284615Snyan ***********************************************************/ 148384615Snyan#define NEPC_SWITCH_BUS16 \ 148484615Snyan pushl %ebp ;\ 148584615Snyan pushl %eax ;\ 148684615Snyan pushl %edx ;\ 148784615Snyan movl $0x2a8e,%edx ;\ 148884615Snyan inb %dx,%al ;\ 148984615Snyan movl %eax,%ebp ;\ 149084615Snyan andl $~0x20,%eax ;\ 149184615Snyan outb %al,%dx ;\ 149284615Snyan popl %edx ;\ 149384615Snyan popl %eax 149484615Snyan 149584615Snyan#define NEPC_BUS_RESTORE \ 149684615Snyan pushl %eax ;\ 149784615Snyan movl %ebp,%eax ;\ 149884615Snyan xchgl %edx,%ebp ;\ 149984615Snyan movl $0x2a8e,%edx ;\ 150084615Snyan outb %al,%dx ;\ 150184615Snyan xchgl %ebp,%edx ;\ 150284615Snyan popl %eax ;\ 150384615Snyan popl %ebp 150484615Snyan 150584615Snyan/*********************************************************** 150684615Snyan * NEPC pcmcia 16 bits bus acces (Direct Access) 150784615Snyan ***********************************************************/ 150884615Snyan#define BUS_ACCESS_ADDR(BSHREG,ADDRREG) \ 150984615Snyan addl BUS_SPACE_HANDLE_BASE/**/(%/**/BSHREG/**/),%/**/ADDRREG 151084615Snyan 151184615SnyanENTRY(NEPC_DA_io_space_read_2) 151284615Snyan BUS_ACCESS_ADDR(ebx,edx) 151384615Snyan NEPC_SWITCH_BUS16 151484615Snyan inw %dx,%ax 151584615Snyan NEPC_BUS_RESTORE 151684615Snyan ret 151784615Snyan 151884615Snyan 151984615SnyanENTRY(NEPC_DA_io_space_write_2) 152084615Snyan BUS_ACCESS_ADDR(ebx,edx) 152184615Snyan NEPC_SWITCH_BUS16 152284615Snyan outw %ax,%dx 152384615Snyan NEPC_BUS_RESTORE 152484615Snyan ret 152584615Snyan 152684615SnyanENTRY(NEPC_DA_io_space_read_multi_2) 152784615Snyan BUS_ACCESS_ADDR(ebx,edx) 152884615Snyan NEPC_SWITCH_BUS16 152984615Snyan cld 153084615Snyan rep 153184615Snyan insw 153284615Snyan NEPC_BUS_RESTORE 153384615Snyan ret 153484615Snyan 153584615SnyanENTRY(NEPC_DA_io_space_write_multi_2) 153684615Snyan BUS_ACCESS_ADDR(ebx,edx) 153784615Snyan NEPC_SWITCH_BUS16 153884615Snyan cld 153984615Snyan rep 154084615Snyan outsw 154184615Snyan NEPC_BUS_RESTORE 154284615Snyan ret 154384615Snyan 154484615SnyanENTRY(NEPC_DA_io_space_read_region_2) 154584615Snyan NEPC_SWITCH_BUS16 154684615Snyan call SBUS_DA_io_space_read_region_2 154784615Snyan NEPC_BUS_RESTORE 154884615Snyan ret 154984615Snyan 155084615SnyanENTRY(NEPC_DA_io_space_write_region_2) 155184615Snyan NEPC_SWITCH_BUS16 155284615Snyan call SBUS_DA_io_space_write_region_2 155384615Snyan NEPC_BUS_RESTORE 155484615Snyan ret 155584615Snyan 155684615SnyanENTRY(NEPC_DA_io_space_set_multi_2) 155784615Snyan NEPC_SWITCH_BUS16 155884615Snyan call SBUS_DA_io_space_set_multi_2 155984615Snyan NEPC_BUS_RESTORE 156084615Snyan ret 156184615Snyan 156284615Snyan 156384615SnyanENTRY(NEPC_DA_io_space_set_region_2) 156484615Snyan NEPC_SWITCH_BUS16 156584615Snyan call SBUS_DA_io_space_set_region_2 156684615Snyan NEPC_BUS_RESTORE 156784615Snyan ret 156884615Snyan 156984615SnyanENTRY(NEPC_DA_io_space_copy_region_2) 157084615Snyan NEPC_SWITCH_BUS16 157184615Snyan call SBUS_DA_io_space_copy_region_2 157284615Snyan NEPC_BUS_RESTORE 157384615Snyan ret 157484615Snyan 157584615SnyanENTRY(NEPC_DA_io_space_read_4) 157684615Snyan BUS_ACCESS_ADDR(ebx,edx) 157784615Snyan NEPC_SWITCH_BUS16 157884615Snyan inl %dx,%eax 157984615Snyan NEPC_BUS_RESTORE 158084615Snyan ret 158184615Snyan 158284615SnyanENTRY(NEPC_DA_io_space_write_4) 158384615Snyan BUS_ACCESS_ADDR(ebx,edx) 158484615Snyan NEPC_SWITCH_BUS16 158584615Snyan outl %eax,%dx 158684615Snyan NEPC_BUS_RESTORE 158784615Snyan ret 158884615Snyan 158984615SnyanENTRY(NEPC_DA_io_space_read_multi_4) 159084615Snyan BUS_ACCESS_ADDR(ebx,edx) 159184615Snyan NEPC_SWITCH_BUS16 159284615Snyan cld 159384615Snyan rep 159484615Snyan insl 159584615Snyan NEPC_BUS_RESTORE 159684615Snyan ret 159784615Snyan 159884615SnyanENTRY(NEPC_DA_io_space_write_multi_4) 159984615Snyan BUS_ACCESS_ADDR(ebx,edx) 160084615Snyan NEPC_SWITCH_BUS16 160184615Snyan cld 160284615Snyan rep 160384615Snyan outsl 160484615Snyan NEPC_BUS_RESTORE 160584615Snyan ret 160684615Snyan 160784615SnyanENTRY(NEPC_DA_io_space_read_region_4) 160884615Snyan NEPC_SWITCH_BUS16 160984615Snyan call SBUS_DA_io_space_read_region_4 161084615Snyan NEPC_BUS_RESTORE 161184615Snyan ret 161284615Snyan 161384615SnyanENTRY(NEPC_DA_io_space_write_region_4) 161484615Snyan NEPC_SWITCH_BUS16 161584615Snyan call SBUS_DA_io_space_write_region_4 161684615Snyan NEPC_BUS_RESTORE 161784615Snyan ret 161884615Snyan 161984615SnyanENTRY(NEPC_DA_io_space_set_multi_4) 162084615Snyan NEPC_SWITCH_BUS16 162184615Snyan call SBUS_DA_io_space_set_multi_4 162284615Snyan NEPC_BUS_RESTORE 162384615Snyan ret 162484615Snyan 162584615Snyan 162684615SnyanENTRY(NEPC_DA_io_space_set_region_4) 162784615Snyan NEPC_SWITCH_BUS16 162884615Snyan call SBUS_DA_io_space_set_region_4 162984615Snyan NEPC_BUS_RESTORE 163084615Snyan ret 163184615Snyan 163284615SnyanENTRY(NEPC_DA_io_space_copy_region_4) 163384615Snyan NEPC_SWITCH_BUS16 163484615Snyan call SBUS_DA_io_space_copy_region_4 163584615Snyan NEPC_BUS_RESTORE 163684615Snyan ret 163784615Snyan 163884615Snyan#undef BUS_ACCESS_ADDR 163984615Snyan 164084615Snyan/*********************************************************** 164184615Snyan * NEPC pcmcia 16 bits bus acces (Relocate Access) 164284615Snyan ***********************************************************/ 164384615Snyan#define BUS_ACCESS_ADDR(BSHREG,ADDRREG) \ 164484615Snyan movl BUS_SPACE_HANDLE_IAT/**/(%/**/BSHREG/**/, %/**/ADDRREG/**/, 4), \ 164584615Snyan %/**/ADDRREG 164684615Snyan 164784615SnyanENTRY(NEPC_RA_io_space_read_2) 164884615Snyan BUS_ACCESS_ADDR(ebx,edx) 164984615Snyan NEPC_SWITCH_BUS16 165084615Snyan inw %dx,%ax 165184615Snyan NEPC_BUS_RESTORE 165284615Snyan ret 165384615Snyan 165484615Snyan 165584615SnyanENTRY(NEPC_RA_io_space_write_2) 165684615Snyan BUS_ACCESS_ADDR(ebx,edx) 165784615Snyan NEPC_SWITCH_BUS16 165884615Snyan outw %ax,%dx 165984615Snyan NEPC_BUS_RESTORE 166084615Snyan ret 166184615Snyan 166284615SnyanENTRY(NEPC_RA_io_space_read_multi_2) 166384615Snyan BUS_ACCESS_ADDR(ebx,edx) 166484615Snyan NEPC_SWITCH_BUS16 166584615Snyan cld 166684615Snyan rep 166784615Snyan insw 166884615Snyan NEPC_BUS_RESTORE 166984615Snyan ret 167084615Snyan 167184615SnyanENTRY(NEPC_RA_io_space_write_multi_2) 167284615Snyan BUS_ACCESS_ADDR(ebx,edx) 167384615Snyan NEPC_SWITCH_BUS16 167484615Snyan cld 167584615Snyan rep 167684615Snyan outsw 167784615Snyan NEPC_BUS_RESTORE 167884615Snyan ret 167984615Snyan 168084615SnyanENTRY(NEPC_RA_io_space_read_region_2) 168184615Snyan NEPC_SWITCH_BUS16 168284615Snyan call SBUS_RA_io_space_read_region_2 168384615Snyan NEPC_BUS_RESTORE 168484615Snyan ret 168584615Snyan 168684615SnyanENTRY(NEPC_RA_io_space_write_region_2) 168784615Snyan NEPC_SWITCH_BUS16 168884615Snyan call SBUS_RA_io_space_write_region_2 168984615Snyan NEPC_BUS_RESTORE 169084615Snyan ret 169184615Snyan 169284615SnyanENTRY(NEPC_RA_io_space_set_multi_2) 169384615Snyan NEPC_SWITCH_BUS16 169484615Snyan call SBUS_RA_io_space_set_multi_2 169584615Snyan NEPC_BUS_RESTORE 169684615Snyan ret 169784615Snyan 169884615Snyan 169984615SnyanENTRY(NEPC_RA_io_space_set_region_2) 170084615Snyan NEPC_SWITCH_BUS16 170184615Snyan call SBUS_RA_io_space_set_region_2 170284615Snyan NEPC_BUS_RESTORE 170384615Snyan ret 170484615Snyan 170584615SnyanENTRY(NEPC_RA_io_space_copy_region_2) 170684615Snyan NEPC_SWITCH_BUS16 170784615Snyan call SBUS_RA_io_space_copy_region_2 170884615Snyan NEPC_BUS_RESTORE 170984615Snyan ret 171084615Snyan 171184615SnyanENTRY(NEPC_RA_io_space_read_4) 171284615Snyan BUS_ACCESS_ADDR(ebx,edx) 171384615Snyan NEPC_SWITCH_BUS16 171484615Snyan inl %dx,%eax 171584615Snyan NEPC_BUS_RESTORE 171684615Snyan ret 171784615Snyan 171884615SnyanENTRY(NEPC_RA_io_space_write_4) 171984615Snyan BUS_ACCESS_ADDR(ebx,edx) 172084615Snyan NEPC_SWITCH_BUS16 172184615Snyan outl %eax,%dx 172284615Snyan NEPC_BUS_RESTORE 172384615Snyan ret 172484615Snyan 172584615SnyanENTRY(NEPC_RA_io_space_read_multi_4) 172684615Snyan BUS_ACCESS_ADDR(ebx,edx) 172784615Snyan NEPC_SWITCH_BUS16 172884615Snyan cld 172984615Snyan rep 173084615Snyan insl 173184615Snyan NEPC_BUS_RESTORE 173284615Snyan ret 173384615Snyan 173484615SnyanENTRY(NEPC_RA_io_space_write_multi_4) 173584615Snyan BUS_ACCESS_ADDR(ebx,edx) 173684615Snyan NEPC_SWITCH_BUS16 173784615Snyan cld 173884615Snyan rep 173984615Snyan outsl 174084615Snyan NEPC_BUS_RESTORE 174184615Snyan ret 174284615Snyan 174384615SnyanENTRY(NEPC_RA_io_space_read_region_4) 174484615Snyan NEPC_SWITCH_BUS16 174584615Snyan call SBUS_RA_io_space_read_region_4 174684615Snyan NEPC_BUS_RESTORE 174784615Snyan ret 174884615Snyan 174984615SnyanENTRY(NEPC_RA_io_space_write_region_4) 175084615Snyan NEPC_SWITCH_BUS16 175184615Snyan call SBUS_RA_io_space_write_region_4 175284615Snyan NEPC_BUS_RESTORE 175384615Snyan ret 175484615Snyan 175584615SnyanENTRY(NEPC_RA_io_space_set_multi_4) 175684615Snyan NEPC_SWITCH_BUS16 175784615Snyan call SBUS_RA_io_space_set_multi_4 175884615Snyan NEPC_BUS_RESTORE 175984615Snyan ret 176084615Snyan 176184615Snyan 176284615SnyanENTRY(NEPC_RA_io_space_set_region_4) 176384615Snyan NEPC_SWITCH_BUS16 176484615Snyan call SBUS_RA_io_space_set_region_4 176584615Snyan NEPC_BUS_RESTORE 176684615Snyan ret 176784615Snyan 176884615SnyanENTRY(NEPC_RA_io_space_copy_region_4) 176984615Snyan NEPC_SWITCH_BUS16 177084615Snyan call SBUS_RA_io_space_copy_region_4 177184615Snyan NEPC_BUS_RESTORE 177284615Snyan ret 177384615Snyan 177484615Snyan#endif /* DEV_MECIA */ 1775