summaryrefslogtreecommitdiffstats
path: root/board/MAI/bios_emulator/scitech/src/pm/common/_pcihelp.asm
diff options
context:
space:
mode:
Diffstat (limited to 'board/MAI/bios_emulator/scitech/src/pm/common/_pcihelp.asm')
-rw-r--r--board/MAI/bios_emulator/scitech/src/pm/common/_pcihelp.asm358
1 files changed, 358 insertions, 0 deletions
diff --git a/board/MAI/bios_emulator/scitech/src/pm/common/_pcihelp.asm b/board/MAI/bios_emulator/scitech/src/pm/common/_pcihelp.asm
new file mode 100644
index 0000000000..5b8dbcc73a
--- /dev/null
+++ b/board/MAI/bios_emulator/scitech/src/pm/common/_pcihelp.asm
@@ -0,0 +1,358 @@
+;****************************************************************************
+;*
+;* SciTech OS Portability Manager Library
+;*
+;* ========================================================================
+;*
+;* The contents of this file are subject to the SciTech MGL Public
+;* License Version 1.0 (the "License"); you may not use this file
+;* except in compliance with the License. You may obtain a copy of
+;* the License at http://www.scitechsoft.com/mgl-license.txt
+;*
+;* Software distributed under the License is distributed on an
+;* "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+;* implied. See the License for the specific language governing
+;* rights and limitations under the License.
+;*
+;* The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc.
+;*
+;* The Initial Developer of the Original Code is SciTech Software, Inc.
+;* All Rights Reserved.
+;*
+;* ========================================================================
+;*
+;* Language: 80386 Assembler, TASM 4.0 or NASM
+;* Environment: Any
+;*
+;* Description: Helper assembler functions for PCI access module.
+;*
+;****************************************************************************
+
+ IDEAL
+
+include "scitech.mac" ; Memory model macros
+
+header _pcilib
+
+begcodeseg _pcilib
+
+ifdef flatmodel
+
+;----------------------------------------------------------------------------
+; uchar _ASMAPI _BIOS32_service(
+; ulong service,
+; ulong func,
+; ulong *physBase,
+; ulong *length,
+; ulong *serviceOffset,
+; PCIBIOS_entry entry);
+;----------------------------------------------------------------------------
+; Call the BIOS32 services directory
+;----------------------------------------------------------------------------
+cprocstart _BIOS32_service
+
+ ARG service:ULONG, func:ULONG, physBase:DPTR, len:DPTR, off:DPTR, entry:QWORD
+
+ enter_c
+ mov eax,[service]
+ mov ebx,[func]
+ifdef USE_NASM
+ call far dword [entry]
+else
+ call [FWORD entry]
+endif
+ mov esi,[physBase]
+ mov [esi],ebx
+ mov esi,[len]
+ mov [esi],ecx
+ mov esi,[off]
+ mov [esi],edx
+ leave_c
+ ret
+
+cprocend
+
+endif
+
+;----------------------------------------------------------------------------
+; ushort _ASMAPI _PCIBIOS_isPresent(ulong i_eax,ulong *o_edx,ushort *oeax,
+; uchar *o_cl,PCIBIOS_entry entry)
+;----------------------------------------------------------------------------
+; Call the PCI BIOS to determine if it is present.
+;----------------------------------------------------------------------------
+cprocstart _PCIBIOS_isPresent
+
+ ARG i_eax:ULONG, o_edx:DPTR, oeax:DPTR, o_cl:DPTR, entry:QWORD
+
+ enter_c
+ mov eax,[i_eax]
+ifdef flatmodel
+ifdef USE_NASM
+ call far dword [entry]
+else
+ call [FWORD entry]
+endif
+else
+ int 1Ah
+endif
+ _les _si,[o_edx]
+ mov [_ES _si],edx
+ _les _si,[oeax]
+ mov [_ES _si],ax
+ _les _si,[o_cl]
+ mov [_ES _si],cl
+ mov ax,bx
+ leave_c
+ ret
+
+cprocend
+
+;----------------------------------------------------------------------------
+; ulong _PCIBIOS_service(ulong r_eax,ulong r_ebx,ulong r_edi,ulong r_ecx,
+; PCIBIOS_entry entry)
+;----------------------------------------------------------------------------
+; Call the PCI BIOS services, either via the 32-bit protected mode entry
+; point or via the Int 1Ah 16-bit interrupt.
+;----------------------------------------------------------------------------
+cprocstart _PCIBIOS_service
+
+ ARG r_eax:ULONG, r_ebx:ULONG, r_edi:ULONG, r_ecx:ULONG, entry:QWORD
+
+ enter_c
+ mov eax,[r_eax]
+ mov ebx,[r_ebx]
+ mov edi,[r_edi]
+ mov ecx,[r_ecx]
+ifdef flatmodel
+ifdef USE_NASM
+ call far dword [entry]
+else
+ call [FWORD entry]
+endif
+else
+ int 1Ah
+endif
+ mov eax,ecx
+ifndef flatmodel
+ shld edx,eax,16 ; Return result in DX:AX
+endif
+ leave_c
+ ret
+
+cprocend
+
+;----------------------------------------------------------------------------
+; int _PCIBIOS_getRouting(PCIRoutingOptionsBuffer *buf,PCIBIOS_entry entry);
+;----------------------------------------------------------------------------
+; Get the routing options for PCI devices
+;----------------------------------------------------------------------------
+cprocstart _PCIBIOS_getRouting
+
+ ARG buf:DPTR, entry:QWORD
+
+ enter_c
+ mov eax,0B10Eh
+ mov bx,0
+ _les _di,[buf]
+ifdef flatmodel
+ifdef USE_NASM
+ call far dword [entry]
+else
+ call [FWORD entry]
+endif
+else
+ int 1Ah
+endif
+ movzx eax,ah
+ leave_c
+ ret
+
+cprocend
+
+;----------------------------------------------------------------------------
+; ibool _PCIBIOS_setIRQ(int busDev,int intPin,int IRQ,PCIBIOS_entry entry);
+;----------------------------------------------------------------------------
+; Change the IRQ routing for the PCI device
+;----------------------------------------------------------------------------
+cprocstart _PCIBIOS_setIRQ
+
+ ARG busDev:UINT, intPin:UINT, IRQ:UINT, entry:QWORD
+
+ enter_c
+ mov eax,0B10Fh
+ mov bx,[USHORT busDev]
+ mov cl,[BYTE intPin]
+ mov ch,[BYTE IRQ]
+ifdef flatmodel
+ifdef USE_NASM
+ call far dword [entry]
+else
+ call [FWORD entry]
+endif
+else
+ int 1Ah
+endif
+ mov eax,1
+ jnc @@1
+ xor eax,eax ; Function failed!
+@@1: leave_c
+ ret
+
+cprocend
+
+;----------------------------------------------------------------------------
+; ulong _PCIBIOS_specialCycle(int bus,ulong data,PCIBIOS_entry entry);
+;----------------------------------------------------------------------------
+; Generate a special cycle via the PCI BIOS.
+;----------------------------------------------------------------------------
+cprocstart _PCIBIOS_specialCycle
+
+ ARG bus:UINT, data:ULONG, entry:QWORD
+
+ enter_c
+ mov eax,0B106h
+ mov bh,[BYTE bus]
+ mov ecx,[data]
+ifdef flatmodel
+ifdef USE_NASM
+ call far dword [entry]
+else
+ call [FWORD entry]
+endif
+else
+ int 1Ah
+endif
+ leave_c
+ ret
+
+cprocend
+
+;----------------------------------------------------------------------------
+; ushort _PCI_getCS(void)
+;----------------------------------------------------------------------------
+cprocstart _PCI_getCS
+
+ mov ax,cs
+ ret
+
+cprocend
+
+;----------------------------------------------------------------------------
+; int PM_inpb(int port)
+;----------------------------------------------------------------------------
+; Reads a byte from the specified port
+;----------------------------------------------------------------------------
+cprocstart PM_inpb
+
+ ARG port:UINT
+
+ push _bp
+ mov _bp,_sp
+ xor _ax,_ax
+ mov _dx,[port]
+ in al,dx
+ pop _bp
+ ret
+
+cprocend
+
+;----------------------------------------------------------------------------
+; int PM_inpw(int port)
+;----------------------------------------------------------------------------
+; Reads a word from the specified port
+;----------------------------------------------------------------------------
+cprocstart PM_inpw
+
+ ARG port:UINT
+
+ push _bp
+ mov _bp,_sp
+ xor _ax,_ax
+ mov _dx,[port]
+ in ax,dx
+ pop _bp
+ ret
+
+cprocend
+
+;----------------------------------------------------------------------------
+; ulong PM_inpd(int port)
+;----------------------------------------------------------------------------
+; Reads a word from the specified port
+;----------------------------------------------------------------------------
+cprocstart PM_inpd
+
+ ARG port:UINT
+
+ push _bp
+ mov _bp,_sp
+ mov _dx,[port]
+ in eax,dx
+ifndef flatmodel
+ shld edx,eax,16 ; DX:AX = result
+endif
+ pop _bp
+ ret
+
+cprocend
+
+;----------------------------------------------------------------------------
+; void PM_outpb(int port,int value)
+;----------------------------------------------------------------------------
+; Write a byte to the specified port.
+;----------------------------------------------------------------------------
+cprocstart PM_outpb
+
+ ARG port:UINT, value:UINT
+
+ push _bp
+ mov _bp,_sp
+ mov _dx,[port]
+ mov _ax,[value]
+ out dx,al
+ pop _bp
+ ret
+
+cprocend
+
+;----------------------------------------------------------------------------
+; void PM_outpw(int port,int value)
+;----------------------------------------------------------------------------
+; Write a word to the specified port.
+;----------------------------------------------------------------------------
+cprocstart PM_outpw
+
+ ARG port:UINT, value:UINT
+
+ push _bp
+ mov _bp,_sp
+ mov _dx,[port]
+ mov _ax,[value]
+ out dx,ax
+ pop _bp
+ ret
+
+cprocend
+
+;----------------------------------------------------------------------------
+; void PM_outpd(int port,ulong value)
+;----------------------------------------------------------------------------
+; Write a word to the specified port.
+;----------------------------------------------------------------------------
+cprocstart PM_outpd
+
+ ARG port:UINT, value:ULONG
+
+ push _bp
+ mov _bp,_sp
+ mov _dx,[port]
+ mov eax,[value]
+ out dx,eax
+ pop _bp
+ ret
+
+cprocend
+
+endcodeseg _pcilib
+
+ END
OpenPOWER on IntegriCloud