* Code cleanup:

- remove trailing white space, trailing empty lines, C++ comments, etc.
  - split cmd_boot.c (separate cmd_bdinfo.c and cmd_load.c)

* Patches by Kenneth Johansson, 25 Jun 2003:
  - major rework of command structure
    (work done mostly by Michal Cendrowski and Joakim Kristiansen)
This commit is contained in:
wdenk 2003-06-27 21:31:46 +00:00
parent 993cad9364
commit 8bde7f776c
1246 changed files with 46635 additions and 48962 deletions

View File

@ -1,11 +1,25 @@
====================================================================== ======================================================================
Changes since U-Boot 0.3.1: Changes since U-Boot 0.4.0:
======================================================================
* Code cleanup:
- remove trailing white space, trailing empty lines, C++ comments, etc.
- split cmd_boot.c (separate cmd_bdinfo.c and cmd_load.c)
* Patches by Kenneth Johansson, 25 Jun 2003:
- major rework of command structure
(work done mostly by Michal Cendrowski and Joakim Kristiansen)
======================================================================
Changes for U-Boot 0.4.0:
====================================================================== ======================================================================
* Patches by Robert Schwebel, 26 Jun 2003: * Patches by Robert Schwebel, 26 Jun 2003:
- logdl - csb226 configuration updated
- csb226 - credits for logodl port updated
- innokom - innokom configuration updated
- logodl tree update, still with coding style inconsistencies
- added OCM for ppc405 warning to README
* Patch by Pantelis Antoniou, 25 Jun 2003: * Patch by Pantelis Antoniou, 25 Jun 2003:
update NetVia with V2 board support update NetVia with V2 board support

View File

@ -67,7 +67,7 @@ E: jonathan.debruyne@siemens.atea.be
D: Port to Siemens IAD210 board D: Port to Siemens IAD210 board
N: Ken Chou N: Ken Chou
E: kchou@ieee.org E: kchou@ieee.org
D: Support for A3000 SBC board D: Support for A3000 SBC board
N: Conn Clark N: Conn Clark

10
MAKEALL
View File

@ -45,10 +45,10 @@ LIST_8xx=" \
LIST_4xx=" \ LIST_4xx=" \
ADCIOP AR405 ASH405 BUBINGA405EP \ ADCIOP AR405 ASH405 BUBINGA405EP \
CANBT CPCI405 CPCI4052 CPCI405AB \ CANBT CPCI405 CPCI4052 CPCI405AB \
CPCI440 CPCIISER4 CRAYL1 DASA_SIM \ CPCI440 CPCIISER4 CRAYL1 DASA_SIM \
DU405 EBONY ERIC MIP405 \ DU405 EBONY ERIC MIP405 \
MIP405T ML2 OCRTC ORSG \ MIP405T ML2 OCRTC ORSG \
PCI405 PIP405 PMC405 W7OLMC \ PCI405 PIP405 PMC405 W7OLMC \
W7OLMG WALNUT405 \ W7OLMG WALNUT405 \
" "
@ -58,7 +58,7 @@ LIST_4xx=" \
######################################################################### #########################################################################
LIST_824x=" \ LIST_824x=" \
A3000 BMW CPC45 CU824 \ A3000 BMW CPC45 CU824 \
MOUSSE MUSENKI OXC PN62 \ MOUSSE MUSENKI OXC PN62 \
Sandpoint8240 Sandpoint8245 utx8245 \ Sandpoint8240 Sandpoint8245 utx8245 \
" "

View File

@ -134,7 +134,8 @@ u-boot.dis: u-boot
$(OBJDUMP) -d $< > $@ $(OBJDUMP) -d $< > $@
u-boot: depend subdirs $(OBJS) $(LIBS) $(LDSCRIPT) u-boot: depend subdirs $(OBJS) $(LIBS) $(LDSCRIPT)
$(LD) $(LDFLAGS) $(OBJS) \ UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
$(LD) $(LDFLAGS) $$UNDEF_SYM $(OBJS) \
--start-group $(LIBS) --end-group \ --start-group $(LIBS) --end-group \
-Map u-boot.map -o u-boot -Map u-boot.map -o u-boot
@ -741,7 +742,7 @@ ep7312_config : unconfig
######################################################################### #########################################################################
cradle_config : unconfig cradle_config : unconfig
@./mkconfig $(@:_config=) arm pxa cradle @./mkconfig $(@:_config=) arm pxa cradle
csb226_config : unconfig csb226_config : unconfig
@./mkconfig $(@:_config=) arm pxa csb226 @./mkconfig $(@:_config=) arm pxa csb226

181
README
View File

@ -735,12 +735,12 @@ The following options need to be configured:
(TEAC FD-05PUB). (TEAC FD-05PUB).
- MMC Support: - MMC Support:
The MMC controller on the Intel PXA is supported. To The MMC controller on the Intel PXA is supported. To
enable this define CONFIG_MMC. The MMC can be enable this define CONFIG_MMC. The MMC can be
accessed from the boot prompt by mapping the device accessed from the boot prompt by mapping the device
to physical memory similar to flash. Command line is to physical memory similar to flash. Command line is
enabled with CFG_CMD_MMC. The MMC driver also works with enabled with CFG_CMD_MMC. The MMC driver also works with
the FAT fs. This is enabled with CFG_CMD_FAT. the FAT fs. This is enabled with CFG_CMD_FAT.
- Keyboard Support: - Keyboard Support:
CONFIG_ISA_KEYBOARD CONFIG_ISA_KEYBOARD
@ -782,12 +782,12 @@ The following options need to be configured:
or CONFIG_VIDEO_SED13806_16BPP or CONFIG_VIDEO_SED13806_16BPP
- Keyboard Support: - Keyboard Support:
CONFIG_KEYBOARD CONFIG_KEYBOARD
Define this to enable a custom keyboard support. Define this to enable a custom keyboard support.
This simply calls drv_keyboard_init() which must be This simply calls drv_keyboard_init() which must be
defined in your board-specific files. defined in your board-specific files.
The only board using this so far is RBC823. The only board using this so far is RBC823.
- LCD Support: CONFIG_LCD - LCD Support: CONFIG_LCD
@ -834,14 +834,14 @@ The following options need to be configured:
- Spash Screen Support: CONFIG_SPLASH_SCREEN - Spash Screen Support: CONFIG_SPLASH_SCREEN
If this option is set, the environment is checked for If this option is set, the environment is checked for
a variable "splashimage". If found, the usual display a variable "splashimage". If found, the usual display
of logo, copyright and system information on the LCD of logo, copyright and system information on the LCD
is supressed and the BMP image at the address is supressed and the BMP image at the address
specified in "splashimage" is loaded instead. The specified in "splashimage" is loaded instead. The
console is redirected to the "nulldev", too. This console is redirected to the "nulldev", too. This
allows for a "silent" boot where a splash screen is allows for a "silent" boot where a splash screen is
loaded very quickly after power-on. loaded very quickly after power-on.
- Ethernet address: - Ethernet address:
@ -968,14 +968,14 @@ The following options need to be configured:
CFG_I2C_INIT_BOARD CFG_I2C_INIT_BOARD
When a board is reset during an i2c bus transfer When a board is reset during an i2c bus transfer
chips might think that the current transfer is still chips might think that the current transfer is still
in progress. On some boards it is possible to access in progress. On some boards it is possible to access
the i2c SCLK line directly, either by using the the i2c SCLK line directly, either by using the
processor pin as a GPIO or by having a second pin processor pin as a GPIO or by having a second pin
connected to the bus. If this option is defined a connected to the bus. If this option is defined a
custom i2c_init_board() routine in boards/xxx/board.c custom i2c_init_board() routine in boards/xxx/board.c
is run early in the boot sequence. is run early in the boot sequence.
- SPI Support: CONFIG_SPI - SPI Support: CONFIG_SPI
@ -1006,9 +1006,9 @@ The following options need to be configured:
Used to specify the types of FPGA devices. For Used to specify the types of FPGA devices. For
example, example,
#define CONFIG_FPGA CFG_XILINX_VIRTEX2 #define CONFIG_FPGA CFG_XILINX_VIRTEX2
CFG_FPGA_PROG_FEEDBACK CFG_FPGA_PROG_FEEDBACK
Enable printing of hash marks during FPGA Enable printing of hash marks during FPGA
configuration. configuration.
@ -1054,16 +1054,16 @@ The following options need to be configured:
- FPGA Support: CONFIG_FPGA_COUNT - FPGA Support: CONFIG_FPGA_COUNT
Specify the number of FPGA devices to support. Specify the number of FPGA devices to support.
CONFIG_FPGA CONFIG_FPGA
Used to specify the types of FPGA devices. For example, Used to specify the types of FPGA devices. For example,
#define CONFIG_FPGA CFG_XILINX_VIRTEX2 #define CONFIG_FPGA CFG_XILINX_VIRTEX2
CFG_FPGA_PROG_FEEDBACK CFG_FPGA_PROG_FEEDBACK
Enable printing of hash marks during FPGA configuration. Enable printing of hash marks during FPGA configuration.
CFG_FPGA_CHECK_BUSY CFG_FPGA_CHECK_BUSY
@ -1205,13 +1205,13 @@ The following options need to be configured:
Note: Note:
In the current implementation, the local variables In the current implementation, the local variables
space and global environment variables space are space and global environment variables space are
separated. Local variables are those you define by separated. Local variables are those you define by
simply typing `name=value'. To access a local simply typing `name=value'. To access a local
variable later on, you have write `$name' or variable later on, you have write `$name' or
`${name}'; to execute the contents of a variable `${name}'; to execute the contents of a variable
directly type `$name' at the command prompt. directly type `$name' at the command prompt.
Global environment variables are those you use Global environment variables are those you use
setenv/printenv to work with. To run a command stored setenv/printenv to work with. To run a command stored
@ -1253,9 +1253,9 @@ The following options need to be configured:
- DataFlash Support - DataFlash Support
CONFIG_HAS_DATAFLASH CONFIG_HAS_DATAFLASH
Defining this option enables DataFlash features and Defining this option enables DataFlash features and
allows to read/write in Dataflash via the standard allows to read/write in Dataflash via the standard
commands cp, md... commands cp, md...
- Show boot progress - Show boot progress
CONFIG_SHOW_BOOT_PROGRESS CONFIG_SHOW_BOOT_PROGRESS
@ -1349,8 +1349,6 @@ Modem Support:
See also: doc/README.Modem See also: doc/README.Modem
Configuration Settings: Configuration Settings:
----------------------- -----------------------
@ -1374,16 +1372,16 @@ Configuration Settings:
List of legal baudrate settings for this board. List of legal baudrate settings for this board.
- CFG_CONSOLE_INFO_QUIET - CFG_CONSOLE_INFO_QUIET
Suppress display of console information at boot. Suppress display of console information at boot.
- CFG_CONSOLE_IS_IN_ENV - CFG_CONSOLE_IS_IN_ENV
If the board specific function If the board specific function
extern int overwrite_console (void); extern int overwrite_console (void);
returns 1, the stdin, stderr and stdout are switched to the returns 1, the stdin, stderr and stdout are switched to the
serial port, else the settings in the environment are used. serial port, else the settings in the environment are used.
- CFG_CONSOLE_OVERWRITE_ROUTINE - CFG_CONSOLE_OVERWRITE_ROUTINE
Enable the call to overwrite_console(). Enable the call to overwrite_console().
- CFG_CONSOLE_ENV_OVERWRITE - CFG_CONSOLE_ENV_OVERWRITE
Enable overwrite of previous console environment settings. Enable overwrite of previous console environment settings.
@ -1393,7 +1391,7 @@ Configuration Settings:
simple memory test. simple memory test.
- CFG_ALT_MEMTEST: - CFG_ALT_MEMTEST:
Enable an alternate, more extensive memory test. Enable an alternate, more extensive memory test.
- CFG_TFTP_LOADADDR: - CFG_TFTP_LOADADDR:
Default load address for network file downloads Default load address for network file downloads
@ -1418,10 +1416,10 @@ Configuration Settings:
CFG_FLASH_BASE when booting from flash. CFG_FLASH_BASE when booting from flash.
- CFG_MONITOR_LEN: - CFG_MONITOR_LEN:
Size of memory reserved for monitor code, used to Size of memory reserved for monitor code, used to
determine _at_compile_time_ (!) if the environment is determine _at_compile_time_ (!) if the environment is
embedded within the U-Boot image, or in a separate embedded within the U-Boot image, or in a separate
flash sector. flash sector.
- CFG_MALLOC_LEN: - CFG_MALLOC_LEN:
Size of DRAM reserved for malloc() use. Size of DRAM reserved for malloc() use.
@ -1842,7 +1840,6 @@ Note: for some board special configuration names may exist; check if
etc. etc.
Finally, type "make all", and you should get some working U-Boot Finally, type "make all", and you should get some working U-Boot
images ready for downlod to / installation on your system: images ready for downlod to / installation on your system:
@ -1906,7 +1903,6 @@ or to build on a native PowerPC system you can type
See also "U-Boot Porting Guide" below. See also "U-Boot Porting Guide" below.
Monitor Commands - Overview: Monitor Commands - Overview:
============================ ============================
@ -2029,13 +2025,13 @@ Some configuration options can be set using Environment Variables:
setenv initrd_high 00c00000 setenv initrd_high 00c00000
If you set initrd_high to 0xFFFFFFFF, this is an If you set initrd_high to 0xFFFFFFFF, this is an
indication to U-Boot that all addresses are legal indication to U-Boot that all addresses are legal
for the Linux kernel, including addresses in flash for the Linux kernel, including addresses in flash
memory. In this case U-Boot will NOT COPY the memory. In this case U-Boot will NOT COPY the
ramdisk at all. This may be useful to reduce the ramdisk at all. This may be useful to reduce the
boot time on your system, but requires that this boot time on your system, but requires that this
feature is supported by your Linux kernel. feature is supported by your Linux kernel.
ipaddr - IP address; needed for tftpboot command ipaddr - IP address; needed for tftpboot command
@ -2165,7 +2161,6 @@ o If neither SROM nor the environment contain a MAC address, an error
is raised. is raised.
Image Formats: Image Formats:
============== ==============
@ -2428,7 +2423,6 @@ corruption happened:
Verifying Checksum ... OK Verifying Checksum ... OK
Boot Linux: Boot Linux:
----------- -----------
@ -2518,39 +2512,39 @@ More About U-Boot Image Types:
U-Boot supports the following image types: U-Boot supports the following image types:
"Standalone Programs" are directly runnable in the environment "Standalone Programs" are directly runnable in the environment
provided by U-Boot; it is expected that (if they behave provided by U-Boot; it is expected that (if they behave
well) you can continue to work in U-Boot after return from well) you can continue to work in U-Boot after return from
the Standalone Program. the Standalone Program.
"OS Kernel Images" are usually images of some Embedded OS which "OS Kernel Images" are usually images of some Embedded OS which
will take over control completely. Usually these programs will take over control completely. Usually these programs
will install their own set of exception handlers, device will install their own set of exception handlers, device
drivers, set up the MMU, etc. - this means, that you cannot drivers, set up the MMU, etc. - this means, that you cannot
expect to re-enter U-Boot except by resetting the CPU. expect to re-enter U-Boot except by resetting the CPU.
"RAMDisk Images" are more or less just data blocks, and their "RAMDisk Images" are more or less just data blocks, and their
parameters (address, size) are passed to an OS kernel that is parameters (address, size) are passed to an OS kernel that is
being started. being started.
"Multi-File Images" contain several images, typically an OS "Multi-File Images" contain several images, typically an OS
(Linux) kernel image and one or more data images like (Linux) kernel image and one or more data images like
RAMDisks. This construct is useful for instance when you want RAMDisks. This construct is useful for instance when you want
to boot over the network using BOOTP etc., where the boot to boot over the network using BOOTP etc., where the boot
server provides just a single image file, but you want to get server provides just a single image file, but you want to get
for instance an OS kernel and a RAMDisk image. for instance an OS kernel and a RAMDisk image.
"Multi-File Images" start with a list of image sizes, each "Multi-File Images" start with a list of image sizes, each
image size (in bytes) specified by an "uint32_t" in network image size (in bytes) specified by an "uint32_t" in network
byte order. This list is terminated by an "(uint32_t)0". byte order. This list is terminated by an "(uint32_t)0".
Immediately after the terminating 0 follow the images, one by Immediately after the terminating 0 follow the images, one by
one, all aligned on "uint32_t" boundaries (size rounded up to one, all aligned on "uint32_t" boundaries (size rounded up to
a multiple of 4 bytes). a multiple of 4 bytes).
"Firmware Images" are binary images containing firmware (like "Firmware Images" are binary images containing firmware (like
U-Boot or FPGA images) which usually will be programmed to U-Boot or FPGA images) which usually will be programmed to
flash memory. flash memory.
"Script files" are command sequences that will be executed by "Script files" are command sequences that will be executed by
U-Boot's command interpreter; this feature is especially U-Boot's command interpreter; this feature is especially
useful when you configure U-Boot to use a real shell (hush) useful when you configure U-Boot to use a real shell (hush)
as command interpreter. as command interpreter.
Standalone HOWTO: Standalone HOWTO:
@ -2641,7 +2635,6 @@ Hit 'q':
[q, b, e, ?] ## Application terminated, rc = 0x0 [q, b, e, ?] ## Application terminated, rc = 0x0
Minicom warning: Minicom warning:
================ ================
@ -2813,7 +2806,6 @@ On ARM, the following registers are used:
==> U-Boot will use R8 to hold a pointer to the global data ==> U-Boot will use R8 to hold a pointer to the global data
Memory Management: Memory Management:
------------------ ------------------
@ -2959,7 +2951,6 @@ void no_more_time (int sig)
} }
Coding Standards: Coding Standards:
----------------- -----------------
@ -3016,7 +3007,7 @@ it:
* Changesets that contain different, unrelated modifications shall be * Changesets that contain different, unrelated modifications shall be
submitted as SEPARATE patches, one patch per changeset. submitted as SEPARATE patches, one patch per changeset.
Notes: Notes:

View File

@ -1,3 +1,4 @@
####################################################################### #######################################################################
# #
# Copyright (C) 2000, 2001, 2002, 2003 # Copyright (C) 2000, 2001, 2002, 2003
@ -35,7 +36,7 @@ LIB = lib$(BOARD).a
OBJS = $(BOARD).o flash.o OBJS = $(BOARD).o flash.o
$(LIB): .depend $(OBJS) $(LIB): .depend $(OBJS)
$(AR) crv $@ $^ $(AR) crv $@ $(OBJS)
######################################################################### #########################################################################

View File

@ -1,20 +1,20 @@
============================================================================= =============================================================================
U-Boot port on the LEOX's ELPT860 CPU board U-Boot port on the LEOX's ELPT860 CPU board
------------------------------------------- -------------------------------------------
LEOX.org is about the development of free hardware and software resources LEOX.org is about the development of free hardware and software resources
for system on chip. for system on chip.
For more information, contact The LEOX team <team@leox.org> For more information, contact The LEOX team <team@leox.org>
References: References:
~~~~~~~~~~ ~~~~~~~~~~
1) Get the last stable release from denx.de: 1) Get the last stable release from denx.de:
o ftp://ftp.denx.de/pub/u-boot/u-boot-0.2.0.tar.bz2 o ftp://ftp.denx.de/pub/u-boot/u-boot-0.2.0.tar.bz2
2) Get the current CVS snapshot: 2) Get the current CVS snapshot:
o cvs -d:pserver:anonymous@cvs.u-boot.sourceforge.net:/cvsroot/u-boot login o cvs -d:pserver:anonymous@cvs.u-boot.sourceforge.net:/cvsroot/u-boot login
o cvs -z6 -d:pserver:anonymous@cvs.u-boot.sourceforge.net:/cvsroot/u-boot co -P u-boot o cvs -z6 -d:pserver:anonymous@cvs.u-boot.sourceforge.net:/cvsroot/u-boot co -P u-boot
============================================================================= =============================================================================
@ -42,7 +42,7 @@ U-Boot, at the address of 0x03000000.
============================================================================= =============================================================================
U-Boot test results U-Boot test results
============================================================================= =============================================================================
@ -54,7 +54,7 @@ U-Boot, at the address of 0x03000000.
U-Boot 0.2.2 (Jan 19 2003 - 11:08:39) U-Boot 0.2.2 (Jan 19 2003 - 11:08:39)
CPU: XPC860xxZPnnB at 50 MHz: 4 kB I-Cache 4 kB D-Cache FEC present CPU: XPC860xxZPnnB at 50 MHz: 4 kB I-Cache 4 kB D-Cache FEC present
*** Warning: CPU Core has Silicon Bugs -- Check the Errata *** *** Warning: CPU Core has Silicon Bugs -- Check the Errata ***
Board: ### No HW ID - assuming ELPT860 Board: ### No HW ID - assuming ELPT860
DRAM: 16 MB DRAM: 16 MB
FLASH: 512 kB FLASH: 512 kB
@ -101,7 +101,7 @@ saveenv - save environment variables to persistent storage
setenv - set environment variables setenv - set environment variables
sleep - delay execution for some time sleep - delay execution for some time
tftpboot- boot image via network using TFTP protocol tftpboot- boot image via network using TFTP protocol
and env variables ipaddr and serverip and env variables ipaddr and serverip
version - print monitor version version - print monitor version
? - alias for 'help' ? - alias for 'help'
@ -143,8 +143,8 @@ LEOX_elpt860: flinfo
Bank # 1: AMD AM29F040 (4 Mbits) Bank # 1: AMD AM29F040 (4 Mbits)
Size: 512 KB in 8 Sectors Size: 512 KB in 8 Sectors
Sector Start Addresses: Sector Start Addresses:
02000000 (RO) 02010000 (RO) 02020000 (RO) 02030000 (RO) 02040000 02000000 (RO) 02010000 (RO) 02020000 (RO) 02030000 (RO) 02040000
02050000 02060000 02070000 02050000 02060000 02070000
################################################## ##################################################
# Board Information Structure # Board Information Structure
@ -177,7 +177,7 @@ baudrate = 9600 bps
U-Boot 0.2.2 (Jan 19 2003 - 11:08:39) U-Boot 0.2.2 (Jan 19 2003 - 11:08:39)
CPU: XPC860xxZPnnB at 50 MHz: 4 kB I-Cache 4 kB D-Cache FEC present CPU: XPC860xxZPnnB at 50 MHz: 4 kB I-Cache 4 kB D-Cache FEC present
*** Warning: CPU Core has Silicon Bugs -- Check the Errata *** *** Warning: CPU Core has Silicon Bugs -- Check the Errata ***
Board: ### No HW ID - assuming ELPT860 Board: ### No HW ID - assuming ELPT860
DRAM: 16 MB DRAM: 16 MB
FLASH: 512 kB FLASH: 512 kB
@ -219,7 +219,7 @@ Hit any key to exit ...
U-Boot 0.2.2 (Jan 19 2003 - 11:08:39) U-Boot 0.2.2 (Jan 19 2003 - 11:08:39)
CPU: XPC860xxZPnnB at 50 MHz: 4 kB I-Cache 4 kB D-Cache FEC present CPU: XPC860xxZPnnB at 50 MHz: 4 kB I-Cache 4 kB D-Cache FEC present
*** Warning: CPU Core has Silicon Bugs -- Check the Errata *** *** Warning: CPU Core has Silicon Bugs -- Check the Errata ***
Board: ### No HW ID - assuming ELPT860 Board: ### No HW ID - assuming ELPT860
DRAM: 16 MB DRAM: 16 MB
FLASH: 512 kB FLASH: 512 kB
@ -237,7 +237,7 @@ TFTP from server 192.168.0.1; our IP address is 192.168.0.30
Filename '/home/leox/uImage'. Filename '/home/leox/uImage'.
Load address: 0x400000 Load address: 0x400000
Loading: ################################################################# Loading: #################################################################
############################# #############################
done done
Bytes transferred = 477294 (7486e hex) Bytes transferred = 477294 (7486e hex)
## Booting image at 00400000 ... ## Booting image at 00400000 ...
@ -282,8 +282,8 @@ Looking up port of RPC 100005/2 on 192.168.0.1
VFS: Mounted root (nfs filesystem). VFS: Mounted root (nfs filesystem).
Freeing unused kernel memory: 44k init Freeing unused kernel memory: 44k init
INIT: version 2.78 booting INIT: version 2.78 booting
Welcome to DENX Embedded Linux Environment Welcome to DENX Embedded Linux Environment
Press 'I' to enter interactive startup. Press 'I' to enter interactive startup.
Mounting proc filesystem: [ OK ] Mounting proc filesystem: [ OK ]
Configuring kernel parameters: [ OK ] Configuring kernel parameters: [ OK ]
Cannot access the Hardware Clock via any known method. Cannot access the Hardware Clock via any known method.
@ -316,7 +316,7 @@ bash-2.04#
U-Boot 0.2.2 (Jan 19 2003 - 11:08:39) U-Boot 0.2.2 (Jan 19 2003 - 11:08:39)
CPU: XPC860xxZPnnB at 50 MHz: 4 kB I-Cache 4 kB D-Cache FEC present CPU: XPC860xxZPnnB at 50 MHz: 4 kB I-Cache 4 kB D-Cache FEC present
*** Warning: CPU Core has Silicon Bugs -- Check the Errata *** *** Warning: CPU Core has Silicon Bugs -- Check the Errata ***
Board: ### No HW ID - assuming ELPT860 Board: ### No HW ID - assuming ELPT860
DRAM: 16 MB DRAM: 16 MB
FLASH: 512 kB FLASH: 512 kB
@ -334,11 +334,11 @@ TFTP from server 192.168.0.1; our IP address is 192.168.0.30
Filename '/home/leox/pMulti'. Filename '/home/leox/pMulti'.
Load address: 0x400000 Load address: 0x400000
Loading: ################################################################# Loading: #################################################################
################################################################# #################################################################
################################################################# #################################################################
################################################################# #################################################################
################################################################# #################################################################
######################################################## ########################################################
done done
Bytes transferred = 1947816 (1db8a8 hex) Bytes transferred = 1947816 (1db8a8 hex)
## Booting image at 00400000 ... ## Booting image at 00400000 ...
@ -398,22 +398,22 @@ ELPT860 login: root
Password: Password:
Welcome to Linux-2.4.4 for ELPT CPU board (MPC860T @ 50MHz) Welcome to Linux-2.4.4 for ELPT CPU board (MPC860T @ 50MHz)
a8888b. a8888b.
d888888b. d888888b.
8P"YP"Y88 8P"YP"Y88
_ _ 8|o||o|88 _ _ 8|o||o|88
| | |_| 8' .88 | | |_| 8' .88
| | _ ____ _ _ _ _ 8`._.' Y8. | | _ ____ _ _ _ _ 8`._.' Y8.
| | | | _ \| | | |\ \/ / d/ `8b. | | | | _ \| | | |\ \/ / d/ `8b.
| |___ | | | | | |_| |/ \ .dP . Y8b. | |___ | | | | | |_| |/ \ .dP . Y8b.
|_____||_|_| |_|\____|\_/\_/ d8:' " `::88b. |_____||_|_| |_|\____|\_/\_/ d8:' " `::88b.
d8" `Y88b d8" `Y88b
:8P ' :888 :8P ' :888
8a. : _a88P 8a. : _a88P
._/"Yaa_ : .| 88P| ._/"Yaa_ : .| 88P|
\ YP" `| 8P `. \ YP" `| 8P `.
/ \._____.d| .' / \._____.d| .'
`--..__)888888P`._.' `--..__)888888P`._.'
login[21]: root login on `ttyS0' login[21]: root login on `ttyS0'

View File

@ -95,7 +95,7 @@ const uint sdram_table[] =
/* /*
* Single Read. (Offset 0 in UPMA RAM) * Single Read. (Offset 0 in UPMA RAM)
*/ */
0x0F0FFC24, 0x0F0CFC04, 0xFF0FFC04, 0x00AF3C04, 0x0F0FFC24, 0x0F0CFC04, 0xFF0FFC04, 0x00AF3C04,
0xFF0FFC00, /* last */ 0xFF0FFC00, /* last */
/* /*
* SDRAM Initialization (offset 5 in UPMA RAM) * SDRAM Initialization (offset 5 in UPMA RAM)
@ -109,28 +109,28 @@ const uint sdram_table[] =
/* /*
* Burst Read. (Offset 8 in UPMA RAM) * Burst Read. (Offset 8 in UPMA RAM)
*/ */
0x0F0FFC24, 0x0F0CFC04, 0xFF0FFC04, 0x00AF3C04, 0x0F0FFC24, 0x0F0CFC04, 0xFF0FFC04, 0x00AF3C04,
0xF00FFC00, 0xF00FFC00, 0xF00FFC00, 0xFF0FFC00, 0xF00FFC00, 0xF00FFC00, 0xF00FFC00, 0xFF0FFC00,
0x0FFCCC04, 0xFFAFFC05, 0xFFAFFC04, 0xFFAFFC04, 0x0FFCCC04, 0xFFAFFC05, 0xFFAFFC04, 0xFFAFFC04,
0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, /* last */ 0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, /* last */
/* /*
* Single Write. (Offset 18 in UPMA RAM) * Single Write. (Offset 18 in UPMA RAM)
*/ */
0x0F0FFC24, 0x0F0CFC04, 0xFF0FFC04, 0x00AF0C00, 0x0F0FFC24, 0x0F0CFC04, 0xFF0FFC04, 0x00AF0C00,
0xFF0FFC04, 0x0FFCCC04, 0xFFAFFC05, /* last */ 0xFF0FFC04, 0x0FFCCC04, 0xFFAFFC05, /* last */
_NOT_USED_, _NOT_USED_,
/* /*
* Burst Write. (Offset 20 in UPMA RAM) * Burst Write. (Offset 20 in UPMA RAM)
*/ */
0x0F0FFC24, 0x0F0CFC04, 0xFF0FFC00, 0x00AF0C00, 0x0F0FFC24, 0x0F0CFC04, 0xFF0FFC00, 0x00AF0C00,
0xF00FFC00, 0xF00FFC00, 0xF00FFC04, 0x0FFCCC04, 0xF00FFC00, 0xF00FFC00, 0xF00FFC04, 0x0FFCCC04,
0xFFAFFC04, 0xFFAFFC05, 0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC05, 0xFFAFFC04, 0xFFAFFC04,
0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, /* last */ 0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, /* last */
/* /*
* Refresh (Offset 30 in UPMA RAM) * Refresh (Offset 30 in UPMA RAM)
*/ */
0x0FFC3C04, 0xFFFFFC04, 0xFFFFFC04, 0xFFFFFC04, 0x0FFC3C04, 0xFFFFFC04, 0xFFFFFC04, 0xFFFFFC04,
0xFFFFFC05, 0xFFFFFC04, 0xFFFFFC05, _NOT_USED_, 0xFFFFFC05, 0xFFFFFC04, 0xFFFFFC05, _NOT_USED_,
0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, /* last */ 0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, /* last */
/* /*
* Exception. (Offset 3c in UPMA RAM) * Exception. (Offset 3c in UPMA RAM)
@ -152,8 +152,8 @@ board_pre_init (void)
{ {
volatile immap_t *immr = (immap_t *) CFG_IMMR; volatile immap_t *immr = (immap_t *) CFG_IMMR;
/* /*
* Light up the red led on ELPT860 pcb (DS1) (PCDAT) * Light up the red led on ELPT860 pcb (DS1) (PCDAT)
*/ */
immr->im_ioport.iop_pcdat &= ~CFG_DS1; /* PCDAT (DS1 = 0) */ immr->im_ioport.iop_pcdat &= ~CFG_DS1; /* PCDAT (DS1 = 0) */
immr->im_ioport.iop_pcpar &= ~CFG_DS1; /* PCPAR (0=general purpose I/O) */ immr->im_ioport.iop_pcpar &= ~CFG_DS1; /* PCPAR (0=general purpose I/O) */
@ -170,20 +170,20 @@ board_pre_init (void)
* Return 1 if no second DRAM bank, otherwise returns 0 * Return 1 if no second DRAM bank, otherwise returns 0
*/ */
int int
checkboard (void) checkboard (void)
{ {
unsigned char *s = getenv("serial#"); unsigned char *s = getenv("serial#");
if ( !s || strncmp(s, "ELPT860", 7) ) if ( !s || strncmp(s, "ELPT860", 7) )
printf ("### No HW ID - assuming ELPT860\n"); printf ("### No HW ID - assuming ELPT860\n");
return ( 0 ); /* success */ return ( 0 ); /* success */
} }
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
long int long int
initdram (int board_type) initdram (int board_type)
{ {
volatile immap_t *immap = (immap_t *)CFG_IMMR; volatile immap_t *immap = (immap_t *)CFG_IMMR;
@ -194,7 +194,7 @@ initdram (int board_type)
/* /*
* This sequence initializes SDRAM chips on ELPT860 board * This sequence initializes SDRAM chips on ELPT860 board
*/ */
upmconfig(UPMA, (uint *)init_sdram_table, upmconfig(UPMA, (uint *)init_sdram_table,
sizeof(init_sdram_table)/sizeof(uint)); sizeof(init_sdram_table)/sizeof(uint));
memctl->memc_mptpr = 0x0200; memctl->memc_mptpr = 0x0200;
@ -203,7 +203,7 @@ initdram (int board_type)
memctl->memc_mar = 0x00000088; memctl->memc_mar = 0x00000088;
memctl->memc_mcr = 0x80002000; /* CS1: SDRAM bank 0 */ memctl->memc_mcr = 0x80002000; /* CS1: SDRAM bank 0 */
upmconfig(UPMA, (uint *)sdram_table, upmconfig(UPMA, (uint *)sdram_table,
sizeof(sdram_table)/sizeof(uint)); sizeof(sdram_table)/sizeof(uint));
/* /*
@ -257,8 +257,8 @@ initdram (int board_type)
* *
* try 8 column mode * try 8 column mode
*/ */
size8 = dram_size (CFG_MAMR_8COL, size8 = dram_size (CFG_MAMR_8COL,
(ulong *) SDRAM_BASE1_PRELIM, (ulong *) SDRAM_BASE1_PRELIM,
SDRAM_MAX_SIZE); SDRAM_MAX_SIZE);
udelay (1000); udelay (1000);
@ -266,15 +266,15 @@ initdram (int board_type)
/* /*
* try 9 column mode * try 9 column mode
*/ */
size9 = dram_size (CFG_MAMR_9COL, size9 = dram_size (CFG_MAMR_9COL,
(ulong *) SDRAM_BASE1_PRELIM, (ulong *) SDRAM_BASE1_PRELIM,
SDRAM_MAX_SIZE); SDRAM_MAX_SIZE);
if ( size8 < size9 ) /* leave configuration at 9 columns */ if ( size8 < size9 ) /* leave configuration at 9 columns */
{ {
size_b0 = size9; size_b0 = size9;
/* debug ("SDRAM Bank 0 in 9 column mode: %ld MB\n", size >> 20); */ /* debug ("SDRAM Bank 0 in 9 column mode: %ld MB\n", size >> 20); */
} }
else /* back to 8 columns */ else /* back to 8 columns */
{ {
size_b0 = size8; size_b0 = size8;
@ -282,14 +282,14 @@ initdram (int board_type)
udelay (500); udelay (500);
/* debug ("SDRAM Bank 0 in 8 column mode: %ld MB\n", size >> 20); */ /* debug ("SDRAM Bank 0 in 8 column mode: %ld MB\n", size >> 20); */
} }
udelay (1000); udelay (1000);
/* /*
* Adjust refresh rate depending on SDRAM type, both banks * Adjust refresh rate depending on SDRAM type, both banks
* For types > 128 MBit leave it at the current (fast) rate * For types > 128 MBit leave it at the current (fast) rate
*/ */
if ( size_b0 < 0x02000000 ) if ( size_b0 < 0x02000000 )
{ {
/* reduce to 15.6 us (62.4 us / quad) */ /* reduce to 15.6 us (62.4 us / quad) */
memctl->memc_mptpr = CFG_MPTPR_2BK_4K; memctl->memc_mptpr = CFG_MPTPR_2BK_4K;
@ -304,7 +304,7 @@ initdram (int board_type)
{ {
unsigned long reg; unsigned long reg;
/* adjust refresh rate depending on SDRAM type, one bank */ /* adjust refresh rate depending on SDRAM type, one bank */
reg = memctl->memc_mptpr; reg = memctl->memc_mptpr;
reg >>= 1; /* reduce to CFG_MPTPR_1BK_8K / _4K */ reg >>= 1; /* reduce to CFG_MPTPR_1BK_8K / _4K */
@ -312,7 +312,7 @@ initdram (int board_type)
} }
udelay(10000); udelay(10000);
return (size_b0); return (size_b0);
} }
@ -326,9 +326,9 @@ initdram (int board_type)
* - short between data lines * - short between data lines
*/ */
static long int static long int
dram_size (long int mamr_value, dram_size (long int mamr_value,
long int *base, long int *base,
long int maxsize) long int maxsize)
{ {
volatile immap_t *immap = (immap_t *)CFG_IMMR; volatile immap_t *immap = (immap_t *)CFG_IMMR;
@ -337,38 +337,38 @@ dram_size (long int mamr_value,
ulong cnt, val; ulong cnt, val;
ulong save[32]; /* to make test non-destructive */ ulong save[32]; /* to make test non-destructive */
unsigned char i = 0; unsigned char i = 0;
memctl->memc_mamr = mamr_value; memctl->memc_mamr = mamr_value;
for (cnt = maxsize/sizeof(long); cnt > 0; cnt >>= 1) for (cnt = maxsize/sizeof(long); cnt > 0; cnt >>= 1)
{ {
addr = base + cnt; /* pointer arith! */ addr = base + cnt; /* pointer arith! */
save[i++] = *addr; save[i++] = *addr;
*addr = ~cnt; *addr = ~cnt;
} }
/* write 0 to base address */ /* write 0 to base address */
addr = base; addr = base;
save[i] = *addr; save[i] = *addr;
*addr = 0; *addr = 0;
/* check at base address */ /* check at base address */
if ( (val = *addr) != 0 ) if ( (val = *addr) != 0 )
{ {
*addr = save[i]; *addr = save[i];
return (0); return (0);
} }
for (cnt = 1; cnt <= maxsize/sizeof(long); cnt <<= 1) for (cnt = 1; cnt <= maxsize/sizeof(long); cnt <<= 1)
{ {
addr = base + cnt; /* pointer arith! */ addr = base + cnt; /* pointer arith! */
val = *addr; val = *addr;
*addr = save[--i]; *addr = save[--i];
if ( val != (~cnt) ) if ( val != (~cnt) )
{ {
return (cnt * sizeof(long)); return (cnt * sizeof(long));
} }
@ -388,7 +388,7 @@ void
reset_phy (void) reset_phy (void)
{ {
volatile immap_t *immr = (immap_t *) CFG_IMMR; volatile immap_t *immr = (immap_t *) CFG_IMMR;
/* /*
* Ensure LBK LXT901 ethernet 1 & 2 = 0 ... for normal loopback in effect * Ensure LBK LXT901 ethernet 1 & 2 = 0 ... for normal loopback in effect
* and no AUI loopback * and no AUI loopback

View File

@ -79,41 +79,41 @@ static int write_byte (flash_info_t *info, ulong dest, uchar data);
/*----------------------------------------------------------------------- /*-----------------------------------------------------------------------
*/ */
unsigned long unsigned long
flash_init (void) flash_init (void)
{ {
volatile immap_t *immap = (immap_t *)CFG_IMMR; volatile immap_t *immap = (immap_t *)CFG_IMMR;
volatile memctl8xx_t *memctl = &immap->im_memctl; volatile memctl8xx_t *memctl = &immap->im_memctl;
unsigned long size_b0; unsigned long size_b0;
int i; int i;
/* Init: no FLASHes known */ /* Init: no FLASHes known */
for (i=0; i<CFG_MAX_FLASH_BANKS; ++i) for (i=0; i<CFG_MAX_FLASH_BANKS; ++i)
{ {
flash_info[i].flash_id = FLASH_UNKNOWN; flash_info[i].flash_id = FLASH_UNKNOWN;
} }
/* Static FLASH Bank configuration here - FIXME XXX */ /* Static FLASH Bank configuration here - FIXME XXX */
size_b0 = flash_get_size ((volatile unsigned char *)FLASH_BASE0_PRELIM, size_b0 = flash_get_size ((volatile unsigned char *)FLASH_BASE0_PRELIM,
&flash_info[0]); &flash_info[0]);
if ( flash_info[0].flash_id == FLASH_UNKNOWN ) if ( flash_info[0].flash_id == FLASH_UNKNOWN )
{ {
printf ("## Unknown FLASH on Bank 0 - Size = 0x%08lx = %ld MB\n", printf ("## Unknown FLASH on Bank 0 - Size = 0x%08lx = %ld MB\n",
size_b0, size_b0<<20); size_b0, size_b0<<20);
} }
/* Remap FLASH according to real size */ /* Remap FLASH according to real size */
memctl->memc_or0 = CFG_OR_TIMING_FLASH | (-size_b0 & OR_AM_MSK); memctl->memc_or0 = CFG_OR_TIMING_FLASH | (-size_b0 & OR_AM_MSK);
memctl->memc_br0 = (CFG_FLASH_BASE & BR_BA_MSK) | BR_MS_GPCM | BR_PS_8 | BR_V; memctl->memc_br0 = (CFG_FLASH_BASE & BR_BA_MSK) | BR_MS_GPCM | BR_PS_8 | BR_V;
/* Re-do sizing to get full correct info */ /* Re-do sizing to get full correct info */
size_b0 = flash_get_size ((volatile unsigned char *)CFG_FLASH_BASE, size_b0 = flash_get_size ((volatile unsigned char *)CFG_FLASH_BASE,
&flash_info[0]); &flash_info[0]);
flash_get_offsets (CFG_FLASH_BASE, &flash_info[0]); flash_get_offsets (CFG_FLASH_BASE, &flash_info[0]);
#if CFG_MONITOR_BASE >= CFG_FLASH_BASE #if CFG_MONITOR_BASE >= CFG_FLASH_BASE
/* monitor protection ON by default */ /* monitor protection ON by default */
flash_protect (FLAG_PROTECT_SET, flash_protect (FLAG_PROTECT_SET,
@ -121,7 +121,7 @@ flash_init (void)
CFG_MONITOR_BASE + monitor_flash_len-1, CFG_MONITOR_BASE + monitor_flash_len-1,
&flash_info[0]); &flash_info[0]);
#endif #endif
#ifdef CFG_ENV_IS_IN_FLASH #ifdef CFG_ENV_IS_IN_FLASH
/* ENV protection ON by default */ /* ENV protection ON by default */
flash_protect(FLAG_PROTECT_SET, flash_protect(FLAG_PROTECT_SET,
@ -131,14 +131,14 @@ flash_init (void)
#endif #endif
flash_info[0].size = size_b0; flash_info[0].size = size_b0;
return (size_b0); return (size_b0);
} }
/*----------------------------------------------------------------------- /*-----------------------------------------------------------------------
*/ */
static void static void
flash_get_offsets (ulong base, flash_get_offsets (ulong base,
flash_info_t *info) flash_info_t *info)
{ {
int i; int i;
@ -146,7 +146,7 @@ flash_get_offsets (ulong base,
#define SECTOR_64KB 0x00010000 #define SECTOR_64KB 0x00010000
/* set up sector start adress table */ /* set up sector start adress table */
for (i = 0; i < info->sector_count; i++) for (i = 0; i < info->sector_count; i++)
{ {
info->start[i] = base + (i * SECTOR_64KB); info->start[i] = base + (i * SECTOR_64KB);
} }
@ -154,38 +154,38 @@ flash_get_offsets (ulong base,
/*----------------------------------------------------------------------- /*-----------------------------------------------------------------------
*/ */
void void
flash_print_info (flash_info_t *info) flash_print_info (flash_info_t *info)
{ {
int i; int i;
if ( info->flash_id == FLASH_UNKNOWN ) if ( info->flash_id == FLASH_UNKNOWN )
{ {
printf ("missing or unknown FLASH type\n"); printf ("missing or unknown FLASH type\n");
return; return;
} }
switch ( info->flash_id & FLASH_VENDMASK ) switch ( info->flash_id & FLASH_VENDMASK )
{ {
case FLASH_MAN_AMD: printf ("AMD "); break; case FLASH_MAN_AMD: printf ("AMD "); break;
case FLASH_MAN_FUJ: printf ("FUJITSU "); break; case FLASH_MAN_FUJ: printf ("FUJITSU "); break;
case FLASH_MAN_STM: printf ("STM (Thomson) "); break; case FLASH_MAN_STM: printf ("STM (Thomson) "); break;
default: printf ("Unknown Vendor "); break; default: printf ("Unknown Vendor "); break;
} }
switch ( info->flash_id & FLASH_TYPEMASK ) switch ( info->flash_id & FLASH_TYPEMASK )
{ {
case FLASH_AM040: printf ("AM29F040 (4 Mbits)\n"); case FLASH_AM040: printf ("AM29F040 (4 Mbits)\n");
break; break;
default: printf ("Unknown Chip Type\n"); default: printf ("Unknown Chip Type\n");
break; break;
} }
printf (" Size: %ld KB in %d Sectors\n", printf (" Size: %ld KB in %d Sectors\n",
info->size >> 10, info->sector_count); info->size >> 10, info->sector_count);
printf (" Sector Start Addresses:"); printf (" Sector Start Addresses:");
for (i=0; i<info->sector_count; ++i) for (i=0; i<info->sector_count; ++i)
{ {
if ((i % 5) == 0) if ((i % 5) == 0)
printf ("\n "); printf ("\n ");
@ -210,9 +210,9 @@ flash_print_info (flash_info_t *info)
* The following code cannot be run from FLASH! * The following code cannot be run from FLASH!
*/ */
static ulong static ulong
flash_get_size (volatile unsigned char *addr, flash_get_size (volatile unsigned char *addr,
flash_info_t *info) flash_info_t *info)
{ {
short i; short i;
uchar value; uchar value;
@ -222,10 +222,10 @@ flash_get_size (volatile unsigned char *addr,
addr[0x0555] = 0xAA; addr[0x0555] = 0xAA;
addr[0x02AA] = 0x55; addr[0x02AA] = 0x55;
addr[0x0555] = 0x90; addr[0x0555] = 0x90;
value = addr[0]; value = addr[0];
switch ( value ) switch ( value )
{ {
/* case AMD_MANUFACT: */ /* case AMD_MANUFACT: */
case 0x01: case 0x01:
@ -246,10 +246,10 @@ flash_get_size (volatile unsigned char *addr,
info->size = 0; info->size = 0;
return (0); /* no or unknown flash */ return (0); /* no or unknown flash */
} }
value = addr[1]; /* device ID */ value = addr[1]; /* device ID */
switch ( value ) switch ( value )
{ {
case STM_ID_F040B: case STM_ID_F040B:
case AMD_ID_F040B: case AMD_ID_F040B:
@ -264,13 +264,13 @@ flash_get_size (volatile unsigned char *addr,
} }
/* set up sector start adress table */ /* set up sector start adress table */
for (i = 0; i < info->sector_count; i++) for (i = 0; i < info->sector_count; i++)
{ {
info->start[i] = base + (i * 0x00010000); info->start[i] = base + (i * 0x00010000);
} }
/* check for protected sectors */ /* check for protected sectors */
for (i = 0; i < info->sector_count; i++) for (i = 0; i < info->sector_count; i++)
{ {
/* read sector protection at sector address, (A7 .. A0) = 0x02 */ /* read sector protection at sector address, (A7 .. A0) = 0x02 */
/* D0 = 1 if protected */ /* D0 = 1 if protected */
@ -281,13 +281,13 @@ flash_get_size (volatile unsigned char *addr,
/* /*
* Prevent writes to uninitialized FLASH. * Prevent writes to uninitialized FLASH.
*/ */
if ( info->flash_id != FLASH_UNKNOWN ) if ( info->flash_id != FLASH_UNKNOWN )
{ {
addr = (volatile unsigned char *)info->start[0]; addr = (volatile unsigned char *)info->start[0];
*addr = 0xF0; /* reset bank */ *addr = 0xF0; /* reset bank */
} }
return (info->size); return (info->size);
} }
@ -296,21 +296,21 @@ flash_get_size (volatile unsigned char *addr,
*/ */
int int
flash_erase (flash_info_t *info, flash_erase (flash_info_t *info,
int s_first, int s_first,
int s_last) int s_last)
{ {
volatile unsigned char *addr = (volatile unsigned char *)(info->start[0]); volatile unsigned char *addr = (volatile unsigned char *)(info->start[0]);
int flag, prot, sect, l_sect; int flag, prot, sect, l_sect;
ulong start, now, last; ulong start, now, last;
if ( (s_first < 0) || (s_first > s_last) ) if ( (s_first < 0) || (s_first > s_last) )
{ {
if ( info->flash_id == FLASH_UNKNOWN ) if ( info->flash_id == FLASH_UNKNOWN )
{ {
printf ("- missing\n"); printf ("- missing\n");
} }
else else
{ {
printf ("- no sectors to erase\n"); printf ("- no sectors to erase\n");
} }
@ -318,44 +318,44 @@ flash_erase (flash_info_t *info,
} }
if ( (info->flash_id == FLASH_UNKNOWN) || if ( (info->flash_id == FLASH_UNKNOWN) ||
(info->flash_id > FLASH_AMD_COMP) ) (info->flash_id > FLASH_AMD_COMP) )
{ {
printf ("Can't erase unknown flash type %08lx - aborted\n", printf ("Can't erase unknown flash type %08lx - aborted\n",
info->flash_id); info->flash_id);
return ( 1 ); return ( 1 );
} }
prot = 0; prot = 0;
for (sect=s_first; sect<=s_last; ++sect) for (sect=s_first; sect<=s_last; ++sect)
{ {
if ( info->protect[sect] ) if ( info->protect[sect] )
{ {
prot++; prot++;
} }
} }
if ( prot ) if ( prot )
{ {
printf ("- Warning: %d protected sectors will not be erased!\n", prot); printf ("- Warning: %d protected sectors will not be erased!\n", prot);
} }
else else
{ {
printf ("\n"); printf ("\n");
} }
l_sect = -1; l_sect = -1;
/* Disable interrupts which might cause a timeout here */ /* Disable interrupts which might cause a timeout here */
flag = disable_interrupts(); flag = disable_interrupts();
addr[0x0555] = 0xAA; addr[0x0555] = 0xAA;
addr[0x02AA] = 0x55; addr[0x02AA] = 0x55;
addr[0x0555] = 0x80; addr[0x0555] = 0x80;
addr[0x0555] = 0xAA; addr[0x0555] = 0xAA;
addr[0x02AA] = 0x55; addr[0x02AA] = 0x55;
/* Start erase on unprotected sectors */ /* Start erase on unprotected sectors */
for (sect = s_first; sect<=s_last; sect++) for (sect = s_first; sect<=s_last; sect++)
{ {
if (info->protect[sect] == 0) /* not protected */ if (info->protect[sect] == 0) /* not protected */
{ {
@ -364,26 +364,26 @@ flash_erase (flash_info_t *info,
l_sect = sect; l_sect = sect;
} }
} }
/* re-enable interrupts if necessary */ /* re-enable interrupts if necessary */
if ( flag ) if ( flag )
enable_interrupts(); enable_interrupts();
/* wait at least 80us - let's wait 1 ms */ /* wait at least 80us - let's wait 1 ms */
udelay (1000); udelay (1000);
/* /*
* We wait for the last triggered sector * We wait for the last triggered sector
*/ */
if ( l_sect < 0 ) if ( l_sect < 0 )
goto DONE; goto DONE;
start = get_timer (0); start = get_timer (0);
last = start; last = start;
addr = (volatile unsigned char *)(info->start[l_sect]); addr = (volatile unsigned char *)(info->start[l_sect]);
while ( (addr[0] & 0x80) != 0x80 ) while ( (addr[0] & 0x80) != 0x80 )
{ {
if ( (now = get_timer(start)) > CFG_FLASH_ERASE_TOUT ) if ( (now = get_timer(start)) > CFG_FLASH_ERASE_TOUT )
{ {
printf ("Timeout\n"); printf ("Timeout\n");
return ( 1 ); return ( 1 );
@ -395,14 +395,14 @@ flash_erase (flash_info_t *info,
last = now; last = now;
} }
} }
DONE: DONE:
/* reset to read mode */ /* reset to read mode */
addr = (volatile unsigned char *)info->start[0]; addr = (volatile unsigned char *)info->start[0];
addr[0] = 0xF0; /* reset bank */ addr[0] = 0xF0; /* reset bank */
printf (" done\n"); printf (" done\n");
return ( 0 ); return ( 0 );
} }
@ -413,10 +413,10 @@ DONE:
* 2 - Flash not erased * 2 - Flash not erased
*/ */
int int
write_buff (flash_info_t *info, write_buff (flash_info_t *info,
uchar *src, uchar *src,
ulong addr, ulong addr,
ulong cnt) ulong cnt)
{ {
ulong cp, wp, data; ulong cp, wp, data;
@ -428,16 +428,16 @@ write_buff (flash_info_t *info,
/* Width of the data bus: 8 bits */ /* Width of the data bus: 8 bits */
wp = addr; wp = addr;
while ( cnt ) while ( cnt )
{ {
bdata = *src++; bdata = *src++;
if ( (rc = write_byte(info, wp, bdata)) != 0 ) if ( (rc = write_byte(info, wp, bdata)) != 0 )
{ {
return (rc); return (rc);
} }
++wp; ++wp;
--cnt; --cnt;
} }
@ -449,72 +449,72 @@ write_buff (flash_info_t *info,
/* Width of the data bus: 32 bits */ /* Width of the data bus: 32 bits */
wp = (addr & ~3); /* get lower word aligned address */ wp = (addr & ~3); /* get lower word aligned address */
/* /*
* handle unaligned start bytes * handle unaligned start bytes
*/ */
if ( (l = addr - wp) != 0 ) if ( (l = addr - wp) != 0 )
{ {
data = 0; data = 0;
for (i=0, cp=wp; i<l; ++i, ++cp) for (i=0, cp=wp; i<l; ++i, ++cp)
{ {
data = (data << 8) | (*(uchar *)cp); data = (data << 8) | (*(uchar *)cp);
} }
for (; i<4 && cnt>0; ++i) for (; i<4 && cnt>0; ++i)
{ {
data = (data << 8) | *src++; data = (data << 8) | *src++;
--cnt; --cnt;
++cp; ++cp;
} }
for (; cnt==0 && i<4; ++i, ++cp) for (; cnt==0 && i<4; ++i, ++cp)
{ {
data = (data << 8) | (*(uchar *)cp); data = (data << 8) | (*(uchar *)cp);
} }
if ( (rc = write_word(info, wp, data)) != 0 ) if ( (rc = write_word(info, wp, data)) != 0 )
{ {
return (rc); return (rc);
} }
wp += 4; wp += 4;
} }
/* /*
* handle word aligned part * handle word aligned part
*/ */
while ( cnt >= 4 ) while ( cnt >= 4 )
{ {
data = 0; data = 0;
for (i=0; i<4; ++i) for (i=0; i<4; ++i)
{ {
data = (data << 8) | *src++; data = (data << 8) | *src++;
} }
if ( (rc = write_word(info, wp, data)) != 0 ) if ( (rc = write_word(info, wp, data)) != 0 )
{ {
return (rc); return (rc);
} }
wp += 4; wp += 4;
cnt -= 4; cnt -= 4;
} }
if ( cnt == 0 ) if ( cnt == 0 )
{ {
return (0); return (0);
} }
/* /*
* handle unaligned tail bytes * handle unaligned tail bytes
*/ */
data = 0; data = 0;
for (i=0, cp=wp; i<4 && cnt>0; ++i, ++cp) for (i=0, cp=wp; i<4 && cnt>0; ++i, ++cp)
{ {
data = (data << 8) | *src++; data = (data << 8) | *src++;
--cnt; --cnt;
} }
for (; i<4; ++i, ++cp) for (; i<4; ++i, ++cp)
{ {
data = (data << 8) | (*(uchar *)cp); data = (data << 8) | (*(uchar *)cp);
} }
return (write_word(info, wp, data)); return (write_word(info, wp, data));
} }
} }
@ -525,38 +525,38 @@ write_buff (flash_info_t *info,
* 1 - write timeout * 1 - write timeout
* 2 - Flash not erased * 2 - Flash not erased
*/ */
static int static int
write_word (flash_info_t *info, write_word (flash_info_t *info,
ulong dest, ulong dest,
ulong data) ulong data)
{ {
vu_long *addr = (vu_long*)(info->start[0]); vu_long *addr = (vu_long*)(info->start[0]);
ulong start; ulong start;
int flag; int flag;
/* Check if Flash is (sufficiently) erased */ /* Check if Flash is (sufficiently) erased */
if ( (*((vu_long *)dest) & data) != data ) if ( (*((vu_long *)dest) & data) != data )
{ {
return (2); return (2);
} }
/* Disable interrupts which might cause a timeout here */ /* Disable interrupts which might cause a timeout here */
flag = disable_interrupts(); flag = disable_interrupts();
addr[0x0555] = 0x00AA00AA; addr[0x0555] = 0x00AA00AA;
addr[0x02AA] = 0x00550055; addr[0x02AA] = 0x00550055;
addr[0x0555] = 0x00A000A0; addr[0x0555] = 0x00A000A0;
*((vu_long *)dest) = data; *((vu_long *)dest) = data;
/* re-enable interrupts if necessary */ /* re-enable interrupts if necessary */
if ( flag ) if ( flag )
enable_interrupts(); enable_interrupts();
/* data polling for D7 */ /* data polling for D7 */
start = get_timer (0); start = get_timer (0);
while ( (*((vu_long *)dest) & 0x00800080) != (data & 0x00800080) ) while ( (*((vu_long *)dest) & 0x00800080) != (data & 0x00800080) )
{ {
if ( get_timer(start) > CFG_FLASH_WRITE_TOUT ) if ( get_timer(start) > CFG_FLASH_WRITE_TOUT )
{ {
return (1); return (1);
} }
@ -571,38 +571,38 @@ write_word (flash_info_t *info,
* 1 - write timeout * 1 - write timeout
* 2 - Flash not erased * 2 - Flash not erased
*/ */
static int static int
write_byte (flash_info_t *info, write_byte (flash_info_t *info,
ulong dest, ulong dest,
uchar data) uchar data)
{ {
volatile unsigned char *addr = (volatile unsigned char *)(info->start[0]); volatile unsigned char *addr = (volatile unsigned char *)(info->start[0]);
ulong start; ulong start;
int flag; int flag;
/* Check if Flash is (sufficiently) erased */ /* Check if Flash is (sufficiently) erased */
if ( (*((volatile unsigned char *)dest) & data) != data ) if ( (*((volatile unsigned char *)dest) & data) != data )
{ {
return (2); return (2);
} }
/* Disable interrupts which might cause a timeout here */ /* Disable interrupts which might cause a timeout here */
flag = disable_interrupts(); flag = disable_interrupts();
addr[0x0555] = 0xAA; addr[0x0555] = 0xAA;
addr[0x02AA] = 0x55; addr[0x02AA] = 0x55;
addr[0x0555] = 0xA0; addr[0x0555] = 0xA0;
*((volatile unsigned char *)dest) = data; *((volatile unsigned char *)dest) = data;
/* re-enable interrupts if necessary */ /* re-enable interrupts if necessary */
if ( flag ) if ( flag )
enable_interrupts(); enable_interrupts();
/* data polling for D7 */ /* data polling for D7 */
start = get_timer (0); start = get_timer (0);
while ( (*((volatile unsigned char *)dest) & 0x80) != (data & 0x80) ) while ( (*((volatile unsigned char *)dest) & 0x80) != (data & 0x80) )
{ {
if ( get_timer(start) > CFG_FLASH_WRITE_TOUT ) if ( get_timer(start) > CFG_FLASH_WRITE_TOUT )
{ {
return (1); return (1);
} }

View File

@ -123,6 +123,10 @@ SECTIONS
_edata = .; _edata = .;
PROVIDE (edata = .); PROVIDE (edata = .);
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
__start___ex_table = .; __start___ex_table = .;
__ex_table : { *(__ex_table) } __ex_table : { *(__ex_table) }
__stop___ex_table = .; __stop___ex_table = .;

View File

@ -137,4 +137,3 @@ SECTIONS
_end = . ; _end = . ;
PROVIDE (end = .); PROVIDE (end = .);
} }

View File

@ -30,47 +30,47 @@
#include "via686.h" #include "via686.h"
__asm(" .globl send_kb \n __asm(" .globl send_kb \n
send_kb: \n send_kb: \n
lis r9, 0xfe00 \n lis r9, 0xfe00 \n
\n \n
li r4, 0x10 # retries \n li r4, 0x10 # retries \n
mtctr r4 \n mtctr r4 \n
\n \n
idle: \n idle: \n
lbz r4, 0x64(r9) \n lbz r4, 0x64(r9) \n
andi. r4, r4, 0x02 \n andi. r4, r4, 0x02 \n
bne idle \n bne idle \n
\n \n
ready: \n ready: \n
stb r3, 0x60(r9) \n stb r3, 0x60(r9) \n
\n \n
check: \n check: \n
lbz r4, 0x64(r9) \n lbz r4, 0x64(r9) \n
andi. r4, r4, 0x01 \n andi. r4, r4, 0x01 \n
beq check \n beq check \n
\n \n
lbz r4, 0x60(r9) \n lbz r4, 0x60(r9) \n
cmpwi r4, 0xfa \n cmpwi r4, 0xfa \n
beq done \n beq done \n
\n \n
bdnz idle \n bdnz idle \n
\n \n
li r3, 0 \n li r3, 0 \n
blr \n blr \n
\n \n
done: \n done: \n
li r3, 1 \n li r3, 1 \n
blr \n blr \n
\n \n
.globl test_kb \n .globl test_kb \n
test_kb: \n test_kb: \n
mflr r10 \n mflr r10 \n
li r3, 0xed \n li r3, 0xed \n
bl send_kb \n bl send_kb \n
li r3, 0x01 \n li r3, 0x01 \n
bl send_kb \n bl send_kb \n
mtlr r10 \n mtlr r10 \n
blr \n blr \n
"); ");
@ -86,7 +86,6 @@ long initdram (int board_type)
} }
void after_reloc (ulong dest_addr, gd_t *gd) void after_reloc (ulong dest_addr, gd_t *gd)
{ {
/* HJF: DECLARE_GLOBAL_DATA_PTR; */ /* HJF: DECLARE_GLOBAL_DATA_PTR; */

View File

@ -33,14 +33,14 @@ COBJS = $(BOARD).o articiaS.o flash.o serial.o smbus.o articiaS_pci.o \
AOBJS = board_asm_init.o memio.o AOBJS = board_asm_init.o memio.o
OBJS = $(COBJS) $(AOBJS) OBJS = $(COBJS) $(AOBJS)
EMUDIR = ../bios_emulator/scitech/src/x86emu/ EMUDIR = ../bios_emulator/scitech/src/x86emu/
EMUOBJ = $(EMUDIR)decode.o $(EMUDIR)ops2.o $(EMUDIR)fpu.o $(EMUDIR)prim_ops.o \ EMUOBJ = $(EMUDIR)decode.o $(EMUDIR)ops2.o $(EMUDIR)fpu.o $(EMUDIR)prim_ops.o \
$(EMUDIR)ops.o $(EMUDIR)sys.o $(EMUDIR)ops.o $(EMUDIR)sys.o
EMUSRC = $(EMUOBJ:.o=.c) EMUSRC = $(EMUOBJ:.o=.c)
$(LIB): .depend $(OBJS) $(EMUSRC) $(LIB): .depend $(OBJS) $(EMUSRC)
make libx86emu.a -C ../bios_emulator/scitech/src/x86emu -f makefile.uboot CROSS_COMPILE=$(CROSS_COMPILE) make libx86emu.a -C ../bios_emulator/scitech/src/x86emu -f makefile.uboot CROSS_COMPILE=$(CROSS_COMPILE)
-rm $(LIB) -rm $(LIB)
$(AR) crv $@ $(OBJS) $(EMUOBJ) $(AR) crv $@ $(OBJS) $(EMUOBJ)

View File

@ -1,6 +1,6 @@
/* /*
* (C) Copyright 2002 * (C) Copyright 2002
* Hyperion Entertainment, ThomasF@hyperion-entertainment.com * Hyperion Entertainment, ThomasF@hyperion-entertainment.com
* *
* See file CREDITS for list of people who contributed to this * See file CREDITS for list of people who contributed to this
* project. * project.
@ -572,7 +572,7 @@ long articiaS_ram_init (void)
if (banks[3].used) if (banks[3].used)
burst_support = banks[3].burst_len; burst_support = banks[3].burst_len;
/* /*
** Mode register: ** Mode register:
** Bits Use ** Bits Use
** 0-2 Burst len ** 0-2 Burst len

View File

@ -99,14 +99,14 @@
#define XDBCR_HWTOXD (1<<0) #define XDBCR_HWTOXD (1<<0)
#define XDBCR_KBTOXD (1<<1) #define XDBCR_KBTOXD (1<<1)
#define XDBCR_RTCTOXD (1<<2) #define XDBCR_RTCTOXD (1<<2)
#define XDBCR_SCALE_1_1 (0x0<<3) #define XDBCR_SCALE_1_1 (0x0<<3)
#define XDBCR_SCALE_2_2 (0x1<<3) #define XDBCR_SCALE_2_2 (0x1<<3)
#define XDBCR_SCALE_3_2 (0x2<<3) #define XDBCR_SCALE_3_2 (0x2<<3)
#define XDBCR_SCALE_4_4 (0x3<<3) #define XDBCR_SCALE_4_4 (0x3<<3)
#define XDBCR_SCALE_5_8 (0x4<<3) #define XDBCR_SCALE_5_8 (0x4<<3)
#define XDBCR_SCALE_6_8 (0x5<<3) #define XDBCR_SCALE_6_8 (0x5<<3)
#define XDBCR_SCALE_8_8 (0x6<<3) #define XDBCR_SCALE_8_8 (0x6<<3)
#define XDBCR_SCALE_0_16 (0x7<<3) #define XDBCR_SCALE_0_16 (0x7<<3)
#define XDBCR_XDPROM (1<<7) #define XDBCR_XDPROM (1<<7)
@ -134,7 +134,6 @@
#define ARTICIAS_ISAIO_PHYS 0xfe002000 #define ARTICIAS_ISAIO_PHYS 0xfe002000
/* Prototypes */ /* Prototypes */
long articiaS_ram_init(void); long articiaS_ram_init(void);
void articiaS_pci_init(void); void articiaS_pci_init(void);

View File

@ -123,14 +123,14 @@ struct pci_irq_fixup_table fixuptab [] =
{ {
{ 0, 0, 0, 0xff}, /* Articia S host bridge */ { 0, 0, 0, 0xff}, /* Articia S host bridge */
{ 0, 1, 0, 0xff}, /* Articia S AGP bridge */ { 0, 1, 0, 0xff}, /* Articia S AGP bridge */
// { 0, 6, 0, 0x05}, /* 3COM ethernet */ /* { 0, 6, 0, 0x05}, /###* 3COM ethernet */
{ 0, 7, 0, 0xff}, /* VIA southbridge */ { 0, 7, 0, 0xff}, /* VIA southbridge */
{ 0, 7, 1, 0x0e}, /* IDE controller in legacy mode */ { 0, 7, 1, 0x0e}, /* IDE controller in legacy mode */
// { 0, 7, 2, 0x05}, /* First USB controller */ /* { 0, 7, 2, 0x05}, /###* First USB controller */
// { 0, 7, 3, 0x0c}, /* Second USB controller (shares interrupt with ethernet) */ /* { 0, 7, 3, 0x0c}, /###* Second USB controller (shares interrupt with ethernet) */
{ 0, 7, 4, 0xff}, /* ACPI Power Management */ { 0, 7, 4, 0xff}, /* ACPI Power Management */
// { 0, 7, 5, 0x08}, /* AC97 */ /* { 0, 7, 5, 0x08}, /###* AC97 */
// { 0, 7, 6, 0x08}, /* MC97 */ /* { 0, 7, 6, 0x08}, /###* MC97 */
{ 0xff, 0xff, 0xff, 0xff} { 0xff, 0xff, 0xff, 0xff}
}; };
@ -287,7 +287,7 @@ void articiaS_pci_init (void)
PRINTF("atriciaS_pci_init\n"); PRINTF("atriciaS_pci_init\n");
// Why aren't these relocated?? /* Why aren't these relocated?? */
for (i=0; config_table[i].config_device; i++) for (i=0; config_table[i].config_device; i++)
{ {
switch((int)config_table[i].config_device) switch((int)config_table[i].config_device)
@ -335,7 +335,6 @@ void articiaS_pci_init (void)
PCI_REGION_IO); PCI_REGION_IO);
articiaS_hose.region_count = 4; articiaS_hose.region_count = 4;
pci_setup_indirect(&articiaS_hose, ARTICIAS_PCI_CFGADDR, ARTICIAS_PCI_CFGDATA); pci_setup_indirect(&articiaS_hose, ARTICIAS_PCI_CFGADDR, ARTICIAS_PCI_CFGDATA);
@ -410,8 +409,8 @@ pci_dev_t pci_hose_find_class(struct pci_controller *hose, int bus, short find_c
pci_hose_read_config_byte(hose, dev, 0x0B, &c1); pci_hose_read_config_byte(hose, dev, 0x0B, &c1);
pci_hose_read_config_byte(hose, dev, 0x0A, &c2); pci_hose_read_config_byte(hose, dev, 0x0A, &c2);
class = c1<<8 | c2; class = c1<<8 | c2;
//printf("At %02x:%02x:%02x: class %x\n", /*printf("At %02x:%02x:%02x: class %x\n", */
// PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev), class); /* PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev), class); */
if (class == find_class) if (class == find_class)
{ {
if (index == 0) if (index == 0)
@ -441,7 +440,7 @@ pci_dev_t pci_find_bridge_for_bus(struct pci_controller *hose, int busnr)
if (hose == NULL) hose = &articiaS_hose; if (hose == NULL) hose = &articiaS_hose;
if (busnr < hose->first_busno || busnr > hose->last_busno) return PCI_ANY_ID; // Not in range if (busnr < hose->first_busno || busnr > hose->last_busno) return PCI_ANY_ID; /* Not in range */
/* /*
* The bridge must be on a lower bus number * The bridge must be on a lower bus number
@ -467,7 +466,7 @@ pci_dev_t pci_find_bridge_for_bus(struct pci_controller *hose, int busnr)
if (!PCI_FUNC(dev)) if (!PCI_FUNC(dev))
found_multi = header_type & 0x80; found_multi = header_type & 0x80;
if (header_type == 1) // Bridge device header if (header_type == 1) /* Bridge device header */
{ {
pci_hose_read_config_byte(hose, dev, PCI_SECONDARY_BUS, &secondary_bus); pci_hose_read_config_byte(hose, dev, PCI_SECONDARY_BUS, &secondary_bus);
if ((int)secondary_bus == busnr) return dev; if ((int)secondary_bus == busnr) return dev;
@ -512,7 +511,7 @@ int articiaS_init_vga (void)
PRINTF("Searching for class 0x%x on bus %d\n", classes[classnr], busnr); PRINTF("Searching for class 0x%x on bus %d\n", classes[classnr], busnr);
/* Find the first of this class on this bus */ /* Find the first of this class on this bus */
dev = pci_hose_find_class(&articiaS_hose, busnr, classes[classnr], 0); dev = pci_hose_find_class(&articiaS_hose, busnr, classes[classnr], 0);
if (dev != ~0) if (dev != ~0)
{ {
PRINTF("Found VGA Card at %02x:%02x:%02x\n", PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev)); PRINTF("Found VGA Card at %02x:%02x:%02x\n", PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev));
break; break;

View File

@ -1,14 +1,13 @@
#include "macros.h" #include "macros.h"
#define GLOBALINFO0 0x50
#define GLOBALINFO0 0x50
#define GLOBALINFO0_BO (1<<7) #define GLOBALINFO0_BO (1<<7)
#define GLOBALINFO2_B1ARBITER (1<<6) #define GLOBALINFO2_B1ARBITER (1<<6)
#define HBUSACR0 0x5c #define HBUSACR0 0x5c
#define HBUSACR2_BURST (1<<0) #define HBUSACR2_BURST (1<<0)
#define HBUSACR2_LAT (1<<1) #define HBUSACR2_LAT (1<<1)
#define RECEIVER_HOLDING 0 #define RECEIVER_HOLDING 0
#define TRANSMITTER_HOLDING 0 #define TRANSMITTER_HOLDING 0
#define INTERRUPT_ENABLE 1 #define INTERRUPT_ENABLE 1
@ -35,9 +34,9 @@
#define SUPERIO_1 ((7 << 3) | (0)) #define SUPERIO_1 ((7 << 3) | (0))
#define SUPERIO_2 ((7 << 3) | (1)) #define SUPERIO_2 ((7 << 3) | (1))
.globl board_asm_init .globl board_asm_init
board_asm_init: board_asm_init:
mflr r29 mflr r29
/* Set 'Must-set' register */ /* Set 'Must-set' register */
@ -77,7 +76,7 @@ board_asm_init:
li r5, 0x47 li r5, 0x47
bl pci_write_cfg_byte*/ bl pci_write_cfg_byte*/
/* Enable NVRAM for environment */ /* Enable NVRAM for environment */
li r3, 0 li r3, 0
li r4, 0 li r4, 0
@ -91,7 +90,7 @@ board_asm_init:
siowb 0x40, 0x08 siowb 0x40, 0x08
siowb 0x41, 0x01 siowb 0x41, 0x01
siowb 0x45, 0x80 siowb 0x45, 0x80
siowb 0x46, 0x60 siowb 0x46, 0x60
siowb 0x47, 0x20 siowb 0x47, 0x20
siowb 0x48, 0x01 siowb 0x48, 0x01
siowb 0x4a, 0xc4 siowb 0x4a, 0xc4
@ -103,7 +102,7 @@ board_asm_init:
siowb 0x56, 0x99 siowb 0x56, 0x99
siowb 0x57, 0x90 siowb 0x57, 0x90
siowb 0x85, 0x01 siowb 0x85, 0x01
/* Enable configuration mode for SuperIO */ /* Enable configuration mode for SuperIO */
li r3, 0 li r3, 0
li r4, (7<<3) li r4, (7<<3)
@ -128,7 +127,7 @@ board_asm_init:
ori r3, r3, 0x0c ori r3, r3, 0x0c
outb 0x3f0, 0xe2 outb 0x3f0, 0xe2
outbr 0x3f1, r3 outbr 0x3f1, r3
/* Disable configuration mode */ /* Disable configuration mode */
li r3, 0 li r3, 0
li r4, (7<<3) li r4, (7<<3)
@ -145,7 +144,7 @@ board_asm_init:
mtlr r29 mtlr r29
blr blr
.globl new_reset .globl new_reset
.globl new_reset_end .globl new_reset_end
new_reset: new_reset:
@ -153,5 +152,5 @@ new_reset:
oris r0, r0, 0xFFF0 oris r0, r0, 0xFFF0
mtlr r0 mtlr r0
blr blr
new_reset_end: new_reset_end:

View File

@ -1,6 +1,5 @@
#include <common.h> #include <common.h>
#include <command.h> #include <command.h>
#include <cmd_boota.h>
#include "../disk/part_amiga.h" #include "../disk/part_amiga.h"
#include <asm/cache.h> #include <asm/cache.h>
@ -121,3 +120,10 @@ int do_boota (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
return 0; return 0;
} }
#if defined(CONFIG_AMIGAONEG3SE) && (CONFIG_COMMANDS & CFG_CMD_BSP)
cmd_tbl_t U_BOOT_CMD(BOOTA) = MK_CMD_ENTRY(
"boota", 3, 1, do_boota,
"boota - boot an Amiga kernel\n",
"address disk"
);
#endif /* _CMD_BOOTA_H */

View File

@ -29,5 +29,4 @@ X86EMU = -I../bios_emulator/scitech/include -I../bios_emulator/scitech/src/x86e
TEXT_BASE = 0xfff00000 TEXT_BASE = 0xfff00000
PLATFORM_CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE) -Wa,-mregnames -DEASTEREGG $(X86EMU) -Dprintk=printf #-DDEBUG PLATFORM_CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE) -Wa,-mregnames -DEASTEREGG $(X86EMU) -Dprintk=printf #-DDEBUG

View File

@ -36,45 +36,45 @@
/* 3Com Ethernet PCI definitions*/ /* 3Com Ethernet PCI definitions*/
// #define PCI_VENDOR_ID_3COM 0x10B7 /* #define PCI_VENDOR_ID_3COM 0x10B7 */
#define PCI_DEVICE_ID_3COM_3C905C 0x9200 #define PCI_DEVICE_ID_3COM_3C905C 0x9200
/* 3Com Commands, top 5 bits are command and bottom 11 bits are parameters */ /* 3Com Commands, top 5 bits are command and bottom 11 bits are parameters */
#define TotalReset (0<<11) #define TotalReset (0<<11)
#define SelectWindow (1<<11) #define SelectWindow (1<<11)
#define StartCoax (2<<11) #define StartCoax (2<<11)
#define RxDisable (3<<11) #define RxDisable (3<<11)
#define RxEnable (4<<11) #define RxEnable (4<<11)
#define RxReset (5<<11) #define RxReset (5<<11)
#define UpStall (6<<11) #define UpStall (6<<11)
#define UpUnstall (6<<11)+1 #define UpUnstall (6<<11)+1
#define DownStall (6<<11)+2 #define DownStall (6<<11)+2
#define DownUnstall (6<<11)+3 #define DownUnstall (6<<11)+3
#define RxDiscard (8<<11) #define RxDiscard (8<<11)
#define TxEnable (9<<11) #define TxEnable (9<<11)
#define TxDisable (10<<11) #define TxDisable (10<<11)
#define TxReset (11<<11) #define TxReset (11<<11)
#define FakeIntr (12<<11) #define FakeIntr (12<<11)
#define AckIntr (13<<11) #define AckIntr (13<<11)
#define SetIntrEnb (14<<11) #define SetIntrEnb (14<<11)
#define SetStatusEnb (15<<11) #define SetStatusEnb (15<<11)
#define SetRxFilter (16<<11) #define SetRxFilter (16<<11)
#define SetRxThreshold (17<<11) #define SetRxThreshold (17<<11)
#define SetTxThreshold (18<<11) #define SetTxThreshold (18<<11)
#define SetTxStart (19<<11) #define SetTxStart (19<<11)
#define StartDMAUp (20<<11) #define StartDMAUp (20<<11)
#define StartDMADown (20<<11)+1 #define StartDMADown (20<<11)+1
#define StatsEnable (21<<11) #define StatsEnable (21<<11)
#define StatsDisable (22<<11) #define StatsDisable (22<<11)
#define StopCoax (23<<11) #define StopCoax (23<<11)
#define SetFilterBit (25<<11) #define SetFilterBit (25<<11)
/* The SetRxFilter command accepts the following classes */ /* The SetRxFilter command accepts the following classes */
#define RxStation 1 #define RxStation 1
#define RxMulticast 2 #define RxMulticast 2
#define RxBroadcast 4 #define RxBroadcast 4
#define RxProm 8 #define RxProm 8
/* 3Com status word defnitions */ /* 3Com status word defnitions */
@ -83,12 +83,12 @@
#define HostError 0x0002 #define HostError 0x0002
#define TxComplete 0x0004 #define TxComplete 0x0004
#define TxAvailable 0x0008 #define TxAvailable 0x0008
#define RxComplete 0x0010 #define RxComplete 0x0010
#define RxEarly 0x0020 #define RxEarly 0x0020
#define IntReq 0x0040 #define IntReq 0x0040
#define StatsFull 0x0080 #define StatsFull 0x0080
#define DMADone (1<<8) #define DMADone (1<<8)
#define DownComplete (1<<9) #define DownComplete (1<<9)
#define UpComplete (1<<10) #define UpComplete (1<<10)
#define DMAInProgress (1<<11) /* DMA controller is still busy.*/ #define DMAInProgress (1<<11) /* DMA controller is still busy.*/
#define CmdInProgress (1<<12) /* EL3_CMD is still busy.*/ #define CmdInProgress (1<<12) /* EL3_CMD is still busy.*/
@ -114,31 +114,31 @@
/* EEPROM locations. */ /* EEPROM locations. */
#define PhysAddr01 0 #define PhysAddr01 0
#define PhysAddr23 1 #define PhysAddr23 1
#define PhysAddr45 2 #define PhysAddr45 2
#define ModelID 3 #define ModelID 3
#define EtherLink3ID 7 #define EtherLink3ID 7
#define IFXcvrIO 8 #define IFXcvrIO 8
#define IRQLine 9 #define IRQLine 9
#define NodeAddr01 10 #define NodeAddr01 10
#define NodeAddr23 11 #define NodeAddr23 11
#define NodeAddr45 12 #define NodeAddr45 12
#define DriverTune 13 #define DriverTune 13
#define Checksum 15 #define Checksum 15
/* Register window 1 offsets, the window used in normal operation */ /* Register window 1 offsets, the window used in normal operation */
#define TX_FIFO 0x10 #define TX_FIFO 0x10
#define RX_FIFO 0x10 #define RX_FIFO 0x10
#define RxErrors 0x14 #define RxErrors 0x14
#define RxStatus 0x18 #define RxStatus 0x18
#define Timer 0x1A #define Timer 0x1A
#define TxStatus 0x1B #define TxStatus 0x1B
#define TxFree 0x1C /* Remaining free bytes in Tx buffer. */ #define TxFree 0x1C /* Remaining free bytes in Tx buffer. */
/* Register Window 2 */ /* Register Window 2 */
#define Wn2_ResetOptions 12 #define Wn2_ResetOptions 12
/* Register Window 3: MAC/config bits */ /* Register Window 3: MAC/config bits */
@ -148,11 +148,11 @@
#define Wn3_Options 8 #define Wn3_Options 8
#define BFEXT(value, offset, bitcount) \ #define BFEXT(value, offset, bitcount) \
((((unsigned long)(value)) >> (offset)) & ((1 << (bitcount)) - 1)) ((((unsigned long)(value)) >> (offset)) & ((1 << (bitcount)) - 1))
#define BFINS(lhs, rhs, offset, bitcount) \ #define BFINS(lhs, rhs, offset, bitcount) \
(((lhs) & ~((((1 << (bitcount)) - 1)) << (offset))) | \ (((lhs) & ~((((1 << (bitcount)) - 1)) << (offset))) | \
(((rhs) & ((1 << (bitcount)) - 1)) << (offset))) (((rhs) & ((1 << (bitcount)) - 1)) << (offset)))
#define RAM_SIZE(v) BFEXT(v, 0, 3) #define RAM_SIZE(v) BFEXT(v, 0, 3)
#define RAM_WIDTH(v) BFEXT(v, 3, 1) #define RAM_WIDTH(v) BFEXT(v, 3, 1)
@ -163,7 +163,7 @@
#define AUTOSELECT(v) BFEXT(v, 24, 1) #define AUTOSELECT(v) BFEXT(v, 24, 1)
/* Register Window 4: Xcvr/media bits */ /* Register Window 4: Xcvr/media bits */
#define Wn4_FIFODiag 4 #define Wn4_FIFODiag 4
#define Wn4_NetDiag 6 #define Wn4_NetDiag 6
#define Wn4_PhysicalMgmt 8 #define Wn4_PhysicalMgmt 8
@ -196,28 +196,28 @@
#define DN_COMPLETE 0x00010000 /* This packet has been downloaded */ #define DN_COMPLETE 0x00010000 /* This packet has been downloaded */
struct rx_desc_3com { struct rx_desc_3com {
u32 next; /* Last entry points to 0 */ u32 next; /* Last entry points to 0 */
u32 status; /* FSH -> Frame Start Header */ u32 status; /* FSH -> Frame Start Header */
u32 addr; /* Up to 63 addr/len pairs possible */ u32 addr; /* Up to 63 addr/len pairs possible */
u32 length; /* Set LAST_FRAG to indicate last pair */ u32 length; /* Set LAST_FRAG to indicate last pair */
}; };
/* Values for the Rx status entry. */ /* Values for the Rx status entry. */
#define RxDComplete 0x00008000 #define RxDComplete 0x00008000
#define RxDError 0x4000 #define RxDError 0x4000
#define IPChksumErr (1<<25) #define IPChksumErr (1<<25)
#define TCPChksumErr (1<<26) #define TCPChksumErr (1<<26)
#define UDPChksumErr (1<<27) #define UDPChksumErr (1<<27)
#define IPChksumValid (1<<29) #define IPChksumValid (1<<29)
#define TCPChksumValid (1<<30) #define TCPChksumValid (1<<30)
#define UDPChksumValid (1<<31) #define UDPChksumValid (1<<31)
struct tx_desc_3com { struct tx_desc_3com {
u32 next; /* Last entry points to 0 */ u32 next; /* Last entry points to 0 */
u32 status; /* bits 0:12 length, others see below */ u32 status; /* bits 0:12 length, others see below */
u32 addr; u32 addr;
u32 length; u32 length;
}; };
/* Values for the Tx status entry. */ /* Values for the Tx status entry. */
@ -232,9 +232,9 @@ struct tx_desc_3com {
/* XCVR Types */ /* XCVR Types */
#define XCVR_10baseT 0 #define XCVR_10baseT 0
#define XCVR_AUI 1 #define XCVR_AUI 1
#define XCVR_10baseTOnly 2 #define XCVR_10baseTOnly 2
#define XCVR_10base2 3 #define XCVR_10base2 3
#define XCVR_100baseTx 4 #define XCVR_100baseTx 4
#define XCVR_100baseFx 5 #define XCVR_100baseFx 5
#define XCVR_MII 6 #define XCVR_MII 6
@ -243,10 +243,10 @@ struct tx_desc_3com {
#define XCVR_Default 10 /* I don't think this is correct -> should have been 0x10 if Auto Negotiate */ #define XCVR_Default 10 /* I don't think this is correct -> should have been 0x10 if Auto Negotiate */
struct descriptor { /* A generic descriptor. */ struct descriptor { /* A generic descriptor. */
u32 next; /* Last entry points to 0 */ u32 next; /* Last entry points to 0 */
u32 status; /* FSH -> Frame Start Header */ u32 status; /* FSH -> Frame Start Header */
u32 addr; /* Up to 63 addr/len pairs possible */ u32 addr; /* Up to 63 addr/len pairs possible */
u32 length; /* Set LAST_FRAG to indicate last pair */ u32 length; /* Set LAST_FRAG to indicate last pair */
}; };
/* Misc. definitions */ /* Misc. definitions */
@ -338,7 +338,7 @@ static inline int ETH_STATUS(struct eth_device* dev)
static inline void ETH_CMD(struct eth_device* dev, int command) static inline void ETH_CMD(struct eth_device* dev, int command)
{ {
*(volatile u16 *)io_to_phys(EL3_CMD + dev->iobase) = cpu_to_le16(command); *(volatile u16 *)io_to_phys(EL3_CMD + dev->iobase) = cpu_to_le16(command);
__asm volatile ("eieio"); __asm volatile ("eieio");
} }
@ -348,24 +348,24 @@ static inline void ETH_CMD(struct eth_device* dev, int command)
static int issue_and_wait(struct eth_device* dev, int command) static int issue_and_wait(struct eth_device* dev, int command)
{ {
int i, status; int i, status;
ETH_CMD(dev, command); ETH_CMD(dev, command);
for (i = 0; i < 2000; i++) { for (i = 0; i < 2000; i++) {
status = ETH_STATUS(dev); status = ETH_STATUS(dev);
//printf ("Issue: status 0x%4x.\n", status); /*printf ("Issue: status 0x%4x.\n", status); */
if (!(status & CmdInProgress)) if (!(status & CmdInProgress))
return 1; return 1;
} }
/* OK, that didn't work. Do it the slow way. One second */ /* OK, that didn't work. Do it the slow way. One second */
for (i = 0; i < 100000; i++) { for (i = 0; i < 100000; i++) {
status = ETH_STATUS(dev); status = ETH_STATUS(dev);
//printf ("Issue: status 0x%4x.\n", status); /*printf ("Issue: status 0x%4x.\n", status); */
return 1; return 1;
udelay(10); udelay(10);
} }
PRINTF("Ethernet command: 0x%4x did not complete! Status: 0x%4x\n", command, ETH_STATUS(dev) ); PRINTF("Ethernet command: 0x%4x did not complete! Status: 0x%4x\n", command, ETH_STATUS(dev) );
return 0; return 0;
} }
@ -378,7 +378,7 @@ static int auto_negotiate(struct eth_device* dev)
EL3WINDOW(dev, 1); EL3WINDOW(dev, 1);
// Wait for Auto negotiation to complete /* Wait for Auto negotiation to complete */
for (i = 0; i <= 1000; i++) for (i = 0; i <= 1000; i++)
{ {
if (ETH_INW(dev, 2) & 0x04) if (ETH_INW(dev, 2) & 0x04)
@ -391,7 +391,6 @@ static int auto_negotiate(struct eth_device* dev)
return 0; return 0;
} }
} }
return 1; return 1;
@ -430,10 +429,10 @@ void eth_interrupt(struct eth_device *dev)
int eth_3com_initialize(bd_t *bis) int eth_3com_initialize(bd_t *bis)
{ {
u32 eth_iobase = 0, status; u32 eth_iobase = 0, status;
int card_number = 0, ret; int card_number = 0, ret;
struct eth_device* dev; struct eth_device* dev;
pci_dev_t devno; pci_dev_t devno;
char *s; char *s;
s = getenv("3com_base"); s = getenv("3com_base");
@ -453,10 +452,10 @@ int eth_3com_initialize(bd_t *bis)
} }
ret = pci_read_config_dword(devno, PCI_BASE_ADDRESS_0, &eth_iobase); ret = pci_read_config_dword(devno, PCI_BASE_ADDRESS_0, &eth_iobase);
eth_iobase &= ~0xf; eth_iobase &= ~0xf;
PRINTF("eth: 3Com Found at Address: 0x%x\n", eth_iobase); PRINTF("eth: 3Com Found at Address: 0x%x\n", eth_iobase);
pci_write_config_dword(devno, PCI_COMMAND, PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); pci_write_config_dword(devno, PCI_COMMAND, PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
/* Check if I/O accesses and Bus Mastering are enabled */ /* Check if I/O accesses and Bus Mastering are enabled */
@ -481,28 +480,28 @@ int eth_3com_initialize(bd_t *bis)
goto Done; goto Done;
} }
dev = (struct eth_device*) malloc(sizeof(*dev)); //struct eth_device)); dev = (struct eth_device*) malloc(sizeof(*dev)); /*struct eth_device)); */
sprintf(dev->name, "3Com 3c920c#%d", card_number); sprintf(dev->name, "3Com 3c920c#%d", card_number);
dev->iobase = eth_iobase; dev->iobase = eth_iobase;
dev->priv = (void*) devno; dev->priv = (void*) devno;
dev->init = eth_3com_init; dev->init = eth_3com_init;
dev->halt = eth_3com_halt; dev->halt = eth_3com_halt;
dev->send = eth_3com_send; dev->send = eth_3com_send;
dev->recv = eth_3com_recv; dev->recv = eth_3com_recv;
eth_register(dev); eth_register(dev);
/* { */ /* { */
/* char interrupt; */ /* char interrupt; */
/* devno = pci_find_device(PCI_VENDOR_ID_3COM, PCI_DEVICE_ID_3COM_3C905C, 0); */ /* devno = pci_find_device(PCI_VENDOR_ID_3COM, PCI_DEVICE_ID_3COM_3C905C, 0); */
/* pci_read_config_byte(devno, PCI_INTERRUPT_LINE, &interrupt); */ /* pci_read_config_byte(devno, PCI_INTERRUPT_LINE, &interrupt); */
/* printf("Installing eth0 interrupt handler to %d\n", interrupt); */ /* printf("Installing eth0 interrupt handler to %d\n", interrupt); */
/* irq_install_handler(interrupt, eth_interrupt, dev); */ /* irq_install_handler(interrupt, eth_interrupt, dev); */
/* } */ /* } */
card_number++; card_number++;
/* Set the latency timer for value */ /* Set the latency timer for value */
s = getenv("3com_latency"); s = getenv("3com_latency");
@ -532,13 +531,13 @@ int eth_3com_initialize(bd_t *bis)
PRINTF ("Cannot allocate memory for RX_RING.....\n"); PRINTF ("Cannot allocate memory for RX_RING.....\n");
goto Done; goto Done;
} }
if (!(tx_ring = memalign(sizeof(struct tx_desc_3com) * NUM_TX_DESC, 16))) if (!(tx_ring = memalign(sizeof(struct tx_desc_3com) * NUM_TX_DESC, 16)))
{ {
PRINTF ("Cannot allocate memory for TX_RING.....\n"); PRINTF ("Cannot allocate memory for TX_RING.....\n");
goto Done; goto Done;
} }
Done: Done:
return status; return status;
} }
@ -552,7 +551,7 @@ static int eth_3com_init(struct eth_device* dev, bd_t *bis)
struct descriptor *ias_cmd; struct descriptor *ias_cmd;
/* Determine what type of network the machine is connected to */ /* Determine what type of network the machine is connected to */
/* presently drops the connect to 10Mbps */ /* presently drops the connect to 10Mbps */
if (!auto_negotiate(dev)) if (!auto_negotiate(dev))
{ {
@ -560,43 +559,43 @@ static int eth_3com_init(struct eth_device* dev, bd_t *bis)
goto Done; goto Done;
} }
issue_and_wait(dev, TxReset); issue_and_wait(dev, TxReset);
issue_and_wait(dev, RxReset|0x04); issue_and_wait(dev, RxReset|0x04);
/* Switch to register set 7 for normal use. */ /* Switch to register set 7 for normal use. */
EL3WINDOW(dev, 7); EL3WINDOW(dev, 7);
/* Initialize Rx and Tx rings */ /* Initialize Rx and Tx rings */
init_rx_ring(dev); init_rx_ring(dev);
purge_tx_ring(dev); purge_tx_ring(dev);
ETH_CMD(dev, SetRxFilter | RxStation | RxBroadcast | RxProm); ETH_CMD(dev, SetRxFilter | RxStation | RxBroadcast | RxProm);
issue_and_wait(dev,SetTxStart|0x07ff); issue_and_wait(dev,SetTxStart|0x07ff);
/* Below sets which indication bits to be seen. */ /* Below sets which indication bits to be seen. */
status_enable = SetStatusEnb | HostError | DownComplete | UpComplete | (1<<6); status_enable = SetStatusEnb | HostError | DownComplete | UpComplete | (1<<6);
ETH_CMD(dev, status_enable); ETH_CMD(dev, status_enable);
/* Below sets no bits are to cause an interrupt since this is just polling */ /* Below sets no bits are to cause an interrupt since this is just polling */
intr_enable = SetIntrEnb; intr_enable = SetIntrEnb;
// intr_enable = SetIntrEnb | (1<<9) | (1<<10) | (1<<6); /* intr_enable = SetIntrEnb | (1<<9) | (1<<10) | (1<<6); */
ETH_CMD(dev, intr_enable); ETH_CMD(dev, intr_enable);
ETH_OUTB(dev, 127, UpPoll); ETH_OUTB(dev, 127, UpPoll);
/* Ack all pending events, and set active indicator mask */ /* Ack all pending events, and set active indicator mask */
ETH_CMD(dev, AckIntr | IntLatch | TxAvailable | RxEarly | IntReq); ETH_CMD(dev, AckIntr | IntLatch | TxAvailable | RxEarly | IntReq);
ETH_CMD(dev, intr_enable); ETH_CMD(dev, intr_enable);
/* Tell the adapter where the RX ring is located */ /* Tell the adapter where the RX ring is located */
issue_and_wait(dev,UpStall); /* Stall and set the UplistPtr */ issue_and_wait(dev,UpStall); /* Stall and set the UplistPtr */
ETH_OUTL(dev, (u32)&rx_ring[rx_next], UpListPtr); ETH_OUTL(dev, (u32)&rx_ring[rx_next], UpListPtr);
ETH_CMD(dev, RxEnable); /* Enable the receiver. */ ETH_CMD(dev, RxEnable); /* Enable the receiver. */
issue_and_wait(dev,UpUnstall); issue_and_wait(dev,UpUnstall);
/* Send the Individual Address Setup frame */ /* Send the Individual Address Setup frame */
@ -612,7 +611,7 @@ static int eth_3com_init(struct eth_device* dev, bd_t *bis)
/* Tell the adapter where the TX ring is located */ /* Tell the adapter where the TX ring is located */
ETH_CMD(dev, TxEnable); /* Enable transmitter. */ ETH_CMD(dev, TxEnable); /* Enable transmitter. */
issue_and_wait(dev, DownStall); /* Stall and set the DownListPtr. */ issue_and_wait(dev, DownStall); /* Stall and set the DownListPtr. */
ETH_OUTL(dev, (u32)&tx_ring[tx_cur], DownListPtr); ETH_OUTL(dev, (u32)&tx_ring[tx_cur], DownListPtr);
issue_and_wait(dev, DownUnstall); issue_and_wait(dev, DownUnstall);
@ -627,13 +626,13 @@ static int eth_3com_init(struct eth_device* dev, bd_t *bis)
} }
if (ETH_STATUS(dev) & DownComplete) /* If DownLoad Complete ACK the bit */ if (ETH_STATUS(dev) & DownComplete) /* If DownLoad Complete ACK the bit */
{ {
ETH_CMD(dev, AckIntr | DownComplete); /* acknowledge the indication bit */ ETH_CMD(dev, AckIntr | DownComplete); /* acknowledge the indication bit */
issue_and_wait(dev, DownStall); /* stall and clear DownListPtr */ issue_and_wait(dev, DownStall); /* stall and clear DownListPtr */
ETH_OUTL(dev, 0, DownListPtr); ETH_OUTL(dev, 0, DownListPtr);
issue_and_wait(dev, DownUnstall); issue_and_wait(dev, DownUnstall);
} }
status = 1; status = 1;
Done: Done:
return status; return status;
} }
@ -673,8 +672,8 @@ int eth_3com_send(struct eth_device* dev, volatile void *packet, int length)
} }
if (ETH_STATUS(dev) & DownComplete) /* If DownLoad Complete ACK the bit */ if (ETH_STATUS(dev) & DownComplete) /* If DownLoad Complete ACK the bit */
{ {
ETH_CMD(dev, AckIntr | DownComplete); /* acknowledge the indication bit */ ETH_CMD(dev, AckIntr | DownComplete); /* acknowledge the indication bit */
issue_and_wait(dev, DownStall); /* stall and clear DownListPtr */ issue_and_wait(dev, DownStall); /* stall and clear DownListPtr */
ETH_OUTL(dev, 0, DownListPtr); ETH_OUTL(dev, 0, DownListPtr);
issue_and_wait(dev, DownUnstall); issue_and_wait(dev, DownUnstall);
} }
@ -710,15 +709,15 @@ int eth_3com_recv(struct eth_device* dev)
status = le32_to_cpu(rx_ring[rx_next].status); /* packet status */ status = le32_to_cpu(rx_ring[rx_next].status); /* packet status */
while (status & (1<<15)) while (status & (1<<15))
{ {
/* A packet has been received */ /* A packet has been received */
if (status & (1<<15)) if (status & (1<<15))
{ {
/* A valid frame received */ /* A valid frame received */
length = le32_to_cpu(rx_ring[rx_next].status) & 0x1fff; /* length is in bits 0 - 12 */ length = le32_to_cpu(rx_ring[rx_next].status) & 0x1fff; /* length is in bits 0 - 12 */
/* Pass the packet up to the protocol layers */ /* Pass the packet up to the protocol layers */
NetReceive((uchar *)le32_to_cpu(rx_ring[rx_next].addr), length); NetReceive((uchar *)le32_to_cpu(rx_ring[rx_next].addr), length);
@ -748,7 +747,7 @@ Done:
void eth_3com_halt(struct eth_device* dev) void eth_3com_halt(struct eth_device* dev)
{ {
if (!(dev->iobase)) if (!(dev->iobase))
{ {
goto Done; goto Done;
} }
@ -758,14 +757,14 @@ void eth_3com_halt(struct eth_device* dev)
issue_and_wait(dev, RxDisable); issue_and_wait(dev, RxDisable);
issue_and_wait(dev, TxDisable); issue_and_wait(dev, TxDisable);
// free(tx_ring); /* release memory allocated to the DPD and UPD rings */ /* free(tx_ring); /###* release memory allocated to the DPD and UPD rings */
// free(rx_ring); /* free(rx_ring); */
Done: Done:
return; return;
} }
static void init_rx_ring(struct eth_device* dev) static void init_rx_ring(struct eth_device* dev)
{ {
int i; int i;
@ -782,7 +781,7 @@ static void init_rx_ring(struct eth_device* dev)
rx_next = 0; rx_next = 0;
} }
static void purge_tx_ring(struct eth_device* dev) static void purge_tx_ring(struct eth_device* dev)
{ {
int i; int i;
@ -799,39 +798,39 @@ static void purge_tx_ring(struct eth_device* dev)
} }
} }
static void read_hw_addr(struct eth_device* dev, bd_t *bis) static void read_hw_addr(struct eth_device* dev, bd_t *bis)
{ {
u8 hw_addr[ETH_ALEN]; u8 hw_addr[ETH_ALEN];
unsigned int eeprom[0x40]; unsigned int eeprom[0x40];
unsigned int checksum = 0; unsigned int checksum = 0;
int i, j, timer; int i, j, timer;
/* Read the station address from the EEPROM. */ /* Read the station address from the EEPROM. */
EL3WINDOW(dev, 0); EL3WINDOW(dev, 0);
for (i = 0; i < 0x40; i++) for (i = 0; i < 0x40; i++)
{ {
ETH_OUTW(dev, EEPROM_Read + i, Wn0EepromCmd); ETH_OUTW(dev, EEPROM_Read + i, Wn0EepromCmd);
/* Pause for at least 162 us. for the read to take place. */ /* Pause for at least 162 us. for the read to take place. */
for (timer = 10; timer >= 0; timer--) for (timer = 10; timer >= 0; timer--)
{ {
udelay(162); udelay(162);
if ((ETH_INW(dev, Wn0EepromCmd) & 0x8000) == 0) if ((ETH_INW(dev, Wn0EepromCmd) & 0x8000) == 0)
break; break;
} }
eeprom[i] = ETH_INW(dev, Wn0EepromData); eeprom[i] = ETH_INW(dev, Wn0EepromData);
} }
/* Checksum calculation. I'm not sure about this part and there seems to be a bug on the 3com side of things */ /* Checksum calculation. I'm not sure about this part and there seems to be a bug on the 3com side of things */
for (i = 0; i < 0x21; i++) for (i = 0; i < 0x21; i++)
checksum ^= eeprom[i]; checksum ^= eeprom[i];
checksum = (checksum ^ (checksum >> 8)) & 0xff; checksum = (checksum ^ (checksum >> 8)) & 0xff;
if (checksum != 0xbb) if (checksum != 0xbb)
printf(" *** INVALID EEPROM CHECKSUM %4.4x *** \n", checksum); printf(" *** INVALID EEPROM CHECKSUM %4.4x *** \n", checksum);
for (i = 0, j = 0; i < 3; i++) for (i = 0, j = 0; i < 3; i++)
{ {
hw_addr[j++] = (u8)((eeprom[i+10] >> 8) & 0xff); hw_addr[j++] = (u8)((eeprom[i+10] >> 8) & 0xff);
hw_addr[j++] = (u8)(eeprom[i+10] & 0xff); hw_addr[j++] = (u8)(eeprom[i+10] & 0xff);
@ -839,9 +838,9 @@ static void read_hw_addr(struct eth_device* dev, bd_t *bis)
/* MAC Address is in window 2, write value from EEPROM to window 2 */ /* MAC Address is in window 2, write value from EEPROM to window 2 */
EL3WINDOW(dev, 2); EL3WINDOW(dev, 2);
for (i = 0; i < 6; i++) for (i = 0; i < 6; i++)
ETH_OUTB(dev, hw_addr[i], i); ETH_OUTB(dev, hw_addr[i], i);
for (j = 0; j < ETH_ALEN; j+=2) for (j = 0; j < ETH_ALEN; j+=2)
{ {
@ -849,9 +848,9 @@ static void read_hw_addr(struct eth_device* dev, bd_t *bis)
hw_addr[j+1] = (u8)((ETH_INW(dev, j) >> 8) & 0xff); hw_addr[j+1] = (u8)((ETH_INW(dev, j) >> 8) & 0xff);
} }
for (i=0;i<ETH_ALEN;i++) for (i=0;i<ETH_ALEN;i++)
{ {
if (hw_addr[i] != bis->bi_enetaddr[i]) if (hw_addr[i] != bis->bi_enetaddr[i])
{ {
/* printf("Warning: HW address don't match:\n"); */ /* printf("Warning: HW address don't match:\n"); */
/* printf("Address in 3Com Window 2 is " */ /* printf("Address in 3Com Window 2 is " */
@ -870,9 +869,9 @@ static void read_hw_addr(struct eth_device* dev, bd_t *bis)
bis->bi_enetaddr[4] == 0 && bis->bi_enetaddr[5] == 0) bis->bi_enetaddr[4] == 0 && bis->bi_enetaddr[5] == 0)
{ {
sprintf(buffer, "%02X:%02X:%02X:%02X:%02X:%02X", sprintf(buffer, "%02X:%02X:%02X:%02X:%02X:%02X",
hw_addr[0], hw_addr[1], hw_addr[2], hw_addr[0], hw_addr[1], hw_addr[2],
hw_addr[3], hw_addr[4], hw_addr[5]); hw_addr[3], hw_addr[4], hw_addr[5]);
setenv("ethaddr", buffer); setenv("ethaddr", buffer);
} }
} }
@ -883,4 +882,3 @@ static void read_hw_addr(struct eth_device* dev, bd_t *bis)
Done: Done:
return; return;
} }

View File

@ -27,11 +27,10 @@
#include <common.h> #include <common.h>
#include <flash.h> #include <flash.h>
#include <asm/io.h> #include <asm/io.h>
#include "memio.h" #include "memio.h"
/*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/
#undef DEBUG_FLASH #undef DEBUG_FLASH
//#define DEBUG_FLASH
#ifdef DEBUG_FLASH #ifdef DEBUG_FLASH
#define DEBUGF(fmt,args...) printf(fmt ,##args) #define DEBUGF(fmt,args...) printf(fmt ,##args)
@ -68,7 +67,7 @@ static void flash_to_mem(void)
unsigned char x; unsigned char x;
flash_xd_nest --; flash_xd_nest --;
if (flash_xd_nest == 0) if (flash_xd_nest == 0)
{ {
DEBUGF("Flash on memory bus\n"); DEBUGF("Flash on memory bus\n");
@ -327,7 +326,7 @@ static int flash_get_offsets (ulong base, flash_info_t *info)
/* set sector offsets for uniform sector type */ /* set sector offsets for uniform sector type */
for (i = 0; i < info->sector_count; i++) { for (i = 0; i < info->sector_count; i++) {
info->start[i] = base + i * info->size / info->start[i] = base + i * info->size /
info->sector_count; info->sector_count;
} }
break; break;
default: default:
@ -478,7 +477,7 @@ int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
} }
if ((rc = write_word(info, wp, data)) != 0) { if ((rc = write_word(info, wp, data)) != 0) {
flash_to_mem(); flash_to_mem();
return (rc); return (rc);
} }
wp += 4; wp += 4;
@ -493,7 +492,7 @@ int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
data = (data << 8) | *src++; data = (data << 8) | *src++;
} }
if ((rc = write_word(info, wp, data)) != 0) { if ((rc = write_word(info, wp, data)) != 0) {
flash_to_mem(); flash_to_mem();
return (rc); return (rc);
} }
wp += 4; wp += 4;
@ -582,7 +581,7 @@ static int write_word (flash_info_t *info, ulong dest, ulong data)
*/ */
static void flash_reset (ulong addr) static void flash_reset (ulong addr)
{ {
flash_to_xd(); flash_to_xd();
out8(addr, 0xF0); /* reset bank */ out8(addr, 0xF0); /* reset bank */
iobarrier_rw(); iobarrier_rw();
flash_to_mem(); flash_to_mem();
@ -633,10 +632,10 @@ void flash_print_info (flash_info_t *info)
info->size / 0x100000, info->sector_count); info->size / 0x100000, info->sector_count);
} else if (info->size % 0x400 == 0) { } else if (info->size % 0x400 == 0) {
printf (" Size: %ld KB in %d Sectors\n", printf (" Size: %ld KB in %d Sectors\n",
info->size / 0x400, info->sector_count); info->size / 0x400, info->sector_count);
} else { } else {
printf (" Size: %ld B in %d Sectors\n", printf (" Size: %ld B in %d Sectors\n",
info->size, info->sector_count); info->size, info->sector_count);
} }
printf (" Sector Start Addresses:"); printf (" Sector Start Addresses:");

View File

@ -75,16 +75,16 @@ void i8259_init(void)
char dummy; char dummy;
PRINTF("Initializing Interrupt controller\n"); PRINTF("Initializing Interrupt controller\n");
/* init master interrupt controller */ /* init master interrupt controller */
out8(0x20, 0x11); //0x19); // was: 0x11); /* Start init sequence */ out8(0x20, 0x11); /* 0x19); /###* Start init sequence */
out8(0x21, 0x00); /* Vector base */ out8(0x21, 0x00); /* Vector base */
out8(0x21, 0x04); /* edge tiggered, Cascade (slave) on IRQ2 */ out8(0x21, 0x04); /* edge tiggered, Cascade (slave) on IRQ2 */
out8(0x21, 0x11); // was: 0x01); /* Select 8086 mode */ out8(0x21, 0x11); /* was: 0x01); /###* Select 8086 mode */
/* init slave interrupt controller */ /* init slave interrupt controller */
out8(0xA0, 0x11); //0x19); // was: 0x11); /* Start init sequence */ out8(0xA0, 0x11); /* 0x19); /###* Start init sequence */
out8(0xA1, 0x08); /* Vector base */ out8(0xA1, 0x08); /* Vector base */
out8(0xA1, 0x02); /* edge triggered, Cascade (slave) on IRQ2 */ out8(0xA1, 0x02); /* edge triggered, Cascade (slave) on IRQ2 */
out8(0xA1, 0x11); // was: 0x01); /* Select 8086 mode */ out8(0xA1, 0x11); /* was: 0x01); /###* Select 8086 mode */
/* always read ISR */ /* always read ISR */
out8(0x20, 0x0B); out8(0x20, 0x0B);

View File

@ -73,7 +73,7 @@ get_msr(void)
static __inline__ void static __inline__ void
set_msr(unsigned long msr) set_msr(unsigned long msr)
{ {
asm volatile("mtmsr %0" : : "r" (msr)); asm volatile("mtmsr %0" : : "r" (msr));
} }
static __inline__ unsigned long static __inline__ unsigned long
@ -89,7 +89,7 @@ get_dec(void)
static __inline__ void static __inline__ void
set_dec(unsigned long val) set_dec(unsigned long val)
{ {
asm volatile("mtdec %0" : : "r" (val)); asm volatile("mtdec %0" : : "r" (val));
} }
@ -167,8 +167,8 @@ external_interrupt(struct pt_regs *regs)
int irq, unmask = 1; int irq, unmask = 1;
irq = i8259_irq(); //i8259_get_irq(regs); irq = i8259_irq(); /*i8259_get_irq(regs); */
// printf("irq = %d, handler at %p ack=%d\n", irq, irq_handlers[irq].handler, *(volatile unsigned char *)0xFEF00000); /* printf("irq = %d, handler at %p ack=%d\n", irq, irq_handlers[irq].handler, *(volatile unsigned char *)0xFEF00000); */
i8259_mask_and_ack(irq); i8259_mask_and_ack(irq);
if (irq_handlers[irq].handler != NULL) if (irq_handlers[irq].handler != NULL)
@ -264,5 +264,3 @@ do_irqinfo(cmd_tbl_t *cmdtp, bd_t *bd, int flag, int argc, char *argv[])
{ {
puts("IRQ related functions are unimplemented currently.\n"); puts("IRQ related functions are unimplemented currently.\n");
} }

View File

@ -5,20 +5,20 @@
/* /*
** Load a long integer into a register ** Load a long integer into a register
*/ */
.macro liw reg, value .macro liw reg, value
lis \reg, \value@h lis \reg, \value@h
ori \reg, \reg, \value@l ori \reg, \reg, \value@l
.endm .endm
/* /*
** Generate config_addr request ** Generate config_addr request
** This macro expects the values in registers: ** This macro expects the values in registers:
** r3 - bus ** r3 - bus
** r4 - devfn ** r4 - devfn
** r5 - offset ** r5 - offset
*/ */
.macro config_addr .macro config_addr
rlwinm r9, r5, 24, 0, 6 rlwinm r9, r5, 24, 0, 6
rlwinm r8, r4, 16, 0, 31 rlwinm r8, r4, 16, 0, 31
rlwinm r7, r3, 8, 0, 31 rlwinm r7, r3, 8, 0, 31
@ -31,7 +31,7 @@
sync sync
.endm .endm
/* /*
** Generate config_data address ** Generate config_data address
*/ */
@ -45,40 +45,40 @@
/* /*
** Write a byte value to an output port ** Write a byte value to an output port
*/ */
.macro outb port, value .macro outb port, value
lis r2, 0xfe00 lis r2, 0xfe00
li r0, \value li r0, \value
stb r0, \port(r2) stb r0, \port(r2)
.endm .endm
/* /*
** Write a register byte value to an output port ** Write a register byte value to an output port
*/ */
.macro outbr port, value .macro outbr port, value
lis r2, 0xfe00 lis r2, 0xfe00
stb \value, \port(r2) stb \value, \port(r2)
.endm .endm
/* /*
** Read a byte value from a port into a specified register ** Read a byte value from a port into a specified register
*/ */
.macro inb reg, port .macro inb reg, port
lis r2, 0xfe00 lis r2, 0xfe00
lbz \reg, \port(r2) lbz \reg, \port(r2)
.endm .endm
/* /*
** Write a byte to the SuperIO config area ** Write a byte to the SuperIO config area
*/ */
.macro siowb offset, value .macro siowb offset, value
li r3, 0 li r3, 0
li r4, (7<<3) li r4, (7<<3)
li r5, \offset li r5, \offset
li r6, \value li r6, \value
bl pci_write_cfg_byte bl pci_write_cfg_byte
.endm .endm
#endif #endif

View File

@ -1,9 +1,8 @@
#include "macros.h" #include "macros.h"
.globl pci_read_cfg_byte .globl pci_read_cfg_byte
pci_read_cfg_byte: pci_read_cfg_byte:
config_addr config_addr
config_data 3 config_data 3
@ -12,11 +11,10 @@ pci_read_cfg_byte:
lbz r3, 0(r9) lbz r3, 0(r9)
blr blr
.globl pci_write_cfg_byte .globl pci_write_cfg_byte
pci_write_cfg_byte: pci_write_cfg_byte:
config_addr config_addr
config_data 3 config_data 3
stb r6, 0(r9) stb r6, 0(r9)
@ -25,9 +23,8 @@ pci_write_cfg_byte:
blr blr
.globl pci_read_cfg_word .globl pci_read_cfg_word
pci_read_cfg_word: pci_read_cfg_word:
config_addr config_addr
config_data 2 config_data 2
@ -37,9 +34,8 @@ pci_read_cfg_word:
blr blr
.globl pci_write_cfg_word .globl pci_write_cfg_word
pci_write_cfg_word: pci_write_cfg_word:
config_addr config_addr
config_data 2 config_data 2
@ -48,10 +44,9 @@ pci_write_cfg_word:
sync sync
blr blr
.globl pci_read_cfg_long .globl pci_read_cfg_long
pci_read_cfg_long: pci_read_cfg_long:
config_addr config_addr
config_data 0 config_data 0
@ -61,9 +56,8 @@ pci_read_cfg_long:
blr blr
.globl pci_write_cfg_long .globl pci_write_cfg_long
pci_write_cfg_long: pci_write_cfg_long:
config_addr config_addr
config_data 0 config_data 0
@ -71,4 +65,3 @@ pci_write_cfg_long:
eieio eieio
sync sync
blr blr

View File

@ -2,7 +2,7 @@
* Memory mapped IO * Memory mapped IO
* *
* (C) Copyright 2002 * (C) Copyright 2002
* Hyperion Entertainment, ThomasF@hyperion-entertainment.com * Hyperion Entertainment, ThomasF@hyperion-entertainment.com
* *
* See file CREDITS for list of people who contributed to this * See file CREDITS for list of people who contributed to this
* project. * project.
@ -15,9 +15,9 @@
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* *
*/ */
#ifndef _MEMIO_H #ifndef _MEMIO_H
#define _MEMIO_H #define _MEMIO_H
@ -97,8 +97,8 @@ static inline void write_long_big(volatile uint32 *to, uint32 x)
#define CONFIG_ADDR(bus, devfn, offset) \ #define CONFIG_ADDR(bus, devfn, offset) \
write_long_big((uint32 *)0xFEC00CF8, \ write_long_big((uint32 *)0xFEC00CF8, \
((offset & 0xFC)<<24) | (devfn << 16) \ ((offset & 0xFC)<<24) | (devfn << 16) \
| (bus<<8) | 0x80); | (bus<<8) | 0x80);
#define CONFIG_DATA(offset,mask) ((void *)(0xFEE00CFC+(offset & mask))) #define CONFIG_DATA(offset,mask) ((void *)(0xFEE00CFC+(offset & mask)))

View File

@ -1,6 +1,6 @@
/* /*
* (C) Copyright 2002 * (C) Copyright 2002
* Thomas Frieden, Hyperion Entertainment * Thomas Frieden, Hyperion Entertainment
* ThomasF@hyperion-entertainment.com * ThomasF@hyperion-entertainment.com
* *
* See file CREDITS for list of people who contributed to this * See file CREDITS for list of people who contributed to this
@ -34,4 +34,3 @@ void disable_nvram(void)
{ {
pci_write_cfg_byte(0, 0, 0x56, 0x0); pci_write_cfg_byte(0, 0, 0x56, 0x0);
} }

View File

@ -1,7 +1,7 @@
/* /*
* (C) Copyright 2002 * (C) Copyright 2002
* John W. Linville, linville@tuxdriver.com * John W. Linville, linville@tuxdriver.com
* *
* Modified from code for support of MIP405 and PIP405 boards. Previous * Modified from code for support of MIP405 and PIP405 boards. Previous
* copyright follows. * copyright follows.
* *
@ -48,7 +48,6 @@ void i8259_unmask_irq(unsigned int irq);
#undef KBG_DEBUG #undef KBG_DEBUG
//#define KBG_DEBUG
#ifdef KBG_DEBUG #ifdef KBG_DEBUG
#define PRINTF(fmt,args...) printf (fmt ,##args) #define PRINTF(fmt,args...) printf (fmt ,##args)
@ -143,8 +142,6 @@ void i8259_unmask_irq(unsigned int irq);
#define KBD_BUFFER_LEN 0x20 /* size of the keyboardbuffer */ #define KBD_BUFFER_LEN 0x20 /* size of the keyboardbuffer */
static volatile char kbd_buffer[KBD_BUFFER_LEN]; static volatile char kbd_buffer[KBD_BUFFER_LEN];
static volatile int in_pointer = 0; static volatile int in_pointer = 0;
static volatile int out_pointer = 0; static volatile int out_pointer = 0;
@ -172,7 +169,7 @@ static unsigned char kbd_plain_xlate[] = {
'2', '3', '0', '.',0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 0x50 - 0x5F */ '2', '3', '0', '.',0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, /* 0x50 - 0x5F */
'\r',0xff,0xff '\r',0xff,0xff
}; };
static unsigned char kbd_shift_xlate[] = { static unsigned char kbd_shift_xlate[] = {
0xff,0x1b, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+','\b','\t', /* 0x00 - 0x0f */ 0xff,0x1b, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+','\b','\t', /* 0x00 - 0x0f */
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}','\r',0xff, 'A', 'S', /* 0x10 - 0x1f */ 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}','\r',0xff, 'A', 'S', /* 0x10 - 0x1f */
@ -194,7 +191,7 @@ static unsigned char kbd_ctrl_xlate[] = {
}; };
/****************************************************************** /******************************************************************
* Init * Init
******************************************************************/ ******************************************************************/
int isa_kbd_init(void) int isa_kbd_init(void)
@ -252,7 +249,7 @@ int drv_isa_kbd_init (void)
error=console_assign(stdin,DEVNAME); error=console_assign(stdin,DEVNAME);
if(error==0) if(error==0)
return 1; return 1;
else else
return error; return error;
} }
return 1; return 1;
@ -261,7 +258,7 @@ int drv_isa_kbd_init (void)
} }
/****************************************************************** /******************************************************************
* Queue handling * Queue handling
******************************************************************/ ******************************************************************/
/* puts character in the queue and sets up the in and out pointer */ /* puts character in the queue and sets up the in and out pointer */
void kbd_put_queue(char data) void kbd_put_queue(char data)
@ -287,7 +284,7 @@ int kbd_testc(void)
if(in_pointer==out_pointer) if(in_pointer==out_pointer)
return(0); /* no data */ return(0); /* no data */
else else
return(1); return(1);
} }
/* gets the character from the queue */ /* gets the character from the queue */
int kbd_getc(void) int kbd_getc(void)
@ -295,13 +292,13 @@ int kbd_getc(void)
char c; char c;
while(in_pointer==out_pointer); while(in_pointer==out_pointer);
if((out_pointer+1)==KBD_BUFFER_LEN) if((out_pointer+1)==KBD_BUFFER_LEN)
out_pointer=0; out_pointer=0;
else else
out_pointer++; out_pointer++;
c=kbd_buffer[out_pointer]; c=kbd_buffer[out_pointer];
return (int)c; return (int)c;
} }
@ -324,7 +321,7 @@ void kbd_set_leds(void)
kbd_send_data(KBD_CMD_SET_LEDS); kbd_send_data(KBD_CMD_SET_LEDS);
kbd_send_data(leds); kbd_send_data(leds);
} }
void handle_keyboard_event(unsigned char scancode) void handle_keyboard_event(unsigned char scancode)
{ {
@ -381,11 +378,11 @@ void handle_keyboard_event(unsigned char scancode)
console_changed = 1; console_changed = 1;
} }
return; return;
case 0x2A: case 0x2A:
case 0x36: /* shift pressed */ case 0x36: /* shift pressed */
shift=1; shift=1;
return; /* do nothing else */ return; /* do nothing else */
case 0xAA: case 0xAA:
case 0xB6: /* shift released */ case 0xB6: /* shift released */
shift=0; shift=0;
return; /* do nothing else */ return; /* do nothing else */
@ -408,15 +405,15 @@ void handle_keyboard_event(unsigned char scancode)
case 0x3A: /* capslock pressed */ case 0x3A: /* capslock pressed */
caps_lock=~caps_lock; caps_lock=~caps_lock;
kbd_set_leds(); kbd_set_leds();
return; return;
case 0x45: /* numlock pressed */ case 0x45: /* numlock pressed */
num_lock=~num_lock; num_lock=~num_lock;
kbd_set_leds(); kbd_set_leds();
return; return;
case 0xC6: /* scroll lock released */ case 0xC6: /* scroll lock released */
case 0xC5: /* num lock released */ case 0xC5: /* num lock released */
case 0xBA: /* caps lock released */ case 0xBA: /* caps lock released */
return; /* just swallow */ return; /* just swallow */
} }
if((scancode&0x80)==0x80) /* key released */ if((scancode&0x80)==0x80) /* key released */
return; return;
@ -456,7 +453,7 @@ void handle_keyboard_event(unsigned char scancode)
PRINTF("unkown scancode %X\n",scancode); PRINTF("unkown scancode %X\n",scancode);
return; /* swallow unknown codes */ return; /* swallow unknown codes */
} }
kbd_put_queue(keycode); kbd_put_queue(keycode);
PRINTF("%x\n",keycode); PRINTF("%x\n",keycode);
} }
@ -494,30 +491,29 @@ unsigned char handle_kbd_event(void)
} }
/****************************************************************************** /******************************************************************************
* Lowlevel Part of keyboard section * Lowlevel Part of keyboard section
*/ */
unsigned char kbd_read_status(void) unsigned char kbd_read_status(void)
{ {
return(in8(CFG_ISA_IO_BASE_ADDRESS + KDB_COMMAND_PORT)); return(in8(CFG_ISA_IO_BASE_ADDRESS + KDB_COMMAND_PORT));
} }
unsigned char kbd_read_input(void) unsigned char kbd_read_input(void)
{ {
return(in8(CFG_ISA_IO_BASE_ADDRESS + KDB_DATA_PORT)); return(in8(CFG_ISA_IO_BASE_ADDRESS + KDB_DATA_PORT));
} }
void kbd_write_command(unsigned char cmd) void kbd_write_command(unsigned char cmd)
{ {
out8(CFG_ISA_IO_BASE_ADDRESS + KDB_COMMAND_PORT,cmd); out8(CFG_ISA_IO_BASE_ADDRESS + KDB_COMMAND_PORT,cmd);
} }
void kbd_write_output(unsigned char data) void kbd_write_output(unsigned char data)
{ {
out8(CFG_ISA_IO_BASE_ADDRESS + KDB_DATA_PORT, data); out8(CFG_ISA_IO_BASE_ADDRESS + KDB_DATA_PORT, data);
} }
int kbd_read_data(void) int kbd_read_data(void)
{ {
int val; int val;
@ -537,7 +533,7 @@ int kbd_wait_for_input(void)
{ {
unsigned long timeout; unsigned long timeout;
int val; int val;
timeout = KBD_TIMEOUT; timeout = KBD_TIMEOUT;
val=kbd_read_data(); val=kbd_read_data();
while(val < 0) while(val < 0)
@ -602,7 +598,7 @@ char * kbd_initialize(void)
* If the test is successful a x55 is placed in the input buffer. * If the test is successful a x55 is placed in the input buffer.
*/ */
kbd_write_command_w(KBD_CCMD_SELF_TEST); kbd_write_command_w(KBD_CCMD_SELF_TEST);
if (kbd_wait_for_input() != 0x55) if (kbd_wait_for_input() != 0x55)
return "Kbd: failed self test"; return "Kbd: failed self test";
/* /*
* Perform a keyboard interface test. This causes the controller * Perform a keyboard interface test. This causes the controller
@ -610,7 +606,7 @@ char * kbd_initialize(void)
* test are placed in the input buffer. * test are placed in the input buffer.
*/ */
kbd_write_command_w(KBD_CCMD_KBD_TEST); kbd_write_command_w(KBD_CCMD_KBD_TEST);
if (kbd_wait_for_input() != 0x00) if (kbd_wait_for_input() != 0x00)
return "Kbd: interface failed self test"; return "Kbd: interface failed self test";
/* /*
* Enable the keyboard by allowing the keyboard clock to run. * Enable the keyboard by allowing the keyboard clock to run.
@ -628,7 +624,7 @@ char * kbd_initialize(void)
do { do {
kbd_write_output_w(KBD_CMD_RESET); kbd_write_output_w(KBD_CMD_RESET);
status = kbd_wait_for_input(); status = kbd_wait_for_input();
if (status == KBD_REPLY_ACK) if (status == KBD_REPLY_ACK)
break; break;
if (status != KBD_REPLY_RESEND) if (status != KBD_REPLY_RESEND)
{ {
@ -692,8 +688,3 @@ void kbd_interrupt(void)
{ {
handle_kbd_event(); handle_kbd_event();
} }
/* eof */

View File

@ -1,7 +1,7 @@
/* /*
* (C) Copyright 2002 * (C) Copyright 2002
* John W. Linville, linville@tuxdriver.com * John W. Linville, linville@tuxdriver.com
* *
* Modified from code for support of MIP405 and PIP405 boards. Previous * Modified from code for support of MIP405 and PIP405 boards. Previous
* copyright follows. * copyright follows.
* *
@ -30,7 +30,7 @@
#ifndef _KBD_H_ #ifndef _KBD_H_
#define _KBD_H_ #define _KBD_H_
extern int kbd_testc(void); extern int kbd_testc(void);
extern int kbd_getc(void); extern int kbd_getc(void);
extern void kbd_interrupt(void); extern void kbd_interrupt(void);

View File

@ -2,7 +2,7 @@
* short type names * short type names
* *
* (C) Copyright 2002 * (C) Copyright 2002
* Hyperion Entertainment, ThomasF@hyperion-entertainment.com * Hyperion Entertainment, ThomasF@hyperion-entertainment.com
* *
* See file CREDITS for list of people who contributed to this * See file CREDITS for list of people who contributed to this
* project. * project.

View File

@ -26,18 +26,18 @@ void sm_write_byte(uint8 writeme)
{ {
int i; int i;
int level; int level;
out_byte(0xA539, 0x00); out_byte(0xA539, 0x00);
level = 0; level = 0;
for (i=0; i<8; i++) for (i=0; i<8; i++)
{ {
if ((writeme & 0x80) == (level<<7)) if ((writeme & 0x80) == (level<<7))
{ {
/* Bit did not change, rewrite strobe */ /* Bit did not change, rewrite strobe */
out_byte(0xA539, level | 0x02); out_byte(0xA539, level | 0x02);
out_byte(0xA539, level); out_byte(0xA539, level);
} }
else else
{ {
@ -68,7 +68,7 @@ uint8 sm_read_byte(void)
} }
return retme; return retme;
} }
int sm_get_ack(void) int sm_get_ack(void)
{ {
@ -106,36 +106,36 @@ void sm_send_stop(void)
int sm_read_byte_from_device(uint8 addr, uint8 reg, uint8 *storage) int sm_read_byte_from_device(uint8 addr, uint8 reg, uint8 *storage)
{ {
// S Addr Wr /* S Addr Wr */
sm_write_mode(); sm_write_mode();
sm_send_start(); sm_send_start();
sm_write_byte((addr<<1)); sm_write_byte((addr<<1));
// [A] /* [A] */
sm_read_mode(); sm_read_mode();
if (sm_get_ack() == FALSE) return FALSE; if (sm_get_ack() == FALSE) return FALSE;
// Comm /* Comm */
sm_write_mode(); sm_write_mode();
sm_write_byte(reg); sm_write_byte(reg);
// [A] /* [A] */
sm_read_mode(); sm_read_mode();
if (sm_get_ack() == FALSE) return FALSE; if (sm_get_ack() == FALSE) return FALSE;
// S Addr Rd /* S Addr Rd */
sm_write_mode(); sm_write_mode();
sm_send_start(); sm_send_start();
sm_write_byte((addr<<1)|1); sm_write_byte((addr<<1)|1);
// [A] /* [A] */
sm_read_mode(); sm_read_mode();
if (sm_get_ack() == FALSE) return FALSE; if (sm_get_ack() == FALSE) return FALSE;
// [Data] /* [Data] */
*storage = sm_read_byte(); *storage = sm_read_byte();
// NA /* NA */
sm_write_mode(); sm_write_mode();
sm_write_nack(); sm_write_nack();
sm_send_stop(); sm_send_stop();
@ -144,10 +144,10 @@ int sm_read_byte_from_device(uint8 addr, uint8 reg, uint8 *storage)
} }
void sm_init(void) void sm_init(void)
{ {
/* Switch to PMC mode */ /* Switch to PMC mode */
pci_write_cfg_byte(0, 0, REG_GROUP, (uint8)(REG_GROUP_SPECIAL|REG_GROUP_POWER)); pci_write_cfg_byte(0, 0, REG_GROUP, (uint8)(REG_GROUP_SPECIAL|REG_GROUP_POWER));
/* Set GPIO Base */ /* Set GPIO Base */
pci_write_cfg_long(0, 0, 0x40, 0xa500); pci_write_cfg_long(0, 0, 0x40, 0xa500);
@ -155,12 +155,12 @@ void sm_init(void)
pci_write_cfg_byte(0, 0, 0x44, 0x11); pci_write_cfg_byte(0, 0, 0x44, 0x11);
/* Set both GPIO 0 and 1 as output */ /* Set both GPIO 0 and 1 as output */
out_byte(0xA53A, 0x03); out_byte(0xA53A, 0x03);
} }
void sm_term(void) void sm_term(void)
{ {
/* Switch to normal mode */ /* Switch to normal mode */
pci_write_cfg_byte(0, 0, REG_GROUP, 0); pci_write_cfg_byte(0, 0, REG_GROUP, 0);
} }
@ -173,7 +173,7 @@ int sm_get_data(uint8 *DataArray, int dimm_socket)
#if 0 #if 0
/* Switch to PMC mode */ /* Switch to PMC mode */
pci_write_cfg_byte(0, 0, REG_GROUP, (uint8)(REG_GROUP_SPECIAL|REG_GROUP_POWER)); pci_write_cfg_byte(0, 0, REG_GROUP, (uint8)(REG_GROUP_SPECIAL|REG_GROUP_POWER));
/* Set GPIO Base */ /* Set GPIO Base */
pci_write_cfg_long(0, 0, 0x40, 0xa500); pci_write_cfg_long(0, 0, 0x40, 0xa500);
@ -181,7 +181,7 @@ int sm_get_data(uint8 *DataArray, int dimm_socket)
pci_write_cfg_byte(0, 0, 0x44, 0x11); pci_write_cfg_byte(0, 0, 0x44, 0x11);
/* Set both GPIO 0 and 1 as output */ /* Set both GPIO 0 and 1 as output */
out_byte(0xA53A, 0x03); out_byte(0xA53A, 0x03);
#endif #endif
sm_init(); sm_init();

View File

@ -1,201 +1,198 @@
/*------------------------------------------------------*/ /*------------------------------------------------------*/
/* TERON Articia / SDRAM Init */ /* TERON Articia / SDRAM Init */
/*------------------------------------------------------*/ /*------------------------------------------------------*/
* XD_CTL = 0x81000000 (0x74) * XD_CTL = 0x81000000 (0x74)
* HBUS_ACC_CTL_0 &= 0xFFFFFDFF (0x5c) * HBUS_ACC_CTL_0 &= 0xFFFFFDFF (0x5c)
/* host bus access ctl reg 2(5e) */ /* host bus access ctl reg 2(5e) */
/* set - CPU read from memory data one clock after data is latched */ /* set - CPU read from memory data one clock after data is latched */
* GLOBL_INFO_0 |= 0x00004000 (0x50) * GLOBL_INFO_0 |= 0x00004000 (0x50)
/* global info register 2 (52), AGP/PCI bus 1 arbiter is addressed in Articia S */ /* global info register 2 (52), AGP/PCI bus 1 arbiter is addressed in Articia S */
PCI_1_SB_CONFIG_0 |= 0x00000400 (0x80d0) PCI_1_SB_CONFIG_0 |= 0x00000400 (0x80d0)
/* PCI1 side band config reg 2 (d2), enable read acces while write buffer not empty */ /* PCI1 side band config reg 2 (d2), enable read acces while write buffer not empty */
MEM_RAS_CTL_0 |= 0x3f000000 (0xcc) MEM_RAS_CTL_0 |= 0x3f000000 (0xcc)
&= 0x3fffffff &= 0x3fffffff
/* RAS park control reg 0(cc), park access enable is set */ /* RAS park control reg 0(cc), park access enable is set */
HOST_RDBUF_CTL |= 0x10000000 (0x70) HOST_RDBUF_CTL |= 0x10000000 (0x70)
&= 0x10ffffff &= 0x10ffffff
/* host read buffer control reg, enable prefetch for CPU read from DRAM control */ /* host read buffer control reg, enable prefetch for CPU read from DRAM control */
HBUS_ACC_CTL_0 |= 0x0100001f (0x5c) HBUS_ACC_CTL_0 |= 0x0100001f (0x5c)
&= 0xf1ffffff &= 0xf1ffffff
/* host bus access control register, enable CPU address bus pipe control */ /* host bus access control register, enable CPU address bus pipe control */
/* two outstanding requests, *** changed to 2 from 3 */ /* two outstanding requests, *** changed to 2 from 3 */
/* enable line merge write control for CPU write to system memory, PCI 1 */ /* enable line merge write control for CPU write to system memory, PCI 1 */
/* and PCI 0 bus memory; enable page merge write control for write to */ /* and PCI 0 bus memory; enable page merge write control for write to */
/* PCI bus 0 & bus 1 memory */ /* PCI bus 0 & bus 1 memory */
SRAM_CTL |= 0x00004000 (0xc8) SRAM_CTL |= 0x00004000 (0xc8)
&= 0xffbff7ff &= 0xffbff7ff
/* DRAM detail timing control register 1 (ca), bit 3 set to 0 */ /* DRAM detail timing control register 1 (ca), bit 3 set to 0 */
/* DRAM start access latency control - wait for one clock */ /* DRAM start access latency control - wait for one clock */
/* ff9f changed to ffbf */ /* ff9f changed to ffbf */
DIM0_TIM_CTL_0 = 0x737d737d (0xc9) DIM0_TIM_CTL_0 = 0x737d737d (0xc9)
/* DRAM timing control for dimm0 & dimm1; set wait one clock */ /* DRAM timing control for dimm0 & dimm1; set wait one clock */
/* cycle for next data access */ /* cycle for next data access */
DIM2_TIM_CTL_0 = 0x737d737d (0xca) DIM2_TIM_CTL_0 = 0x737d737d (0xca)
/* DRAM timing control for dimm2 & dimm3; set wait one clock */ /* DRAM timing control for dimm2 & dimm3; set wait one clock */
/* cycle for next data access */ /* cycle for next data access */
DIM0_BNK0_CTL_0 = BNK0_RAM_SIZ_128MB (0x90) DIM0_BNK0_CTL_0 = BNK0_RAM_SIZ_128MB (0x90)
/* set dimm0 bank0 for 128 MB */ /* set dimm0 bank0 for 128 MB */
DIM0_BNK1_CTL_0 = BNK1_RAM_SIZ_128MB (0x94) DIM0_BNK1_CTL_0 = BNK1_RAM_SIZ_128MB (0x94)
/* set dimm0 for bank1 */ /* set dimm0 for bank1 */
DIM0_TIM_CTL_0 = 0xf3bf0000 (0xc9) DIM0_TIM_CTL_0 = 0xf3bf0000 (0xc9)
/* dimm0 timing control register; RAS - CAS latency - 4 clock */ /* dimm0 timing control register; RAS - CAS latency - 4 clock */
/* CAS access latency - 3 wait; pre-charge latency - 3 wait */ /* CAS access latency - 3 wait; pre-charge latency - 3 wait */
/* pre-charge command period control - 5 clock; wait one clock */ /* pre-charge command period control - 5 clock; wait one clock */
/* cycle for next data access; read to write access latency control */ /* cycle for next data access; read to write access latency control */
/* - 2 clock cycles */ /* - 2 clock cycles */
DRAM_GBL_CTL_0 |= 0x00000100 (0xc0) DRAM_GBL_CTL_0 |= 0x00000100 (0xc0)
&= 0xffff01ff &= 0xffff01ff
/* memory global control register - support buffer sdram on bank 0 */ /* memory global control register - support buffer sdram on bank 0 */
DRAM_ECC_CTL_0 |= 0x00260000 (0xc4) DRAM_ECC_CTL_0 |= 0x00260000 (0xc4)
&= 0xff26ffff &= 0xff26ffff
/* enable ECC; enable read, modify, write control */ /* enable ECC; enable read, modify, write control */
DRAM_REF_CTL_0 = DRAM_REF_DATA (0xb8) DRAM_REF_CTL_0 = DRAM_REF_DATA (0xb8)
/* set DRAM refresh parameters *** changed to 00940100 */ /* set DRAM refresh parameters *** changed to 00940100 */
nop nop
nop nop
nop nop
nop nop
nop nop
DRAM_ECC_CTL_0 |= 0x20243280 (0xc4) DRAM_ECC_CTL_0 |= 0x20243280 (0xc4)
/* turn off ecc */ /* turn off ecc */
/* for SDRAM bank 0 */ /* for SDRAM bank 0 */
DRAM_ECC_CTL_0 |= 0x20243290 (0xc4) ? DRAM_ECC_CTL_0 |= 0x20243290 (0xc4) ?
/* for SDRAM bank 1 */ /* for SDRAM bank 1 */
/* Additional Stuff...*/ /* Additional Stuff...*/
GLOBL_CTRL |= 0x20000b00 (0x54) GLOBL_CTRL |= 0x20000b00 (0x54)
PCI_0_SB_CONFIG |= 0x04100007 (0xd0) PCI_0_SB_CONFIG |= 0x04100007 (0xd0)
/* PCI 0 Side band config reg*/ /* PCI 0 Side band config reg*/
0x8000083c |= 0x00080000 0x8000083c |= 0x00080000
/* Disable VGA decode on PCI Bus 1 */ /* Disable VGA decode on PCI Bus 1 */
/*End Additional Stuff..*/ /*End Additional Stuff..*/
/*--------------------------------------------------------------*/ /*--------------------------------------------------------------*/
/* TERON serial port initialization code */ /* TERON serial port initialization code */
/*--------------------------------------------------------------*/ /*--------------------------------------------------------------*/
0x84380080 |= 0x00030000 0x84380080 |= 0x00030000
/* enable super IO configuration VIA chip Register 85 */ /* enable super IO configuration VIA chip Register 85 */
/* Enable super I/O config mode */ /* Enable super I/O config mode */
0xfe0003f0 = 0xe2 0xfe0003f0 = 0xe2
bl delay1 bl delay1
0xfe0003f1 = 0x0f 0xfe0003f1 = 0x0f
bl delay1 bl delay1
/* enable com1 & com2, parallel port disabled */ /* enable com1 & com2, parallel port disabled */
0xfe0003f0 = 0xe7 0xfe0003f0 = 0xe7
bl delay1 bl delay1
/* let's make com1 base as 0x3f8 */ /* let's make com1 base as 0x3f8 */
0xfe0003f1 = 0xfe 0xfe0003f1 = 0xfe
bl delay1 bl delay1
0xfe0003f0 = 0xe8 0xfe0003f0 = 0xe8
bl delay1 bl delay1
/* let's make com2 base as 0x2f8 */ /* let's make com2 base as 0x2f8 */
0xfe0003f1 = 0xbe 0xfe0003f1 = 0xbe
0x84380080 &= 0xfffdffff 0x84380080 &= 0xfffdffff
/* closing super IO configuration VIA chip Register 85 */ /* closing super IO configuration VIA chip Register 85 */
/* -------------------------------*/ /* -------------------------------*/
0xfe0003fb = 0x83 0xfe0003fb = 0x83
bl delay1 bl delay1
/*latch enable word length -8 bit */ /* set mslab bit */ /*latch enable word length -8 bit */ /* set mslab bit */
0xfe0003f8 = 0x0c 0xfe0003f8 = 0x0c
bl delay1 bl delay1
/* set baud rate lsb for 9600 baud */ /* set baud rate lsb for 9600 baud */
0xfe0003f9 = 0x0 0xfe0003f9 = 0x0
bl delay1 bl delay1
/* set baud rate msb for 9600 baud */ /* set baud rate msb for 9600 baud */
0xfe0003fb = 0x03 0xfe0003fb = 0x03
bl delay1 bl delay1
/* reset mslab */ /* reset mslab */
/*--------------------------------------------------------------*/ /*--------------------------------------------------------------*/
/* END TERON Serial Port Initialization Code */ /* END TERON Serial Port Initialization Code */
/*--------------------------------------------------------------*/ /*--------------------------------------------------------------*/
/*--------------------------------------------------------------*/
/*--------------------------------------------------------------*/ /* END TERON Articia / SDRAM Initialization code */
/* END TERON Articia / SDRAM Initialization code */ /*--------------------------------------------------------------*/
/*--------------------------------------------------------------*/
Proposed from Documentation:
Proposed from Documentation:
write dmem 0xfec00cf8 0x50000080
write dmem 0xfec00cf8 0x50000080 write dmem 0xfee00cfc 0xc0305411
write dmem 0xfee00cfc 0xc0305411
Writes to index 0x50-0x53.
Writes to index 0x50-0x53. 0x50: Global Information Register 0
0x50: Global Information Register 0 0xC0 = Little Endian CPU, Sequential order Burst
0xC0 = Little Endian CPU, Sequential order Burst 0x51: Global Information Register 1
0x51: Global Information Register 1 Read only, 0x30 = Provides PowerPC and X86 support
Read only, 0x30 = Provides PowerPC and X86 support 0x52: Global Information Register 2
0x52: Global Information Register 2 0x05 = 64/128 bit CPU bus support
0x05 = 64/128 bit CPU bus support 0x53: Global Information Register 3
0x53: Global Information Register 3 0x80 = PCI Bus 0 grant active time is 1 clock after REQ# deasserted
0x80 = PCI Bus 0 grant active time is 1 clock after REQ# deasserted
write dmem 0xfec00cf8 0x5c000080
write dmem 0xfec00cf8 0x5c000080 write dmem 0xfee00cfc 0xb300011F
write dmem 0xfee00cfc 0xb300011F
write dmem 0xfec00cf8 0xc8000080
write dmem 0xfec00cf8 0xc8000080 write dmem 0xfee00cfc 0x0020f100
write dmem 0xfee00cfc 0x0020f100
write dmem 0xfec00cf8 0x90000080
write dmem 0xfec00cf8 0x90000080 write dmem 0xfee00cfc 0x007fe700
write dmem 0xfee00cfc 0x007fe700
write dmem 0xfec00cf8 0x9400080
write dmem 0xfec00cf8 0x9400080 write dmem 0xfee00cfc 0x007fe700
write dmem 0xfee00cfc 0x007fe700
write dmem 0xfec00cf8 0xb0000080
write dmem 0xfec00cf8 0xb0000080 write dmem 0xfee00cfc 0x737d737d
write dmem 0xfee00cfc 0x737d737d
write dmem 0xfec00cf8 0xb4000080
write dmem 0xfec00cf8 0xb4000080 write dmem 0xfee00cfc 0x737d737d
write dmem 0xfee00cfc 0x737d737d
write dmem 0xfec00cf8 0xc0000080
write dmem 0xfec00cf8 0xc0000080 write dmem 0xfee00cfc 0x40005500
write dmem 0xfee00cfc 0x40005500
write dmem 0xfec00cf8 0xb8000080
write dmem 0xfec00cf8 0xb8000080 write dmem 0xfee00cfc 0x00940100
write dmem 0xfee00cfc 0x00940100
write dmem 0xfec00cf8 0xc4000080
write dmem 0xfec00cf8 0xc4000080 write dmem 0xfee00cfc 0x00003280
write dmem 0xfee00cfc 0x00003280
write dmem 0xfec00cf8 0xc4000080
write dmem 0xfec00cf8 0xc4000080 write dmem 0xfee00cfc 0x00003290
write dmem 0xfee00cfc 0x00003290

View File

@ -63,7 +63,7 @@ SECTIONS
cpu/74xx_7xx/start.o (.text) cpu/74xx_7xx/start.o (.text)
/* store the environment in a seperate sector in the boot flash */ /* store the environment in a seperate sector in the boot flash */
/* . = env_offset; */ /* . = env_offset; */
common/environment.o(.text) common/environment.o(.text)
*(.text) *(.text)
*(.fixup) *(.fixup)
@ -87,7 +87,7 @@ SECTIONS
PROVIDE (erotext = .); PROVIDE (erotext = .);
.reloc : .reloc :
{ {
*(.got) *(.got)
_GOT2_TABLE_ = .; _GOT2_TABLE_ = .;
*(.got2) *(.got2)
_FIXUP_TABLE_ = .; _FIXUP_TABLE_ = .;
@ -108,6 +108,11 @@ SECTIONS
_edata = .; _edata = .;
PROVIDE (edata = .); PROVIDE (edata = .);
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
__start___ex_table = .; __start___ex_table = .;
__ex_table : { *(__ex_table) } __ex_table : { *(__ex_table) }
__stop___ex_table = .; __stop___ex_table = .;

View File

@ -83,7 +83,7 @@
#define USB_MAX_TEMP_INT_TD 32 /* number of temporary TDs for Interrupt transfers */ #define USB_MAX_TEMP_INT_TD 32 /* number of temporary TDs for Interrupt transfers */
//#define USB_UHCI_DEBUG /*#define USB_UHCI_DEBUG */
#ifdef USB_UHCI_DEBUG #ifdef USB_UHCI_DEBUG
#define USB_UHCI_PRINTF(fmt,args...) printf (fmt ,##args) #define USB_UHCI_PRINTF(fmt,args...) printf (fmt ,##args)
@ -599,7 +599,7 @@ int usb_lowlevel_init(void)
printf("Error USB UHCI (%04X,%04X) not found\n",USB_UHCI_VEND_ID,USB_UHCI_DEV_ID); printf("Error USB UHCI (%04X,%04X) not found\n",USB_UHCI_VEND_ID,USB_UHCI_DEV_ID);
return -1; return -1;
} }
#if 1 #if 1
s = getenv("usb_irq"); s = getenv("usb_irq");
if (s) if (s)
@ -1115,7 +1115,6 @@ static void usb_display_wValue(unsigned short wValue,unsigned short wIndex)
#endif #endif
#ifdef USB_UHCI_DEBUG #ifdef USB_UHCI_DEBUG
static int usb_display_td(uhci_td_t *td) static int usb_display_td(uhci_td_t *td)

View File

@ -190,5 +190,3 @@ struct virt_root_hub {
#endif /* _USB_UHCI_H_ */ #endif /* _USB_UHCI_H_ */

View File

@ -211,18 +211,18 @@ void via_cfgfunc_via686(struct pci_controller *host, pci_dev_t dev, struct pci_c
__asm (" .globl via_calibrate_time_base \n" __asm (" .globl via_calibrate_time_base \n"
"via_calibrate_time_base: \n" "via_calibrate_time_base: \n"
" lis 9, 0xfe00 \n" " lis 9, 0xfe00 \n"
" li 0, 0x00 \n" " li 0, 0x00 \n"
" mttbu 0 \n" " mttbu 0 \n"
" mttbl 0 \n" " mttbl 0 \n"
"ctb_loop: \n" "ctb_loop: \n"
" lbz 0, 0x61(9) \n" " lbz 0, 0x61(9) \n"
" eieio \n" " eieio \n"
" andi. 0, 0, 0x20 \n" " andi. 0, 0, 0x20 \n"
" beq ctb_loop \n" " beq ctb_loop \n"
"ctb_done: \n" "ctb_done: \n"
" mftb 3 \n" " mftb 3 \n"
" blr"); " blr");
extern unsigned long via_calibrate_time_base(void); extern unsigned long via_calibrate_time_base(void);

View File

@ -1,6 +1,6 @@
/* /*
* (C) Copyright 2002 * (C) Copyright 2002
* Hyperion Entertainment, Hans-JoergF@hyperion-entertainment.com * Hyperion Entertainment, Hans-JoergF@hyperion-entertainment.com
* *
* See file CREDITS for list of people who contributed to this * See file CREDITS for list of people who contributed to this
* project. * project.
@ -100,7 +100,7 @@ int drv_video_init(void)
video_inited = 1; video_inited = 1;
video_init(); video_init();
memset (&vgadev, 0, sizeof(vgadev)); memset (&vgadev, 0, sizeof(vgadev));
strcpy(vgadev.name, VIDEO_NAME); strcpy(vgadev.name, VIDEO_NAME);
vgadev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_SYSTEM; vgadev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_SYSTEM;
vgadev.putc = video_putc; vgadev.putc = video_putc;
@ -108,7 +108,7 @@ int drv_video_init(void)
vgadev.getc = NULL; vgadev.getc = NULL;
vgadev.tstc = NULL; vgadev.tstc = NULL;
vgadev.start = video_start; vgadev.start = video_start;
error = device_register (&vgadev); error = device_register (&vgadev);
if (error == 0) if (error == 0)
@ -129,11 +129,11 @@ int drv_video_init(void)
int video_init(void) int video_init(void)
{ {
cursor_position = VIDEO_BASE; // Color text display base cursor_position = VIDEO_BASE; /* Color text display base */
cursor_row = 0; cursor_row = 0;
cursor_col = 0; cursor_col = 0;
current_attr = video_get_attr(); // Currently selected value for attribute. current_attr = video_get_attr(); /* Currently selected value for attribute. */
// video_test(); /* video_test(); */
video_set_color(current_attr); video_set_color(current_attr);
return 0; return 0;
@ -283,7 +283,7 @@ void video_bios_print_string(char *s, int x, int y, int attr, int count)
void video_draw_box(int style, int attr, char *title, int separate, int x, int y, int w, int h) void video_draw_box(int style, int attr, char *title, int separate, int x, int y, int w, int h)
{ {
unsigned char *fb, *fb2; unsigned char *fb, *fb2;
unsigned char *st = (style == SINGLE_BOX)?video_single_box : video_double_box; unsigned char *st = (style == SINGLE_BOX)?video_single_box : video_double_box;
unsigned char *ti = (style == SINGLE_BOX)?video_single_title : video_double_title; unsigned char *ti = (style == SINGLE_BOX)?video_single_title : video_double_title;
int i; int i;
@ -324,11 +324,11 @@ void video_draw_box(int style, int attr, char *title, int separate, int x, int y
*fb = st[3]; *fb = st[3];
*(fb+1) = attr; fb += 2*VIDEO_COLS; *(fb+1) = attr; fb += 2*VIDEO_COLS;
*fb2 = st[4]; *fb2 = st[4];
*(fb2+1) = attr; fb2 += 2*VIDEO_COLS; *(fb2+1) = attr; fb2 += 2*VIDEO_COLS;
} }
// Draw title /* Draw title */
if (title) if (title)
{ {
if (separate == 0) if (separate == 0)
@ -370,7 +370,7 @@ void video_draw_box(int style, int attr, char *title, int separate, int x, int y
fb += 2; fb += 2;
} }
fb = video_addr(x+2, y+1); fb = video_addr(x+2, y+1);
while (*title) while (*title)
{ {
*fb = *title; *fb = *title;
@ -414,7 +414,7 @@ void video_save_rect(int x, int y, int w, int h, void *save_area, int clearchar,
} }
void video_restore_rect(int x, int y, int w, int h, void *save_area) void video_restore_rect(int x, int y, int w, int h, void *save_area)
{ {
unsigned char *save = (unsigned char *)save_area; unsigned char *save = (unsigned char *)save_area;
unsigned char *fb = video_addr(x,y); unsigned char *fb = video_addr(x,y);
int i,j; int i,j;
@ -484,7 +484,7 @@ void video_banner(void)
int i; int i;
char *s; char *s;
int maxdev; int maxdev;
if (video_inited == 0) return; if (video_inited == 0) return;
#ifdef EASTEREGG #ifdef EASTEREGG

View File

@ -130,14 +130,14 @@ static void X86API int1A(int intno)
switch(M.x86.R_AX) switch(M.x86.R_AX)
{ {
case 0xB101: // PCI Bios Present? case 0xB101: /* PCI Bios Present? */
M.x86.R_AL = 0x00; M.x86.R_AL = 0x00;
M.x86.R_EDX = 0x20494350; M.x86.R_EDX = 0x20494350;
M.x86.R_BX = 0x0210; M.x86.R_BX = 0x0210;
M.x86.R_CL = 3; M.x86.R_CL = 3;
CLEAR_FLAG(F_CF); CLEAR_FLAG(F_CF);
break; break;
case 0xB102: // Find device case 0xB102: /* Find device */
device = mypci_find_device(M.x86.R_DX, M.x86.R_CX, M.x86.R_SI); device = mypci_find_device(M.x86.R_DX, M.x86.R_CX, M.x86.R_SI);
if (device != -1) if (device != -1)
{ {
@ -151,52 +151,52 @@ static void X86API int1A(int intno)
} }
CONDITIONAL_SET_FLAG((M.x86.R_AH != PCIBIOS_SUCCESSFUL), F_CF); CONDITIONAL_SET_FLAG((M.x86.R_AH != PCIBIOS_SUCCESSFUL), F_CF);
break; break;
case 0xB103: // Find PCI class code case 0xB103: /* Find PCI class code */
M.x86.R_AH = PCIBIOS_DEVICE_NOT_FOUND; M.x86.R_AH = PCIBIOS_DEVICE_NOT_FOUND;
//printf("Find by class not yet implmented"); /*printf("Find by class not yet implmented"); */
CONDITIONAL_SET_FLAG((M.x86.R_AH != PCIBIOS_SUCCESSFUL), F_CF); CONDITIONAL_SET_FLAG((M.x86.R_AH != PCIBIOS_SUCCESSFUL), F_CF);
break; break;
case 0xB108: // read config byte case 0xB108: /* read config byte */
M.x86.R_CL = mypci_read_cfg_byte(M.x86.R_BH, M.x86.R_BL, M.x86.R_DI); M.x86.R_CL = mypci_read_cfg_byte(M.x86.R_BH, M.x86.R_BL, M.x86.R_DI);
M.x86.R_AH = PCIBIOS_SUCCESSFUL; M.x86.R_AH = PCIBIOS_SUCCESSFUL;
CONDITIONAL_SET_FLAG((M.x86.R_AH != PCIBIOS_SUCCESSFUL), F_CF); CONDITIONAL_SET_FLAG((M.x86.R_AH != PCIBIOS_SUCCESSFUL), F_CF);
//printf("read_config_byte %x,%x,%x -> %x\n", M.x86.R_BH, M.x86.R_BL, M.x86.R_DI, /*printf("read_config_byte %x,%x,%x -> %x\n", M.x86.R_BH, M.x86.R_BL, M.x86.R_DI, */
// M.x86.R_CL); /* M.x86.R_CL); */
break; break;
case 0xB109: // read config word case 0xB109: /* read config word */
M.x86.R_CX = mypci_read_cfg_word(M.x86.R_BH, M.x86.R_BL, M.x86.R_DI); M.x86.R_CX = mypci_read_cfg_word(M.x86.R_BH, M.x86.R_BL, M.x86.R_DI);
M.x86.R_AH = PCIBIOS_SUCCESSFUL; M.x86.R_AH = PCIBIOS_SUCCESSFUL;
CONDITIONAL_SET_FLAG((M.x86.R_AH != PCIBIOS_SUCCESSFUL), F_CF); CONDITIONAL_SET_FLAG((M.x86.R_AH != PCIBIOS_SUCCESSFUL), F_CF);
//printf("read_config_word %x,%x,%x -> %x\n", M.x86.R_BH, M.x86.R_BL, M.x86.R_DI, /*printf("read_config_word %x,%x,%x -> %x\n", M.x86.R_BH, M.x86.R_BL, M.x86.R_DI, */
// M.x86.R_CX); /* M.x86.R_CX); */
break; break;
case 0xB10A: // read config dword case 0xB10A: /* read config dword */
M.x86.R_ECX = mypci_read_cfg_long(M.x86.R_BH, M.x86.R_BL, M.x86.R_DI); M.x86.R_ECX = mypci_read_cfg_long(M.x86.R_BH, M.x86.R_BL, M.x86.R_DI);
M.x86.R_AH = PCIBIOS_SUCCESSFUL; M.x86.R_AH = PCIBIOS_SUCCESSFUL;
CONDITIONAL_SET_FLAG((M.x86.R_AH != PCIBIOS_SUCCESSFUL), F_CF); CONDITIONAL_SET_FLAG((M.x86.R_AH != PCIBIOS_SUCCESSFUL), F_CF);
//printf("read_config_long %x,%x,%x -> %x\n", M.x86.R_BH, M.x86.R_BL, M.x86.R_DI, /*printf("read_config_long %x,%x,%x -> %x\n", M.x86.R_BH, M.x86.R_BL, M.x86.R_DI, */
// M.x86.R_ECX); /* M.x86.R_ECX); */
break; break;
case 0xB10B: // write config byte case 0xB10B: /* write config byte */
mypci_write_cfg_byte(M.x86.R_BH, M.x86.R_BL, M.x86.R_DI, M.x86.R_CL); mypci_write_cfg_byte(M.x86.R_BH, M.x86.R_BL, M.x86.R_DI, M.x86.R_CL);
M.x86.R_AH = PCIBIOS_SUCCESSFUL; M.x86.R_AH = PCIBIOS_SUCCESSFUL;
CONDITIONAL_SET_FLAG((M.x86.R_AH != PCIBIOS_SUCCESSFUL), F_CF); CONDITIONAL_SET_FLAG((M.x86.R_AH != PCIBIOS_SUCCESSFUL), F_CF);
//printf("write_config_byte %x,%x,%x <- %x\n", M.x86.R_BH, M.x86.R_BL, M.x86.R_DI, /*printf("write_config_byte %x,%x,%x <- %x\n", M.x86.R_BH, M.x86.R_BL, M.x86.R_DI, */
// M.x86.R_CL); /* M.x86.R_CL); */
break; break;
case 0xB10C: // write config word case 0xB10C: /* write config word */
mypci_write_cfg_word(M.x86.R_BH, M.x86.R_BL, M.x86.R_DI, M.x86.R_CX); mypci_write_cfg_word(M.x86.R_BH, M.x86.R_BL, M.x86.R_DI, M.x86.R_CX);
M.x86.R_AH = PCIBIOS_SUCCESSFUL; M.x86.R_AH = PCIBIOS_SUCCESSFUL;
CONDITIONAL_SET_FLAG((M.x86.R_AH != PCIBIOS_SUCCESSFUL), F_CF); CONDITIONAL_SET_FLAG((M.x86.R_AH != PCIBIOS_SUCCESSFUL), F_CF);
//printf("write_config_word %x,%x,%x <- %x\n", M.x86.R_BH, M.x86.R_BL, M.x86.R_DI, /*printf("write_config_word %x,%x,%x <- %x\n", M.x86.R_BH, M.x86.R_BL, M.x86.R_DI, */
// M.x86.R_CX); /* M.x86.R_CX); */
break; break;
case 0xB10D: // write config dword case 0xB10D: /* write config dword */
mypci_write_cfg_long(M.x86.R_BH, M.x86.R_BL, M.x86.R_DI, M.x86.R_ECX); mypci_write_cfg_long(M.x86.R_BH, M.x86.R_BL, M.x86.R_DI, M.x86.R_ECX);
M.x86.R_AH = PCIBIOS_SUCCESSFUL; M.x86.R_AH = PCIBIOS_SUCCESSFUL;
CONDITIONAL_SET_FLAG((M.x86.R_AH != PCIBIOS_SUCCESSFUL), F_CF); CONDITIONAL_SET_FLAG((M.x86.R_AH != PCIBIOS_SUCCESSFUL), F_CF);
//printf("write_config_long %x,%x,%x <- %x\n", M.x86.R_BH, M.x86.R_BL, M.x86.R_DI, /*printf("write_config_long %x,%x,%x <- %x\n", M.x86.R_BH, M.x86.R_BL, M.x86.R_DI, */
// M.x86.R_ECX); /* M.x86.R_ECX); */
break; break;
default: default:
PRINTF("BIOS int %xh: Unknown function AX=%04xh\n", intno, M.x86.R_AX); PRINTF("BIOS int %xh: Unknown function AX=%04xh\n", intno, M.x86.R_AX);
@ -208,7 +208,7 @@ void bios_init(void)
{ {
int i; int i;
X86EMU_intrFuncs bios_intr_tab[256]; X86EMU_intrFuncs bios_intr_tab[256];
for (i=0; i<256; i++) for (i=0; i<256; i++)
{ {
write_long_little(M.mem_base+i*4, BIOS_SEG<<16); write_long_little(M.mem_base+i*4, BIOS_SEG<<16);
@ -221,7 +221,7 @@ void bios_init(void)
bios_intr_tab[0x15] = int15; bios_intr_tab[0x15] = int15;
bios_intr_tab[0x6D] = int42; bios_intr_tab[0x6D] = int42;
X86EMU_setupIntrFuncs(bios_intr_tab); X86EMU_setupIntrFuncs(bios_intr_tab);
video_init(); video_init();
} }
@ -252,14 +252,14 @@ unsigned char setup_bw[] =
unsigned char * setup_modes[] = unsigned char * setup_modes[] =
{ {
setup_40x25, // mode 0: 40x25 bw text setup_40x25, /* mode 0: 40x25 bw text */
setup_40x25, // mode 1: 40x25 col text setup_40x25, /* mode 1: 40x25 col text */
setup_80x25, // mode 2: 80x25 bw text setup_80x25, /* mode 2: 80x25 bw text */
setup_80x25, // mode 3: 80x25 col text setup_80x25, /* mode 3: 80x25 col text */
setup_graphics, // mode 4: 320x200 col graphics setup_graphics, /* mode 4: 320x200 col graphics */
setup_graphics, // mode 5: 320x200 bw graphics setup_graphics, /* mode 5: 320x200 bw graphics */
setup_graphics, // mode 6: 640x200 bw graphics setup_graphics, /* mode 6: 640x200 bw graphics */
setup_bw // mode 7: 80x25 mono text setup_bw /* mode 7: 80x25 mono text */
}; };
unsigned int setup_cols[] = unsigned int setup_cols[] =
@ -280,13 +280,13 @@ unsigned int setup_bufsize[] =
void bios_set_mode(int mode) void bios_set_mode(int mode)
{ {
int i; int i;
unsigned char mode_set = setup_modesets[mode]; // Control register value unsigned char mode_set = setup_modesets[mode]; /* Control register value */
unsigned char *setup_regs = setup_modes[mode]; // Register 3D4 Array unsigned char *setup_regs = setup_modes[mode]; /* Register 3D4 Array */
// Switch video off /* Switch video off */
out_byte(0x3D8, mode_set & 0x37); out_byte(0x3D8, mode_set & 0x37);
// Set up parameters at 3D4h /* Set up parameters at 3D4h */
for (i=0; i<16; i++) for (i=0; i<16; i++)
{ {
out_byte(0x3D4, (unsigned char)i); out_byte(0x3D4, (unsigned char)i);
@ -294,10 +294,10 @@ void bios_set_mode(int mode)
setup_regs++; setup_regs++;
} }
// Enable video /* Enable video */
out_byte(0x3D8, mode_set); out_byte(0x3D8, mode_set);
// Set overscan /* Set overscan */
if (mode == 6) out_byte(0x3D9, 0x3F); if (mode == 6) out_byte(0x3D9, 0x3F);
else out_byte(0x3D9, 0x30); else out_byte(0x3D9, 0x30);
} }

View File

@ -401,7 +401,7 @@ int find_image(u32 rom_address, u32 rom_size, void **image, u32 *image_size)
{ {
int i = 0; int i = 0;
unsigned char *rom = (unsigned char *)rom_address; unsigned char *rom = (unsigned char *)rom_address;
/* if (*rom != 0x55 || *(rom+1) != 0xAA) return 0; // No bios rom this is, yes. */ /* if (*rom != 0x55 || *(rom+1) != 0xAA) return 0; /* No bios rom this is, yes. */ */
for (;;) for (;;)
{ {
@ -479,7 +479,6 @@ void show_bat_mapping(void)
} }
void remove_init_data(void) void remove_init_data(void)
{ {
char *s; char *s;
@ -497,19 +496,19 @@ void remove_init_data(void)
} }
else if (s) else if (s)
{ {
if (strcmp(s, "dcache")==0) if (strcmp(s, "dcache")==0)
{ {
dcache_enable(); dcache_enable();
} }
else if (strcmp(s, "icache") == 0) else if (strcmp(s, "icache") == 0)
{ {
icache_enable(); icache_enable();
} }
else if (strcmp(s, "on")== 0 || strcmp(s, "both") == 0) else if (strcmp(s, "on")== 0 || strcmp(s, "both") == 0)
{ {
dcache_enable(); dcache_enable();
icache_enable(); icache_enable();
} }
} }
/* show_bat_mapping();*/ /* show_bat_mapping();*/

View File

@ -152,4 +152,3 @@ void PMAPI BE_exit(void);
#endif #endif
#endif /* __BIOSEMU_H */ #endif /* __BIOSEMU_H */

View File

@ -201,9 +201,9 @@ keyboard), but the translated ASCII values may be different depending on
the country code pages in use. the country code pages in use.
NOTE: Scan codes in the event library are not really hardware scan codes, NOTE: Scan codes in the event library are not really hardware scan codes,
but rather virtual scan codes as generated by a low level keyboard but rather virtual scan codes as generated by a low level keyboard
interface driver. All virtual codes begin with scan code 0x60 and interface driver. All virtual codes begin with scan code 0x60 and
range up from there. range up from there.
HEADER: HEADER:
event.h event.h
@ -496,38 +496,38 @@ event.h
MEMBERS: MEMBERS:
which - Window identifier for message for use by high level window manager which - Window identifier for message for use by high level window manager
code (i.e. MegaVision GUI or Windows API). code (i.e. MegaVision GUI or Windows API).
what - Type of event that occurred. Will be one of the values defined by what - Type of event that occurred. Will be one of the values defined by
the EVT_eventType enumeration. the EVT_eventType enumeration.
when - Time that the event occurred in milliseconds since startup when - Time that the event occurred in milliseconds since startup
where_x - X coordinate of the mouse cursor location at the time of the event where_x - X coordinate of the mouse cursor location at the time of the event
(in screen coordinates). For joystick events this represents (in screen coordinates). For joystick events this represents
the position of the first joystick X axis. the position of the first joystick X axis.
where_y - Y coordinate of the mouse cursor location at the time of the event where_y - Y coordinate of the mouse cursor location at the time of the event
(in screen coordinates). For joystick events this represents (in screen coordinates). For joystick events this represents
the position of the first joystick Y axis. the position of the first joystick Y axis.
relative_x - Relative movement of the mouse cursor in the X direction (in relative_x - Relative movement of the mouse cursor in the X direction (in
units of mickeys, or 1/200th of an inch). For joystick events units of mickeys, or 1/200th of an inch). For joystick events
this represents the position of the second joystick X axis. this represents the position of the second joystick X axis.
relative_y - Relative movement of the mouse cursor in the Y direction (in relative_y - Relative movement of the mouse cursor in the Y direction (in
units of mickeys, or 1/200th of an inch). For joystick events units of mickeys, or 1/200th of an inch). For joystick events
this represents the position of the second joystick Y axis. this represents the position of the second joystick Y axis.
message - Event specific message for the event. For use events this can be message - Event specific message for the event. For use events this can be
any user specific information. For keyboard events this contains any user specific information. For keyboard events this contains
the ASCII code in bits 0-7, the keyboard scan code in bits 8-15 and the ASCII code in bits 0-7, the keyboard scan code in bits 8-15 and
the character repeat count in bits 16-30. You can use the the character repeat count in bits 16-30. You can use the
EVT_asciiCode, EVT_scanCode and EVT_repeatCount macros to extract EVT_asciiCode, EVT_scanCode and EVT_repeatCount macros to extract
this information from the message field. For mouse events this this information from the message field. For mouse events this
contains information about which button was pressed, and will be a contains information about which button was pressed, and will be a
combination of the flags defined by the EVT_eventMouseMaskType combination of the flags defined by the EVT_eventMouseMaskType
enumeration. For joystick events, this conatins information enumeration. For joystick events, this conatins information
about which buttons were pressed, and will be a combination of about which buttons were pressed, and will be a combination of
the flags defined by the EVT_eventJoyMaskType enumeration. the flags defined by the EVT_eventJoyMaskType enumeration.
modifiers - Contains additional information about the state of the keyboard modifiers - Contains additional information about the state of the keyboard
shift modifiers (Ctrl, Alt and Shift keys) when the event shift modifiers (Ctrl, Alt and Shift keys) when the event
occurred. For mouse events it will also contain the state of occurred. For mouse events it will also contain the state of
the mouse buttons. Will be a combination of the values defined the mouse buttons. Will be a combination of the values defined
by the EVT_eventModMaskType enumeration. by the EVT_eventModMaskType enumeration.
next - Internal use; do not use. next - Internal use; do not use.
prev - Internal use; do not use. prev - Internal use; do not use.
****************************************************************************/ ****************************************************************************/
@ -555,8 +555,8 @@ different code page translation table if you want to support keyboards
other than the US English keyboard (the default). other than the US English keyboard (the default).
NOTE: Entries in code page tables *must* be in ascending order for the NOTE: Entries in code page tables *must* be in ascending order for the
scan codes as we do a binary search on the tables for the ASCII scan codes as we do a binary search on the tables for the ASCII
code equivalents. code equivalents.
HEADER: HEADER:
event.h event.h

View File

@ -103,14 +103,14 @@ typedef enum {
typedef union { typedef union {
struct { struct {
uint Zero:2; uint Zero:2;
uint Register:6; uint Register:6;
uint Function:3; uint Function:3;
uint Device:5; uint Device:5;
uint Bus:8; uint Bus:8;
uint Reserved:7; uint Reserved:7;
uint Enable:1; uint Enable:1;
} p; } p;
ulong i; ulong i;
} PCIslot; } PCIslot;
@ -194,9 +194,9 @@ typedef struct {
uchar SubordinateBus; uchar SubordinateBus;
uchar SecondaryLatency; uchar SecondaryLatency;
struct { struct {
ulong Base; ulong Base;
ulong Limit; ulong Limit;
} Range[4]; } Range[4];
uchar InterruptLine; uchar InterruptLine;
uchar InterruptPin; uchar InterruptPin;
ushort BridgeControl; ushort BridgeControl;
@ -224,10 +224,10 @@ typedef struct {
uchar HeaderType; uchar HeaderType;
uchar BIST; uchar BIST;
union { union {
PCIType0Info type0; PCIType0Info type0;
PCIType1Info type1; PCIType1Info type1;
PCIType2Info type2; PCIType2Info type2;
} u; } u;
} PCIDeviceInfo; } PCIDeviceInfo;
/* PCI Capability header structure. All PCI capabilities have the /* PCI Capability header structure. All PCI capabilities have the
@ -411,4 +411,3 @@ ulong _ASMAPI PCIBIOS_getEntry(void);
#endif #endif
#endif /* __PCILIB_H */ #endif /* __PCILIB_H */

View File

@ -164,4 +164,3 @@ typedef enum {
#endif /* !__OS2__ */ #endif /* !__OS2__ */
#endif /* __PMHELP_H */ #endif /* __PMHELP_H */

View File

@ -73,4 +73,3 @@ PMHELP_CTL_CODE(GASETLOCALPATH ,0x002D),
PMHELP_CTL_CODE(GAGETEXPORTS ,0x002E), PMHELP_CTL_CODE(GAGETEXPORTS ,0x002E),
PMHELP_CTL_CODE(GATHUNK ,0x002F), PMHELP_CTL_CODE(GATHUNK ,0x002F),
PMHELP_CTL_CODE(SETNUCLEUSPATH ,0x0030), PMHELP_CTL_CODE(SETNUCLEUSPATH ,0x0030),

View File

@ -1146,4 +1146,3 @@ int PMAPI PM_int386x(int intno, PMREGS *in, PMREGS *out,PMSREGS *sregs);
#endif #endif
#endif /* __PMAPI_H */ #endif /* __PMAPI_H */

View File

@ -191,4 +191,3 @@ PM_imports _VARAPI _PM_imports = {
NULL, NULL,
#endif #endif
}; };

View File

@ -80,7 +80,7 @@
#ifdef __GNUC__ #ifdef __GNUC__
#ifdef __cplusplus #ifdef __cplusplus
// G++ currently fucks this up! /* G++ currently fucks this up! */
#define __cdecl #define __cdecl
#define __stdcall #define __stdcall
#else #else
@ -605,18 +605,18 @@ void _ASMAPI DebugVxD(void);
{ \ { \
static ibool firstTime = true; \ static ibool firstTime = true; \
if (firstTime) { \ if (firstTime) { \
firstTime = false; \ firstTime = false; \
DebugInt(); \ DebugInt(); \
} \ } \
} }
#define DebugVxDOnce() \ #define DebugVxDOnce() \
{ \ { \
static ibool firstTime = true; \ static ibool firstTime = true; \
if (firstTime) { \ if (firstTime) { \
firstTime = false; \ firstTime = false; \
DebugVxD(); \ DebugVxD(); \
} \ } \
} }
/* Macros for linux string compatibility functions */ /* Macros for linux string compatibility functions */
@ -636,10 +636,10 @@ void _ASMAPI DebugVxD(void);
/* Get rid of some helaciously annoying Visual C++ warnings! */ /* Get rid of some helaciously annoying Visual C++ warnings! */
#if defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__SC__) #if defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__SC__)
#pragma warning(disable:4761) // integral size mismatch in argument; conversion supplied #pragma warning(disable:4761) /* integral size mismatch in argument; conversion supplied */
#pragma warning(disable:4244) // conversion from 'unsigned short ' to 'unsigned char ', possible loss of data #pragma warning(disable:4244) /* conversion from 'unsigned short ' to 'unsigned char ', possible loss of data */
#pragma warning(disable:4018) // '<' : signed/unsigned mismatch #pragma warning(disable:4018) /* '<' : signed/unsigned mismatch */
#pragma warning(disable:4305) // 'initializing' : truncation from 'const double' to 'float' #pragma warning(disable:4305) /* 'initializing' : truncation from 'const double' to 'float' */
#endif #endif
/*--------------------------------------------------------------------------- /*---------------------------------------------------------------------------
@ -674,29 +674,29 @@ void _CHK_defaultFail(int fatal,const char *msg,const char *cond,const char *fil
# define CHK(x) x # define CHK(x) x
#if CHECKED > 1 #if CHECKED > 1
# define CHECK(p) \ # define CHECK(p) \
((p) ? (void)0 : DebugInt(), \ ((p) ? (void)0 : DebugInt(), \
_CHK_fail(1,"Check failed: '%s', file %s, line %d\n", \ _CHK_fail(1,"Check failed: '%s', file %s, line %d\n", \
#p, __FILE__, __LINE__)) #p, __FILE__, __LINE__))
# define WARN(p) \ # define WARN(p) \
((p) ? (void)0 : DebugInt(), \ ((p) ? (void)0 : DebugInt(), \
_CHK_fail(0,"Warning: '%s', file %s, line %d\n", \ _CHK_fail(0,"Warning: '%s', file %s, line %d\n", \
#p, __FILE__, __LINE__)) #p, __FILE__, __LINE__))
#else #else
# define CHECK(p) \ # define CHECK(p) \
((p) ? (void)0 : \ ((p) ? (void)0 : \
_CHK_fail(1,"Check failed: '%s', file %s, line %d\n", \ _CHK_fail(1,"Check failed: '%s', file %s, line %d\n", \
#p, __FILE__, __LINE__)) #p, __FILE__, __LINE__))
# define WARN(p) \ # define WARN(p) \
((p) ? (void)0 : \ ((p) ? (void)0 : \
_CHK_fail(0,"Warning: '%s', file %s, line %d\n", \ _CHK_fail(0,"Warning: '%s', file %s, line %d\n", \
#p, __FILE__, __LINE__)) #p, __FILE__, __LINE__))
#endif #endif
# define LOGFATAL(msg) \ # define LOGFATAL(msg) \
_CHK_fail(1,"Fatal error: '%s', file %s, line %d\n", \ _CHK_fail(1,"Fatal error: '%s', file %s, line %d\n", \
msg, __FILE__, __LINE__) msg, __FILE__, __LINE__)
# define LOGWARN(msg) \ # define LOGWARN(msg) \
_CHK_fail(0,"Warning: '%s', file %s, line %d\n", \ _CHK_fail(0,"Warning: '%s', file %s, line %d\n", \
msg, __FILE__, __LINE__) msg, __FILE__, __LINE__)
#else #else
# define CHK(x) # define CHK(x)
# define CHECK(p) ((void)0) # define CHECK(p) ((void)0)

View File

@ -105,7 +105,7 @@ struct i386_special_regs {
u32 FLAGS; u32 FLAGS;
}; };
/* /*
* Segment registers here represent the 16 bit quantities * Segment registers here represent the 16 bit quantities
* CS, DS, ES, SS. * CS, DS, ES, SS.
*/ */
@ -183,8 +183,8 @@ struct i386_segment_regs {
#define F_ALWAYS_ON (0x0002) /* flag bits always on */ #define F_ALWAYS_ON (0x0002) /* flag bits always on */
/* /*
* Define a mask for only those flag bits we will ever pass back * Define a mask for only those flag bits we will ever pass back
* (via PUSHF) * (via PUSHF)
*/ */
#define F_MSK (FB_CF|FB_PF|FB_AF|FB_ZF|FB_SF|FB_TF|FB_IF|FB_DF|FB_OF) #define F_MSK (FB_CF|FB_PF|FB_AF|FB_ZF|FB_SF|FB_TF|FB_IF|FB_DF|FB_OF)
@ -235,21 +235,21 @@ struct i386_segment_regs {
#define SYSMODE_HALTED 0x40000000 #define SYSMODE_HALTED 0x40000000
#define SYSMODE_SEGMASK (SYSMODE_SEG_DS_SS | \ #define SYSMODE_SEGMASK (SYSMODE_SEG_DS_SS | \
SYSMODE_SEGOVR_CS | \ SYSMODE_SEGOVR_CS | \
SYSMODE_SEGOVR_DS | \ SYSMODE_SEGOVR_DS | \
SYSMODE_SEGOVR_ES | \ SYSMODE_SEGOVR_ES | \
SYSMODE_SEGOVR_FS | \ SYSMODE_SEGOVR_FS | \
SYSMODE_SEGOVR_GS | \ SYSMODE_SEGOVR_GS | \
SYSMODE_SEGOVR_SS) SYSMODE_SEGOVR_SS)
#define SYSMODE_CLRMASK (SYSMODE_SEG_DS_SS | \ #define SYSMODE_CLRMASK (SYSMODE_SEG_DS_SS | \
SYSMODE_SEGOVR_CS | \ SYSMODE_SEGOVR_CS | \
SYSMODE_SEGOVR_DS | \ SYSMODE_SEGOVR_DS | \
SYSMODE_SEGOVR_ES | \ SYSMODE_SEGOVR_ES | \
SYSMODE_SEGOVR_FS | \ SYSMODE_SEGOVR_FS | \
SYSMODE_SEGOVR_GS | \ SYSMODE_SEGOVR_GS | \
SYSMODE_SEGOVR_SS | \ SYSMODE_SEGOVR_SS | \
SYSMODE_PREFIX_DATA | \ SYSMODE_PREFIX_DATA | \
SYSMODE_PREFIX_ADDR) SYSMODE_PREFIX_ADDR)
#define INTR_SYNCH 0x1 #define INTR_SYNCH 0x1
#define INTR_ASYNCH 0x2 #define INTR_ASYNCH 0x2
@ -266,8 +266,8 @@ typedef struct {
* Delayed flag set 3 bits (zero, signed, parity) * Delayed flag set 3 bits (zero, signed, parity)
* reserved 6 bits * reserved 6 bits
* interrupt # 8 bits instruction raised interrupt * interrupt # 8 bits instruction raised interrupt
* BIOS video segregs 4 bits * BIOS video segregs 4 bits
* Interrupt Pending 1 bits * Interrupt Pending 1 bits
* Extern interrupt 1 bits * Extern interrupt 1 bits
* Halted 1 bits * Halted 1 bits
*/ */
@ -317,12 +317,12 @@ extern "C" { /* Use "C" linkage when in C++ mode */
extern X86EMU_sysEnv _X86EMU_env; extern X86EMU_sysEnv _X86EMU_env;
#define M _X86EMU_env #define M _X86EMU_env
/*-------------------------- Function Prototypes --------------------------*/ /*-------------------------- Function Prototypes --------------------------*/
/* Function to log information at runtime */ /* Function to log information at runtime */
//void printk(const char *fmt, ...); /*void printk(const char *fmt, ...); */
#ifdef __cplusplus #ifdef __cplusplus
} /* End of "C" linkage for C++ */ } /* End of "C" linkage for C++ */

View File

@ -178,4 +178,3 @@ ASFLAGS += -d__SNAP__
# Include file dependencies # Include file dependencies
.INCLUDE .IGNORE: "makefile.dep" .INCLUDE .IGNORE: "makefile.dep"

View File

@ -178,4 +178,3 @@ PMLIB := -lpm
# Define which file contains our rules # Define which file contains our rules
RULES_MAK := gcc_linux.mk RULES_MAK := gcc_linux.mk

View File

@ -133,4 +133,3 @@ PMLIB := -lpm
# Define which file contains our rules # Define which file contains our rules
RULES_MAK := gcc_win32.mk RULES_MAK := gcc_win32.mk

View File

@ -162,4 +162,3 @@ PMLIB := -lpm
# Define which file contains our rules # Define which file contains our rules
RULES_MAK := qnx4.mk RULES_MAK := qnx4.mk

View File

@ -44,5 +44,4 @@ PMLIB :=
%$L: ; $(LIB) $(LIBFLAGS) $@ $& %$L: ; $(LIB) $(LIBFLAGS) $@ $&
# Implicit rule for building an executable file # Implicit rule for building an executable file
%$E: ; $(LD) $(LDFLAGS) -o $@ $& $(EXELIBS) $(PMLIB) %$E: ; $(LD) $(LDFLAGS) -o $@ $& $(EXELIBS) $(PMLIB)

View File

@ -91,4 +91,3 @@ LD := $(LDXX)
@$(ECHO) ld $@ @$(ECHO) ld $@
@$(LD) $(LDFLAGS) -o $@ $& $(EXELIBS) $(PMLIB) -lm @$(LD) $(LDFLAGS) -o $@ $& $(EXELIBS) $(PMLIB) -lm
.ENDIF .ENDIF

View File

@ -88,4 +88,3 @@ LD := $(LDXX)
@$(ECHO) ld $@ @$(ECHO) ld $@
@$(LD) $(LDFLAGS) -o $@ @$(mktmp $(&:s/\/\\) $(EXELIBS) $(PMLIB) -lm) @$(LD) $(LDFLAGS) -o $@ @$(mktmp $(&:s/\/\\) $(EXELIBS) $(PMLIB) -lm)
.ENDIF .ENDIF

View File

@ -69,14 +69,14 @@ PMLIB :=
# Implicit rule for building an executable file using response file # Implicit rule for building an executable file using response file
.IF $(USE_OS2GUI) .IF $(USE_OS2GUI)
%$E: ; %$E: ;
rclink $(LD) $(RC) $@ $(mktmp $(LDFLAGS) $(&:t"+\n":s/\/\\)\n$@\n$*.map\n$(EXELIBS) $(PMLIB)\n$*.def\n) rclink $(LD) $(RC) $@ $(mktmp $(LDFLAGS) $(&:t"+\n":s/\/\\)\n$@\n$*.map\n$(EXELIBS) $(PMLIB)\n$*.def\n)
.IF $(LXLITE) .IF $(LXLITE)
lxlite $@ lxlite $@
.ENDIF .ENDIF
.ELSE .ELSE
%$E: ; %$E: ;
rclink $(LD) $(RC) $@ $(mktmp $(LDFLAGS) $(&:t"+\n":s/\/\\)\n$@\n$*.map\n$(EXELIBS) $(PMLIB)\n\n) rclink $(LD) $(RC) $@ $(mktmp $(LDFLAGS) $(&:t"+\n":s/\/\\)\n$@\n$*.map\n$(EXELIBS) $(PMLIB)\n\n)
.IF $(LXLITE) .IF $(LXLITE)
lxlite $@ lxlite $@
.ENDIF .ENDIF
.ENDIF .ENDIF

View File

@ -66,14 +66,14 @@ PMLIB :=
# Implicit rule for building an executable file using response file # Implicit rule for building an executable file using response file
.IF $(USE_OS2GUI) .IF $(USE_OS2GUI)
%$E: ; %$E: ;
rclink $(LD) $(RC) $@ $(mktmp $(LDFLAGS) $(&:t"+\n":s/\/\\)\n$@\n$*.map\n$(EXELIBS) $(PMLIB)\n$*.def\n) rclink $(LD) $(RC) $@ $(mktmp $(LDFLAGS) $(&:t"+\n":s/\/\\)\n$@\n$*.map\n$(EXELIBS) $(PMLIB)\n$*.def\n)
.IF $(LXLITE) .IF $(LXLITE)
lxlite $@ lxlite $@
.ENDIF .ENDIF
.ELSE .ELSE
%$E: ; %$E: ;
rclink $(LD) $(RC) $@ $(mktmp $(LDFLAGS) $(&:t"+\n":s/\/\\)\n$@\n$*.map\n$(EXELIBS) $(PMLIB)\n\n) rclink $(LD) $(RC) $@ $(mktmp $(LDFLAGS) $(&:t"+\n":s/\/\\)\n$@\n$*.map\n$(EXELIBS) $(PMLIB)\n\n)
.IF $(LXLITE) .IF $(LXLITE)
lxlite $@ lxlite $@
.ENDIF .ENDIF
.ENDIF .ENDIF

View File

@ -109,7 +109,7 @@ LDFLAGS += OP PRIV=1
@gcpp -DNASM_ASSEMBLER -D__WATCOMC__ -EP $(<:s,/,\) > $(*:s,/,\).asm @gcpp -DNASM_ASSEMBLER -D__WATCOMC__ -EP $(<:s,/,\) > $(*:s,/,\).asm
nasm @$(mktmp -f obj -o $@) $(*:s,/,\).asm nasm @$(mktmp -f obj -o $@) $(*:s,/,\).asm
@$(RM) -S $(mktmp $(*:s,/,\).asm) @$(RM) -S $(mktmp $(*:s,/,\).asm)
.ENDIF .ENDIF
# Special target to build dllstart.asm using Borland TASM # Special target to build dllstart.asm using Borland TASM
dllstart.obj: dllstart.asm dllstart.obj: dllstart.asm
@ -126,26 +126,26 @@ dllstart.obj: dllstart.asm
@trimlib $(mktmp $(LDFLAGS) OP quiet SYS os2v2 dll\nN $@\nF $(&:t",\n":s/\/\\)\nLIBR $(EXELIBS:t",")) $*.lnk @trimlib $(mktmp $(LDFLAGS) OP quiet SYS os2v2 dll\nN $@\nF $(&:t",\n":s/\/\\)\nLIBR $(EXELIBS:t",")) $*.lnk
rclink $(LD) $(RC) $@ $*.lnk rclink $(LD) $(RC) $@ $*.lnk
.IF $(LEAVE_LINKFILE) .IF $(LEAVE_LINKFILE)
.ELSE .ELSE
@$(RM) -S $(mktmp *.lnk) @$(RM) -S $(mktmp *.lnk)
.ENDIF .ENDIF
.ELIF $(USE_WIN32) .ELIF $(USE_WIN32)
%$D: ; %$D: ;
@trimlib $(mktmp $(LDFLAGS) OP quiet SYS nt_dll\nN $@\nF $(&:t",\n":s/\/\\)\nLIBR $(PMLIB)$(DEFLIBS)$(EXELIBS:t",")) $*.lnk @trimlib $(mktmp $(LDFLAGS) OP quiet SYS nt_dll\nN $@\nF $(&:t",\n":s/\/\\)\nLIBR $(PMLIB)$(DEFLIBS)$(EXELIBS:t",")) $*.lnk
rclink $(LD) $(RC) $@ $*.lnk rclink $(LD) $(RC) $@ $*.lnk
.IF $(LEAVE_LINKFILE) .IF $(LEAVE_LINKFILE)
.ELSE .ELSE
@$(RM) -S $(mktmp *.lnk) @$(RM) -S $(mktmp *.lnk)
.ENDIF .ENDIF
.ELSE .ELSE
%$D: ; %$D: ;
@trimlib $(mktmp $(LDFLAGS) OP quiet SYS win386\nN $*.rex\nF $(&:t",\n":s/\/\\)\nLIBR $(EXELIBS:t",")) $*.lnk @trimlib $(mktmp $(LDFLAGS) OP quiet SYS win386\nN $*.rex\nF $(&:t",\n":s/\/\\)\nLIBR $(EXELIBS:t",")) $*.lnk
rclink $(LD) $(RC) $@ $*.lnk rclink $(LD) $(RC) $@ $*.lnk
wbind $* -d -q -n wbind $* -d -q -n
.IF $(LEAVE_LINKFILE) .IF $(LEAVE_LINKFILE)
.ELSE .ELSE
@$(RM) -S $(mktmp *.lnk) @$(RM) -S $(mktmp *.lnk)
.ENDIF .ENDIF
.ENDIF .ENDIF
.ENDIF .ENDIF
@ -171,18 +171,18 @@ dllstart.obj: dllstart.asm
$(LD) $(LDFLAGS) @$*.lnk $(LD) $(LDFLAGS) @$*.lnk
x32fix $@ x32fix $@
.IF $(LEAVE_LINKFILE) .IF $(LEAVE_LINKFILE)
.ELSE .ELSE
@$(RM) -S $(mktmp *.lnk) @$(RM) -S $(mktmp *.lnk)
.ENDIF .ENDIF
.ELIF $(USE_OS232) .ELIF $(USE_OS232)
.IF $(USE_OS2GUI) .IF $(USE_OS2GUI)
%$E: ; %$E: ;
@trimlib $(mktmp $(LDFLAGS) OP quiet SYS os2v2_pm\nN $@\nF $(&:t",":s/\/\\)\nLIBR $(PMLIB)$(EXELIBS:t",")) $*.lnk @trimlib $(mktmp $(LDFLAGS) OP quiet SYS os2v2_pm\nN $@\nF $(&:t",":s/\/\\)\nLIBR $(PMLIB)$(EXELIBS:t",")) $*.lnk
rclink $(LD) $(RC) $@ $*.lnk rclink $(LD) $(RC) $@ $*.lnk
.IF $(LEAVE_LINKFILE) .IF $(LEAVE_LINKFILE)
.ELSE .ELSE
@$(RM) -S $(mktmp *.lnk) @$(RM) -S $(mktmp *.lnk)
.ENDIF .ENDIF
.IF $(LXLITE) .IF $(LXLITE)
lxlite $@ lxlite $@
.ENDIF .ENDIF
@ -191,9 +191,9 @@ dllstart.obj: dllstart.asm
@trimlib $(mktmp $(LDFLAGS) OP quiet SYS os2v2\nN $@\nF $(&:t",":s/\/\\)\nLIBR $(PMLIB)$(EXELIBS:t",")) $*.lnk @trimlib $(mktmp $(LDFLAGS) OP quiet SYS os2v2\nN $@\nF $(&:t",":s/\/\\)\nLIBR $(PMLIB)$(EXELIBS:t",")) $*.lnk
rclink $(LD) $(RC) $@ $*.lnk rclink $(LD) $(RC) $@ $*.lnk
.IF $(LEAVE_LINKFILE) .IF $(LEAVE_LINKFILE)
.ELSE .ELSE
@$(RM) -S $(mktmp *.lnk) @$(RM) -S $(mktmp *.lnk)
.ENDIF .ENDIF
.IF $(LXLITE) .IF $(LXLITE)
lxlite $@ lxlite $@
.ENDIF .ENDIF
@ -203,43 +203,43 @@ dllstart.obj: dllstart.asm
@trimlib $(mktmp $(LDFLAGS) OP quiet SYS nt\nN $@\nF $(&:t",":s/\/\\)\nLIBR $(DEFLIBS)$(EXELIBS:t",")) $*.lnk @trimlib $(mktmp $(LDFLAGS) OP quiet SYS nt\nN $@\nF $(&:t",":s/\/\\)\nLIBR $(DEFLIBS)$(EXELIBS:t",")) $*.lnk
rclink $(LD) $(RC) $@ $*.lnk rclink $(LD) $(RC) $@ $*.lnk
.IF $(LEAVE_LINKFILE) .IF $(LEAVE_LINKFILE)
.ELSE .ELSE
@$(RM) -S $(mktmp *.lnk) @$(RM) -S $(mktmp *.lnk)
.ENDIF .ENDIF
.ELIF $(USE_WIN32) .ELIF $(USE_WIN32)
.IF $(WIN32_GUI) .IF $(WIN32_GUI)
%$E: ; %$E: ;
@trimlib $(mktmp $(LDFLAGS) OP quiet SYS win95\nN $@\nF $(&:t",":s/\/\\)\nLIBR $(PMLIB)$(DEFLIBS)$(EXELIBS:t",")) $*.lnk @trimlib $(mktmp $(LDFLAGS) OP quiet SYS win95\nN $@\nF $(&:t",":s/\/\\)\nLIBR $(PMLIB)$(DEFLIBS)$(EXELIBS:t",")) $*.lnk
rclink $(LD) $(RC) $@ $*.lnk rclink $(LD) $(RC) $@ $*.lnk
.IF $(LEAVE_LINKFILE) .IF $(LEAVE_LINKFILE)
.ELSE .ELSE
@$(RM) -S $(mktmp *.lnk) @$(RM) -S $(mktmp *.lnk)
.ENDIF .ENDIF
.ELSE .ELSE
%$E: ; %$E: ;
@trimlib $(mktmp $(LDFLAGS) OP quiet SYS nt\nN $@\nF $(&:t",":s/\/\\)\nLIBR $(PMLIB)$(DEFLIBS)$(EXELIBS:t",")) $*.lnk @trimlib $(mktmp $(LDFLAGS) OP quiet SYS nt\nN $@\nF $(&:t",":s/\/\\)\nLIBR $(PMLIB)$(DEFLIBS)$(EXELIBS:t",")) $*.lnk
rclink $(LD) $(RC) $@ $*.lnk rclink $(LD) $(RC) $@ $*.lnk
.IF $(LEAVE_LINKFILE) .IF $(LEAVE_LINKFILE)
.ELSE .ELSE
@$(RM) -S $(mktmp *.lnk) @$(RM) -S $(mktmp *.lnk)
.ENDIF .ENDIF
.ENDIF .ENDIF
.ELIF $(USE_WIN386) .ELIF $(USE_WIN386)
%$E: ; %$E: ;
@trimlib $(mktmp $(LDFLAGS) OP quiet SYS win386\nN $*.rex\nF $(&:t",":s/\/\\)\nLIBR $(PMLIB)$(EXELIBS:t",")) $*.lnk @trimlib $(mktmp $(LDFLAGS) OP quiet SYS win386\nN $*.rex\nF $(&:t",":s/\/\\)\nLIBR $(PMLIB)$(EXELIBS:t",")) $*.lnk
rclink $(LD) wbind $*.rex $*.lnk rclink $(LD) wbind $*.rex $*.lnk
.IF $(LEAVE_LINKFILE) .IF $(LEAVE_LINKFILE)
.ELSE .ELSE
@$(RM) -S $(mktmp *.lnk) @$(RM) -S $(mktmp *.lnk)
.ENDIF .ENDIF
.ELIF $(USE_TNT) .ELIF $(USE_TNT)
%$E: ; %$E: ;
@trimlib $(mktmp $(LDFLAGS) OP quiet\nN $@\nF $(&:t",":s/\/\\)\nLIBR dosx32.lib,tntapi.lib,$(PMLIB)$(EXELIBS:t",")) $*.lnk @trimlib $(mktmp $(LDFLAGS) OP quiet\nN $@\nF $(&:t",":s/\/\\)\nLIBR dosx32.lib,tntapi.lib,$(PMLIB)$(EXELIBS:t",")) $*.lnk
$(LD) @$*.lnk $(LD) @$*.lnk
.IF $(LEAVE_LINKFILE) .IF $(LEAVE_LINKFILE)
.ELSE .ELSE
@$(RM) -S $(mktmp *.lnk) @$(RM) -S $(mktmp *.lnk)
.ENDIF .ENDIF
.IF $(DOSSTYLE) .IF $(DOSSTYLE)
@markphar $@ @markphar $@
.ENDIF .ENDIF
@ -250,16 +250,15 @@ dllstart.obj: dllstart.asm
$(LD) @$*.lnk $(LD) @$*.lnk
@attrib +s $*.exe @attrib +s $*.exe
.IF $(LEAVE_LINKFILE) .IF $(LEAVE_LINKFILE)
.ELSE .ELSE
@$(RM) -S $(mktmp *.lnk) @$(RM) -S $(mktmp *.lnk)
.ENDIF .ENDIF
.ELSE .ELSE
%$E: ; %$E: ;
@trimlib $(mktmp $(LDFLAGS) OP quiet\nN $@\nF $(&:t",":s/\/\\)\nLIBR $(PMLIB)$(EXELIBS:t",")) $*.lnk @trimlib $(mktmp $(LDFLAGS) OP quiet\nN $@\nF $(&:t",":s/\/\\)\nLIBR $(PMLIB)$(EXELIBS:t",")) $*.lnk
$(LD) @$*.lnk $(LD) @$*.lnk
.IF $(LEAVE_LINKFILE) .IF $(LEAVE_LINKFILE)
.ELSE .ELSE
@$(RM) -S $(mktmp *.lnk) @$(RM) -S $(mktmp *.lnk)
.ENDIF
.ENDIF .ENDIF
.ENDIF

View File

@ -159,4 +159,3 @@ __.SILENT := $(.SILENT)
# We dont use TABS in our makefiles # We dont use TABS in our makefiles
.NOTABS := yes .NOTABS := yes

View File

@ -351,4 +351,3 @@ LIB_BASE_DIR := $(SCITECH_LIB)\lib\release
# Define which file contains our rules # Define which file contains our rules
RULES_MAK := wc32.mk RULES_MAK := wc32.mk

View File

@ -77,20 +77,20 @@ u8 X86API BE_rdb(
u8 val = 0; u8 val = 0;
if (addr >= 0xC0000 && addr <= _BE_env.biosmem_limit) { if (addr >= 0xC0000 && addr <= _BE_env.biosmem_limit) {
val = *(u8*)(_BE_env.biosmem_base + addr - 0xC0000); val = *(u8*)(_BE_env.biosmem_base + addr - 0xC0000);
} }
else if (addr >= 0xA0000 && addr <= 0xFFFFF) { else if (addr >= 0xA0000 && addr <= 0xFFFFF) {
val = readb(_BE_env.busmem_base, addr - 0xA0000); val = readb(_BE_env.busmem_base, addr - 0xA0000);
} }
else if (addr > M.mem_size - 1) { else if (addr > M.mem_size - 1) {
DB( printk("mem_read: address %#lx out of range!\n", addr);) DB( printk("mem_read: address %#lx out of range!\n", addr);)
HALT_SYS(); HALT_SYS();
} }
else { else {
val = *(u8*)(M.mem_base + addr); val = *(u8*)(M.mem_base + addr);
} }
DB( if (DEBUG_MEM()) DB( if (DEBUG_MEM())
printk("%#08x 1 -> %#x\n", addr, val);) printk("%#08x 1 -> %#x\n", addr, val);)
return val; return val;
} }
@ -112,42 +112,42 @@ u16 X86API BE_rdw(
if (addr >= 0xC0000 && addr <= _BE_env.biosmem_limit) { if (addr >= 0xC0000 && addr <= _BE_env.biosmem_limit) {
#ifdef __BIG_ENDIAN__ #ifdef __BIG_ENDIAN__
if (addr & 0x1) { if (addr & 0x1) {
addr -= 0xC0000; addr -= 0xC0000;
val = ( *(u8*)(_BE_env.biosmem_base + addr) | val = ( *(u8*)(_BE_env.biosmem_base + addr) |
(*(u8*)(_BE_env.biosmem_base + addr + 1) << 8)); (*(u8*)(_BE_env.biosmem_base + addr + 1) << 8));
} }
else else
#endif #endif
val = *(u16*)(_BE_env.biosmem_base + addr - 0xC0000); val = *(u16*)(_BE_env.biosmem_base + addr - 0xC0000);
} }
else if (addr >= 0xA0000 && addr <= 0xFFFFF) { else if (addr >= 0xA0000 && addr <= 0xFFFFF) {
#ifdef __BIG_ENDIAN__ #ifdef __BIG_ENDIAN__
if (addr & 0x1) { if (addr & 0x1) {
addr -= 0xA0000; addr -= 0xA0000;
val = ( readb(_BE_env.busmem_base, addr) | val = ( readb(_BE_env.busmem_base, addr) |
(readb(_BE_env.busmem_base, addr + 1) << 8)); (readb(_BE_env.busmem_base, addr + 1) << 8));
} }
else else
#endif #endif
val = readw(_BE_env.busmem_base, addr - 0xA0000); val = readw(_BE_env.busmem_base, addr - 0xA0000);
} }
else if (addr > M.mem_size - 2) { else if (addr > M.mem_size - 2) {
DB( printk("mem_read: address %#lx out of range!\n", addr);) DB( printk("mem_read: address %#lx out of range!\n", addr);)
HALT_SYS(); HALT_SYS();
} }
else { else {
#ifdef __BIG_ENDIAN__ #ifdef __BIG_ENDIAN__
if (addr & 0x1) { if (addr & 0x1) {
val = ( *(u8*)(M.mem_base + addr) | val = ( *(u8*)(M.mem_base + addr) |
(*(u8*)(M.mem_base + addr + 1) << 8)); (*(u8*)(M.mem_base + addr + 1) << 8));
} }
else else
#endif #endif
val = *(u16*)(M.mem_base + addr); val = *(u16*)(M.mem_base + addr);
} }
DB( if (DEBUG_MEM()) DB( if (DEBUG_MEM())
printk("%#08x 2 -> %#x\n", addr, val);) printk("%#08x 2 -> %#x\n", addr, val);)
return val; return val;
} }
@ -169,48 +169,48 @@ u32 X86API BE_rdl(
if (addr >= 0xC0000 && addr <= _BE_env.biosmem_limit) { if (addr >= 0xC0000 && addr <= _BE_env.biosmem_limit) {
#ifdef __BIG_ENDIAN__ #ifdef __BIG_ENDIAN__
if (addr & 0x3) { if (addr & 0x3) {
addr -= 0xC0000; addr -= 0xC0000;
val = ( *(u8*)(_BE_env.biosmem_base + addr + 0) | val = ( *(u8*)(_BE_env.biosmem_base + addr + 0) |
(*(u8*)(_BE_env.biosmem_base + addr + 1) << 8) | (*(u8*)(_BE_env.biosmem_base + addr + 1) << 8) |
(*(u8*)(_BE_env.biosmem_base + addr + 2) << 16) | (*(u8*)(_BE_env.biosmem_base + addr + 2) << 16) |
(*(u8*)(_BE_env.biosmem_base + addr + 3) << 24)); (*(u8*)(_BE_env.biosmem_base + addr + 3) << 24));
} }
else else
#endif #endif
val = *(u32*)(_BE_env.biosmem_base + addr - 0xC0000); val = *(u32*)(_BE_env.biosmem_base + addr - 0xC0000);
} }
else if (addr >= 0xA0000 && addr <= 0xFFFFF) { else if (addr >= 0xA0000 && addr <= 0xFFFFF) {
#ifdef __BIG_ENDIAN__ #ifdef __BIG_ENDIAN__
if (addr & 0x3) { if (addr & 0x3) {
addr -= 0xA0000; addr -= 0xA0000;
val = ( readb(_BE_env.busmem_base, addr) | val = ( readb(_BE_env.busmem_base, addr) |
(readb(_BE_env.busmem_base, addr + 1) << 8) | (readb(_BE_env.busmem_base, addr + 1) << 8) |
(readb(_BE_env.busmem_base, addr + 2) << 16) | (readb(_BE_env.busmem_base, addr + 2) << 16) |
(readb(_BE_env.busmem_base, addr + 3) << 24)); (readb(_BE_env.busmem_base, addr + 3) << 24));
} }
else else
#endif #endif
val = readl(_BE_env.busmem_base, addr - 0xA0000); val = readl(_BE_env.busmem_base, addr - 0xA0000);
} }
else if (addr > M.mem_size - 4) { else if (addr > M.mem_size - 4) {
DB( printk("mem_read: address %#lx out of range!\n", addr);) DB( printk("mem_read: address %#lx out of range!\n", addr);)
HALT_SYS(); HALT_SYS();
} }
else { else {
#ifdef __BIG_ENDIAN__ #ifdef __BIG_ENDIAN__
if (addr & 0x3) { if (addr & 0x3) {
val = ( *(u8*)(M.mem_base + addr + 0) | val = ( *(u8*)(M.mem_base + addr + 0) |
(*(u8*)(M.mem_base + addr + 1) << 8) | (*(u8*)(M.mem_base + addr + 1) << 8) |
(*(u8*)(M.mem_base + addr + 2) << 16) | (*(u8*)(M.mem_base + addr + 2) << 16) |
(*(u8*)(M.mem_base + addr + 3) << 24)); (*(u8*)(M.mem_base + addr + 3) << 24));
} }
else else
#endif #endif
val = *(u32*)(M.mem_base + addr); val = *(u32*)(M.mem_base + addr);
} }
DB( if (DEBUG_MEM()) DB( if (DEBUG_MEM())
printk("%#08x 4 -> %#x\n", addr, val);) printk("%#08x 4 -> %#x\n", addr, val);)
return val; return val;
} }
@ -228,20 +228,20 @@ void X86API BE_wrb(
u8 val) u8 val)
{ {
DB( if (DEBUG_MEM()) DB( if (DEBUG_MEM())
printk("%#08x 1 <- %#x\n", addr, val);) printk("%#08x 1 <- %#x\n", addr, val);)
if (addr >= 0xC0000 && addr <= _BE_env.biosmem_limit) { if (addr >= 0xC0000 && addr <= _BE_env.biosmem_limit) {
*(u8*)(_BE_env.biosmem_base + addr - 0xC0000) = val; *(u8*)(_BE_env.biosmem_base + addr - 0xC0000) = val;
} }
else if (addr >= 0xA0000 && addr <= 0xFFFFF) { else if (addr >= 0xA0000 && addr <= 0xFFFFF) {
writeb(val, _BE_env.busmem_base, addr - 0xA0000); writeb(val, _BE_env.busmem_base, addr - 0xA0000);
} }
else if (addr > M.mem_size-1) { else if (addr > M.mem_size-1) {
DB( printk("mem_write: address %#lx out of range!\n", addr);) DB( printk("mem_write: address %#lx out of range!\n", addr);)
HALT_SYS(); HALT_SYS();
} }
else { else {
*(u8*)(M.mem_base + addr) = val; *(u8*)(M.mem_base + addr) = val;
} }
} }
/**************************************************************************** /****************************************************************************
@ -258,43 +258,43 @@ void X86API BE_wrw(
u16 val) u16 val)
{ {
DB( if (DEBUG_MEM()) DB( if (DEBUG_MEM())
printk("%#08x 2 <- %#x\n", addr, val);) printk("%#08x 2 <- %#x\n", addr, val);)
if (addr >= 0xC0000 && addr <= _BE_env.biosmem_limit) { if (addr >= 0xC0000 && addr <= _BE_env.biosmem_limit) {
#ifdef __BIG_ENDIAN__ #ifdef __BIG_ENDIAN__
if (addr & 0x1) { if (addr & 0x1) {
addr -= 0xC0000; addr -= 0xC0000;
*(u8*)(_BE_env.biosmem_base + addr + 0) = (val >> 0) & 0xff; *(u8*)(_BE_env.biosmem_base + addr + 0) = (val >> 0) & 0xff;
*(u8*)(_BE_env.biosmem_base + addr + 1) = (val >> 8) & 0xff; *(u8*)(_BE_env.biosmem_base + addr + 1) = (val >> 8) & 0xff;
} }
else else
#endif #endif
*(u16*)(_BE_env.biosmem_base + addr - 0xC0000) = val; *(u16*)(_BE_env.biosmem_base + addr - 0xC0000) = val;
} }
else if (addr >= 0xA0000 && addr <= 0xFFFFF) { else if (addr >= 0xA0000 && addr <= 0xFFFFF) {
#ifdef __BIG_ENDIAN__ #ifdef __BIG_ENDIAN__
if (addr & 0x1) { if (addr & 0x1) {
addr -= 0xA0000; addr -= 0xA0000;
writeb(val >> 0, _BE_env.busmem_base, addr); writeb(val >> 0, _BE_env.busmem_base, addr);
writeb(val >> 8, _BE_env.busmem_base, addr + 1); writeb(val >> 8, _BE_env.busmem_base, addr + 1);
} }
else else
#endif #endif
writew(val, _BE_env.busmem_base, addr - 0xA0000); writew(val, _BE_env.busmem_base, addr - 0xA0000);
} }
else if (addr > M.mem_size-2) { else if (addr > M.mem_size-2) {
DB( printk("mem_write: address %#lx out of range!\n", addr);) DB( printk("mem_write: address %#lx out of range!\n", addr);)
HALT_SYS(); HALT_SYS();
} }
else { else {
#ifdef __BIG_ENDIAN__ #ifdef __BIG_ENDIAN__
if (addr & 0x1) { if (addr & 0x1) {
*(u8*)(M.mem_base + addr + 0) = (val >> 0) & 0xff; *(u8*)(M.mem_base + addr + 0) = (val >> 0) & 0xff;
*(u8*)(M.mem_base + addr + 1) = (val >> 8) & 0xff; *(u8*)(M.mem_base + addr + 1) = (val >> 8) & 0xff;
} }
else else
#endif #endif
*(u16*)(M.mem_base + addr) = val; *(u16*)(M.mem_base + addr) = val;
} }
} }
/**************************************************************************** /****************************************************************************
@ -311,49 +311,49 @@ void X86API BE_wrl(
u32 val) u32 val)
{ {
DB( if (DEBUG_MEM()) DB( if (DEBUG_MEM())
printk("%#08x 4 <- %#x\n", addr, val);) printk("%#08x 4 <- %#x\n", addr, val);)
if (addr >= 0xC0000 && addr <= _BE_env.biosmem_limit) { if (addr >= 0xC0000 && addr <= _BE_env.biosmem_limit) {
#ifdef __BIG_ENDIAN__ #ifdef __BIG_ENDIAN__
if (addr & 0x1) { if (addr & 0x1) {
addr -= 0xC0000; addr -= 0xC0000;
*(u8*)(M.mem_base + addr + 0) = (val >> 0) & 0xff; *(u8*)(M.mem_base + addr + 0) = (val >> 0) & 0xff;
*(u8*)(M.mem_base + addr + 1) = (val >> 8) & 0xff; *(u8*)(M.mem_base + addr + 1) = (val >> 8) & 0xff;
*(u8*)(M.mem_base + addr + 2) = (val >> 16) & 0xff; *(u8*)(M.mem_base + addr + 2) = (val >> 16) & 0xff;
*(u8*)(M.mem_base + addr + 3) = (val >> 24) & 0xff; *(u8*)(M.mem_base + addr + 3) = (val >> 24) & 0xff;
} }
else else
#endif #endif
*(u32*)(M.mem_base + addr - 0xC0000) = val; *(u32*)(M.mem_base + addr - 0xC0000) = val;
} }
else if (addr >= 0xA0000 && addr <= 0xFFFFF) { else if (addr >= 0xA0000 && addr <= 0xFFFFF) {
#ifdef __BIG_ENDIAN__ #ifdef __BIG_ENDIAN__
if (addr & 0x3) { if (addr & 0x3) {
addr -= 0xA0000; addr -= 0xA0000;
writeb(val >> 0, _BE_env.busmem_base, addr); writeb(val >> 0, _BE_env.busmem_base, addr);
writeb(val >> 8, _BE_env.busmem_base, addr + 1); writeb(val >> 8, _BE_env.busmem_base, addr + 1);
writeb(val >> 16, _BE_env.busmem_base, addr + 1); writeb(val >> 16, _BE_env.busmem_base, addr + 1);
writeb(val >> 24, _BE_env.busmem_base, addr + 1); writeb(val >> 24, _BE_env.busmem_base, addr + 1);
} }
else else
#endif #endif
writel(val, _BE_env.busmem_base, addr - 0xA0000); writel(val, _BE_env.busmem_base, addr - 0xA0000);
} }
else if (addr > M.mem_size-4) { else if (addr > M.mem_size-4) {
DB( printk("mem_write: address %#lx out of range!\n", addr);) DB( printk("mem_write: address %#lx out of range!\n", addr);)
HALT_SYS(); HALT_SYS();
} }
else { else {
#ifdef __BIG_ENDIAN__ #ifdef __BIG_ENDIAN__
if (addr & 0x1) { if (addr & 0x1) {
*(u8*)(M.mem_base + addr + 0) = (val >> 0) & 0xff; *(u8*)(M.mem_base + addr + 0) = (val >> 0) & 0xff;
*(u8*)(M.mem_base + addr + 1) = (val >> 8) & 0xff; *(u8*)(M.mem_base + addr + 1) = (val >> 8) & 0xff;
*(u8*)(M.mem_base + addr + 2) = (val >> 16) & 0xff; *(u8*)(M.mem_base + addr + 2) = (val >> 16) & 0xff;
*(u8*)(M.mem_base + addr + 3) = (val >> 24) & 0xff; *(u8*)(M.mem_base + addr + 3) = (val >> 24) & 0xff;
} }
else else
#endif #endif
*(u32*)(M.mem_base + addr) = val; *(u32*)(M.mem_base + addr) = val;
} }
} }
/* Debug functions to do ISA/PCI bus port I/O */ /* Debug functions to do ISA/PCI bus port I/O */
@ -365,7 +365,7 @@ u8 X86API BE_inb(int port)
{ {
u8 val = PM_inpb(port); u8 val = PM_inpb(port);
if (DEBUG_IO()) if (DEBUG_IO())
printk("%04X:%04X: inb.%04X -> %02X\n",M.x86.saved_cs, M.x86.saved_ip, (ushort)port, val); printk("%04X:%04X: inb.%04X -> %02X\n",M.x86.saved_cs, M.x86.saved_ip, (ushort)port, val);
return val; return val;
} }
@ -373,7 +373,7 @@ u16 X86API BE_inw(int port)
{ {
u16 val = PM_inpw(port); u16 val = PM_inpw(port);
if (DEBUG_IO()) if (DEBUG_IO())
printk("%04X:%04X: inw.%04X -> %04X\n",M.x86.saved_cs, M.x86.saved_ip, (ushort)port, val); printk("%04X:%04X: inw.%04X -> %04X\n",M.x86.saved_cs, M.x86.saved_ip, (ushort)port, val);
return val; return val;
} }
@ -381,28 +381,28 @@ u32 X86API BE_inl(int port)
{ {
u32 val = PM_inpd(port); u32 val = PM_inpd(port);
if (DEBUG_IO()) if (DEBUG_IO())
printk("%04X:%04X: inl.%04X -> %08X\n",M.x86.saved_cs, M.x86.saved_ip, (ushort)port, val); printk("%04X:%04X: inl.%04X -> %08X\n",M.x86.saved_cs, M.x86.saved_ip, (ushort)port, val);
return val; return val;
} }
void X86API BE_outb(int port, u8 val) void X86API BE_outb(int port, u8 val)
{ {
if (DEBUG_IO()) if (DEBUG_IO())
printk("%04X:%04X: outb.%04X <- %02X\n",M.x86.saved_cs, M.x86.saved_ip, (ushort)port, val); printk("%04X:%04X: outb.%04X <- %02X\n",M.x86.saved_cs, M.x86.saved_ip, (ushort)port, val);
PM_outpb(port,val); PM_outpb(port,val);
} }
void X86API BE_outw(int port, u16 val) void X86API BE_outw(int port, u16 val)
{ {
if (DEBUG_IO()) if (DEBUG_IO())
printk("%04X:%04X: outw.%04X <- %04X\n",M.x86.saved_cs, M.x86.saved_ip, (ushort)port, val); printk("%04X:%04X: outw.%04X <- %04X\n",M.x86.saved_cs, M.x86.saved_ip, (ushort)port, val);
PM_outpw(port,val); PM_outpw(port,val);
} }
void X86API BE_outl(int port, u32 val) void X86API BE_outl(int port, u32 val)
{ {
if (DEBUG_IO()) if (DEBUG_IO())
printk("%04X:%04X: outl.%04X <- %08X\n",M.x86.saved_cs, M.x86.saved_ip, (ushort)port, val); printk("%04X:%04X: outl.%04X <- %08X\n",M.x86.saved_cs, M.x86.saved_ip, (ushort)port, val);
PM_outpd(port,val); PM_outpd(port,val);
} }
#endif #endif

View File

@ -50,9 +50,9 @@ static void X86API undefined_intr(
int intno) int intno)
{ {
if (BE_rdw(intno * 4 + 2) == BIOS_SEG) if (BE_rdw(intno * 4 + 2) == BIOS_SEG)
printk("biosEmu: undefined interrupt %xh called!\n",intno); printk("biosEmu: undefined interrupt %xh called!\n",intno);
else else
X86EMU_prepareForInt(intno); X86EMU_prepareForInt(intno);
} }
/**************************************************************************** /****************************************************************************
@ -68,26 +68,26 @@ static void X86API int42(
int intno) int intno)
{ {
if (M.x86.R_AH == 0x12 && M.x86.R_BL == 0x32) { if (M.x86.R_AH == 0x12 && M.x86.R_BL == 0x32) {
if (M.x86.R_AL == 0) { if (M.x86.R_AL == 0) {
/* Enable CPU accesses to video memory */ /* Enable CPU accesses to video memory */
PM_outpb(0x3c2, PM_inpb(0x3cc) | (u8)0x02); PM_outpb(0x3c2, PM_inpb(0x3cc) | (u8)0x02);
return; return;
} }
else if (M.x86.R_AL == 1) { else if (M.x86.R_AL == 1) {
/* Disable CPU accesses to video memory */ /* Disable CPU accesses to video memory */
PM_outpb(0x3c2, PM_inpb(0x3cc) & (u8)~0x02); PM_outpb(0x3c2, PM_inpb(0x3cc) & (u8)~0x02);
return; return;
} }
#ifdef DEBUG #ifdef DEBUG
else { else {
printk("biosEmu/bios.int42: unknown function AH=0x12, BL=0x32, AL=%#02x\n",M.x86.R_AL); printk("biosEmu/bios.int42: unknown function AH=0x12, BL=0x32, AL=%#02x\n",M.x86.R_AL);
} }
#endif #endif
} }
#ifdef DEBUG #ifdef DEBUG
else { else {
printk("biosEmu/bios.int42: unknown function AH=%#02x, AL=%#02x, BL=%#02x\n",M.x86.R_AH, M.x86.R_AL, M.x86.R_BL); printk("biosEmu/bios.int42: unknown function AH=%#02x, AL=%#02x, BL=%#02x\n",M.x86.R_AH, M.x86.R_AL, M.x86.R_BL);
} }
#endif #endif
} }
@ -106,9 +106,9 @@ static void X86API int10(
int intno) int intno)
{ {
if (BE_rdw(intno * 4 + 2) == BIOS_SEG) if (BE_rdw(intno * 4 + 2) == BIOS_SEG)
int42(intno); int42(intno);
else else
X86EMU_prepareForInt(intno); X86EMU_prepareForInt(intno);
} }
/* Result codes returned by the PCI BIOS */ /* Result codes returned by the PCI BIOS */
@ -142,87 +142,87 @@ static void X86API int1A(
/* Fail if no PCI device information has been registered */ /* Fail if no PCI device information has been registered */
if (!_BE_env.vgaInfo.pciInfo) if (!_BE_env.vgaInfo.pciInfo)
return; return;
pciSlot = (u16)(_BE_env.vgaInfo.pciInfo->slot.i >> 8); pciSlot = (u16)(_BE_env.vgaInfo.pciInfo->slot.i >> 8);
switch (M.x86.R_AX) { switch (M.x86.R_AX) {
case 0xB101: /* PCI bios present? */ case 0xB101: /* PCI bios present? */
M.x86.R_AL = 0x00; /* no config space/special cycle generation support */ M.x86.R_AL = 0x00; /* no config space/special cycle generation support */
M.x86.R_EDX = 0x20494350; /* " ICP" */ M.x86.R_EDX = 0x20494350; /* " ICP" */
M.x86.R_BX = 0x0210; /* Version 2.10 */ M.x86.R_BX = 0x0210; /* Version 2.10 */
M.x86.R_CL = 0; /* Max bus number in system */ M.x86.R_CL = 0; /* Max bus number in system */
CLEAR_FLAG(F_CF); CLEAR_FLAG(F_CF);
break; break;
case 0xB102: /* Find PCI device */ case 0xB102: /* Find PCI device */
M.x86.R_AH = DEVICE_NOT_FOUND; M.x86.R_AH = DEVICE_NOT_FOUND;
if (M.x86.R_DX == _BE_env.vgaInfo.pciInfo->VendorID && if (M.x86.R_DX == _BE_env.vgaInfo.pciInfo->VendorID &&
M.x86.R_CX == _BE_env.vgaInfo.pciInfo->DeviceID && M.x86.R_CX == _BE_env.vgaInfo.pciInfo->DeviceID &&
M.x86.R_SI == 0) { M.x86.R_SI == 0) {
M.x86.R_AH = SUCCESSFUL; M.x86.R_AH = SUCCESSFUL;
M.x86.R_BX = pciSlot; M.x86.R_BX = pciSlot;
} }
CONDITIONAL_SET_FLAG((M.x86.R_AH != SUCCESSFUL), F_CF); CONDITIONAL_SET_FLAG((M.x86.R_AH != SUCCESSFUL), F_CF);
break; break;
case 0xB103: /* Find PCI class code */ case 0xB103: /* Find PCI class code */
M.x86.R_AH = DEVICE_NOT_FOUND; M.x86.R_AH = DEVICE_NOT_FOUND;
if (M.x86.R_CL == _BE_env.vgaInfo.pciInfo->Interface && if (M.x86.R_CL == _BE_env.vgaInfo.pciInfo->Interface &&
M.x86.R_CH == _BE_env.vgaInfo.pciInfo->SubClass && M.x86.R_CH == _BE_env.vgaInfo.pciInfo->SubClass &&
(u8)(M.x86.R_ECX >> 16) == _BE_env.vgaInfo.pciInfo->BaseClass) { (u8)(M.x86.R_ECX >> 16) == _BE_env.vgaInfo.pciInfo->BaseClass) {
M.x86.R_AH = SUCCESSFUL; M.x86.R_AH = SUCCESSFUL;
M.x86.R_BX = pciSlot; M.x86.R_BX = pciSlot;
} }
CONDITIONAL_SET_FLAG((M.x86.R_AH != SUCCESSFUL), F_CF); CONDITIONAL_SET_FLAG((M.x86.R_AH != SUCCESSFUL), F_CF);
break; break;
case 0xB108: /* Read configuration byte */ case 0xB108: /* Read configuration byte */
M.x86.R_AH = BAD_REGISTER_NUMBER; M.x86.R_AH = BAD_REGISTER_NUMBER;
if (M.x86.R_BX == pciSlot) { if (M.x86.R_BX == pciSlot) {
M.x86.R_AH = SUCCESSFUL; M.x86.R_AH = SUCCESSFUL;
M.x86.R_CL = (u8)PCI_accessReg(M.x86.R_DI,0,PCI_READ_BYTE,_BE_env.vgaInfo.pciInfo); M.x86.R_CL = (u8)PCI_accessReg(M.x86.R_DI,0,PCI_READ_BYTE,_BE_env.vgaInfo.pciInfo);
} }
CONDITIONAL_SET_FLAG((M.x86.R_AH != SUCCESSFUL), F_CF); CONDITIONAL_SET_FLAG((M.x86.R_AH != SUCCESSFUL), F_CF);
break; break;
case 0xB109: /* Read configuration word */ case 0xB109: /* Read configuration word */
M.x86.R_AH = BAD_REGISTER_NUMBER; M.x86.R_AH = BAD_REGISTER_NUMBER;
if (M.x86.R_BX == pciSlot) { if (M.x86.R_BX == pciSlot) {
M.x86.R_AH = SUCCESSFUL; M.x86.R_AH = SUCCESSFUL;
M.x86.R_CX = (u16)PCI_accessReg(M.x86.R_DI,0,PCI_READ_WORD,_BE_env.vgaInfo.pciInfo); M.x86.R_CX = (u16)PCI_accessReg(M.x86.R_DI,0,PCI_READ_WORD,_BE_env.vgaInfo.pciInfo);
} }
CONDITIONAL_SET_FLAG((M.x86.R_AH != SUCCESSFUL), F_CF); CONDITIONAL_SET_FLAG((M.x86.R_AH != SUCCESSFUL), F_CF);
break; break;
case 0xB10A: /* Read configuration dword */ case 0xB10A: /* Read configuration dword */
M.x86.R_AH = BAD_REGISTER_NUMBER; M.x86.R_AH = BAD_REGISTER_NUMBER;
if (M.x86.R_BX == pciSlot) { if (M.x86.R_BX == pciSlot) {
M.x86.R_AH = SUCCESSFUL; M.x86.R_AH = SUCCESSFUL;
M.x86.R_ECX = (u32)PCI_accessReg(M.x86.R_DI,0,PCI_READ_DWORD,_BE_env.vgaInfo.pciInfo); M.x86.R_ECX = (u32)PCI_accessReg(M.x86.R_DI,0,PCI_READ_DWORD,_BE_env.vgaInfo.pciInfo);
} }
CONDITIONAL_SET_FLAG((M.x86.R_AH != SUCCESSFUL), F_CF); CONDITIONAL_SET_FLAG((M.x86.R_AH != SUCCESSFUL), F_CF);
break; break;
case 0xB10B: /* Write configuration byte */ case 0xB10B: /* Write configuration byte */
M.x86.R_AH = BAD_REGISTER_NUMBER; M.x86.R_AH = BAD_REGISTER_NUMBER;
if (M.x86.R_BX == pciSlot) { if (M.x86.R_BX == pciSlot) {
M.x86.R_AH = SUCCESSFUL; M.x86.R_AH = SUCCESSFUL;
PCI_accessReg(M.x86.R_DI,M.x86.R_CL,PCI_WRITE_BYTE,_BE_env.vgaInfo.pciInfo); PCI_accessReg(M.x86.R_DI,M.x86.R_CL,PCI_WRITE_BYTE,_BE_env.vgaInfo.pciInfo);
} }
CONDITIONAL_SET_FLAG((M.x86.R_AH != SUCCESSFUL), F_CF); CONDITIONAL_SET_FLAG((M.x86.R_AH != SUCCESSFUL), F_CF);
break; break;
case 0xB10C: /* Write configuration word */ case 0xB10C: /* Write configuration word */
M.x86.R_AH = BAD_REGISTER_NUMBER; M.x86.R_AH = BAD_REGISTER_NUMBER;
if (M.x86.R_BX == pciSlot) { if (M.x86.R_BX == pciSlot) {
M.x86.R_AH = SUCCESSFUL; M.x86.R_AH = SUCCESSFUL;
PCI_accessReg(M.x86.R_DI,M.x86.R_CX,PCI_WRITE_WORD,_BE_env.vgaInfo.pciInfo); PCI_accessReg(M.x86.R_DI,M.x86.R_CX,PCI_WRITE_WORD,_BE_env.vgaInfo.pciInfo);
} }
CONDITIONAL_SET_FLAG((M.x86.R_AH != SUCCESSFUL), F_CF); CONDITIONAL_SET_FLAG((M.x86.R_AH != SUCCESSFUL), F_CF);
break; break;
case 0xB10D: /* Write configuration dword */ case 0xB10D: /* Write configuration dword */
M.x86.R_AH = BAD_REGISTER_NUMBER; M.x86.R_AH = BAD_REGISTER_NUMBER;
if (M.x86.R_BX == pciSlot) { if (M.x86.R_BX == pciSlot) {
M.x86.R_AH = SUCCESSFUL; M.x86.R_AH = SUCCESSFUL;
PCI_accessReg(M.x86.R_DI,M.x86.R_ECX,PCI_WRITE_DWORD,_BE_env.vgaInfo.pciInfo); PCI_accessReg(M.x86.R_DI,M.x86.R_ECX,PCI_WRITE_DWORD,_BE_env.vgaInfo.pciInfo);
} }
CONDITIONAL_SET_FLAG((M.x86.R_AH != SUCCESSFUL), F_CF); CONDITIONAL_SET_FLAG((M.x86.R_AH != SUCCESSFUL), F_CF);
break; break;
default: default:
printk("biosEmu/bios.int1a: unknown function AX=%#04x\n", M.x86.R_AX); printk("biosEmu/bios.int1a: unknown function AX=%#04x\n", M.x86.R_AX);
} }
} }
/**************************************************************************** /****************************************************************************
@ -240,9 +240,9 @@ void _BE_bios_init(
X86EMU_intrFuncs bios_intr_tab[256]; X86EMU_intrFuncs bios_intr_tab[256];
for (i = 0; i < 256; ++i) { for (i = 0; i < 256; ++i) {
intrTab[i] = BIOS_SEG << 16; intrTab[i] = BIOS_SEG << 16;
bios_intr_tab[i] = undefined_intr; bios_intr_tab[i] = undefined_intr;
} }
bios_intr_tab[0x10] = int10; bios_intr_tab[0x10] = int10;
bios_intr_tab[0x1A] = int1A; bios_intr_tab[0x1A] = int1A;
bios_intr_tab[0x42] = int42; bios_intr_tab[0x42] = int42;

View File

@ -100,9 +100,9 @@ ibool PMAPI BE_init(
#endif #endif
memset(&M,0,sizeof(M)); memset(&M,0,sizeof(M));
if (memSize < 20480) if (memSize < 20480)
PM_fatalError("Emulator requires at least 20Kb of memory!\n"); PM_fatalError("Emulator requires at least 20Kb of memory!\n");
if ((M.mem_base = (unsigned long)malloc(memSize)) == NULL) if ((M.mem_base = (unsigned long)malloc(memSize)) == NULL)
PM_fatalError("Out of memory!"); PM_fatalError("Out of memory!");
M.mem_size = memSize; M.mem_size = memSize;
_BE_env.busmem_base = (ulong)PM_mapPhysicalAddr(0xA0000,0x5FFFF,true); _BE_env.busmem_base = (ulong)PM_mapPhysicalAddr(0xA0000,0x5FFFF,true);
M.x86.debug = debugFlags; M.x86.debug = debugFlags;
@ -144,15 +144,15 @@ void PMAPI BE_setVGA(
_BE_env.vgaInfo.pciInfo = info->pciInfo; _BE_env.vgaInfo.pciInfo = info->pciInfo;
_BE_env.vgaInfo.BIOSImage = info->BIOSImage; _BE_env.vgaInfo.BIOSImage = info->BIOSImage;
if (info->BIOSImage) { if (info->BIOSImage) {
_BE_env.biosmem_base = (ulong)info->BIOSImage; _BE_env.biosmem_base = (ulong)info->BIOSImage;
_BE_env.biosmem_limit = 0xC0000 + info->BIOSImageLen-1; _BE_env.biosmem_limit = 0xC0000 + info->BIOSImageLen-1;
} }
else { else {
_BE_env.biosmem_base = _BE_env.busmem_base + 0x20000; _BE_env.biosmem_base = _BE_env.busmem_base + 0x20000;
_BE_env.biosmem_limit = 0xC7FFF; _BE_env.biosmem_limit = 0xC7FFF;
} }
if (*((u32*)info->LowMem) == 0) if (*((u32*)info->LowMem) == 0)
_BE_bios_init((u32*)info->LowMem); _BE_bios_init((u32*)info->LowMem);
memcpy((u8*)M.mem_base,info->LowMem,sizeof(info->LowMem)); memcpy((u8*)M.mem_base,info->LowMem,sizeof(info->LowMem));
} }
@ -182,8 +182,8 @@ This function maps a real mode pointer in the emulator memory to a protected
mode pointer that can be used to directly access the memory. mode pointer that can be used to directly access the memory.
NOTE: The memory is *always* in little endian format, son on non-x86 NOTE: The memory is *always* in little endian format, son on non-x86
systems you will need to do endian translations to access this systems you will need to do endian translations to access this
memory. memory.
****************************************************************************/ ****************************************************************************/
void * PMAPI BE_mapRealPointer( void * PMAPI BE_mapRealPointer(
uint r_seg, uint r_seg,
@ -192,11 +192,11 @@ void * PMAPI BE_mapRealPointer(
u32 addr = ((u32)r_seg << 4) + r_off; u32 addr = ((u32)r_seg << 4) + r_off;
if (addr >= 0xC0000 && addr <= _BE_env.biosmem_limit) { if (addr >= 0xC0000 && addr <= _BE_env.biosmem_limit) {
return (void*)(_BE_env.biosmem_base + addr - 0xC0000); return (void*)(_BE_env.biosmem_base + addr - 0xC0000);
} }
else if (addr >= 0xA0000 && addr <= 0xFFFFF) { else if (addr >= 0xA0000 && addr <= 0xFFFFF) {
return (void*)(_BE_env.busmem_base + addr - 0xA0000); return (void*)(_BE_env.busmem_base + addr - 0xA0000);
} }
return (void*)(M.mem_base + addr); return (void*)(M.mem_base + addr);
} }
@ -213,8 +213,8 @@ and located at 15Kb into the start of the real mode memory (16Kb is where
we put the real mode code we execute for issuing interrupts). we put the real mode code we execute for issuing interrupts).
NOTE: The memory is *always* in little endian format, son on non-x86 NOTE: The memory is *always* in little endian format, son on non-x86
systems you will need to do endian translations to access this systems you will need to do endian translations to access this
memory. memory.
****************************************************************************/ ****************************************************************************/
void * PMAPI BE_getVESABuf( void * PMAPI BE_getVESABuf(
uint *len, uint *len,
@ -416,28 +416,28 @@ BE_exports * _CEXPORT BE_initLibrary(
PM_imports *pmImp) PM_imports *pmImp)
{ {
static BE_exports _BE_exports = { static BE_exports _BE_exports = {
sizeof(BE_exports), sizeof(BE_exports),
BE_init, BE_init,
BE_setVGA, BE_setVGA,
BE_getVGA, BE_getVGA,
BE_mapRealPointer, BE_mapRealPointer,
BE_getVESABuf, BE_getVESABuf,
BE_callRealMode, BE_callRealMode,
BE_int86, BE_int86,
BE_int86x, BE_int86x,
NULL, NULL,
BE_exit, BE_exit,
}; };
int i,max; int i,max;
ulong *p; ulong *p;
// Initialize all default imports to point to fatal error handler /* Initialize all default imports to point to fatal error handler */
// for upwards compatibility. /* for upwards compatibility. */
max = sizeof(_PM_imports)/sizeof(BE_initLibrary_t); max = sizeof(_PM_imports)/sizeof(BE_initLibrary_t);
for (i = 0,p = (ulong*)&_PM_imports; i < max; i++) for (i = 0,p = (ulong*)&_PM_imports; i < max; i++)
*p++ = (ulong)_PM_fatalErrorHandler; *p++ = (ulong)_PM_fatalErrorHandler;
// Now copy all our imported functions /* Now copy all our imported functions */
memcpy(&_PM_imports,pmImp,MIN(sizeof(_PM_imports),pmImp->dwSize)); memcpy(&_PM_imports,pmImp,MIN(sizeof(_PM_imports),pmImp->dwSize));
return &_BE_exports; return &_BE_exports;
} }

View File

@ -112,16 +112,16 @@ static ulong PCI_findBIOSAddr(
int bar; int bar;
for (bar = 0x10; bar <= 0x14; bar++) { for (bar = 0x10; bar <= 0x14; bar++) {
base = PCI_readPCIRegL(bar,device) & ~0xFF; base = PCI_readPCIRegL(bar,device) & ~0xFF;
if (!(base & 0x1)) { if (!(base & 0x1)) {
PCI_writePCIRegL(bar,0xFFFFFFFF,device); PCI_writePCIRegL(bar,0xFFFFFFFF,device);
size = PCI_readPCIRegL(bar,device) & ~0xFF; size = PCI_readPCIRegL(bar,device) & ~0xFF;
size = ~size+1; size = ~size+1;
PCI_writePCIRegL(bar,0,device); PCI_writePCIRegL(bar,0,device);
if (size >= MAX_BIOSLEN) if (size >= MAX_BIOSLEN)
return base; return base;
} }
} }
return 0; return 0;
} }
@ -138,13 +138,13 @@ static void _PCI_fixupSecondaryBARs(void)
int i; int i;
for (i = 0; i < NumDevices; i++) { for (i = 0; i < NumDevices; i++) {
PCI_writePCIRegL(0x10,PCI[DeviceIndex[i]].BaseAddress10,i); PCI_writePCIRegL(0x10,PCI[DeviceIndex[i]].BaseAddress10,i);
PCI_writePCIRegL(0x14,PCI[DeviceIndex[i]].BaseAddress14,i); PCI_writePCIRegL(0x14,PCI[DeviceIndex[i]].BaseAddress14,i);
PCI_writePCIRegL(0x18,PCI[DeviceIndex[i]].BaseAddress18,i); PCI_writePCIRegL(0x18,PCI[DeviceIndex[i]].BaseAddress18,i);
PCI_writePCIRegL(0x1C,PCI[DeviceIndex[i]].BaseAddress1C,i); PCI_writePCIRegL(0x1C,PCI[DeviceIndex[i]].BaseAddress1C,i);
PCI_writePCIRegL(0x20,PCI[DeviceIndex[i]].BaseAddress20,i); PCI_writePCIRegL(0x20,PCI[DeviceIndex[i]].BaseAddress20,i);
PCI_writePCIRegL(0x24,PCI[DeviceIndex[i]].BaseAddress24,i); PCI_writePCIRegL(0x24,PCI[DeviceIndex[i]].BaseAddress24,i);
} }
} }
/**************************************************************************** /****************************************************************************
@ -165,29 +165,29 @@ static void PCI_doBIOSPOST(
RMREGS regs; RMREGS regs;
RMSREGS sregs; RMSREGS sregs;
// Determine the value to store in AX for BIOS POST /* Determine the value to store in AX for BIOS POST */
regs.x.ax = (u16)(PCI[DeviceIndex[device]].slot.i >> 8); regs.x.ax = (u16)(PCI[DeviceIndex[device]].slot.i >> 8);
if (useV86) { if (useV86) {
// Post the BIOS using the PM functions (ie: v86 mode on Linux) /* Post the BIOS using the PM functions (ie: v86 mode on Linux) */
if (!PM_doBIOSPOST(regs.x.ax,BIOSPhysAddr,mappedBIOS,BIOSLen)) { if (!PM_doBIOSPOST(regs.x.ax,BIOSPhysAddr,mappedBIOS,BIOSLen)) {
// If the PM function fails, this probably means are we are on /* If the PM function fails, this probably means are we are on */
// DOS and can't re-map the real mode 0xC0000 region. In thise /* DOS and can't re-map the real mode 0xC0000 region. In thise */
// case if the device is the primary, we can use the real /* case if the device is the primary, we can use the real */
// BIOS at 0xC0000 directly. /* BIOS at 0xC0000 directly. */
if (device == 0) if (device == 0)
PM_doBIOSPOST(regs.x.ax,0xC0000,mappedBIOS,BIOSLen); PM_doBIOSPOST(regs.x.ax,0xC0000,mappedBIOS,BIOSLen);
} }
} }
else { else {
// Setup the X86 emulator for the VGA BIOS /* Setup the X86 emulator for the VGA BIOS */
BE_setVGA(&VGAInfo[device]); BE_setVGA(&VGAInfo[device]);
// Execute the BIOS POST code /* Execute the BIOS POST code */
BE_callRealMode(0xC000,0x0003,&regs,&sregs); BE_callRealMode(0xC000,0x0003,&regs,&sregs);
// Cleanup and exit /* Cleanup and exit */
BE_getVGA(&VGAInfo[device]); BE_getVGA(&VGAInfo[device]);
} }
} }
/**************************************************************************** /****************************************************************************
@ -206,113 +206,113 @@ static ibool PCI_postControllers(void)
char filename[_MAX_PATH]; char filename[_MAX_PATH];
FILE *f; FILE *f;
// Disable the primary display controller and AGP VGA pass-through /* Disable the primary display controller and AGP VGA pass-through */
DISABLE_DEVICE(0); DISABLE_DEVICE(0);
if (AGPBridge) if (AGPBridge)
DISABLE_AGP_VGA(); DISABLE_AGP_VGA();
// Now POST all the secondary controllers /* Now POST all the secondary controllers */
for (device = 0; device < NumDevices; device++) { for (device = 0; device < NumDevices; device++) {
// Skip the device if it is not enabled (probably an ISA device) /* Skip the device if it is not enabled (probably an ISA device) */
if (DeviceIndex[device] == -1) if (DeviceIndex[device] == -1)
continue; continue;
// Enable secondary display controller. If the secondary controller /* Enable secondary display controller. If the secondary controller */
// is on the AGP bus, then enable VGA resources for the AGP device. /* is on the AGP bus, then enable VGA resources for the AGP device. */
ENABLE_DEVICE(device); ENABLE_DEVICE(device);
if (AGPBridge && AGPBridge->SecondayBusNumber == PCI[DeviceIndex[device]].slot.p.Bus) if (AGPBridge && AGPBridge->SecondayBusNumber == PCI[DeviceIndex[device]].slot.p.Bus)
ENABLE_AGP_VGA(); ENABLE_AGP_VGA();
// Check if the controller has already been POST'ed /* Check if the controller has already been POST'ed */
if (VGA_NOT_ACTIVE()) { if (VGA_NOT_ACTIVE()) {
// Find a viable place to map the secondary PCI BIOS image and map it /* Find a viable place to map the secondary PCI BIOS image and map it */
printk("Device %d not enabled, so attempting warm boot it\n", device); printk("Device %d not enabled, so attempting warm boot it\n", device);
// For AGP devices (and PCI devices that do have the ROM base /* For AGP devices (and PCI devices that do have the ROM base */
// address zero'ed out) we have to map the BIOS to a location /* address zero'ed out) we have to map the BIOS to a location */
// that is passed by the AGP bridge to the bus. Some AGP devices /* that is passed by the AGP bridge to the bus. Some AGP devices */
// have the ROM base address already set up for us, and some /* have the ROM base address already set up for us, and some */
// do not (we map to one of the existing BAR locations in /* do not (we map to one of the existing BAR locations in */
// this case). /* this case). */
mappedBIOS = NULL; mappedBIOS = NULL;
if (PCI[DeviceIndex[device]].ROMBaseAddress != 0) if (PCI[DeviceIndex[device]].ROMBaseAddress != 0)
mappedBIOSPhys = PCI[DeviceIndex[device]].ROMBaseAddress & ~0xF; mappedBIOSPhys = PCI[DeviceIndex[device]].ROMBaseAddress & ~0xF;
else else
mappedBIOSPhys = PCI_findBIOSAddr(device); mappedBIOSPhys = PCI_findBIOSAddr(device);
printk("Mapping BIOS image to 0x%08X\n", mappedBIOSPhys); printk("Mapping BIOS image to 0x%08X\n", mappedBIOSPhys);
mappedBIOS = PM_mapPhysicalAddr(mappedBIOSPhys,MAX_BIOSLEN-1,false); mappedBIOS = PM_mapPhysicalAddr(mappedBIOSPhys,MAX_BIOSLEN-1,false);
PCI_writePCIRegL(0x30,mappedBIOSPhys | 0x1,device); PCI_writePCIRegL(0x30,mappedBIOSPhys | 0x1,device);
BIOSImageLen = mappedBIOS[2] * 512; BIOSImageLen = mappedBIOS[2] * 512;
if ((copyOfBIOS = malloc(BIOSImageLen)) == NULL) if ((copyOfBIOS = malloc(BIOSImageLen)) == NULL)
return false; return false;
memcpy(copyOfBIOS,mappedBIOS,BIOSImageLen); memcpy(copyOfBIOS,mappedBIOS,BIOSImageLen);
PM_freePhysicalAddr(mappedBIOS,MAX_BIOSLEN-1); PM_freePhysicalAddr(mappedBIOS,MAX_BIOSLEN-1);
// Allocate memory to store copy of BIOS from secondary controllers /* Allocate memory to store copy of BIOS from secondary controllers */
VGAInfo[device].pciInfo = &PCI[DeviceIndex[device]]; VGAInfo[device].pciInfo = &PCI[DeviceIndex[device]];
VGAInfo[device].BIOSImage = copyOfBIOS; VGAInfo[device].BIOSImage = copyOfBIOS;
VGAInfo[device].BIOSImageLen = BIOSImageLen; VGAInfo[device].BIOSImageLen = BIOSImageLen;
// Restore device mappings /* Restore device mappings */
PCI_writePCIRegL(0x30,PCI[DeviceIndex[device]].ROMBaseAddress,device); PCI_writePCIRegL(0x30,PCI[DeviceIndex[device]].ROMBaseAddress,device);
PCI_writePCIRegL(0x10,PCI[DeviceIndex[device]].BaseAddress10,device); PCI_writePCIRegL(0x10,PCI[DeviceIndex[device]].BaseAddress10,device);
PCI_writePCIRegL(0x14,PCI[DeviceIndex[device]].BaseAddress14,device); PCI_writePCIRegL(0x14,PCI[DeviceIndex[device]].BaseAddress14,device);
// Now execute the BIOS POST for the device /* Now execute the BIOS POST for the device */
if (copyOfBIOS[0] == 0x55 && copyOfBIOS[1] == 0xAA) { if (copyOfBIOS[0] == 0x55 && copyOfBIOS[1] == 0xAA) {
printk("Executing BIOS POST for controller.\n"); printk("Executing BIOS POST for controller.\n");
PCI_doBIOSPOST(device,mappedBIOSPhys,copyOfBIOS,BIOSImageLen); PCI_doBIOSPOST(device,mappedBIOSPhys,copyOfBIOS,BIOSImageLen);
} }
// Reset the size of the BIOS image to the final size /* Reset the size of the BIOS image to the final size */
VGAInfo[device].BIOSImageLen = FINAL_BIOSLEN; VGAInfo[device].BIOSImageLen = FINAL_BIOSLEN;
// Save the BIOS and interrupt vector information to disk /* Save the BIOS and interrupt vector information to disk */
sprintf(filename,"%s/bios.%02d",PM_getNucleusConfigPath(),device); sprintf(filename,"%s/bios.%02d",PM_getNucleusConfigPath(),device);
if ((f = fopen(filename,"wb")) != NULL) { if ((f = fopen(filename,"wb")) != NULL) {
fwrite(copyOfBIOS,1,FINAL_BIOSLEN,f); fwrite(copyOfBIOS,1,FINAL_BIOSLEN,f);
fwrite(VGAInfo[device].LowMem,1,sizeof(VGAInfo[device].LowMem),f); fwrite(VGAInfo[device].LowMem,1,sizeof(VGAInfo[device].LowMem),f);
fclose(f); fclose(f);
} }
} }
else { else {
// Allocate memory to store copy of BIOS from secondary controllers /* Allocate memory to store copy of BIOS from secondary controllers */
if ((copyOfBIOS = malloc(FINAL_BIOSLEN)) == NULL) if ((copyOfBIOS = malloc(FINAL_BIOSLEN)) == NULL)
return false; return false;
VGAInfo[device].pciInfo = &PCI[DeviceIndex[device]]; VGAInfo[device].pciInfo = &PCI[DeviceIndex[device]];
VGAInfo[device].BIOSImage = copyOfBIOS; VGAInfo[device].BIOSImage = copyOfBIOS;
VGAInfo[device].BIOSImageLen = FINAL_BIOSLEN; VGAInfo[device].BIOSImageLen = FINAL_BIOSLEN;
// Load the BIOS and interrupt vector information from disk /* Load the BIOS and interrupt vector information from disk */
sprintf(filename,"%s/bios.%02d",PM_getNucleusConfigPath(),device); sprintf(filename,"%s/bios.%02d",PM_getNucleusConfigPath(),device);
if ((f = fopen(filename,"rb")) != NULL) { if ((f = fopen(filename,"rb")) != NULL) {
fread(copyOfBIOS,1,FINAL_BIOSLEN,f); fread(copyOfBIOS,1,FINAL_BIOSLEN,f);
fread(VGAInfo[device].LowMem,1,sizeof(VGAInfo[device].LowMem),f); fread(VGAInfo[device].LowMem,1,sizeof(VGAInfo[device].LowMem),f);
fclose(f); fclose(f);
} }
} }
// Fix up all the secondary PCI base address registers /* Fix up all the secondary PCI base address registers */
// (restores them all from the values we read previously) /* (restores them all from the values we read previously) */
_PCI_fixupSecondaryBARs(); _PCI_fixupSecondaryBARs();
// Disable the secondary controller and AGP VGA pass-through /* Disable the secondary controller and AGP VGA pass-through */
DISABLE_DEVICE(device); DISABLE_DEVICE(device);
if (AGPBridge) if (AGPBridge)
DISABLE_AGP_VGA(); DISABLE_AGP_VGA();
} }
// Reenable primary display controller and reset AGP bridge control /* Reenable primary display controller and reset AGP bridge control */
if (AGPBridge) if (AGPBridge)
RESTORE_AGP_VGA(); RESTORE_AGP_VGA();
ENABLE_DEVICE(0); ENABLE_DEVICE(0);
// Free physical BIOS image mapping /* Free physical BIOS image mapping */
PM_freePhysicalAddr(mappedBIOS,MAX_BIOSLEN-1); PM_freePhysicalAddr(mappedBIOS,MAX_BIOSLEN-1);
// Restore the X86 emulator BIOS info to primary controller /* Restore the X86 emulator BIOS info to primary controller */
if (!useV86) if (!useV86)
BE_setVGA(&VGAInfo[0]); BE_setVGA(&VGAInfo[0]);
return true; return true;
} }
@ -327,123 +327,123 @@ static void EnumeratePCI(void)
PCIBridgeInfo *info; PCIBridgeInfo *info;
printk("Displaying enumeration of PCI bus (%d devices, %d display devices)\n", printk("Displaying enumeration of PCI bus (%d devices, %d display devices)\n",
NumPCI, NumDevices); NumPCI, NumDevices);
for (index = 0; index < NumDevices; index++) for (index = 0; index < NumDevices; index++)
printk(" Display device %d is PCI device %d\n",index,DeviceIndex[index]); printk(" Display device %d is PCI device %d\n",index,DeviceIndex[index]);
printk("\n"); printk("\n");
printk("Bus Slot Fnc DeviceID SubSystem Rev Class IRQ Int Cmd\n"); printk("Bus Slot Fnc DeviceID SubSystem Rev Class IRQ Int Cmd\n");
for (i = 0; i < NumPCI; i++) { for (i = 0; i < NumPCI; i++) {
printk("%2d %2d %2d %04X:%04X %04X:%04X %02X %02X:%02X %02X %02X %04X ", printk("%2d %2d %2d %04X:%04X %04X:%04X %02X %02X:%02X %02X %02X %04X ",
PCI[i].slot.p.Bus, PCI[i].slot.p.Bus,
PCI[i].slot.p.Device, PCI[i].slot.p.Device,
PCI[i].slot.p.Function, PCI[i].slot.p.Function,
PCI[i].VendorID, PCI[i].VendorID,
PCI[i].DeviceID, PCI[i].DeviceID,
PCI[i].SubSystemVendorID, PCI[i].SubSystemVendorID,
PCI[i].SubSystemID, PCI[i].SubSystemID,
PCI[i].RevID, PCI[i].RevID,
PCI[i].BaseClass, PCI[i].BaseClass,
PCI[i].SubClass, PCI[i].SubClass,
PCI[i].InterruptLine, PCI[i].InterruptLine,
PCI[i].InterruptPin, PCI[i].InterruptPin,
PCI[i].Command); PCI[i].Command);
for (index = 0; index < NumDevices; index++) { for (index = 0; index < NumDevices; index++) {
if (DeviceIndex[index] == i) if (DeviceIndex[index] == i)
break; break;
} }
if (index < NumDevices) if (index < NumDevices)
printk("<- %d\n", index); printk("<- %d\n", index);
else else
printk("\n"); printk("\n");
} }
printk("\n"); printk("\n");
printk("DeviceID Stat Ifc Cch Lat Hdr BIST\n"); printk("DeviceID Stat Ifc Cch Lat Hdr BIST\n");
for (i = 0; i < NumPCI; i++) { for (i = 0; i < NumPCI; i++) {
printk("%04X:%04X %04X %02X %02X %02X %02X %02X ", printk("%04X:%04X %04X %02X %02X %02X %02X %02X ",
PCI[i].VendorID, PCI[i].VendorID,
PCI[i].DeviceID, PCI[i].DeviceID,
PCI[i].Status, PCI[i].Status,
PCI[i].Interface, PCI[i].Interface,
PCI[i].CacheLineSize, PCI[i].CacheLineSize,
PCI[i].LatencyTimer, PCI[i].LatencyTimer,
PCI[i].HeaderType, PCI[i].HeaderType,
PCI[i].BIST); PCI[i].BIST);
for (index = 0; index < NumDevices; index++) { for (index = 0; index < NumDevices; index++) {
if (DeviceIndex[index] == i) if (DeviceIndex[index] == i)
break; break;
} }
if (index < NumDevices) if (index < NumDevices)
printk("<- %d\n", index); printk("<- %d\n", index);
else else
printk("\n"); printk("\n");
} }
printk("\n"); printk("\n");
printk("DeviceID Base10h Base14h Base18h Base1Ch Base20h Base24h ROMBase\n"); printk("DeviceID Base10h Base14h Base18h Base1Ch Base20h Base24h ROMBase\n");
for (i = 0; i < NumPCI; i++) { for (i = 0; i < NumPCI; i++) {
printk("%04X:%04X %08X %08X %08X %08X %08X %08X %08X ", printk("%04X:%04X %08X %08X %08X %08X %08X %08X %08X ",
PCI[i].VendorID, PCI[i].VendorID,
PCI[i].DeviceID, PCI[i].DeviceID,
PCI[i].BaseAddress10, PCI[i].BaseAddress10,
PCI[i].BaseAddress14, PCI[i].BaseAddress14,
PCI[i].BaseAddress18, PCI[i].BaseAddress18,
PCI[i].BaseAddress1C, PCI[i].BaseAddress1C,
PCI[i].BaseAddress20, PCI[i].BaseAddress20,
PCI[i].BaseAddress24, PCI[i].BaseAddress24,
PCI[i].ROMBaseAddress); PCI[i].ROMBaseAddress);
for (index = 0; index < NumDevices; index++) { for (index = 0; index < NumDevices; index++) {
if (DeviceIndex[index] == i) if (DeviceIndex[index] == i)
break; break;
} }
if (index < NumDevices) if (index < NumDevices)
printk("<- %d\n", index); printk("<- %d\n", index);
else else
printk("\n"); printk("\n");
} }
printk("\n"); printk("\n");
printk("DeviceID BAR10Len BAR14Len BAR18Len BAR1CLen BAR20Len BAR24Len ROMLen\n"); printk("DeviceID BAR10Len BAR14Len BAR18Len BAR1CLen BAR20Len BAR24Len ROMLen\n");
for (i = 0; i < NumPCI; i++) { for (i = 0; i < NumPCI; i++) {
printk("%04X:%04X %08X %08X %08X %08X %08X %08X %08X ", printk("%04X:%04X %08X %08X %08X %08X %08X %08X %08X ",
PCI[i].VendorID, PCI[i].VendorID,
PCI[i].DeviceID, PCI[i].DeviceID,
PCI[i].BaseAddress10Len, PCI[i].BaseAddress10Len,
PCI[i].BaseAddress14Len, PCI[i].BaseAddress14Len,
PCI[i].BaseAddress18Len, PCI[i].BaseAddress18Len,
PCI[i].BaseAddress1CLen, PCI[i].BaseAddress1CLen,
PCI[i].BaseAddress20Len, PCI[i].BaseAddress20Len,
PCI[i].BaseAddress24Len, PCI[i].BaseAddress24Len,
PCI[i].ROMBaseAddressLen); PCI[i].ROMBaseAddressLen);
for (index = 0; index < NumDevices; index++) { for (index = 0; index < NumDevices; index++) {
if (DeviceIndex[index] == i) if (DeviceIndex[index] == i)
break; break;
} }
if (index < NumDevices) if (index < NumDevices)
printk("<- %d\n", index); printk("<- %d\n", index);
else else
printk("\n"); printk("\n");
} }
printk("\n"); printk("\n");
printk("Displaying enumeration of %d bridge devices\n",NumBridges); printk("Displaying enumeration of %d bridge devices\n",NumBridges);
printk("\n"); printk("\n");
printk("DeviceID P# S# B# IOB IOL MemBase MemLimit PreBase PreLimit Ctrl\n"); printk("DeviceID P# S# B# IOB IOL MemBase MemLimit PreBase PreLimit Ctrl\n");
for (i = 0; i < NumBridges; i++) { for (i = 0; i < NumBridges; i++) {
info = (PCIBridgeInfo*)&PCI[BridgeIndex[i]]; info = (PCIBridgeInfo*)&PCI[BridgeIndex[i]];
printk("%04X:%04X %02X %02X %02X %04X %04X %08X %08X %08X %08X %04X\n", printk("%04X:%04X %02X %02X %02X %04X %04X %08X %08X %08X %08X %04X\n",
info->VendorID, info->VendorID,
info->DeviceID, info->DeviceID,
info->PrimaryBusNumber, info->PrimaryBusNumber,
info->SecondayBusNumber, info->SecondayBusNumber,
info->SubordinateBusNumber, info->SubordinateBusNumber,
((u16)info->IOBase << 8) & 0xF000, ((u16)info->IOBase << 8) & 0xF000,
info->IOLimit ? info->IOLimit ?
((u16)info->IOLimit << 8) | 0xFFF : 0, ((u16)info->IOLimit << 8) | 0xFFF : 0,
((u32)info->MemoryBase << 16) & 0xFFF00000, ((u32)info->MemoryBase << 16) & 0xFFF00000,
info->MemoryLimit ? info->MemoryLimit ?
((u32)info->MemoryLimit << 16) | 0xFFFFF : 0, ((u32)info->MemoryLimit << 16) | 0xFFFFF : 0,
((u32)info->PrefetchableMemoryBase << 16) & 0xFFF00000, ((u32)info->PrefetchableMemoryBase << 16) & 0xFFF00000,
info->PrefetchableMemoryLimit ? info->PrefetchableMemoryLimit ?
((u32)info->PrefetchableMemoryLimit << 16) | 0xFFFFF : 0, ((u32)info->PrefetchableMemoryLimit << 16) | 0xFFFFF : 0,
info->BridgeControl); info->BridgeControl);
} }
printk("\n"); printk("\n");
} }
@ -460,51 +460,51 @@ static int PCI_enumerateDevices(void)
int i,j; int i,j;
PCIBridgeInfo *info; PCIBridgeInfo *info;
// If this is the first time we have been called, enumerate all /* If this is the first time we have been called, enumerate all */
// devices on the PCI bus. /* devices on the PCI bus. */
if (NumPCI == -1) { if (NumPCI == -1) {
for (i = 0; i < MAX_PCI_DEVICES; i++) for (i = 0; i < MAX_PCI_DEVICES; i++)
PCI[i].dwSize = sizeof(PCI[i]); PCI[i].dwSize = sizeof(PCI[i]);
if ((NumPCI = PCI_enumerate(PCI,MAX_PCI_DEVICES)) == 0) if ((NumPCI = PCI_enumerate(PCI,MAX_PCI_DEVICES)) == 0)
return -1; return -1;
// Build a list of all PCI bridge devices /* Build a list of all PCI bridge devices */
for (i = 0,NumBridges = 0,BridgeIndex[0] = -1; i < NumPCI; i++) { for (i = 0,NumBridges = 0,BridgeIndex[0] = -1; i < NumPCI; i++) {
if (PCI[i].BaseClass == PCI_BRIDGE_CLASS) { if (PCI[i].BaseClass == PCI_BRIDGE_CLASS) {
if (NumBridges < MAX_PCI_DEVICES) if (NumBridges < MAX_PCI_DEVICES)
BridgeIndex[NumBridges++] = i; BridgeIndex[NumBridges++] = i;
} }
} }
// Now build a list of all display class devices /* Now build a list of all display class devices */
for (i = 0,NumDevices = 1,DeviceIndex[0] = -1; i < NumPCI; i++) { for (i = 0,NumDevices = 1,DeviceIndex[0] = -1; i < NumPCI; i++) {
if (PCI_IS_DISPLAY_CLASS(&PCI[i])) { if (PCI_IS_DISPLAY_CLASS(&PCI[i])) {
if ((PCI[i].Command & 0x3) == 0x3) { if ((PCI[i].Command & 0x3) == 0x3) {
DeviceIndex[0] = i; DeviceIndex[0] = i;
} }
else { else {
if (NumDevices < MAX_PCI_DEVICES) if (NumDevices < MAX_PCI_DEVICES)
DeviceIndex[NumDevices++] = i; DeviceIndex[NumDevices++] = i;
} }
if (PCI[i].slot.p.Bus != 0) { if (PCI[i].slot.p.Bus != 0) {
// This device is on a different bus than the primary /* This device is on a different bus than the primary */
// PCI bus, so it is probably an AGP device. Find the /* PCI bus, so it is probably an AGP device. Find the */
// AGP bus device that controls that bus so we can /* AGP bus device that controls that bus so we can */
// control it. /* control it. */
for (j = 0; j < NumBridges; j++) { for (j = 0; j < NumBridges; j++) {
info = (PCIBridgeInfo*)&PCI[BridgeIndex[j]]; info = (PCIBridgeInfo*)&PCI[BridgeIndex[j]];
if (info->SecondayBusNumber == PCI[i].slot.p.Bus) { if (info->SecondayBusNumber == PCI[i].slot.p.Bus) {
AGPBridge = info; AGPBridge = info;
break; break;
} }
} }
} }
} }
} }
// Enumerate all PCI and bridge devices to log file /* Enumerate all PCI and bridge devices to log file */
EnumeratePCI(); EnumeratePCI();
} }
return NumDevices; return NumDevices;
} }
@ -522,48 +522,48 @@ void printk(const char *fmt, ...)
int main(int argc,char *argv[]) int main(int argc,char *argv[])
{ {
while (argc > 1) { while (argc > 1) {
if (stricmp(argv[1],"-usev86") == 0) { if (stricmp(argv[1],"-usev86") == 0) {
useV86 = true; useV86 = true;
} }
else if (stricmp(argv[1],"-force") == 0) { else if (stricmp(argv[1],"-force") == 0) {
forcePost = true; forcePost = true;
} }
#ifdef DEBUG #ifdef DEBUG
else if (stricmp(argv[1],"-decode") == 0) { else if (stricmp(argv[1],"-decode") == 0) {
debugFlags |= DEBUG_DECODE_F; debugFlags |= DEBUG_DECODE_F;
} }
else if (stricmp(argv[1],"-iotrace") == 0) { else if (stricmp(argv[1],"-iotrace") == 0) {
debugFlags |= DEBUG_IO_TRACE_F; debugFlags |= DEBUG_IO_TRACE_F;
} }
#endif #endif
else { else {
printf("Usage: warmboot [-usev86] [-force] [-decode] [-iotrace]\n"); printf("Usage: warmboot [-usev86] [-force] [-decode] [-iotrace]\n");
exit(-1); exit(-1);
} }
argc--; argc--;
argv++; argv++;
} }
if ((logfile = fopen("warmboot.log","w")) == NULL) if ((logfile = fopen("warmboot.log","w")) == NULL)
exit(1); exit(1);
PM_init(); PM_init();
if (!useV86) { if (!useV86) {
// Initialise the x86 BIOS emulator /* Initialise the x86 BIOS emulator */
BE_init(false,debugFlags,65536,&VGAInfo[0]); BE_init(false,debugFlags,65536,&VGAInfo[0]);
} }
// Enumerate all devices (which POST's them at the same time) /* Enumerate all devices (which POST's them at the same time) */
if (PCI_enumerateDevices() < 1) { if (PCI_enumerateDevices() < 1) {
printk("No PCI display devices found!\n"); printk("No PCI display devices found!\n");
return -1; return -1;
} }
// Post all the display controller BIOS'es /* Post all the display controller BIOS'es */
PCI_postControllers(); PCI_postControllers();
// Cleanup and exit the emulator /* Cleanup and exit the emulator */
if (!useV86) if (!useV86)
BE_exit(); BE_exit();
fclose(logfile); fclose(logfile);
return 0; return 0;
} }

View File

@ -70,7 +70,7 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0)
haveRDTSC = true; haveRDTSC = true;
return true; return true;
} }
@ -82,11 +82,11 @@ void NAPI GA_TimerRead(
GA_largeInteger *value) GA_largeInteger *value)
{ {
if (haveRDTSC) if (haveRDTSC)
_GA_readTimeStamp(value); _GA_readTimeStamp(value);
else { else {
struct timeval t; struct timeval t;
gettimeofday(&t, NULL); gettimeofday(&t, NULL);
value->low = t.tv_sec*1000000 + t.tv_usec; value->low = t.tv_sec*1000000 + t.tv_usec;
value->high = 0; value->high = 0;
} }
} }

View File

@ -49,7 +49,7 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0)
return true; return true;
return false; return false;
} }

View File

@ -100,35 +100,35 @@ static ibool LoadDriver(void)
/* Check if we have already loaded the driver */ /* Check if we have already loaded the driver */
if (loaded) if (loaded)
return true; return true;
PM_init(); PM_init();
_AA_exports.dwSize = sizeof(_AA_exports); _AA_exports.dwSize = sizeof(_AA_exports);
/* Open the BPD file */ /* Open the BPD file */
if (!PM_findBPD(DLL_NAME,bpdpath)) if (!PM_findBPD(DLL_NAME,bpdpath))
return false; return false;
strcpy(filename,bpdpath); strcpy(filename,bpdpath);
strcat(filename,DLL_NAME); strcat(filename,DLL_NAME);
if ((hModBPD = PE_loadLibrary(filename,false)) == NULL) if ((hModBPD = PE_loadLibrary(filename,false)) == NULL)
return false; return false;
if ((AA_initLibrary = (AA_initLibrary_t)PE_getProcAddress(hModBPD,"_AA_initLibrary")) == NULL) if ((AA_initLibrary = (AA_initLibrary_t)PE_getProcAddress(hModBPD,"_AA_initLibrary")) == NULL)
return false; return false;
bpdpath[strlen(bpdpath)-1] = 0; bpdpath[strlen(bpdpath)-1] = 0;
if (strcmp(bpdpath,PM_getNucleusPath()) == 0) if (strcmp(bpdpath,PM_getNucleusPath()) == 0)
strcpy(bpdpath,PM_getNucleusConfigPath()); strcpy(bpdpath,PM_getNucleusConfigPath());
else { else {
PM_backslash(bpdpath); PM_backslash(bpdpath);
strcat(bpdpath,"config"); strcat(bpdpath,"config");
} }
if ((aaExp = AA_initLibrary(bpdpath,filename,&_PM_imports,&_N_imports,&_AA_imports)) == NULL) if ((aaExp = AA_initLibrary(bpdpath,filename,&_PM_imports,&_N_imports,&_AA_imports)) == NULL)
PM_fatalError("AA_initLibrary failed!\n"); PM_fatalError("AA_initLibrary failed!\n");
/* Initialize all default imports to point to fatal error handler /* Initialize all default imports to point to fatal error handler
* for upwards compatibility, and copy the exported functions. * for upwards compatibility, and copy the exported functions.
*/ */
max = sizeof(_AA_exports)/sizeof(AA_initLibrary_t); max = sizeof(_AA_exports)/sizeof(AA_initLibrary_t);
for (i = 0,p = (ulong*)&_AA_exports; i < max; i++) for (i = 0,p = (ulong*)&_AA_exports; i < max; i++)
*p++ = (ulong)_AA_fatalErrorHandler; *p++ = (ulong)_AA_fatalErrorHandler;
memcpy(&_AA_exports,aaExp,MIN(sizeof(_AA_exports),aaExp->dwSize)); memcpy(&_AA_exports,aaExp,MIN(sizeof(_AA_exports),aaExp->dwSize));
loaded = true; loaded = true;
return true; return true;
@ -143,7 +143,7 @@ static ibool LoadDriver(void)
int NAPI AA_status(void) int NAPI AA_status(void)
{ {
if (!loaded) if (!loaded)
return nDriverNotFound; return nDriverNotFound;
return _AA_exports.AA_status(); return _AA_exports.AA_status();
} }
@ -152,7 +152,7 @@ const char * NAPI AA_errorMsg(
N_int32 status) N_int32 status)
{ {
if (!loaded) if (!loaded)
return "Unable to load Nucleus device driver!"; return "Unable to load Nucleus device driver!";
return _AA_exports.AA_errorMsg(status); return _AA_exports.AA_errorMsg(status);
} }
@ -160,7 +160,7 @@ const char * NAPI AA_errorMsg(
int NAPI AA_getDaysLeft(void) int NAPI AA_getDaysLeft(void)
{ {
if (!LoadDriver()) if (!LoadDriver())
return -1; return -1;
return _AA_exports.AA_getDaysLeft(); return _AA_exports.AA_getDaysLeft();
} }
@ -168,7 +168,7 @@ int NAPI AA_getDaysLeft(void)
int NAPI AA_registerLicense(uchar *license) int NAPI AA_registerLicense(uchar *license)
{ {
if (!LoadDriver()) if (!LoadDriver())
return 0; return 0;
return _AA_exports.AA_registerLicense(license); return _AA_exports.AA_registerLicense(license);
} }
@ -176,7 +176,7 @@ int NAPI AA_registerLicense(uchar *license)
int NAPI AA_enumerateDevices(void) int NAPI AA_enumerateDevices(void)
{ {
if (!LoadDriver()) if (!LoadDriver())
return 0; return 0;
return _AA_exports.AA_enumerateDevices(); return _AA_exports.AA_enumerateDevices();
} }
@ -184,7 +184,7 @@ int NAPI AA_enumerateDevices(void)
AA_devCtx * NAPI AA_loadDriver(N_int32 deviceIndex) AA_devCtx * NAPI AA_loadDriver(N_int32 deviceIndex)
{ {
if (!LoadDriver()) if (!LoadDriver())
return NULL; return NULL;
return _AA_exports.AA_loadDriver(deviceIndex); return _AA_exports.AA_loadDriver(deviceIndex);
} }
#endif #endif
@ -211,15 +211,15 @@ void NAPI _OS_delay(
LZTimerObject tm; LZTimerObject tm;
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) { if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) {
if (!inited) { if (!inited) {
ZTimerInit(); ZTimerInit();
inited = true; inited = true;
} }
LZTimerOnExt(&tm); LZTimerOnExt(&tm);
while (LZTimerLapExt(&tm) < microSeconds) while (LZTimerLapExt(&tm) < microSeconds)
; ;
LZTimerOnExt(&tm); LZTimerOnExt(&tm);
} }
else else
_OS_delay8253(microSeconds); _OS_delay8253(microSeconds);
} }

View File

@ -72,7 +72,7 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0)
haveRDTSC = true; haveRDTSC = true;
return true; return true;
} }
@ -84,11 +84,11 @@ void NAPI GA_TimerRead(
GA_largeInteger *value) GA_largeInteger *value)
{ {
if (haveRDTSC) if (haveRDTSC)
_GA_readTimeStamp(value); _GA_readTimeStamp(value);
else { else {
struct timeval t; struct timeval t;
gettimeofday(&t, NULL); gettimeofday(&t, NULL);
value->low = t.tv_sec*1000000 + t.tv_usec; value->low = t.tv_sec*1000000 + t.tv_usec;
value->high = 0; value->high = 0;
} }
} }

View File

@ -65,25 +65,25 @@ GA_sharedInfo * NAPI GA_getSharedInfo(
/* Open our helper device driver */ /* Open our helper device driver */
if (DosOpen(PMHELP_NAME,&hSDDHelp,&result,0,0, if (DosOpen(PMHELP_NAME,&hSDDHelp,&result,0,0,
FILE_OPEN, OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE, FILE_OPEN, OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE,
NULL)) NULL))
PM_fatalError("Unable to open SDDHELP$ helper device driver!"); PM_fatalError("Unable to open SDDHELP$ helper device driver!");
outLen = sizeof(result); outLen = sizeof(result);
DosDevIOCtl(hSDDHelp,PMHELP_IOCTL,PMHELP_GETSHAREDINFO, DosDevIOCtl(hSDDHelp,PMHELP_IOCTL,PMHELP_GETSHAREDINFO,
NULL, 0, NULL, NULL, 0, NULL,
&result, outLen, &outLen); &result, outLen, &outLen);
DosClose(hSDDHelp); DosClose(hSDDHelp);
if (result) { if (result) {
/* We have found the shared Nucleus packet. Because not all processes /* We have found the shared Nucleus packet. Because not all processes
* map to SDDPMI.DLL, we need to ensure that we connect to this * map to SDDPMI.DLL, we need to ensure that we connect to this
* DLL so that it gets mapped into our address space (that is * DLL so that it gets mapped into our address space (that is
* where the shared Nucleus packet is located). Simply doing a * where the shared Nucleus packet is located). Simply doing a
* DosLoadModule on it is enough for this. * DosLoadModule on it is enough for this.
*/ */
HMODULE hModSDDPMI; HMODULE hModSDDPMI;
char buf[80]; char buf[80];
DosLoadModule((PSZ)buf,sizeof(buf),(PSZ)"SDDPMI.DLL",&hModSDDPMI); DosLoadModule((PSZ)buf,sizeof(buf),(PSZ)"SDDPMI.DLL",&hModSDDPMI);
} }
return (GA_sharedInfo*)result; return (GA_sharedInfo*)result;
} }
@ -106,7 +106,7 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0)
haveRDTSC = true; haveRDTSC = true;
return true; return true;
} }
@ -118,7 +118,7 @@ void NAPI GA_TimerRead(
GA_largeInteger *value) GA_largeInteger *value)
{ {
if (haveRDTSC) if (haveRDTSC)
_GA_readTimeStamp(value); _GA_readTimeStamp(value);
else else
DosTmrQueryTime((QWORD*)value); DosTmrQueryTime((QWORD*)value);
} }

View File

@ -72,7 +72,7 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0)
haveRDTSC = true; haveRDTSC = true;
return true; return true;
} }
@ -84,12 +84,12 @@ void NAPI GA_TimerRead(
GA_largeInteger *value) GA_largeInteger *value)
{ {
if (haveRDTSC) if (haveRDTSC)
_GA_readTimeStamp(value); _GA_readTimeStamp(value);
else { else {
struct timespec ts; struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts); clock_gettime(CLOCK_REALTIME, &ts);
value->low = (ts.tv_nsec / 1000 + ts.tv_sec * 1000000); value->low = (ts.tv_nsec / 1000 + ts.tv_sec * 1000000);
value->high = 0; value->high = 0;
} }
} }

View File

@ -71,9 +71,9 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) { if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) {
haveRDTSC = true; haveRDTSC = true;
return true; return true;
} }
return false; return false;
} }
@ -85,5 +85,5 @@ void NAPI GA_TimerRead(
GA_largeInteger *value) GA_largeInteger *value)
{ {
if (haveRDTSC) if (haveRDTSC)
_GA_readTimeStamp(value); _GA_readTimeStamp(value);
} }

View File

@ -68,7 +68,7 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0)
return true; return true;
return false; return false;
} }

View File

@ -71,8 +71,8 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) { if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) {
haveRDTSC = true; haveRDTSC = true;
} }
return true; return true;
} }
@ -84,7 +84,7 @@ void NAPI GA_TimerRead(
GA_largeInteger *value) GA_largeInteger *value)
{ {
if (haveRDTSC) if (haveRDTSC)
_GA_readTimeStamp(value); _GA_readTimeStamp(value);
else else
VTD_Get_Real_Time(&value->high,&value->low); VTD_Get_Real_Time(&value->high,&value->low);
} }

View File

@ -75,9 +75,9 @@ GA_sharedInfo * NAPI GA_getSharedInfo(
PM_init(); PM_init();
inBuf[0] = device; inBuf[0] = device;
if (DeviceIoControl(_PM_hDevice, PMHELP_GETSHAREDINFO32, inBuf, sizeof(inBuf), if (DeviceIoControl(_PM_hDevice, PMHELP_GETSHAREDINFO32, inBuf, sizeof(inBuf),
outBuf, sizeof(outBuf), &count, NULL)) { outBuf, sizeof(outBuf), &count, NULL)) {
return (GA_sharedInfo*)outBuf[0]; return (GA_sharedInfo*)outBuf[0];
} }
return NULL; return NULL;
} }
@ -102,16 +102,16 @@ static ibool NAPI _GA_softStereoInit(
GA_devCtx *dc) GA_devCtx *dc)
{ {
if (_PM_hDevice) { if (_PM_hDevice) {
DWORD inBuf[1]; /* Buffer to send data to VxD */ DWORD inBuf[1]; /* Buffer to send data to VxD */
DWORD outBuf[1]; /* Buffer to receive data from VxD */ DWORD outBuf[1]; /* Buffer to receive data from VxD */
DWORD count; /* Count of bytes returned from VxD */ DWORD count; /* Count of bytes returned from VxD */
inBuf[0] = (ulong)dc; inBuf[0] = (ulong)dc;
if (DeviceIoControl(_PM_hDevice, PMHELP_GASTEREOINIT32, inBuf, sizeof(inBuf), if (DeviceIoControl(_PM_hDevice, PMHELP_GASTEREOINIT32, inBuf, sizeof(inBuf),
outBuf, sizeof(outBuf), &count, NULL)) { outBuf, sizeof(outBuf), &count, NULL)) {
return outBuf[0]; return outBuf[0];
} }
} }
return false; return false;
} }
@ -122,9 +122,9 @@ This function turns on software stereo mode, either directly or via the VxD.
static void NAPI _GA_softStereoOn(void) static void NAPI _GA_softStereoOn(void)
{ {
if (_PM_hDevice) { if (_PM_hDevice) {
DeviceIoControl(_PM_hDevice, PMHELP_GASTEREOON32, NULL, 0, DeviceIoControl(_PM_hDevice, PMHELP_GASTEREOON32, NULL, 0,
NULL, 0, NULL, NULL); NULL, 0, NULL, NULL);
} }
} }
/**************************************************************************** /****************************************************************************
@ -137,14 +137,14 @@ static void NAPI _GA_softStereoScheduleFlip(
N_uint32 rightAddr) N_uint32 rightAddr)
{ {
if (_PM_hDevice) { if (_PM_hDevice) {
DWORD inBuf[2]; /* Buffer to send data to VxD */ DWORD inBuf[2]; /* Buffer to send data to VxD */
DWORD count; /* Count of bytes returned from VxD */ DWORD count; /* Count of bytes returned from VxD */
inBuf[0] = (ulong)leftAddr; inBuf[0] = (ulong)leftAddr;
inBuf[1] = (ulong)rightAddr; inBuf[1] = (ulong)rightAddr;
DeviceIoControl(_PM_hDevice, PMHELP_GASTEREOFLIP32, inBuf, sizeof(inBuf), DeviceIoControl(_PM_hDevice, PMHELP_GASTEREOFLIP32, inBuf, sizeof(inBuf),
NULL, 0, &count, NULL); NULL, 0, &count, NULL);
} }
} }
/**************************************************************************** /****************************************************************************
@ -154,14 +154,14 @@ This function turns off software stereo mode, either directly or via the VxD.
static N_int32 NAPI _GA_softStereoGetFlipStatus(void) static N_int32 NAPI _GA_softStereoGetFlipStatus(void)
{ {
if (_PM_hDevice) { if (_PM_hDevice) {
DWORD outBuf[1]; /* Buffer to receive data from VxD */ DWORD outBuf[1]; /* Buffer to receive data from VxD */
DWORD count; /* Count of bytes returned from VxD */ DWORD count; /* Count of bytes returned from VxD */
if (DeviceIoControl(_PM_hDevice, PMHELP_GASTEREOFLIPSTATUS32, NULL, 0, if (DeviceIoControl(_PM_hDevice, PMHELP_GASTEREOFLIPSTATUS32, NULL, 0,
outBuf, sizeof(outBuf), &count, NULL)) { outBuf, sizeof(outBuf), &count, NULL)) {
return outBuf[0]; return outBuf[0];
} }
} }
return 0; return 0;
} }
@ -172,7 +172,7 @@ This function turns off software stereo mode, either directly or via the VxD.
static void NAPI _GA_softStereoWaitTillFlipped(void) static void NAPI _GA_softStereoWaitTillFlipped(void)
{ {
while (!_GA_softStereoGetFlipStatus()) while (!_GA_softStereoGetFlipStatus())
; ;
} }
/**************************************************************************** /****************************************************************************
@ -182,9 +182,9 @@ This function turns off software stereo mode, either directly or via the VxD.
static void NAPI _GA_softStereoOff(void) static void NAPI _GA_softStereoOff(void)
{ {
if (_PM_hDevice) { if (_PM_hDevice) {
DeviceIoControl(_PM_hDevice, PMHELP_GASTEREOOFF32, NULL, 0, DeviceIoControl(_PM_hDevice, PMHELP_GASTEREOOFF32, NULL, 0,
NULL, 0, NULL, NULL); NULL, 0, NULL, NULL);
} }
} }
/**************************************************************************** /****************************************************************************
@ -195,9 +195,9 @@ the VxD.
static void NAPI _GA_softStereoExit(void) static void NAPI _GA_softStereoExit(void)
{ {
if (_PM_hDevice) { if (_PM_hDevice) {
DeviceIoControl(_PM_hDevice, PMHELP_GASTEREOEXIT32, NULL, 0, DeviceIoControl(_PM_hDevice, PMHELP_GASTEREOEXIT32, NULL, 0,
NULL, 0, NULL, NULL); NULL, 0, NULL, NULL);
} }
} }
/**************************************************************************** /****************************************************************************
@ -217,14 +217,14 @@ static GA_devCtx * NAPI _GA_loadDriver(
N_int32 totalMemory = 0,oldIOPL; N_int32 totalMemory = 0,oldIOPL;
if (deviceIndex >= GA_MAX_DEVICES) if (deviceIndex >= GA_MAX_DEVICES)
PM_fatalError("DeviceIndex too large in GA_loadDriver!"); PM_fatalError("DeviceIndex too large in GA_loadDriver!");
PM_init(); PM_init();
inBuf[0] = deviceIndex; inBuf[0] = deviceIndex;
if (DeviceIoControl(_PM_hDevice, PMHELP_GETMEMSIZE32, if (DeviceIoControl(_PM_hDevice, PMHELP_GETMEMSIZE32,
inBuf, sizeof(inBuf), outBuf, sizeof(outBuf), NULL, NULL)) inBuf, sizeof(inBuf), outBuf, sizeof(outBuf), NULL, NULL))
totalMemory = outBuf[0]; totalMemory = outBuf[0];
if (totalMemory == 0) if (totalMemory == 0)
totalMemory = 8192; totalMemory = 8192;
_GA_exports.GA_forceMemSize(totalMemory,shared); _GA_exports.GA_forceMemSize(totalMemory,shared);
oldIOPL = PM_setIOPL(3); oldIOPL = PM_setIOPL(3);
dc = ORG_GA_loadDriver(deviceIndex,shared); dc = ORG_GA_loadDriver(deviceIndex,shared);
@ -240,13 +240,13 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) { if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) {
haveRDTSC = true; haveRDTSC = true;
return true; return true;
} }
else if (QueryPerformanceFrequency((LARGE_INTEGER*)&countFreq)) { else if (QueryPerformanceFrequency((LARGE_INTEGER*)&countFreq)) {
haveRDTSC = false; haveRDTSC = false;
return true; return true;
} }
return false; return false;
} }
@ -258,7 +258,7 @@ void NAPI GA_TimerRead(
GA_largeInteger *value) GA_largeInteger *value)
{ {
if (haveRDTSC) if (haveRDTSC)
_GA_readTimeStamp(value); _GA_readTimeStamp(value);
else else
QueryPerformanceCounter((LARGE_INTEGER*)value); QueryPerformanceCounter((LARGE_INTEGER*)value);
} }

View File

@ -88,31 +88,31 @@ static ibool LoadDriver(void)
/* Check if we have already loaded the driver */ /* Check if we have already loaded the driver */
if (loaded) if (loaded)
return true; return true;
PM_init(); PM_init();
/* Open the BPD file */ /* Open the BPD file */
if (!PM_findBPD(DLL_NAME,bpdpath)) if (!PM_findBPD(DLL_NAME,bpdpath))
return false; return false;
strcpy(filename,bpdpath); strcpy(filename,bpdpath);
strcat(filename,DLL_NAME); strcat(filename,DLL_NAME);
if ((hModBPD = PE_loadLibrary(filename,false)) == NULL) if ((hModBPD = PE_loadLibrary(filename,false)) == NULL)
return false; return false;
if ((AGP_initLibrary = (AGP_initLibrary_t)PE_getProcAddress(hModBPD,"_AGP_initLibrary")) == NULL) if ((AGP_initLibrary = (AGP_initLibrary_t)PE_getProcAddress(hModBPD,"_AGP_initLibrary")) == NULL)
return false; return false;
bpdpath[strlen(bpdpath)-1] = 0; bpdpath[strlen(bpdpath)-1] = 0;
if (strcmp(bpdpath,PM_getNucleusPath()) == 0) if (strcmp(bpdpath,PM_getNucleusPath()) == 0)
strcpy(bpdpath,PM_getNucleusConfigPath()); strcpy(bpdpath,PM_getNucleusConfigPath());
else { else {
PM_backslash(bpdpath); PM_backslash(bpdpath);
strcat(bpdpath,"config"); strcat(bpdpath,"config");
} }
if ((agpExp = AGP_initLibrary(bpdpath,filename,GA_getSystemPMImports(),&_N_imports,&_AGP_imports)) == NULL) if ((agpExp = AGP_initLibrary(bpdpath,filename,GA_getSystemPMImports(),&_N_imports,&_AGP_imports)) == NULL)
PM_fatalError("AGP_initLibrary failed!\n"); PM_fatalError("AGP_initLibrary failed!\n");
_AGP_exports.dwSize = sizeof(_AGP_exports); _AGP_exports.dwSize = sizeof(_AGP_exports);
max = sizeof(_AGP_exports)/sizeof(AGP_initLibrary_t); max = sizeof(_AGP_exports)/sizeof(AGP_initLibrary_t);
for (i = 0,p = (ulong*)&_AGP_exports; i < max; i++) for (i = 0,p = (ulong*)&_AGP_exports; i < max; i++)
*p++ = (ulong)_AGP_fatalErrorHandler; *p++ = (ulong)_AGP_fatalErrorHandler;
memcpy(&_AGP_exports,agpExp,MIN(sizeof(_AGP_exports),agpExp->dwSize)); memcpy(&_AGP_exports,agpExp,MIN(sizeof(_AGP_exports),agpExp->dwSize));
loaded = true; loaded = true;
return true; return true;
@ -127,7 +127,7 @@ static ibool LoadDriver(void)
int NAPI AGP_status(void) int NAPI AGP_status(void)
{ {
if (!loaded) if (!loaded)
return nDriverNotFound; return nDriverNotFound;
return _AGP_exports.AGP_status(); return _AGP_exports.AGP_status();
} }
@ -136,7 +136,7 @@ const char * NAPI AGP_errorMsg(
N_int32 status) N_int32 status)
{ {
if (!loaded) if (!loaded)
return "Unable to load Nucleus device driver!"; return "Unable to load Nucleus device driver!";
return _AGP_exports.AGP_errorMsg(status); return _AGP_exports.AGP_errorMsg(status);
} }
@ -144,7 +144,7 @@ const char * NAPI AGP_errorMsg(
AGP_devCtx * NAPI AGP_loadDriver(N_int32 deviceIndex) AGP_devCtx * NAPI AGP_loadDriver(N_int32 deviceIndex)
{ {
if (!LoadDriver()) if (!LoadDriver())
return NULL; return NULL;
return _AGP_exports.AGP_loadDriver(deviceIndex); return _AGP_exports.AGP_loadDriver(deviceIndex);
} }
@ -153,7 +153,7 @@ void NAPI AGP_unloadDriver(
AGP_devCtx *dc) AGP_devCtx *dc)
{ {
if (loaded) if (loaded)
_AGP_exports.AGP_unloadDriver(dc); _AGP_exports.AGP_unloadDriver(dc);
} }
/* {secret} */ /* {secret} */
@ -161,7 +161,7 @@ void NAPI AGP_getGlobalOptions(
AGP_globalOptions *options) AGP_globalOptions *options)
{ {
if (LoadDriver()) if (LoadDriver())
_AGP_exports.AGP_getGlobalOptions(options); _AGP_exports.AGP_getGlobalOptions(options);
} }
/* {secret} */ /* {secret} */
@ -169,7 +169,7 @@ void NAPI AGP_setGlobalOptions(
AGP_globalOptions *options) AGP_globalOptions *options)
{ {
if (LoadDriver()) if (LoadDriver())
_AGP_exports.AGP_setGlobalOptions(options); _AGP_exports.AGP_setGlobalOptions(options);
} }
/* {secret} */ /* {secret} */
@ -177,7 +177,7 @@ void NAPI AGP_saveGlobalOptions(
AGP_globalOptions *options) AGP_globalOptions *options)
{ {
if (loaded) if (loaded)
_AGP_exports.AGP_saveGlobalOptions(options); _AGP_exports.AGP_saveGlobalOptions(options);
} }
#endif #endif
@ -197,24 +197,23 @@ void NAPI _OS_delay(
if (!inited) { if (!inited) {
#ifndef __WIN32_VXD__ #ifndef __WIN32_VXD__
// This has been causing problems in VxD's for some reason, so for now /* This has been causing problems in VxD's for some reason, so for now */
// we avoid using it. /* we avoid using it. */
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) { if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) {
ZTimerInit(); ZTimerInit();
haveRDTSC = true; haveRDTSC = true;
} }
else else
#endif #endif
haveRDTSC = false; haveRDTSC = false;
inited = true; inited = true;
} }
if (haveRDTSC) { if (haveRDTSC) {
LZTimerOnExt(&tm); LZTimerOnExt(&tm);
while (LZTimerLapExt(&tm) < microSeconds) while (LZTimerLapExt(&tm) < microSeconds)
; ;
LZTimerOnExt(&tm); LZTimerOnExt(&tm);
} }
else else
_OS_delay8253(microSeconds); _OS_delay8253(microSeconds);
} }

View File

@ -60,19 +60,19 @@ void _EXPORT CenterWindow(HWND hWndCenter, HWND parent, BOOL repaint)
CenterY = ((RectParent.bottom - RectParent.top) - Height) / 2; CenterY = ((RectParent.bottom - RectParent.top) - Height) / 2;
if ((CenterX < 0) || (CenterY < 0)) { if ((CenterX < 0) || (CenterY < 0)) {
/* The Center Window is smaller than the parent window. */ /* The Center Window is smaller than the parent window. */
if (hWndParent != GetDesktopWindow()) { if (hWndParent != GetDesktopWindow()) {
/* If the parent window is not the desktop use the desktop size. */ /* If the parent window is not the desktop use the desktop size. */
CenterX = (GetSystemMetrics(SM_CXSCREEN) - Width) / 2; CenterX = (GetSystemMetrics(SM_CXSCREEN) - Width) / 2;
CenterY = (GetSystemMetrics(SM_CYSCREEN) - Height) / 2; CenterY = (GetSystemMetrics(SM_CYSCREEN) - Height) / 2;
} }
CenterX = (CenterX < 0) ? 0: CenterX; CenterX = (CenterX < 0) ? 0: CenterX;
CenterY = (CenterY < 0) ? 0: CenterY; CenterY = (CenterY < 0) ? 0: CenterY;
} }
else { else {
CenterX += RectParent.left; CenterX += RectParent.left;
CenterY += RectParent.top; CenterY += RectParent.top;
} }
/* Copy the values into RectCenter */ /* Copy the values into RectCenter */
RectCenter.left = CenterX; RectCenter.left = CenterX;
@ -82,8 +82,8 @@ void _EXPORT CenterWindow(HWND hWndCenter, HWND parent, BOOL repaint)
/* Move the window to the new location */ /* Move the window to the new location */
MoveWindow(hWndCenter, RectCenter.left, RectCenter.top, MoveWindow(hWndCenter, RectCenter.left, RectCenter.top,
(RectCenter.right - RectCenter.left), (RectCenter.right - RectCenter.left),
(RectCenter.bottom - RectCenter.top), repaint); (RectCenter.bottom - RectCenter.top), repaint);
} }
void _EXPORT CenterLogo(HWND hWndLogo, HWND hWndParent, int CenterY) void _EXPORT CenterLogo(HWND hWndLogo, HWND hWndParent, int CenterY)
@ -117,7 +117,6 @@ void _EXPORT CenterLogo(HWND hWndLogo, HWND hWndParent, int CenterY)
/* Move the window to the new location */ /* Move the window to the new location */
MoveWindow(hWndLogo, RectCenter.left, RectCenter.top, MoveWindow(hWndLogo, RectCenter.left, RectCenter.top,
(RectCenter.right - RectCenter.left), (RectCenter.right - RectCenter.left),
(RectCenter.bottom - RectCenter.top), false); (RectCenter.bottom - RectCenter.top), false);
} }

View File

@ -106,49 +106,49 @@ int getcmdopt(
char *formatchar; char *formatchar;
if (argc > nextargv) { if (argc > nextargv) {
if (nextchar == NULL) { if (nextchar == NULL) {
nextchar = argv[nextargv]; /* Index next argument */ nextchar = argv[nextargv]; /* Index next argument */
if (nextchar == NULL) { if (nextchar == NULL) {
nextargv++; nextargv++;
return ALLDONE; /* No more options */ return ALLDONE; /* No more options */
} }
if (IS_NOT_SWITCH_CHAR(*nextchar)) { if (IS_NOT_SWITCH_CHAR(*nextchar)) {
nextchar = NULL; nextchar = NULL;
return PARAMETER; /* We have a parameter */ return PARAMETER; /* We have a parameter */
} }
nextchar++; /* Move past switch operator */ nextchar++; /* Move past switch operator */
if (IS_SWITCH_CHAR(*nextchar)) { if (IS_SWITCH_CHAR(*nextchar)) {
nextchar = NULL; nextchar = NULL;
return INVALID; /* Ignore rest of line */ return INVALID; /* Ignore rest of line */
} }
} }
if ((ch = *(nextchar++)) == 0) { if ((ch = *(nextchar++)) == 0) {
nextchar = NULL; nextchar = NULL;
return INVALID; /* No options on line */ return INVALID; /* No options on line */
} }
if (ch == ':' || (formatchar = strchr(format, ch)) == NULL) if (ch == ':' || (formatchar = strchr(format, ch)) == NULL)
return INVALID; return INVALID;
if (*(++formatchar) == ':') { /* Expect an argument after option */ if (*(++formatchar) == ':') { /* Expect an argument after option */
nextargv++; nextargv++;
if (*nextchar == 0) { if (*nextchar == 0) {
if (argc <= nextargv) if (argc <= nextargv)
return INVALID; return INVALID;
nextchar = argv[nextargv++]; nextchar = argv[nextargv++];
} }
*argument = nextchar; *argument = nextchar;
nextchar = NULL; nextchar = NULL;
} }
else { /* We have a switch style option */ else { /* We have a switch style option */
if (*nextchar == 0) { if (*nextchar == 0) {
nextargv++; nextargv++;
nextchar = NULL; nextchar = NULL;
} }
*argument = NULL; *argument = NULL;
} }
return ch; /* return the option specifier */ return ch; /* return the option specifier */
} }
nextchar = NULL; nextchar = NULL;
nextargv++; nextargv++;
return ALLDONE; /* no arguments on command line */ return ALLDONE; /* no arguments on command line */
@ -174,51 +174,51 @@ static int parse_option(
int num_read; int num_read;
switch ((int)(optarr->type)) { switch ((int)(optarr->type)) {
case OPT_INTEGER: case OPT_INTEGER:
num_read = sscanf(argument,"%d",(int*)optarr->arg); num_read = sscanf(argument,"%d",(int*)optarr->arg);
break; break;
case OPT_HEX: case OPT_HEX:
num_read = sscanf(argument,"%x",(int*)optarr->arg); num_read = sscanf(argument,"%x",(int*)optarr->arg);
break; break;
case OPT_OCTAL: case OPT_OCTAL:
num_read = sscanf(argument,"%o",(int*)optarr->arg); num_read = sscanf(argument,"%o",(int*)optarr->arg);
break; break;
case OPT_UNSIGNED: case OPT_UNSIGNED:
num_read = sscanf(argument,"%u",(uint*)optarr->arg); num_read = sscanf(argument,"%u",(uint*)optarr->arg);
break; break;
case OPT_LINTEGER: case OPT_LINTEGER:
num_read = sscanf(argument,"%ld",(long*)optarr->arg); num_read = sscanf(argument,"%ld",(long*)optarr->arg);
break; break;
case OPT_LHEX: case OPT_LHEX:
num_read = sscanf(argument,"%lx",(long*)optarr->arg); num_read = sscanf(argument,"%lx",(long*)optarr->arg);
break; break;
case OPT_LOCTAL: case OPT_LOCTAL:
num_read = sscanf(argument,"%lo",(long*)optarr->arg); num_read = sscanf(argument,"%lo",(long*)optarr->arg);
break; break;
case OPT_LUNSIGNED: case OPT_LUNSIGNED:
num_read = sscanf(argument,"%lu",(ulong*)optarr->arg); num_read = sscanf(argument,"%lu",(ulong*)optarr->arg);
break; break;
case OPT_FLOAT: case OPT_FLOAT:
num_read = sscanf(argument,"%f",(float*)optarr->arg); num_read = sscanf(argument,"%f",(float*)optarr->arg);
break; break;
case OPT_DOUBLE: case OPT_DOUBLE:
num_read = sscanf(argument,"%lf",(double*)optarr->arg); num_read = sscanf(argument,"%lf",(double*)optarr->arg);
break; break;
case OPT_LDOUBLE: case OPT_LDOUBLE:
num_read = sscanf(argument,"%Lf",(long double*)optarr->arg); num_read = sscanf(argument,"%Lf",(long double*)optarr->arg);
break; break;
case OPT_STRING: case OPT_STRING:
num_read = 1; /* This always works */ num_read = 1; /* This always works */
*((char**)optarr->arg) = argument; *((char**)optarr->arg) = argument;
break; break;
default: default:
return INVALID; return INVALID;
} }
if (num_read == 0) if (num_read == 0)
return INVALID; return INVALID;
else else
return ALLDONE; return ALLDONE;
} }
/**************************************************************************** /****************************************************************************
@ -261,8 +261,8 @@ int getargs(
int num_opt, int num_opt,
Option optarr[], Option optarr[],
int (*do_param)( int (*do_param)(
char *param, char *param,
int num)) int num))
{ {
int i,opt; int i,opt;
char *argument; char *argument;
@ -273,51 +273,51 @@ int getargs(
strcpy(cmdstr,"hH?"); strcpy(cmdstr,"hH?");
for (i = 0,opt = 3; i < num_opt; i++,opt++) { for (i = 0,opt = 3; i < num_opt; i++,opt++) {
cmdstr[opt] = optarr[i].opt; cmdstr[opt] = optarr[i].opt;
if (optarr[i].type != OPT_SWITCH) { if (optarr[i].type != OPT_SWITCH) {
cmdstr[++opt] = ':'; cmdstr[++opt] = ':';
} }
} }
cmdstr[opt] = '\0'; cmdstr[opt] = '\0';
for (;;) { for (;;) {
opt = getcmdopt(argc,argv,cmdstr,&argument); opt = getcmdopt(argc,argv,cmdstr,&argument);
switch (opt) { switch (opt) {
case 'H': case 'H':
case 'h': case 'h':
case '?': case '?':
return HELP; return HELP;
case ALLDONE: case ALLDONE:
return ALLDONE; return ALLDONE;
case INVALID: case INVALID:
return INVALID; return INVALID;
case PARAMETER: case PARAMETER:
if (do_param == NULL) if (do_param == NULL)
return INVALID; return INVALID;
if (do_param(argv[nextargv],param_num) == INVALID) if (do_param(argv[nextargv],param_num) == INVALID)
return INVALID; return INVALID;
nextargv++; nextargv++;
param_num++; param_num++;
break; break;
default: default:
/* Search for the option in the option array. We are /* Search for the option in the option array. We are
* guaranteed to find it. * guaranteed to find it.
*/ */
for (i = 0; i < num_opt; i++) { for (i = 0; i < num_opt; i++) {
if (optarr[i].opt == opt) if (optarr[i].opt == opt)
break; break;
} }
if (optarr[i].type == OPT_SWITCH) if (optarr[i].type == OPT_SWITCH)
*((ibool*)optarr[i].arg) = true; *((ibool*)optarr[i].arg) = true;
else { else {
if (parse_option(&optarr[i],argument) == INVALID) if (parse_option(&optarr[i],argument) == INVALID)
return INVALID; return INVALID;
} }
break; break;
} }
} }
} }
/**************************************************************************** /****************************************************************************
@ -340,11 +340,11 @@ void print_desc(
int i; int i;
for (i = 0; i < num_opt; i++) { for (i = 0; i < num_opt; i++) {
if (optarr[i].type == OPT_SWITCH) if (optarr[i].type == OPT_SWITCH)
printf(" -%c %s\n",optarr[i].opt,optarr[i].desc); printf(" -%c %s\n",optarr[i].opt,optarr[i].desc);
else else
printf(" -%c<arg> %s\n",optarr[i].opt,optarr[i].desc); printf(" -%c<arg> %s\n",optarr[i].opt,optarr[i].desc);
} }
} }
/**************************************************************************** /****************************************************************************
@ -382,45 +382,45 @@ int parse_commandline(
argv[argc++] = filename; argv[argc++] = filename;
cmdLine = strncpy(str, cmdLine, sizeof(str)-1); cmdLine = strncpy(str, cmdLine, sizeof(str)-1);
while (*cmdLine) { while (*cmdLine) {
switch (*cmdLine) { switch (*cmdLine) {
case '"' : case '"' :
if (prevWord != NULL) { if (prevWord != NULL) {
if (inQuote) { if (inQuote) {
if (!noStrip) if (!noStrip)
*cmdLine = '\0'; *cmdLine = '\0';
argv [argc++] = prevWord; argv [argc++] = prevWord;
prevWord = NULL; prevWord = NULL;
} }
else else
noStrip = TRUE; noStrip = TRUE;
} }
inQuote = !inQuote; inQuote = !inQuote;
break; break;
case ' ' : case ' ' :
case '\t' : case '\t' :
if (!inQuote) { if (!inQuote) {
if (prevWord != NULL) { if (prevWord != NULL) {
*cmdLine = '\0'; *cmdLine = '\0';
argv [argc++] = prevWord; argv [argc++] = prevWord;
prevWord = NULL; prevWord = NULL;
noStrip = FALSE; noStrip = FALSE;
} }
} }
break; break;
default : default :
if (prevWord == NULL) if (prevWord == NULL)
prevWord = cmdLine; prevWord = cmdLine;
break; break;
} }
if (argc >= maxArgv - 1) if (argc >= maxArgv - 1)
break; break;
cmdLine++; cmdLine++;
} }
if ((prevWord != NULL || (inQuote && prevWord != NULL)) && argc < maxArgv - 1) { if ((prevWord != NULL || (inQuote && prevWord != NULL)) && argc < maxArgv - 1) {
*cmdLine = '\0'; *cmdLine = '\0';
argv [argc++] = prevWord; argv [argc++] = prevWord;
} }
argv[argc] = NULL; argv[argc] = NULL;
/* Return updated parameters */ /* Return updated parameters */

View File

@ -70,10 +70,10 @@ library is used with the application local version of Nucleus.
****************************************************************************/ ****************************************************************************/
PM_imports * NAPI GA_getSystemPMImports(void) PM_imports * NAPI GA_getSystemPMImports(void)
{ {
// TODO: We may very well want to provide a system shared library /* TODO: We may very well want to provide a system shared library */
// that eports the PM functions required by the Nucleus library /* that eports the PM functions required by the Nucleus library */
// for BeOS here. That will eliminate fatal errors loading new /* for BeOS here. That will eliminate fatal errors loading new */
// drivers on BeOS! /* drivers on BeOS! */
return &_PM_imports; return &_PM_imports;
} }
@ -124,7 +124,7 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0)
haveRDTSC = true; haveRDTSC = true;
return true; return true;
} }
@ -136,11 +136,11 @@ void NAPI GA_TimerRead(
GA_largeInteger *value) GA_largeInteger *value)
{ {
if (haveRDTSC) if (haveRDTSC)
_GA_readTimeStamp(value); _GA_readTimeStamp(value);
else { else {
struct timeval t; struct timeval t;
gettimeofday(&t, NULL); gettimeofday(&t, NULL);
value->low = t.tv_sec*1000000 + t.tv_usec; value->low = t.tv_sec*1000000 + t.tv_usec;
value->high = 0; value->high = 0;
} }
} }

View File

@ -120,7 +120,7 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0)
return true; return true;
return false; return false;
} }
@ -133,4 +133,3 @@ void NAPI GA_TimerRead(
{ {
_GA_readTimeStamp(value); _GA_readTimeStamp(value);
} }

View File

@ -107,7 +107,7 @@ static ibool LoadDriver(
/* Check if we have already loaded the driver */ /* Check if we have already loaded the driver */
if (loaded) if (loaded)
return true; return true;
PM_init(); PM_init();
/* First try to see if we can find the system wide shared exports /* First try to see if we can find the system wide shared exports
@ -116,33 +116,33 @@ static ibool LoadDriver(
*/ */
__GA_exports.dwSize = sizeof(__GA_exports); __GA_exports.dwSize = sizeof(__GA_exports);
if (GA_getSharedExports(&__GA_exports,shared)) if (GA_getSharedExports(&__GA_exports,shared))
return loaded = true; return loaded = true;
/* Open the BPD file */ /* Open the BPD file */
if (!PM_findBPD(DLL_NAME,bpdpath)) if (!PM_findBPD(DLL_NAME,bpdpath))
return false; return false;
strcpy(filename,bpdpath); strcpy(filename,bpdpath);
strcat(filename,DLL_NAME); strcat(filename,DLL_NAME);
if ((hModBPD = PE_loadLibrary(filename,shared)) == NULL) if ((hModBPD = PE_loadLibrary(filename,shared)) == NULL)
return false; return false;
if ((GA_initLibrary = (GA_initLibrary_t)PE_getProcAddress(hModBPD,"_GA_initLibrary")) == NULL) if ((GA_initLibrary = (GA_initLibrary_t)PE_getProcAddress(hModBPD,"_GA_initLibrary")) == NULL)
return false; return false;
bpdpath[strlen(bpdpath)-1] = 0; bpdpath[strlen(bpdpath)-1] = 0;
if (strcmp(bpdpath,PM_getNucleusPath()) == 0) if (strcmp(bpdpath,PM_getNucleusPath()) == 0)
strcpy(bpdpath,PM_getNucleusConfigPath()); strcpy(bpdpath,PM_getNucleusConfigPath());
else { else {
PM_backslash(bpdpath); PM_backslash(bpdpath);
strcat(bpdpath,"config"); strcat(bpdpath,"config");
} }
if ((gaExp = GA_initLibrary(shared,bpdpath,filename,GA_getSystemPMImports(),&_N_imports,&_GA_imports)) == NULL) if ((gaExp = GA_initLibrary(shared,bpdpath,filename,GA_getSystemPMImports(),&_N_imports,&_GA_imports)) == NULL)
PM_fatalError("GA_initLibrary failed!\n"); PM_fatalError("GA_initLibrary failed!\n");
/* Initialize all default imports to point to fatal error handler /* Initialize all default imports to point to fatal error handler
* for upwards compatibility, and copy the exported functions. * for upwards compatibility, and copy the exported functions.
*/ */
max = sizeof(__GA_exports)/sizeof(GA_initLibrary_t); max = sizeof(__GA_exports)/sizeof(GA_initLibrary_t);
for (i = 0,p = (ulong*)&__GA_exports; i < max; i++) for (i = 0,p = (ulong*)&__GA_exports; i < max; i++)
*p++ = (ulong)_GA_fatalErrorHandler; *p++ = (ulong)_GA_fatalErrorHandler;
memcpy(&__GA_exports,gaExp,MIN(sizeof(__GA_exports),gaExp->dwSize)); memcpy(&__GA_exports,gaExp,MIN(sizeof(__GA_exports),gaExp->dwSize));
loaded = true; loaded = true;
return true; return true;
@ -157,7 +157,7 @@ static ibool LoadDriver(
int NAPI GA_status(void) int NAPI GA_status(void)
{ {
if (!loaded) if (!loaded)
return nDriverNotFound; return nDriverNotFound;
return __GA_exports.GA_status(); return __GA_exports.GA_status();
} }
@ -166,7 +166,7 @@ const char * NAPI GA_errorMsg(
N_int32 status) N_int32 status)
{ {
if (!loaded) if (!loaded)
return "Unable to load Nucleus device driver!"; return "Unable to load Nucleus device driver!";
return __GA_exports.GA_errorMsg(status); return __GA_exports.GA_errorMsg(status);
} }
@ -174,7 +174,7 @@ const char * NAPI GA_errorMsg(
int NAPI GA_getDaysLeft(N_int32 shared) int NAPI GA_getDaysLeft(N_int32 shared)
{ {
if (!LoadDriver(shared)) if (!LoadDriver(shared))
return -1; return -1;
return __GA_exports.GA_getDaysLeft(shared); return __GA_exports.GA_getDaysLeft(shared);
} }
@ -182,7 +182,7 @@ int NAPI GA_getDaysLeft(N_int32 shared)
int NAPI GA_registerLicense(uchar *license,N_int32 shared) int NAPI GA_registerLicense(uchar *license,N_int32 shared)
{ {
if (!LoadDriver(shared)) if (!LoadDriver(shared))
return 0; return 0;
return __GA_exports.GA_registerLicense(license,shared); return __GA_exports.GA_registerLicense(license,shared);
} }
@ -190,7 +190,7 @@ int NAPI GA_registerLicense(uchar *license,N_int32 shared)
ibool NAPI GA_loadInGUI(N_int32 shared) ibool NAPI GA_loadInGUI(N_int32 shared)
{ {
if (!LoadDriver(shared)) if (!LoadDriver(shared))
return false; return false;
return __GA_exports.GA_loadInGUI(shared); return __GA_exports.GA_loadInGUI(shared);
} }
@ -198,7 +198,7 @@ ibool NAPI GA_loadInGUI(N_int32 shared)
int NAPI GA_enumerateDevices(N_int32 shared) int NAPI GA_enumerateDevices(N_int32 shared)
{ {
if (!LoadDriver(shared)) if (!LoadDriver(shared))
return 0; return 0;
return __GA_exports.GA_enumerateDevices(shared); return __GA_exports.GA_enumerateDevices(shared);
} }
@ -206,7 +206,7 @@ int NAPI GA_enumerateDevices(N_int32 shared)
GA_devCtx * NAPI GA_loadDriver(N_int32 deviceIndex,N_int32 shared) GA_devCtx * NAPI GA_loadDriver(N_int32 deviceIndex,N_int32 shared)
{ {
if (!LoadDriver(shared)) if (!LoadDriver(shared))
return NULL; return NULL;
return __GA_exports.GA_loadDriver(deviceIndex,shared); return __GA_exports.GA_loadDriver(deviceIndex,shared);
} }
@ -216,7 +216,7 @@ void NAPI GA_getGlobalOptions(
ibool shared) ibool shared)
{ {
if (LoadDriver(shared)) if (LoadDriver(shared))
__GA_exports.GA_getGlobalOptions(options,shared); __GA_exports.GA_getGlobalOptions(options,shared);
} }
/* {secret} */ /* {secret} */
@ -226,7 +226,7 @@ PE_MODULE * NAPI GA_loadLibrary(
ibool shared) ibool shared)
{ {
if (!LoadDriver(shared)) if (!LoadDriver(shared))
return NULL; return NULL;
return __GA_exports.GA_loadLibrary(szBPDName,size,shared); return __GA_exports.GA_loadLibrary(szBPDName,size,shared);
} }
@ -236,7 +236,7 @@ GA_devCtx * NAPI GA_getCurrentDriver(
{ {
/* Bail for older drivers that didn't export this function! */ /* Bail for older drivers that didn't export this function! */
if (!__GA_exports.GA_getCurrentDriver) if (!__GA_exports.GA_getCurrentDriver)
return NULL; return NULL;
return __GA_exports.GA_getCurrentDriver(deviceIndex); return __GA_exports.GA_getCurrentDriver(deviceIndex);
} }
@ -246,7 +246,7 @@ REF2D_driver * NAPI GA_getCurrentRef2d(
{ {
/* Bail for older drivers that didn't export this function! */ /* Bail for older drivers that didn't export this function! */
if (!__GA_exports.GA_getCurrentRef2d) if (!__GA_exports.GA_getCurrentRef2d)
return NULL; return NULL;
return __GA_exports.GA_getCurrentRef2d(deviceIndex); return __GA_exports.GA_getCurrentRef2d(deviceIndex);
} }
@ -254,7 +254,7 @@ REF2D_driver * NAPI GA_getCurrentRef2d(
int NAPI GA_isOEMVersion(ibool shared) int NAPI GA_isOEMVersion(ibool shared)
{ {
if (!LoadDriver(shared)) if (!LoadDriver(shared))
return 0; return 0;
return __GA_exports.GA_isOEMVersion(shared); return __GA_exports.GA_isOEMVersion(shared);
} }
@ -262,8 +262,7 @@ int NAPI GA_isOEMVersion(ibool shared)
N_uint32 * NAPI GA_getLicensedDevices(ibool shared) N_uint32 * NAPI GA_getLicensedDevices(ibool shared)
{ {
if (!LoadDriver(shared)) if (!LoadDriver(shared))
return 0; return 0;
return __GA_exports.GA_getLicensedDevices(shared); return __GA_exports.GA_getLicensedDevices(shared);
} }
#endif #endif

View File

@ -72,10 +72,10 @@ library is used with the application local version of Nucleus.
****************************************************************************/ ****************************************************************************/
PM_imports * NAPI GA_getSystemPMImports(void) PM_imports * NAPI GA_getSystemPMImports(void)
{ {
// TODO: We may very well want to provide a system shared library /* TODO: We may very well want to provide a system shared library */
// that eports the PM functions required by the Nucleus library /* that eports the PM functions required by the Nucleus library */
// for Linux here. That will eliminate fatal errors loading new /* for Linux here. That will eliminate fatal errors loading new */
// drivers on Linux! /* drivers on Linux! */
return &_PM_imports; return &_PM_imports;
} }
@ -126,7 +126,7 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0)
haveRDTSC = true; haveRDTSC = true;
return true; return true;
} }
@ -138,11 +138,11 @@ void NAPI GA_TimerRead(
GA_largeInteger *value) GA_largeInteger *value)
{ {
if (haveRDTSC) if (haveRDTSC)
_GA_readTimeStamp(value); _GA_readTimeStamp(value);
else { else {
struct timeval t; struct timeval t;
gettimeofday(&t, NULL); gettimeofday(&t, NULL);
value->low = t.tv_sec*1000000 + t.tv_usec; value->low = t.tv_sec*1000000 + t.tv_usec;
value->high = 0; value->high = 0;
} }
} }

View File

@ -117,8 +117,8 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) { if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) {
haveRDTSC = true; haveRDTSC = true;
} }
return true; return true;
} }
@ -130,8 +130,7 @@ void NAPI GA_TimerRead(
GA_largeInteger *value) GA_largeInteger *value)
{ {
if (haveRDTSC) if (haveRDTSC)
_GA_readTimeStamp(value); _GA_readTimeStamp(value);
else else
KeQuerySystemTime((LARGE_INTEGER*)value); KeQuerySystemTime((LARGE_INTEGER*)value);
} }

View File

@ -83,11 +83,11 @@ static ulong CallSDDHelp(
* can't fail here. * can't fail here.
*/ */
DosOpen(PMHELP_NAME,&hSDDHelp,&result[0],0,0, DosOpen(PMHELP_NAME,&hSDDHelp,&result[0],0,0,
FILE_OPEN, OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE, FILE_OPEN, OPEN_SHARE_DENYNONE | OPEN_ACCESS_READWRITE,
NULL); NULL);
DosDevIOCtl(hSDDHelp,PMHELP_IOCTL,func, DosDevIOCtl(hSDDHelp,PMHELP_IOCTL,func,
&parms, inLen = sizeof(parms), &inLen, &parms, inLen = sizeof(parms), &inLen,
&result, outLen = sizeof(result), &outLen); &result, outLen = sizeof(result), &outLen);
DosClose(hSDDHelp); DosClose(hSDDHelp);
return result[0]; return result[0];
} }
@ -147,17 +147,17 @@ ibool NAPI GA_getSharedExports(
/* Initialise the PM library and connect to our runtime DLL's */ /* Initialise the PM library and connect to our runtime DLL's */
PM_init(); PM_init();
if (CallSDDHelp(PMHELP_GETSHAREDEXP) != 0) { if (CallSDDHelp(PMHELP_GETSHAREDEXP) != 0) {
/* We have found the shared Nucleus exports. Because not all processes /* We have found the shared Nucleus exports. Because not all processes
* map to SDDPMI.DLL, we need to ensure that we connect to this * map to SDDPMI.DLL, we need to ensure that we connect to this
* DLL so that it gets mapped into our address space (that is * DLL so that it gets mapped into our address space (that is
* where the shared Nucleus loader code is located). Simply doing a * where the shared Nucleus loader code is located). Simply doing a
* DosLoadModule on it is enough for this. * DosLoadModule on it is enough for this.
*/ */
DosLoadModule((PSZ)buf,sizeof(buf),(PSZ)"SDDPMI.DLL",&hModSDDPMI); DosLoadModule((PSZ)buf,sizeof(buf),(PSZ)"SDDPMI.DLL",&hModSDDPMI);
exp = (GA_exports*)result[0]; exp = (GA_exports*)result[0];
memcpy(gaExp,exp,MIN(gaExp->dwSize,exp->dwSize)); memcpy(gaExp,exp,MIN(gaExp->dwSize,exp->dwSize));
return true; return true;
} }
#endif #endif
(void)shared; (void)shared;
return false; return false;
@ -197,7 +197,7 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0)
haveRDTSC = true; haveRDTSC = true;
return true; return true;
} }
@ -209,9 +209,9 @@ void NAPI GA_TimerRead(
GA_largeInteger *value) GA_largeInteger *value)
{ {
if (haveRDTSC) if (haveRDTSC)
_GA_readTimeStamp(value); _GA_readTimeStamp(value);
else else
DosTmrQueryTime((QWORD*)value); DosTmrQueryTime((QWORD*)value);
} }
/**************************************************************************** /****************************************************************************

View File

@ -72,10 +72,10 @@ library is used with the application local version of Nucleus.
****************************************************************************/ ****************************************************************************/
PM_imports * NAPI GA_getSystemPMImports(void) PM_imports * NAPI GA_getSystemPMImports(void)
{ {
// TODO: We may very well want to provide a system shared library /* TODO: We may very well want to provide a system shared library */
// that eports the PM functions required by the Nucleus library /* that eports the PM functions required by the Nucleus library */
// for QNX here. That will eliminate fatal errors loading new /* for QNX here. That will eliminate fatal errors loading new */
// drivers on QNX! /* drivers on QNX! */
return &_PM_imports; return &_PM_imports;
} }
@ -126,7 +126,7 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0)
haveRDTSC = true; haveRDTSC = true;
return true; return true;
} }
@ -138,12 +138,12 @@ void NAPI GA_TimerRead(
GA_largeInteger *value) GA_largeInteger *value)
{ {
if (haveRDTSC) if (haveRDTSC)
_GA_readTimeStamp(value); _GA_readTimeStamp(value);
else { else {
struct timespec ts; struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts); clock_gettime(CLOCK_REALTIME, &ts);
value->low = (ts.tv_nsec / 1000 + ts.tv_sec * 1000000); value->low = (ts.tv_nsec / 1000 + ts.tv_sec * 1000000);
value->high = 0; value->high = 0;
} }
} }

View File

@ -121,9 +121,9 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) { if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) {
haveRDTSC = true; haveRDTSC = true;
return true; return true;
} }
return false; return false;
} }
@ -135,5 +135,5 @@ void NAPI GA_TimerRead(
GA_largeInteger *value) GA_largeInteger *value)
{ {
if (haveRDTSC) if (haveRDTSC)
_GA_readTimeStamp(value); _GA_readTimeStamp(value);
} }

View File

@ -118,7 +118,7 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0)
return true; return true;
return false; return false;
} }

View File

@ -117,8 +117,8 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) { if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) {
haveRDTSC = true; haveRDTSC = true;
} }
return true; return true;
} }
@ -130,8 +130,7 @@ void NAPI GA_TimerRead(
GA_largeInteger *value) GA_largeInteger *value)
{ {
if (haveRDTSC) if (haveRDTSC)
_GA_readTimeStamp(value); _GA_readTimeStamp(value);
else else
VTD_Get_Real_Time(&value->high,&value->low); VTD_Get_Real_Time(&value->high,&value->low);
} }

View File

@ -67,16 +67,16 @@ static ibool LoadSharedDLL(void)
/* Check if we have already loaded the DLL */ /* Check if we have already loaded the DLL */
if (hModDLL) if (hModDLL)
return true; return true;
PM_init(); PM_init();
/* Open the DLL file */ /* Open the DLL file */
if (!PM_findBPD(DLL_NAME,bpdpath)) if (!PM_findBPD(DLL_NAME,bpdpath))
return false; return false;
strcpy(filename,bpdpath); strcpy(filename,bpdpath);
strcat(filename,DLL_NAME); strcat(filename,DLL_NAME);
if ((hModDLL = LoadLibrary(filename)) == NULL) if ((hModDLL = LoadLibrary(filename)) == NULL)
return false; return false;
return true; return true;
} }
@ -103,10 +103,10 @@ void NAPI GA_setLocalPath(
PM_setLocalBPDPath(path); PM_setLocalBPDPath(path);
if (_PM_hDevice != INVALID_HANDLE_VALUE) { if (_PM_hDevice != INVALID_HANDLE_VALUE) {
inBuf[0] = (DWORD)path; inBuf[0] = (DWORD)path;
DeviceIoControl(_PM_hDevice, PMHELP_GASETLOCALPATH32, DeviceIoControl(_PM_hDevice, PMHELP_GASETLOCALPATH32,
inBuf, sizeof(inBuf), outBuf, sizeof(outBuf), &outCnt, NULL); inBuf, sizeof(inBuf), outBuf, sizeof(outBuf), &outCnt, NULL);
} }
} }
/**************************************************************************** /****************************************************************************
@ -126,18 +126,18 @@ PM_imports * NAPI GA_getSystemPMImports(void)
PM_imports * (NAPIP _GA_getSystemPMImports)(void); PM_imports * (NAPIP _GA_getSystemPMImports)(void);
if (LoadSharedDLL()) { if (LoadSharedDLL()) {
/* Note that Visual C++ build DLL's with only a single underscore in front /* Note that Visual C++ build DLL's with only a single underscore in front
* of the exported name while Watcom C provides two of them. We check for * of the exported name while Watcom C provides two of them. We check for
* both to allow working with either compiled DLL. * both to allow working with either compiled DLL.
*/ */
if ((_GA_getSystemPMImports = (void*)GetProcAddress(hModDLL,"_GA_getSystemPMImports")) != NULL) { if ((_GA_getSystemPMImports = (void*)GetProcAddress(hModDLL,"_GA_getSystemPMImports")) != NULL) {
if ((_GA_getSystemPMImports = (void*)GetProcAddress(hModDLL,"__GA_getSystemPMImports")) != NULL) { if ((_GA_getSystemPMImports = (void*)GetProcAddress(hModDLL,"__GA_getSystemPMImports")) != NULL) {
pmImp = _GA_getSystemPMImports(); pmImp = _GA_getSystemPMImports();
memcpy(&_PM_imports,pmImp,MIN(_PM_imports.dwSize,pmImp->dwSize)); memcpy(&_PM_imports,pmImp,MIN(_PM_imports.dwSize,pmImp->dwSize));
return pmImp; return pmImp;
} }
} }
} }
return &_PM_imports; return &_PM_imports;
} }
@ -162,16 +162,16 @@ ibool NAPI GA_getSharedExports(
useRing0Driver = false; useRing0Driver = false;
if (shared) { if (shared) {
if (!LoadSharedDLL()) if (!LoadSharedDLL())
PM_fatalError("Unable to load " DLL_NAME "!"); PM_fatalError("Unable to load " DLL_NAME "!");
if ((_GA_getSystemGAExports = (void*)GetProcAddress(hModDLL,"_GA_getSystemGAExports")) == NULL) if ((_GA_getSystemGAExports = (void*)GetProcAddress(hModDLL,"_GA_getSystemGAExports")) == NULL)
if ((_GA_getSystemGAExports = (void*)GetProcAddress(hModDLL,"__GA_getSystemGAExports")) == NULL) if ((_GA_getSystemGAExports = (void*)GetProcAddress(hModDLL,"__GA_getSystemGAExports")) == NULL)
PM_fatalError("Unable to load " DLL_NAME "!"); PM_fatalError("Unable to load " DLL_NAME "!");
exp = _GA_getSystemGAExports(); exp = _GA_getSystemGAExports();
memcpy(gaExp,exp,MIN(gaExp->dwSize,exp->dwSize)); memcpy(gaExp,exp,MIN(gaExp->dwSize,exp->dwSize));
useRing0Driver = true; useRing0Driver = true;
return true; return true;
} }
return false; return false;
} }
@ -188,14 +188,14 @@ ibool NAPI GA_queryFunctions(
static ibool (NAPIP _GA_queryFunctions)(GA_devCtx *dc,N_uint32 id,void _FAR_ *funcs) = NULL; static ibool (NAPIP _GA_queryFunctions)(GA_devCtx *dc,N_uint32 id,void _FAR_ *funcs) = NULL;
if (useRing0Driver) { if (useRing0Driver) {
// Call the version in nga_w32.dll if it is loaded /* Call the version in nga_w32.dll if it is loaded */
if (!_GA_queryFunctions) { if (!_GA_queryFunctions) {
if ((_GA_queryFunctions = (void*)GetProcAddress(hModDLL,"_GA_queryFunctions")) == NULL) if ((_GA_queryFunctions = (void*)GetProcAddress(hModDLL,"_GA_queryFunctions")) == NULL)
if ((_GA_queryFunctions = (void*)GetProcAddress(hModDLL,"__GA_queryFunctions")) == NULL) if ((_GA_queryFunctions = (void*)GetProcAddress(hModDLL,"__GA_queryFunctions")) == NULL)
PM_fatalError("Unable to get exports from " DLL_NAME "!"); PM_fatalError("Unable to get exports from " DLL_NAME "!");
} }
return _GA_queryFunctions(dc,id,funcs); return _GA_queryFunctions(dc,id,funcs);
} }
return __GA_exports.GA_queryFunctions(dc,id,funcs); return __GA_exports.GA_queryFunctions(dc,id,funcs);
} }
@ -211,14 +211,14 @@ ibool NAPI REF2D_queryFunctions(
static ibool (NAPIP _REF2D_queryFunctions)(REF2D_driver *ref2d,N_uint32 id,void _FAR_ *funcs) = NULL; static ibool (NAPIP _REF2D_queryFunctions)(REF2D_driver *ref2d,N_uint32 id,void _FAR_ *funcs) = NULL;
if (useRing0Driver) { if (useRing0Driver) {
// Call the version in nga_w32.dll if it is loaded /* Call the version in nga_w32.dll if it is loaded */
if (!_REF2D_queryFunctions) { if (!_REF2D_queryFunctions) {
if ((_REF2D_queryFunctions = (void*)GetProcAddress(hModDLL,"_REF2D_queryFunctions")) == NULL) if ((_REF2D_queryFunctions = (void*)GetProcAddress(hModDLL,"_REF2D_queryFunctions")) == NULL)
if ((_REF2D_queryFunctions = (void*)GetProcAddress(hModDLL,"__REF2D_queryFunctions")) == NULL) if ((_REF2D_queryFunctions = (void*)GetProcAddress(hModDLL,"__REF2D_queryFunctions")) == NULL)
PM_fatalError("Unable to get exports from " DLL_NAME "!"); PM_fatalError("Unable to get exports from " DLL_NAME "!");
} }
return _REF2D_queryFunctions(ref2d,id,funcs); return _REF2D_queryFunctions(ref2d,id,funcs);
} }
return __GA_exports.REF2D_queryFunctions(ref2d,id,funcs); return __GA_exports.REF2D_queryFunctions(ref2d,id,funcs);
} }
#endif #endif
@ -231,13 +231,13 @@ Nucleus loader library.
ibool NAPI GA_TimerInit(void) ibool NAPI GA_TimerInit(void)
{ {
if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) { if (_GA_haveCPUID() && (_GA_getCPUIDFeatures() & CPU_HaveRDTSC) != 0) {
haveRDTSC = true; haveRDTSC = true;
return true; return true;
} }
else if (QueryPerformanceFrequency((LARGE_INTEGER*)&countFreq)) { else if (QueryPerformanceFrequency((LARGE_INTEGER*)&countFreq)) {
haveRDTSC = false; haveRDTSC = false;
return true; return true;
} }
return false; return false;
} }
@ -249,8 +249,7 @@ void NAPI GA_TimerRead(
GA_largeInteger *value) GA_largeInteger *value)
{ {
if (haveRDTSC) if (haveRDTSC)
_GA_readTimeStamp(value); _GA_readTimeStamp(value);
else else
QueryPerformanceCounter((LARGE_INTEGER*)value); QueryPerformanceCounter((LARGE_INTEGER*)value);
} }

View File

@ -107,9 +107,9 @@ static void GetInternalConstants(GTF_constants *c)
c->hSync = GC.hSync; c->hSync = GC.hSync;
c->minVSyncBP = GC.minVSyncBP; c->minVSyncBP = GC.minVSyncBP;
if (GC.k == 0) if (GC.k == 0)
c->k = 0.001; c->k = 0.001;
else else
c->k = GC.k; c->k = GC.k;
c->m = (c->k / 256) * GC.m; c->m = (c->k / 256) * GC.m;
c->c = (GC.c - GC.j) * (c->k / 256) + GC.j; c->c = (GC.c - GC.j) * (c->k / 256) + GC.j;
c->j = GC.j; c->j = GC.j;
@ -165,89 +165,89 @@ void GTF_calcTimings(double hPixels,double vLines,double freq,
vFieldRate = vFreq; vFieldRate = vFreq;
interlace = 0; interlace = 0;
if (wantInterlace) if (wantInterlace)
dotClock *= 2; dotClock *= 2;
/* Determine the lines for margins */ /* Determine the lines for margins */
if (wantMargins) { if (wantMargins) {
topMarginLines = round(c.margin / 100 * vLines); topMarginLines = round(c.margin / 100 * vLines);
botMarginLines = round(c.margin / 100 * vLines); botMarginLines = round(c.margin / 100 * vLines);
} }
else { else {
topMarginLines = 0; topMarginLines = 0;
botMarginLines = 0; botMarginLines = 0;
} }
if (type != GTF_lockPF) { if (type != GTF_lockPF) {
if (type == GTF_lockVF) { if (type == GTF_lockVF) {
/* Estimate the horizontal period */ /* Estimate the horizontal period */
hPeriodEst = ((1/vFieldRate) - (c.minVSyncBP/1000000)) / hPeriodEst = ((1/vFieldRate) - (c.minVSyncBP/1000000)) /
(vLines + (2*topMarginLines) + c.minPorch + interlace) * 1000000; (vLines + (2*topMarginLines) + c.minPorch + interlace) * 1000000;
/* Find the number of lines in vSync + back porch */ /* Find the number of lines in vSync + back porch */
vSyncBP = round(c.minVSyncBP / hPeriodEst); vSyncBP = round(c.minVSyncBP / hPeriodEst);
} }
else if (type == GTF_lockHF) { else if (type == GTF_lockHF) {
/* Find the number of lines in vSync + back porch */ /* Find the number of lines in vSync + back porch */
vSyncBP = round((c.minVSyncBP * hFreq) / 1000); vSyncBP = round((c.minVSyncBP * hFreq) / 1000);
} }
/* Find the number of lines in the V back porch alone */ /* Find the number of lines in the V back porch alone */
vBackPorch = vSyncBP - c.vSyncRqd; vBackPorch = vSyncBP - c.vSyncRqd;
/* Find the total number of lines in the vertical period */ /* Find the total number of lines in the vertical period */
vTotalLines = vLines + topMarginLines + botMarginLines + vSyncBP vTotalLines = vLines + topMarginLines + botMarginLines + vSyncBP
+ interlace + c.minPorch; + interlace + c.minPorch;
if (type == GTF_lockVF) { if (type == GTF_lockVF) {
/* Estimate the vertical frequency */ /* Estimate the vertical frequency */
vFieldRateEst = 1000000 / (hPeriodEst * vTotalLines); vFieldRateEst = 1000000 / (hPeriodEst * vTotalLines);
/* Find the actual horizontal period */ /* Find the actual horizontal period */
hPeriod = (hPeriodEst * vFieldRateEst) / vFieldRate; hPeriod = (hPeriodEst * vFieldRateEst) / vFieldRate;
/* Find the actual vertical field frequency */ /* Find the actual vertical field frequency */
vFieldRate = 1000000 / (hPeriod * vTotalLines); vFieldRate = 1000000 / (hPeriod * vTotalLines);
} }
else if (type == GTF_lockHF) { else if (type == GTF_lockHF) {
/* Find the actual vertical field frequency */ /* Find the actual vertical field frequency */
vFieldRate = (hFreq / vTotalLines) * 1000; vFieldRate = (hFreq / vTotalLines) * 1000;
} }
} }
/* Find the number of pixels in the left and right margins */ /* Find the number of pixels in the left and right margins */
if (wantMargins) { if (wantMargins) {
leftMarginPixels = round(hPixels * c.margin) / (100 * c.cellGran); leftMarginPixels = round(hPixels * c.margin) / (100 * c.cellGran);
rightMarginPixels = round(hPixels * c.margin) / (100 * c.cellGran); rightMarginPixels = round(hPixels * c.margin) / (100 * c.cellGran);
} }
else { else {
leftMarginPixels = 0; leftMarginPixels = 0;
rightMarginPixels = 0; rightMarginPixels = 0;
} }
/* Find the total number of active pixels in image + margins */ /* Find the total number of active pixels in image + margins */
hTotalActivePixels = hPixels + leftMarginPixels + rightMarginPixels; hTotalActivePixels = hPixels + leftMarginPixels + rightMarginPixels;
if (type == GTF_lockVF) { if (type == GTF_lockVF) {
/* Find the ideal blanking duty cycle */ /* Find the ideal blanking duty cycle */
idealDutyCycle = c.c - ((c.m * hPeriod) / 1000); idealDutyCycle = c.c - ((c.m * hPeriod) / 1000);
} }
else if (type == GTF_lockHF) { else if (type == GTF_lockHF) {
/* Find the ideal blanking duty cycle */ /* Find the ideal blanking duty cycle */
idealDutyCycle = c.c - (c.m / hFreq); idealDutyCycle = c.c - (c.m / hFreq);
} }
else if (type == GTF_lockPF) { else if (type == GTF_lockPF) {
/* Find ideal horizontal period from blanking duty cycle formula */ /* Find ideal horizontal period from blanking duty cycle formula */
idealHPeriod = (((c.c - 100) + (sqrt((pow(100-c.c,2)) + idealHPeriod = (((c.c - 100) + (sqrt((pow(100-c.c,2)) +
(0.4 * c.m * (hTotalActivePixels + rightMarginPixels + (0.4 * c.m * (hTotalActivePixels + rightMarginPixels +
leftMarginPixels) / dotClock)))) / (2 * c.m)) * 1000; leftMarginPixels) / dotClock)))) / (2 * c.m)) * 1000;
/* Find the ideal blanking duty cycle */ /* Find the ideal blanking duty cycle */
idealDutyCycle = c.c - ((c.m * idealHPeriod) / 1000); idealDutyCycle = c.c - ((c.m * idealHPeriod) / 1000);
} }
/* Find the number of pixels in blanking time */ /* Find the number of pixels in blanking time */
hBlankPixels = round((hTotalActivePixels * idealDutyCycle) / hBlankPixels = round((hTotalActivePixels * idealDutyCycle) /
((100 - idealDutyCycle) * c.cellGran)) * c.cellGran; ((100 - idealDutyCycle) * c.cellGran)) * c.cellGran;
/* Find the total number of pixels */ /* Find the total number of pixels */
hTotalPixels = hTotalActivePixels + hBlankPixels; hTotalPixels = hTotalActivePixels + hBlankPixels;
@ -262,35 +262,35 @@ void GTF_calcTimings(double hPixels,double vLines,double freq,
hSyncBP = hBackPorch + hSyncWidth; hSyncBP = hBackPorch + hSyncWidth;
if (type == GTF_lockPF) { if (type == GTF_lockPF) {
/* Find the horizontal frequency */ /* Find the horizontal frequency */
hFreq = (dotClock / hTotalPixels) * 1000; hFreq = (dotClock / hTotalPixels) * 1000;
/* Find the number of lines in vSync + back porch */ /* Find the number of lines in vSync + back porch */
vSyncBP = round((c.minVSyncBP * hFreq) / 1000); vSyncBP = round((c.minVSyncBP * hFreq) / 1000);
/* Find the number of lines in the V back porch alone */ /* Find the number of lines in the V back porch alone */
vBackPorch = vSyncBP - c.vSyncRqd; vBackPorch = vSyncBP - c.vSyncRqd;
/* Find the total number of lines in the vertical period */ /* Find the total number of lines in the vertical period */
vTotalLines = vLines + topMarginLines + botMarginLines + vSyncBP vTotalLines = vLines + topMarginLines + botMarginLines + vSyncBP
+ interlace + c.minPorch; + interlace + c.minPorch;
/* Find the actual vertical field frequency */ /* Find the actual vertical field frequency */
vFieldRate = (hFreq / vTotalLines) * 1000; vFieldRate = (hFreq / vTotalLines) * 1000;
} }
else { else {
if (type == GTF_lockVF) { if (type == GTF_lockVF) {
/* Find the horizontal frequency */ /* Find the horizontal frequency */
hFreq = 1000 / hPeriod; hFreq = 1000 / hPeriod;
} }
else if (type == GTF_lockHF) { else if (type == GTF_lockHF) {
/* Find the horizontal frequency */ /* Find the horizontal frequency */
hPeriod = 1000 / hFreq; hPeriod = 1000 / hFreq;
} }
/* Find the pixel clock frequency */ /* Find the pixel clock frequency */
dotClock = hTotalPixels / hPeriod; dotClock = hTotalPixels / hPeriod;
} }
/* Return the computed frequencies */ /* Return the computed frequencies */
t->vFreq = vFieldRate; t->vFreq = vFieldRate;
@ -315,16 +315,16 @@ void GTF_calcTimings(double hPixels,double vLines,double freq,
t->v.vSyncWidth = (int)c.vSyncRqd; t->v.vSyncWidth = (int)c.vSyncRqd;
t->v.vBackPorch = (int)vBackPorch; t->v.vBackPorch = (int)vBackPorch;
if (wantInterlace) { if (wantInterlace) {
/* Halve the timings for interlaced modes */ /* Halve the timings for interlaced modes */
t->v.vTotal /= 2; t->v.vTotal /= 2;
t->v.vDisp /= 2; t->v.vDisp /= 2;
t->v.vSyncStart /= 2; t->v.vSyncStart /= 2;
t->v.vSyncEnd /= 2; t->v.vSyncEnd /= 2;
t->v.vFrontPorch /= 2; t->v.vFrontPorch /= 2;
t->v.vSyncWidth /= 2; t->v.vSyncWidth /= 2;
t->v.vBackPorch /= 2; t->v.vBackPorch /= 2;
t->dotClock /= 2; t->dotClock /= 2;
} }
/* Mark as GTF timing using the sync polarities */ /* Mark as GTF timing using the sync polarities */
t->interlace = (wantInterlace) ? 'I' : 'N'; t->interlace = (wantInterlace) ? 'I' : 'N';
@ -348,30 +348,30 @@ void main(int argc,char *argv[])
GTF_timings t; GTF_timings t;
if (argc != 5 && argc != 6) { if (argc != 5 && argc != 6) {
printf("Usage: GTFCALC <xPixels> <yPixels> <freq> [[Hz] [KHz] [MHz]] [I]\n"); printf("Usage: GTFCALC <xPixels> <yPixels> <freq> [[Hz] [KHz] [MHz]] [I]\n");
printf("\n"); printf("\n");
printf("where <xPixels> is the horizontal resolution of the mode, <yPixels> is the\n"); printf("where <xPixels> is the horizontal resolution of the mode, <yPixels> is the\n");
printf("vertical resolution of the mode. The <freq> value will be the frequency to\n"); printf("vertical resolution of the mode. The <freq> value will be the frequency to\n");
printf("drive the calculations, and will be either the vertical frequency (in Hz)\n"); printf("drive the calculations, and will be either the vertical frequency (in Hz)\n");
printf("the horizontal frequency (in KHz) or the dot clock (in MHz). To generate\n"); printf("the horizontal frequency (in KHz) or the dot clock (in MHz). To generate\n");
printf("timings for an interlaced mode, add 'I' to the end of the command line.\n"); printf("timings for an interlaced mode, add 'I' to the end of the command line.\n");
printf("\n"); printf("\n");
printf("For example to generate timings for 640x480 at 60Hz vertical:\n"); printf("For example to generate timings for 640x480 at 60Hz vertical:\n");
printf("\n"); printf("\n");
printf(" GTFCALC 640 480 60 Hz\n"); printf(" GTFCALC 640 480 60 Hz\n");
printf("\n"); printf("\n");
printf("For example to generate timings for 640x480 at 31.5KHz horizontal:\n"); printf("For example to generate timings for 640x480 at 31.5KHz horizontal:\n");
printf("\n"); printf("\n");
printf(" GTFCALC 640 480 31.5 KHz\n"); printf(" GTFCALC 640 480 31.5 KHz\n");
printf("\n"); printf("\n");
printf("For example to generate timings for 640x480 with a 25.175Mhz dot clock:\n"); printf("For example to generate timings for 640x480 with a 25.175Mhz dot clock:\n");
printf("\n"); printf("\n");
printf(" GTFCALC 640 480 25.175 MHz\n"); printf(" GTFCALC 640 480 25.175 MHz\n");
printf("\n"); printf("\n");
printf("GTFCALC will print a summary of the results found, and dump the CRTC\n"); printf("GTFCALC will print a summary of the results found, and dump the CRTC\n");
printf("values to the UVCONFIG.CRT file in the format used by SciTech Display Doctor.\n"); printf("values to the UVCONFIG.CRT file in the format used by SciTech Display Doctor.\n");
exit(1); exit(1);
} }
/* Get values from command line */ /* Get values from command line */
xPixels = atof(argv[1]); xPixels = atof(argv[1]);
@ -381,33 +381,33 @@ void main(int argc,char *argv[])
/* Compute the CRTC timings */ /* Compute the CRTC timings */
if (toupper(argv[4][0]) == 'H') if (toupper(argv[4][0]) == 'H')
GTF_calcTimings(xPixels,yPixels,freq,GTF_lockVF,false,interlace,&t); GTF_calcTimings(xPixels,yPixels,freq,GTF_lockVF,false,interlace,&t);
else if (toupper(argv[4][0]) == 'K') else if (toupper(argv[4][0]) == 'K')
GTF_calcTimings(xPixels,yPixels,freq,GTF_lockHF,false,interlace,&t); GTF_calcTimings(xPixels,yPixels,freq,GTF_lockHF,false,interlace,&t);
else if (toupper(argv[4][0]) == 'M') else if (toupper(argv[4][0]) == 'M')
GTF_calcTimings(xPixels,yPixels,freq,GTF_lockPF,false,interlace,&t); GTF_calcTimings(xPixels,yPixels,freq,GTF_lockPF,false,interlace,&t);
else { else {
printf("Unknown command line!\n"); printf("Unknown command line!\n");
exit(1); exit(1);
} }
/* Dump summary info to standard output */ /* Dump summary info to standard output */
printf("CRTC values for %.0fx%.0f @ %.2f %s\n", xPixels, yPixels, freq, argv[4]); printf("CRTC values for %.0fx%.0f @ %.2f %s\n", xPixels, yPixels, freq, argv[4]);
printf("\n"); printf("\n");
printf(" hTotal = %-4d vTotal = %-4d\n", printf(" hTotal = %-4d vTotal = %-4d\n",
t.h.hTotal, t.v.vTotal); t.h.hTotal, t.v.vTotal);
printf(" hDisp = %-4d vDisp = %-4d\n", printf(" hDisp = %-4d vDisp = %-4d\n",
t.h.hDisp, t.v.vDisp); t.h.hDisp, t.v.vDisp);
printf(" hSyncStart = %-4d vSyncStart = %-4d\n", printf(" hSyncStart = %-4d vSyncStart = %-4d\n",
t.h.hSyncStart, t.v.vSyncStart); t.h.hSyncStart, t.v.vSyncStart);
printf(" hSyncEnd = %-4d vSyncEnd = %-4d\n", printf(" hSyncEnd = %-4d vSyncEnd = %-4d\n",
t.h.hSyncEnd, t.v.vSyncEnd); t.h.hSyncEnd, t.v.vSyncEnd);
printf(" hFrontPorch = %-4d vFrontPorch = %-4d\n", printf(" hFrontPorch = %-4d vFrontPorch = %-4d\n",
t.h.hFrontPorch, t.v.vFrontPorch); t.h.hFrontPorch, t.v.vFrontPorch);
printf(" hSyncWidth = %-4d vSyncWidth = %-4d\n", printf(" hSyncWidth = %-4d vSyncWidth = %-4d\n",
t.h.hSyncWidth, t.v.vSyncWidth); t.h.hSyncWidth, t.v.vSyncWidth);
printf(" hBackPorch = %-4d vBackPorch = %-4d\n", printf(" hBackPorch = %-4d vBackPorch = %-4d\n",
t.h.hBackPorch, t.v.vBackPorch); t.h.hBackPorch, t.v.vBackPorch);
printf("\n"); printf("\n");
printf(" Interlaced = %s\n", (t.interlace == 'I') ? "Yes" : "No"); printf(" Interlaced = %s\n", (t.interlace == 'I') ? "Yes" : "No");
printf(" H sync pol = %c\n", t.hSyncPol); printf(" H sync pol = %c\n", t.hSyncPol);
@ -419,18 +419,18 @@ void main(int argc,char *argv[])
/* Dump to file in format used by SciTech Display Doctor */ /* Dump to file in format used by SciTech Display Doctor */
if ((f = fopen("UVCONFIG.CRT","w")) != NULL) { if ((f = fopen("UVCONFIG.CRT","w")) != NULL) {
fprintf(f, "[%.0f %.0f]\n", xPixels, yPixels); fprintf(f, "[%.0f %.0f]\n", xPixels, yPixels);
fprintf(f, "%d %d %d %d '%c' %s\n", fprintf(f, "%d %d %d %d '%c' %s\n",
t.h.hTotal, t.h.hDisp, t.h.hTotal, t.h.hDisp,
t.h.hSyncStart, t.h.hSyncEnd, t.h.hSyncStart, t.h.hSyncEnd,
t.hSyncPol, (t.interlace == 'I') ? "I" : "NI"); t.hSyncPol, (t.interlace == 'I') ? "I" : "NI");
fprintf(f, "%d %d %d %d '%c'\n", fprintf(f, "%d %d %d %d '%c'\n",
t.v.vTotal, t.v.vDisp, t.v.vTotal, t.v.vDisp,
t.v.vSyncStart, t.v.vSyncEnd, t.v.vSyncStart, t.v.vSyncEnd,
t.vSyncPol); t.vSyncPol);
fprintf(f, "%.2f\n", t.dotClock); fprintf(f, "%.2f\n", t.dotClock);
fclose(f); fclose(f);
} }
} }
#endif /* TESTING */ #endif /* TESTING */

View File

@ -270,27 +270,27 @@ int _CDECL stub_open(const char *_path, int _oflag, unsigned _mode)
/* Find an empty file handle to use */ /* Find an empty file handle to use */
for (i = 3; i < MAX_FILES; i++) { for (i = 3; i < MAX_FILES; i++) {
if (!openHandles[i]) if (!openHandles[i])
break; break;
} }
if (openHandles[i]) if (openHandles[i])
return -1; return -1;
/* Find the open flags to use */ /* Find the open flags to use */
if (_oflag & ___O_TRUNC) if (_oflag & ___O_TRUNC)
strcpy(mode,"w"); strcpy(mode,"w");
else if (_oflag & ___O_CREAT) else if (_oflag & ___O_CREAT)
strcpy(mode,"a"); strcpy(mode,"a");
else else
strcpy(mode,"r"); strcpy(mode,"r");
if (_oflag & ___O_BINARY) if (_oflag & ___O_BINARY)
strcat(mode,"b"); strcat(mode,"b");
if (_oflag & ___O_TEXT) if (_oflag & ___O_TEXT)
strcat(mode,"t"); strcat(mode,"t");
/* Open the file and store the file handle */ /* Open the file and store the file handle */
if ((openHandles[i] = fopen(_path,mode)) == NULL) if ((openHandles[i] = fopen(_path,mode)) == NULL)
return -1; return -1;
return i; return i;
} }
@ -300,25 +300,25 @@ int _CDECL stub_access(const char *_path, int _amode)
int _CDECL stub_close(int _fildes) int _CDECL stub_close(int _fildes)
{ {
if (_fildes >= 3 && openHandles[_fildes]) { if (_fildes >= 3 && openHandles[_fildes]) {
fclose(openHandles[_fildes]); fclose(openHandles[_fildes]);
openHandles[_fildes] = NULL; openHandles[_fildes] = NULL;
} }
return 0; return 0;
} }
off_t _CDECL stub_lseek(int _fildes, off_t _offset, int _whence) off_t _CDECL stub_lseek(int _fildes, off_t _offset, int _whence)
{ {
if (_fildes >= 3) { if (_fildes >= 3) {
fseek(openHandles[_fildes],_offset,_whence); fseek(openHandles[_fildes],_offset,_whence);
return ftell(openHandles[_fildes]); return ftell(openHandles[_fildes]);
} }
return 0; return 0;
} }
size_t _CDECL stub_read(int _fildes, void *_buf, size_t _nbyte) size_t _CDECL stub_read(int _fildes, void *_buf, size_t _nbyte)
{ {
if (_fildes >= 3) if (_fildes >= 3)
return fread(_buf,1,_nbyte,openHandles[_fildes]); return fread(_buf,1,_nbyte,openHandles[_fildes]);
return 0; return 0;
} }
@ -327,18 +327,18 @@ int _CDECL stub_unlink(const char *_path)
WORD error; WORD error;
if (initComplete) { if (initComplete) {
if (R0_DeleteFile((char*)_path,0,&error)) if (R0_DeleteFile((char*)_path,0,&error))
return 0; return 0;
return -1; return -1;
} }
else else
return i_remove(_path); return i_remove(_path);
} }
size_t _CDECL stub_write(int _fildes, const void *_buf, size_t _nbyte) size_t _CDECL stub_write(int _fildes, const void *_buf, size_t _nbyte)
{ {
if (_fildes >= 3) if (_fildes >= 3)
return fwrite(_buf,1,_nbyte,openHandles[_fildes]); return fwrite(_buf,1,_nbyte,openHandles[_fildes]);
return _nbyte; return _nbyte;
} }
@ -356,7 +356,7 @@ void _CDECL _OS_setfileattr(const char *filename,unsigned attrib)
{ {
WORD error; WORD error;
if (initComplete) if (initComplete)
R0_SetFileAttributes((char*)filename,attrib,&error); R0_SetFileAttributes((char*)filename,attrib,&error);
} }
/* Return the current date in days since 1/1/1980 */ /* Return the current date in days since 1/1/1980 */
@ -380,59 +380,59 @@ int _CDECL stub_open(const char *_path, int _oflag, unsigned _mode)
/* Find an empty file handle to use */ /* Find an empty file handle to use */
for (i = 3; i < MAX_FILES; i++) { for (i = 3; i < MAX_FILES; i++) {
if (!openHandles[i]) if (!openHandles[i])
break; break;
} }
if (openHandles[i]) if (openHandles[i])
return -1; return -1;
/* Find the open flags to use */ /* Find the open flags to use */
if (_oflag & ___O_TRUNC) if (_oflag & ___O_TRUNC)
strcpy(mode,"w"); strcpy(mode,"w");
else if (_oflag & ___O_CREAT) else if (_oflag & ___O_CREAT)
strcpy(mode,"a"); strcpy(mode,"a");
else else
strcpy(mode,"r"); strcpy(mode,"r");
if (_oflag & ___O_BINARY) if (_oflag & ___O_BINARY)
strcat(mode,"b"); strcat(mode,"b");
if (_oflag & ___O_TEXT) if (_oflag & ___O_TEXT)
strcat(mode,"t"); strcat(mode,"t");
/* Open the file and store the file handle */ /* Open the file and store the file handle */
if ((openHandles[i] = fopen(_path,mode)) == NULL) if ((openHandles[i] = fopen(_path,mode)) == NULL)
return -1; return -1;
return i; return i;
} }
int _CDECL stub_close(int _fildes) int _CDECL stub_close(int _fildes)
{ {
if (_fildes >= 3 && openHandles[_fildes]) { if (_fildes >= 3 && openHandles[_fildes]) {
fclose(openHandles[_fildes]); fclose(openHandles[_fildes]);
openHandles[_fildes] = NULL; openHandles[_fildes] = NULL;
} }
return 0; return 0;
} }
off_t _CDECL stub_lseek(int _fildes, off_t _offset, int _whence) off_t _CDECL stub_lseek(int _fildes, off_t _offset, int _whence)
{ {
if (_fildes >= 3) { if (_fildes >= 3) {
fseek(openHandles[_fildes],_offset,_whence); fseek(openHandles[_fildes],_offset,_whence);
return ftell(openHandles[_fildes]); return ftell(openHandles[_fildes]);
} }
return 0; return 0;
} }
size_t _CDECL stub_read(int _fildes, void *_buf, size_t _nbyte) size_t _CDECL stub_read(int _fildes, void *_buf, size_t _nbyte)
{ {
if (_fildes >= 3) if (_fildes >= 3)
return fread(_buf,1,_nbyte,openHandles[_fildes]); return fread(_buf,1,_nbyte,openHandles[_fildes]);
return 0; return 0;
} }
size_t _CDECL stub_write(int _fildes, const void *_buf, size_t _nbyte) size_t _CDECL stub_write(int _fildes, const void *_buf, size_t _nbyte)
{ {
if (_fildes >= 3) if (_fildes >= 3)
return fwrite(_buf,1,_nbyte,openHandles[_fildes]); return fwrite(_buf,1,_nbyte,openHandles[_fildes]);
return _nbyte; return _nbyte;
} }
@ -444,7 +444,7 @@ int _CDECL stub_isatty(int _fildes)
int _CDECL stub_unlink(const char *_path) int _CDECL stub_unlink(const char *_path)
{ {
// TODO: Implement this! /* TODO: Implement this! */
return -1; return -1;
} }
@ -454,7 +454,7 @@ int _CDECL stub_remove(const char *_filename)
int _CDECL stub_rename(const char *_old, const char *_new) int _CDECL stub_rename(const char *_old, const char *_new)
{ {
// TODO: Implement this! /* TODO: Implement this! */
return -1; return -1;
} }
@ -462,11 +462,11 @@ void _CDECL _OS_setfileattr(const char *filename,unsigned attrib)
{ {
uint _attr = 0; uint _attr = 0;
if (attrib & __A_RDONLY) if (attrib & __A_RDONLY)
_attr |= FILE_ATTRIBUTE_READONLY; _attr |= FILE_ATTRIBUTE_READONLY;
if (attrib & __A_HIDDEN) if (attrib & __A_HIDDEN)
_attr |= FILE_ATTRIBUTE_HIDDEN; _attr |= FILE_ATTRIBUTE_HIDDEN;
if (attrib & __A_SYSTEM) if (attrib & __A_SYSTEM)
_attr |= FILE_ATTRIBUTE_SYSTEM; _attr |= FILE_ATTRIBUTE_SYSTEM;
PM_setFileAttr(filename,_attr); PM_setFileAttr(filename,_attr);
} }
@ -506,7 +506,7 @@ void _CDECL _OS_setfileattr(const char *filename,unsigned attrib)
{ {
FILESTATUS3 s; FILESTATUS3 s;
if (DosQueryPathInfo((PSZ)filename,FIL_STANDARD,(PVOID)&s,sizeof(s))) if (DosQueryPathInfo((PSZ)filename,FIL_STANDARD,(PVOID)&s,sizeof(s)))
return; return;
s.attrFile = attrib; s.attrFile = attrib;
DosSetPathInfo((PSZ)filename,FIL_STANDARD,(PVOID)&s,sizeof(s),0L); DosSetPathInfo((PSZ)filename,FIL_STANDARD,(PVOID)&s,sizeof(s),0L);
} }
@ -528,25 +528,25 @@ int _CDECL stub_open(const char *_path, int _oflag, unsigned _mode)
/* Determine open flags */ /* Determine open flags */
if (_oflag & ___O_CREAT) { if (_oflag & ___O_CREAT) {
if (_oflag & ___O_EXCL) if (_oflag & ___O_EXCL)
openflag = OPEN_ACTION_FAIL_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; openflag = OPEN_ACTION_FAIL_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
else if (_oflag & ___O_TRUNC) else if (_oflag & ___O_TRUNC)
openflag = OPEN_ACTION_REPLACE_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; openflag = OPEN_ACTION_REPLACE_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
else else
openflag = OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW; openflag = OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW;
} }
else if (_oflag & ___O_TRUNC) else if (_oflag & ___O_TRUNC)
openflag = OPEN_ACTION_REPLACE_IF_EXISTS; openflag = OPEN_ACTION_REPLACE_IF_EXISTS;
else else
openflag = OPEN_ACTION_OPEN_IF_EXISTS; openflag = OPEN_ACTION_OPEN_IF_EXISTS;
/* Determine open mode flags */ /* Determine open mode flags */
if (_oflag & ___O_RDONLY) if (_oflag & ___O_RDONLY)
openmode = OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE; openmode = OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE;
else if (_oflag & ___O_WRONLY) else if (_oflag & ___O_WRONLY)
openmode = OPEN_ACCESS_WRITEONLY | OPEN_SHARE_DENYWRITE; openmode = OPEN_ACCESS_WRITEONLY | OPEN_SHARE_DENYWRITE;
else else
openmode = OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYWRITE; openmode = OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYWRITE;
/* Copy the path to a variable on the stack. We need to do this /* Copy the path to a variable on the stack. We need to do this
* for OS/2 as when the drivers are loaded into shared kernel * for OS/2 as when the drivers are loaded into shared kernel
@ -555,14 +555,14 @@ int _CDECL stub_open(const char *_path, int _oflag, unsigned _mode)
*/ */
strcpy(path,_path); strcpy(path,_path);
if (DosOpen(path, &handle, &actiontaken, 0, FILE_NORMAL, if (DosOpen(path, &handle, &actiontaken, 0, FILE_NORMAL,
openflag, openmode, NULL) != NO_ERROR) openflag, openmode, NULL) != NO_ERROR)
return -1; return -1;
/* Handle append mode of operation */ /* Handle append mode of operation */
if (_oflag & ___O_APPEND) { if (_oflag & ___O_APPEND) {
if (DosSetFilePtr(handle, 0, FILE_END, &error) != NO_ERROR) if (DosSetFilePtr(handle, 0, FILE_END, &error) != NO_ERROR)
return -1; return -1;
} }
return handle; return handle;
} }
@ -578,16 +578,16 @@ int _CDECL stub_access(const char *_path, int _amode)
*/ */
strcpy(path,_path); strcpy(path,_path);
if (DosQueryPathInfo(path, FIL_STANDARD, &fs, sizeof(fs)) != NO_ERROR) if (DosQueryPathInfo(path, FIL_STANDARD, &fs, sizeof(fs)) != NO_ERROR)
return -1; return -1;
if ((_amode & W_OK) && (fs.attrFile & FILE_READONLY)) if ((_amode & W_OK) && (fs.attrFile & FILE_READONLY))
return -1; return -1;
return 0; return 0;
} }
int _CDECL stub_close(int _fildes) int _CDECL stub_close(int _fildes)
{ {
if (DosClose(_fildes) != NO_ERROR) if (DosClose(_fildes) != NO_ERROR)
return -1; return -1;
return 0; return 0;
} }
@ -596,17 +596,17 @@ off_t _CDECL stub_lseek(int _fildes, off_t _offset, int _whence)
ULONG cbActual, origin; ULONG cbActual, origin;
switch (_whence) { switch (_whence) {
case SEEK_CUR: case SEEK_CUR:
origin = FILE_CURRENT; origin = FILE_CURRENT;
break; break;
case SEEK_END: case SEEK_END:
origin = FILE_END; origin = FILE_END;
break; break;
default: default:
origin = FILE_BEGIN; origin = FILE_BEGIN;
} }
if (DosSetFilePtr(_fildes, _offset, origin, &cbActual) != NO_ERROR) if (DosSetFilePtr(_fildes, _offset, origin, &cbActual) != NO_ERROR)
return -1; return -1;
return cbActual; return cbActual;
} }
@ -621,19 +621,19 @@ size_t _CDECL stub_read(int _fildes, void *_buf, size_t _nbyte)
* in kernel space and will cause DosRead to bail internally. * in kernel space and will cause DosRead to bail internally.
*/ */
while (_nbyte > BUF_SIZE) { while (_nbyte > BUF_SIZE) {
if (DosRead(_fildes, file_io_buf, BUF_SIZE, &cbRead) != NO_ERROR) if (DosRead(_fildes, file_io_buf, BUF_SIZE, &cbRead) != NO_ERROR)
return -1; return -1;
cbActual += cbRead; cbActual += cbRead;
memcpy(p,file_io_buf,BUF_SIZE); memcpy(p,file_io_buf,BUF_SIZE);
p += BUF_SIZE; p += BUF_SIZE;
_nbyte -= BUF_SIZE; _nbyte -= BUF_SIZE;
} }
if (_nbyte) { if (_nbyte) {
if (DosRead(_fildes, file_io_buf, _nbyte, &cbRead) != NO_ERROR) if (DosRead(_fildes, file_io_buf, _nbyte, &cbRead) != NO_ERROR)
return -1; return -1;
cbActual += cbRead; cbActual += cbRead;
memcpy(p,file_io_buf,_nbyte); memcpy(p,file_io_buf,_nbyte);
} }
return cbActual; return cbActual;
} }
@ -648,19 +648,19 @@ size_t _CDECL stub_write(int _fildes, const void *_buf, size_t _nbyte)
* in kernel space and will cause DosWrite to bail internally. * in kernel space and will cause DosWrite to bail internally.
*/ */
while (_nbyte > BUF_SIZE) { while (_nbyte > BUF_SIZE) {
memcpy(file_io_buf,p,BUF_SIZE); memcpy(file_io_buf,p,BUF_SIZE);
if (DosWrite(_fildes, file_io_buf, BUF_SIZE, &cbWrite) != NO_ERROR) if (DosWrite(_fildes, file_io_buf, BUF_SIZE, &cbWrite) != NO_ERROR)
return -1; return -1;
cbActual += cbWrite; cbActual += cbWrite;
p += BUF_SIZE; p += BUF_SIZE;
_nbyte -= BUF_SIZE; _nbyte -= BUF_SIZE;
} }
if (_nbyte) { if (_nbyte) {
memcpy(file_io_buf,p,_nbyte); memcpy(file_io_buf,p,_nbyte);
if (DosWrite(_fildes, file_io_buf, _nbyte, &cbWrite) != NO_ERROR) if (DosWrite(_fildes, file_io_buf, _nbyte, &cbWrite) != NO_ERROR)
return -1; return -1;
cbActual += cbWrite; cbActual += cbWrite;
} }
return cbActual; return cbActual;
} }
@ -675,7 +675,7 @@ int _CDECL stub_unlink(const char *_path)
*/ */
strcpy(path,_path); strcpy(path,_path);
if (DosDelete(path) != NO_ERROR) if (DosDelete(path) != NO_ERROR)
return -1; return -1;
return 0; return 0;
} }
@ -684,7 +684,7 @@ int _CDECL stub_isatty(int _fildes)
ULONG htype, flags; ULONG htype, flags;
if (DosQueryHType(_fildes, &htype, &flags) != NO_ERROR) if (DosQueryHType(_fildes, &htype, &flags) != NO_ERROR)
return 0; return 0;
return ((htype & 0xFF) == HANDTYPE_DEVICE); return ((htype & 0xFF) == HANDTYPE_DEVICE);
} }
@ -700,7 +700,7 @@ int _CDECL stub_remove(const char *_path)
*/ */
strcpy(path,_path); strcpy(path,_path);
if (DosDelete(path) != NO_ERROR) if (DosDelete(path) != NO_ERROR)
return -1; return -1;
return 0; return 0;
} }
@ -717,7 +717,7 @@ int _CDECL stub_rename(const char *_old, const char *_new)
strcpy(old,_old); strcpy(old,_old);
strcpy(new,_new); strcpy(new,_new);
if (DosMove(old, new) != NO_ERROR) if (DosMove(old, new) != NO_ERROR)
return -1; return -1;
return 0; return 0;
} }
@ -734,23 +734,23 @@ void _CDECL _OS_setfileattr(const char *filename,unsigned attrib)
int _CDECL stub_open(const char *_path, int _oflag, unsigned _mode) int _CDECL stub_open(const char *_path, int _oflag, unsigned _mode)
{ {
int oflag_tab[] = { int oflag_tab[] = {
___O_RDONLY, O_RDONLY, ___O_RDONLY, O_RDONLY,
___O_WRONLY, O_WRONLY, ___O_WRONLY, O_WRONLY,
___O_RDWR, O_RDWR, ___O_RDWR, O_RDWR,
___O_BINARY, O_BINARY, ___O_BINARY, O_BINARY,
___O_TEXT, O_TEXT, ___O_TEXT, O_TEXT,
___O_CREAT, O_CREAT, ___O_CREAT, O_CREAT,
___O_EXCL, O_EXCL, ___O_EXCL, O_EXCL,
___O_TRUNC, O_TRUNC, ___O_TRUNC, O_TRUNC,
___O_APPEND, O_APPEND, ___O_APPEND, O_APPEND,
}; };
int i,oflag = 0; int i,oflag = 0;
/* Translate the oflag's to the OS dependent versions */ /* Translate the oflag's to the OS dependent versions */
for (i = 0; i < sizeof(oflag_tab) / sizeof(int); i += 2) { for (i = 0; i < sizeof(oflag_tab) / sizeof(int); i += 2) {
if (_oflag & oflag_tab[i]) if (_oflag & oflag_tab[i])
oflag |= oflag_tab[i+1]; oflag |= oflag_tab[i+1];
} }
return open(_path,oflag,_mode); return open(_path,oflag,_mode);
} }
@ -825,4 +825,3 @@ void * _CDECL stub_signal(int sig, void *handler)
return (void*)signal(sig,(__code_ptr)handler); return (void*)signal(sig,(__code_ptr)handler);
#endif #endif
} }

View File

@ -79,35 +79,35 @@ static int PE_readHeader(
result = PE_invalidDLLImage; result = PE_invalidDLLImage;
fseek(f, startOffset, SEEK_SET); fseek(f, startOffset, SEEK_SET);
if (fread(&exehdr, 1, sizeof(exehdr), f) != sizeof(exehdr)) if (fread(&exehdr, 1, sizeof(exehdr), f) != sizeof(exehdr))
return false; return false;
if (exehdr.signature != 0x5A4D) if (exehdr.signature != 0x5A4D)
return false; return false;
/* Now seek to the start of the PE header defined at offset 0x3C /* Now seek to the start of the PE header defined at offset 0x3C
* in the MS-DOS EXE header, and read the signature and check it. * in the MS-DOS EXE header, and read the signature and check it.
*/ */
fseek(f, startOffset+0x3C, SEEK_SET); fseek(f, startOffset+0x3C, SEEK_SET);
if (fread(&offset, 1, sizeof(offset), f) != sizeof(offset)) if (fread(&offset, 1, sizeof(offset), f) != sizeof(offset))
return false; return false;
fseek(f, startOffset+offset, SEEK_SET); fseek(f, startOffset+offset, SEEK_SET);
if (fread(&signature, 1, sizeof(signature), f) != sizeof(signature)) if (fread(&signature, 1, sizeof(signature), f) != sizeof(signature))
return false; return false;
if (signature != 0x00004550) if (signature != 0x00004550)
return false; return false;
/* Now read the PE file header and check that it is correct */ /* Now read the PE file header and check that it is correct */
if (fread(filehdr, 1, sizeof(*filehdr), f) != sizeof(*filehdr)) if (fread(filehdr, 1, sizeof(*filehdr), f) != sizeof(*filehdr))
return false; return false;
if (filehdr->Machine != IMAGE_FILE_MACHINE_I386) if (filehdr->Machine != IMAGE_FILE_MACHINE_I386)
return false; return false;
if (!(filehdr->Characteristics & IMAGE_FILE_32BIT_MACHINE)) if (!(filehdr->Characteristics & IMAGE_FILE_32BIT_MACHINE))
return false; return false;
if (!(filehdr->Characteristics & IMAGE_FILE_DLL)) if (!(filehdr->Characteristics & IMAGE_FILE_DLL))
return false; return false;
if (fread(opthdr, 1, sizeof(*opthdr), f) != sizeof(*opthdr)) if (fread(opthdr, 1, sizeof(*opthdr), f) != sizeof(*opthdr))
return false; return false;
if (opthdr->Magic != 0x10B) if (opthdr->Magic != 0x10B)
return false; return false;
/* Success, so return true! */ /* Success, so return true! */
return true; return true;
@ -138,15 +138,15 @@ ulong PEAPI PE_getFileSize(
/* Read the PE file headers from disk */ /* Read the PE file headers from disk */
if (!PE_readHeader(f,startOffset,&filehdr,&opthdr)) if (!PE_readHeader(f,startOffset,&filehdr,&opthdr))
return 0xFFFFFFFF; return 0xFFFFFFFF;
/* Scan all the section headers summing up the total size */ /* Scan all the section headers summing up the total size */
size = opthdr.SizeOfHeaders; size = opthdr.SizeOfHeaders;
for (i = 0; i < filehdr.NumberOfSections; i++) { for (i = 0; i < filehdr.NumberOfSections; i++) {
if (fread(&secthdr, 1, sizeof(secthdr), f) != sizeof(secthdr)) if (fread(&secthdr, 1, sizeof(secthdr), f) != sizeof(secthdr))
return 0xFFFFFFFF; return 0xFFFFFFFF;
size += secthdr.SizeOfRawData; size += secthdr.SizeOfRawData;
} }
return size; return size;
} }
@ -199,7 +199,7 @@ PE_MODULE * PEAPI PE_loadLibraryExt(
/* Read the PE file headers from disk */ /* Read the PE file headers from disk */
if (!PE_readHeader(f,startOffset,&filehdr,&opthdr)) if (!PE_readHeader(f,startOffset,&filehdr,&opthdr))
return NULL; return NULL;
/* Scan all the section headers and find the necessary sections */ /* Scan all the section headers and find the necessary sections */
text_off = data_off = reloc_off = export_off = 0; text_off = data_off = reloc_off = export_off = 0;
@ -208,56 +208,56 @@ PE_MODULE * PEAPI PE_loadLibraryExt(
export_addr = export_size = export_end = 0; export_addr = export_size = export_end = 0;
reloc_size = 0; reloc_size = 0;
for (i = 0; i < filehdr.NumberOfSections; i++) { for (i = 0; i < filehdr.NumberOfSections; i++) {
if (fread(&secthdr, 1, sizeof(secthdr), f) != sizeof(secthdr)) if (fread(&secthdr, 1, sizeof(secthdr), f) != sizeof(secthdr))
goto Error; goto Error;
if (strcmp(secthdr.Name, ".edata") == 0 || strcmp(secthdr.Name, ".rdata") == 0) { if (strcmp(secthdr.Name, ".edata") == 0 || strcmp(secthdr.Name, ".rdata") == 0) {
/* Exports section */ /* Exports section */
export_off = secthdr.PointerToRawData; export_off = secthdr.PointerToRawData;
export_addr = secthdr.VirtualAddress; export_addr = secthdr.VirtualAddress;
export_size = secthdr.SizeOfRawData; export_size = secthdr.SizeOfRawData;
export_end = export_addr + export_size; export_end = export_addr + export_size;
} }
else if (strcmp(secthdr.Name, ".idata") == 0) { else if (strcmp(secthdr.Name, ".idata") == 0) {
/* Imports section, ignore */ /* Imports section, ignore */
} }
else if (strcmp(secthdr.Name, ".reloc") == 0) { else if (strcmp(secthdr.Name, ".reloc") == 0) {
/* Relocations section */ /* Relocations section */
reloc_off = secthdr.PointerToRawData; reloc_off = secthdr.PointerToRawData;
reloc_size = secthdr.SizeOfRawData; reloc_size = secthdr.SizeOfRawData;
} }
else if (!text_off && secthdr.Characteristics & IMAGE_SCN_CNT_CODE) { else if (!text_off && secthdr.Characteristics & IMAGE_SCN_CNT_CODE) {
/* Code section */ /* Code section */
text_off = secthdr.PointerToRawData; text_off = secthdr.PointerToRawData;
text_addr = secthdr.VirtualAddress; text_addr = secthdr.VirtualAddress;
text_size = secthdr.SizeOfRawData; text_size = secthdr.SizeOfRawData;
} }
else if (!data_off && secthdr.Characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA) { else if (!data_off && secthdr.Characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA) {
/* Data section */ /* Data section */
data_off = secthdr.PointerToRawData; data_off = secthdr.PointerToRawData;
data_addr = secthdr.VirtualAddress; data_addr = secthdr.VirtualAddress;
data_size = secthdr.SizeOfRawData; data_size = secthdr.SizeOfRawData;
data_end = data_addr + data_size; data_end = data_addr + data_size;
} }
} }
/* Check to make sure that we have all the sections we need */ /* Check to make sure that we have all the sections we need */
if (!text_off || !data_off || !export_off || !reloc_off) { if (!text_off || !data_off || !export_off || !reloc_off) {
result = PE_invalidDLLImage; result = PE_invalidDLLImage;
goto Error; goto Error;
} }
/* Find the size of the image to load allocate memory for it */ /* Find the size of the image to load allocate memory for it */
image_size = MAX(export_end,data_end) - text_addr; image_size = MAX(export_end,data_end) - text_addr;
*size = sizeof(PE_MODULE) + image_size + 4096; *size = sizeof(PE_MODULE) + image_size + 4096;
if (shared) if (shared)
hMod = PM_mallocShared(*size); hMod = PM_mallocShared(*size);
else else
hMod = PM_malloc(*size); hMod = PM_malloc(*size);
reloc = PM_malloc(reloc_size); reloc = PM_malloc(reloc_size);
if (!hMod || !reloc) { if (!hMod || !reloc) {
result = PE_outOfMemory; result = PE_outOfMemory;
goto Error; goto Error;
} }
hMod->text = (uchar*)ROUND_4K((ulong)hMod + sizeof(PE_MODULE)); hMod->text = (uchar*)ROUND_4K((ulong)hMod + sizeof(PE_MODULE));
hMod->data = (uchar*)((ulong)hMod->text + (data_addr - text_addr)); hMod->data = (uchar*)((ulong)hMod->text + (data_addr - text_addr));
@ -272,48 +272,48 @@ PE_MODULE * PEAPI PE_loadLibraryExt(
result = PE_invalidDLLImage; result = PE_invalidDLLImage;
fseek(f, startOffset+text_off, SEEK_SET); fseek(f, startOffset+text_off, SEEK_SET);
if (fread(hMod->text, 1, text_size, f) != text_size) if (fread(hMod->text, 1, text_size, f) != text_size)
goto Error; goto Error;
fseek(f, startOffset+data_off, SEEK_SET); fseek(f, startOffset+data_off, SEEK_SET);
if (fread(hMod->data, 1, data_size, f) != data_size) if (fread(hMod->data, 1, data_size, f) != data_size)
goto Error; goto Error;
fseek(f, startOffset+export_off, SEEK_SET); fseek(f, startOffset+export_off, SEEK_SET);
if (fread(hMod->export, 1, export_size, f) != export_size) if (fread(hMod->export, 1, export_size, f) != export_size)
goto Error; goto Error;
fseek(f, startOffset+reloc_off, SEEK_SET); fseek(f, startOffset+reloc_off, SEEK_SET);
if (fread(reloc, 1, reloc_size, f) != reloc_size) if (fread(reloc, 1, reloc_size, f) != reloc_size)
goto Error; goto Error;
/* Now perform relocations on all sections in the image */ /* Now perform relocations on all sections in the image */
delta = (ulong)hMod->text - opthdr.ImageBase - text_addr; delta = (ulong)hMod->text - opthdr.ImageBase - text_addr;
baseReloc = (BASE_RELOCATION*)reloc; baseReloc = (BASE_RELOCATION*)reloc;
for (;;) { for (;;) {
/* Check for termination condition */ /* Check for termination condition */
if (!baseReloc->PageRVA || !baseReloc->BlockSize) if (!baseReloc->PageRVA || !baseReloc->BlockSize)
break; break;
/* Do fixups */ /* Do fixups */
pageOffset = baseReloc->PageRVA - hMod->textBase; pageOffset = baseReloc->PageRVA - hMod->textBase;
numFixups = (baseReloc->BlockSize - sizeof(BASE_RELOCATION)) / sizeof(ushort); numFixups = (baseReloc->BlockSize - sizeof(BASE_RELOCATION)) / sizeof(ushort);
fixup = (ushort*)(baseReloc + 1); fixup = (ushort*)(baseReloc + 1);
for (i = 0; i < numFixups; i++) { for (i = 0; i < numFixups; i++) {
relocType = *fixup >> 12; relocType = *fixup >> 12;
if (relocType) { if (relocType) {
offset = pageOffset + (*fixup & 0x0FFF); offset = pageOffset + (*fixup & 0x0FFF);
*(ulong*)(hMod->text + offset) += delta; *(ulong*)(hMod->text + offset) += delta;
} }
fixup++; fixup++;
} }
/* Move to next relocation block */ /* Move to next relocation block */
baseReloc = (BASE_RELOCATION*)((ulong)baseReloc + baseReloc->BlockSize); baseReloc = (BASE_RELOCATION*)((ulong)baseReloc + baseReloc->BlockSize);
} }
/* Initialise the C runtime library for the loaded DLL */ /* Initialise the C runtime library for the loaded DLL */
result = PE_unableToInitLibC; result = PE_unableToInitLibC;
if ((InitLibC = (InitLibC_t)PE_getProcAddress(hMod,"_InitLibC")) == NULL) if ((InitLibC = (InitLibC_t)PE_getProcAddress(hMod,"_InitLibC")) == NULL)
goto Error; goto Error;
if (!InitLibC(&___imports,PM_getOSType())) if (!InitLibC(&___imports,PM_getOSType()))
goto Error; goto Error;
/* Clean up, close the file and return the loaded module handle */ /* Clean up, close the file and return the loaded module handle */
PM_free(reloc); PM_free(reloc);
@ -322,9 +322,9 @@ PE_MODULE * PEAPI PE_loadLibraryExt(
Error: Error:
if (shared) if (shared)
PM_freeShared(hMod); PM_freeShared(hMod);
else else
PM_free(hMod); PM_free(hMod);
PM_free(reloc); PM_free(reloc);
return NULL; return NULL;
} }
@ -360,53 +360,53 @@ PE_MODULE * PEAPI PE_loadLibrary(
#if (defined(__WINDOWS32__) || defined(__DRIVER__)) && defined(CHECKED) #if (defined(__WINDOWS32__) || defined(__DRIVER__)) && defined(CHECKED)
if (!shared) { if (!shared) {
PM_MODULE hInst; PM_MODULE hInst;
InitLibC_t InitLibC; InitLibC_t InitLibC;
/* For Win32 if are building checked libraries for debugging, we use /* For Win32 if are building checked libraries for debugging, we use
* the real Win32 DLL functions so that we can debug the resulting DLL * the real Win32 DLL functions so that we can debug the resulting DLL
* files with the Win32 debuggers. Note that we can't do this if * files with the Win32 debuggers. Note that we can't do this if
* we need to load the files into a shared memory context. * we need to load the files into a shared memory context.
*/ */
if ((hInst = PM_loadLibrary(szDLLName)) == NULL) { if ((hInst = PM_loadLibrary(szDLLName)) == NULL) {
result = PE_fileNotFound; result = PE_fileNotFound;
return NULL; return NULL;
} }
/* Initialise the C runtime library for the loaded DLL */ /* Initialise the C runtime library for the loaded DLL */
result = PE_unableToInitLibC; result = PE_unableToInitLibC;
if ((InitLibC = (void*)PM_getProcAddress(hInst,"_InitLibC")) == NULL) if ((InitLibC = (void*)PM_getProcAddress(hInst,"_InitLibC")) == NULL)
return NULL; return NULL;
if (!InitLibC(&___imports,PM_getOSType())) if (!InitLibC(&___imports,PM_getOSType()))
return NULL; return NULL;
/* Allocate the PE_MODULE structure */ /* Allocate the PE_MODULE structure */
if ((hMod = PM_malloc(sizeof(*hMod))) == NULL) if ((hMod = PM_malloc(sizeof(*hMod))) == NULL)
return NULL; return NULL;
hMod->text = (void*)hInst; hMod->text = (void*)hInst;
hMod->shared = -1; hMod->shared = -1;
/* DLL loaded successfully so return module handle */ /* DLL loaded successfully so return module handle */
result = PE_ok; result = PE_ok;
return hMod; return hMod;
} }
else else
#endif #endif
{ {
FILE *f; FILE *f;
ulong size; ulong size;
/* Attempt to open the file on disk */ /* Attempt to open the file on disk */
if (shared < 0) if (shared < 0)
shared = 0; shared = 0;
if ((f = fopen(szDLLName,"rb")) == NULL) { if ((f = fopen(szDLLName,"rb")) == NULL) {
result = PE_fileNotFound; result = PE_fileNotFound;
return NULL; return NULL;
} }
hMod = PE_loadLibraryExt(f,0,&size,shared); hMod = PE_loadLibraryExt(f,0,&size,shared);
fclose(f); fclose(f);
return hMod; return hMod;
} }
} }
/**************************************************************************** /****************************************************************************
@ -445,14 +445,14 @@ PE_MODULE * PEAPI PE_loadLibraryMGL(
*/ */
#if !defined(__WIN32_VXD__) && !defined(__NT_DRIVER__) #if !defined(__WIN32_VXD__) && !defined(__NT_DRIVER__)
if (getenv("MGL_ROOT")) { if (getenv("MGL_ROOT")) {
strcpy(path,getenv("MGL_ROOT")); strcpy(path,getenv("MGL_ROOT"));
PM_backslash(path); PM_backslash(path);
} }
strcat(path,"drivers"); strcat(path,"drivers");
PM_backslash(path); PM_backslash(path);
strcat(path,szDLLName); strcat(path,szDLLName);
if ((hMod = PE_loadLibrary(path,shared)) != NULL) if ((hMod = PE_loadLibrary(path,shared)) != NULL)
return hMod; return hMod;
#endif #endif
strcpy(path,"drivers"); strcpy(path,"drivers");
PM_backslash(path); PM_backslash(path);
@ -488,39 +488,39 @@ void * PEAPI PE_getProcAddress(
{ {
#if (defined(__WINDOWS32__) || defined(__DRIVER__)) && defined(CHECKED) #if (defined(__WINDOWS32__) || defined(__DRIVER__)) && defined(CHECKED)
if (hModule->shared == -1) if (hModule->shared == -1)
return (void*)PM_getProcAddress(hModule->text,szProcName); return (void*)PM_getProcAddress(hModule->text,szProcName);
else else
#endif #endif
{ {
uint i; uint i;
EXPORT_DIRECTORY *exports; EXPORT_DIRECTORY *exports;
ulong funcOffset; ulong funcOffset;
ulong *AddressTable; ulong *AddressTable;
ulong *NameTable; ulong *NameTable;
ushort *OrdinalTable; ushort *OrdinalTable;
char *name; char *name;
/* Find the address of the export tables from the export section */ /* Find the address of the export tables from the export section */
if (!hModule) if (!hModule)
return NULL; return NULL;
exports = (EXPORT_DIRECTORY*)(hModule->export + hModule->exportDir); exports = (EXPORT_DIRECTORY*)(hModule->export + hModule->exportDir);
AddressTable = (ulong*)(hModule->export + exports->AddressTableRVA - hModule->exportBase); AddressTable = (ulong*)(hModule->export + exports->AddressTableRVA - hModule->exportBase);
NameTable = (ulong*)(hModule->export + exports->NameTableRVA - hModule->exportBase); NameTable = (ulong*)(hModule->export + exports->NameTableRVA - hModule->exportBase);
OrdinalTable = (ushort*)(hModule->export + exports->OrdinalTableRVA - hModule->exportBase); OrdinalTable = (ushort*)(hModule->export + exports->OrdinalTableRVA - hModule->exportBase);
/* Search the export name table to find the function name */ /* Search the export name table to find the function name */
for (i = 0; i < exports->NumberOfNamePointers; i++) { for (i = 0; i < exports->NumberOfNamePointers; i++) {
name = (char*)(hModule->export + NameTable[i] - hModule->exportBase); name = (char*)(hModule->export + NameTable[i] - hModule->exportBase);
if (strcmp(name,szProcName) == 0) if (strcmp(name,szProcName) == 0)
break; break;
} }
if (i == exports->NumberOfNamePointers) if (i == exports->NumberOfNamePointers)
return NULL; return NULL;
funcOffset = AddressTable[OrdinalTable[i]]; funcOffset = AddressTable[OrdinalTable[i]];
if (!funcOffset) if (!funcOffset)
return NULL; return NULL;
return (void*)(hModule->text + funcOffset - hModule->textBase); return (void*)(hModule->text + funcOffset - hModule->textBase);
} }
} }
/**************************************************************************** /****************************************************************************
@ -546,25 +546,25 @@ void PEAPI PE_freeLibrary(
#if (defined(__WINDOWS32__) || defined(__DRIVER__)) && defined(CHECKED) #if (defined(__WINDOWS32__) || defined(__DRIVER__)) && defined(CHECKED)
if (hModule->shared == -1) { if (hModule->shared == -1) {
/* Run the C runtime library exit code on module unload */ /* Run the C runtime library exit code on module unload */
if ((TerminateLibC = (TerminateLibC_t)PM_getProcAddress(hModule->text,"_TerminateLibC")) != NULL) if ((TerminateLibC = (TerminateLibC_t)PM_getProcAddress(hModule->text,"_TerminateLibC")) != NULL)
TerminateLibC(); TerminateLibC();
PM_freeLibrary(hModule->text); PM_freeLibrary(hModule->text);
PM_free(hModule); PM_free(hModule);
} }
else else
#endif #endif
{ {
if (hModule) { if (hModule) {
/* Run the C runtime library exit code on module unload */ /* Run the C runtime library exit code on module unload */
if ((TerminateLibC = (TerminateLibC_t)PE_getProcAddress(hModule,"_TerminateLibC")) != NULL) if ((TerminateLibC = (TerminateLibC_t)PE_getProcAddress(hModule,"_TerminateLibC")) != NULL)
TerminateLibC(); TerminateLibC();
if (hModule->shared) if (hModule->shared)
PM_freeShared(hModule); PM_freeShared(hModule);
else else
PM_free(hModule); PM_free(hModule);
} }
} }
} }
/**************************************************************************** /****************************************************************************
@ -584,4 +584,3 @@ int PEAPI PE_getError(void)
{ {
return result; return result;
} }

View File

@ -73,10 +73,10 @@ void VBEAPI VBE_init(void)
****************************************************************************/ ****************************************************************************/
{ {
if (!state->VESABuf_ptr) { if (!state->VESABuf_ptr) {
/* Allocate a global buffer for communicating with the VESA VBE */ /* Allocate a global buffer for communicating with the VESA VBE */
if ((state->VESABuf_ptr = PM_getVESABuf(&VESABuf_len, &state->VESABuf_rseg, &state->VESABuf_roff)) == NULL) if ((state->VESABuf_ptr = PM_getVESABuf(&VESABuf_len, &state->VESABuf_rseg, &state->VESABuf_roff)) == NULL)
PM_fatalError("VESAVBE.C: Real mode memory allocation failed!"); PM_fatalError("VESAVBE.C: Real mode memory allocation failed!");
} }
} }
void * VBEAPI VBE_getRMBuf(uint *len,uint *rseg,uint *roff) void * VBEAPI VBE_getRMBuf(uint *len,uint *rseg,uint *roff)
@ -129,7 +129,7 @@ void VBEAPI VBE_callESDI(RMREGS *regs, void *buffer, int size)
RMSREGS sregs; RMSREGS sregs;
if (!state->VESABuf_ptr) if (!state->VESABuf_ptr)
PM_fatalError("You *MUST* call VBE_init() before you can call the VESAVBE.C module!"); PM_fatalError("You *MUST* call VBE_init() before you can call the VESAVBE.C module!");
sregs.es = (ushort)state->VESABuf_rseg; sregs.es = (ushort)state->VESABuf_rseg;
regs->x.di = (ushort)state->VESABuf_roff; regs->x.di = (ushort)state->VESABuf_roff;
memcpy(state->VESABuf_ptr, buffer, size); memcpy(state->VESABuf_ptr, buffer, size);
@ -157,7 +157,7 @@ static char *VBE_copyStrToLocal(char *p,char *realPtr,char *max)
v = PM_mapRealPointer((uint)((ulong)realPtr >> 16), (uint)((ulong)realPtr & 0xFFFF)); v = PM_mapRealPointer((uint)((ulong)realPtr >> 16), (uint)((ulong)realPtr & 0xFFFF));
while (*v != 0 && p < max) while (*v != 0 && p < max)
*p++ = *v++; *p++ = *v++;
*p++ = 0; *p++ = 0;
return p; return p;
} }
@ -178,7 +178,7 @@ static void VBE_copyShortToLocal(ushort *p,ushort *realPtr)
v = PM_mapRealPointer((uint)((ulong)realPtr >> 16),(uint)((ulong)realPtr & 0xFFFF)); v = PM_mapRealPointer((uint)((ulong)realPtr >> 16),(uint)((ulong)realPtr & 0xFFFF));
while (*v != 0xFFFF) while (*v != 0xFFFF)
*p++ = *v++; *p++ = *v++;
*p = 0xFFFF; *p = 0xFFFF;
} }
#endif #endif
@ -200,26 +200,26 @@ int VBEAPI VBE_detectEXT(VBE_vgaInfo *vgaInfo,ibool forceUniVBE)
regs.x.ax = 0x4F00; /* Get SuperVGA information */ regs.x.ax = 0x4F00; /* Get SuperVGA information */
if (forceUniVBE) { if (forceUniVBE) {
regs.x.bx = 0x1234; regs.x.bx = 0x1234;
regs.x.cx = 0x4321; regs.x.cx = 0x4321;
} }
else { else {
regs.x.bx = 0; regs.x.bx = 0;
regs.x.cx = 0; regs.x.cx = 0;
} }
strncpy(vgaInfo->VESASignature,"VBE2",4); strncpy(vgaInfo->VESASignature,"VBE2",4);
VBE_callESDI(&regs, vgaInfo, sizeof(*vgaInfo)); VBE_callESDI(&regs, vgaInfo, sizeof(*vgaInfo));
if (regs.x.ax != VBE_SUCCESS) if (regs.x.ax != VBE_SUCCESS)
return 0; return 0;
if (strncmp(vgaInfo->VESASignature,"VESA",4) != 0) if (strncmp(vgaInfo->VESASignature,"VESA",4) != 0)
return 0; return 0;
/* Check for bogus BIOSes that return a VBE version number that is /* Check for bogus BIOSes that return a VBE version number that is
* not correct, and fix it up. We also check the OemVendorNamePtr for a * not correct, and fix it up. We also check the OemVendorNamePtr for a
* valid value, and if it is invalid then we also reset to VBE 1.2. * valid value, and if it is invalid then we also reset to VBE 1.2.
*/ */
if (vgaInfo->VESAVersion >= 0x200 && vgaInfo->OemVendorNamePtr == 0) if (vgaInfo->VESAVersion >= 0x200 && vgaInfo->OemVendorNamePtr == 0)
vgaInfo->VESAVersion = 0x102; vgaInfo->VESAVersion = 0x102;
#ifndef REALMODE #ifndef REALMODE
/* Relocate all the indirect information (mode tables, OEM strings /* Relocate all the indirect information (mode tables, OEM strings
* etc) from the low 1Mb memory region into a static buffer in * etc) from the low 1Mb memory region into a static buffer in
@ -227,23 +227,23 @@ int VBEAPI VBE_detectEXT(VBE_vgaInfo *vgaInfo,ibool forceUniVBE)
* from mapping the strings from real mode to protected mode. * from mapping the strings from real mode to protected mode.
*/ */
{ {
char *p,*p2; char *p,*p2;
p2 = VBE_copyStrToLocal(localBuf,vgaInfo->OemStringPtr,MAX_LOCAL_BUF); p2 = VBE_copyStrToLocal(localBuf,vgaInfo->OemStringPtr,MAX_LOCAL_BUF);
vgaInfo->OemStringPtr = localBuf; vgaInfo->OemStringPtr = localBuf;
if (vgaInfo->VESAVersion >= 0x200) { if (vgaInfo->VESAVersion >= 0x200) {
p = VBE_copyStrToLocal(p2,vgaInfo->OemVendorNamePtr,MAX_LOCAL_BUF); p = VBE_copyStrToLocal(p2,vgaInfo->OemVendorNamePtr,MAX_LOCAL_BUF);
vgaInfo->OemVendorNamePtr = p2; vgaInfo->OemVendorNamePtr = p2;
p2 = VBE_copyStrToLocal(p,vgaInfo->OemProductNamePtr,MAX_LOCAL_BUF); p2 = VBE_copyStrToLocal(p,vgaInfo->OemProductNamePtr,MAX_LOCAL_BUF);
vgaInfo->OemProductNamePtr = p; vgaInfo->OemProductNamePtr = p;
p = VBE_copyStrToLocal(p2,vgaInfo->OemProductRevPtr,MAX_LOCAL_BUF); p = VBE_copyStrToLocal(p2,vgaInfo->OemProductRevPtr,MAX_LOCAL_BUF);
vgaInfo->OemProductRevPtr = p2; vgaInfo->OemProductRevPtr = p2;
VBE_copyShortToLocal((ushort*)p,vgaInfo->VideoModePtr); VBE_copyShortToLocal((ushort*)p,vgaInfo->VideoModePtr);
vgaInfo->VideoModePtr = (ushort*)p; vgaInfo->VideoModePtr = (ushort*)p;
} }
else { else {
VBE_copyShortToLocal((ushort*)p2,vgaInfo->VideoModePtr); VBE_copyShortToLocal((ushort*)p2,vgaInfo->VideoModePtr);
vgaInfo->VideoModePtr = (ushort*)p2; vgaInfo->VideoModePtr = (ushort*)p2;
} }
} }
#endif #endif
state->VBEMemory = vgaInfo->TotalMemory * 64; state->VBEMemory = vgaInfo->TotalMemory * 64;
@ -253,17 +253,17 @@ int VBEAPI VBE_detectEXT(VBE_vgaInfo *vgaInfo,ibool forceUniVBE)
*/ */
haveRiva128 = false; haveRiva128 = false;
if (vgaInfo->VESAVersion >= 0x300 && if (vgaInfo->VESAVersion >= 0x300 &&
(strstr(vgaInfo->OemStringPtr,"NVidia") != NULL || (strstr(vgaInfo->OemStringPtr,"NVidia") != NULL ||
strstr(vgaInfo->OemStringPtr,"Riva") != NULL)) { strstr(vgaInfo->OemStringPtr,"Riva") != NULL)) {
haveRiva128 = true; haveRiva128 = true;
} }
/* Check for Matrox G400 cards which claim to be VBE 3.0 /* Check for Matrox G400 cards which claim to be VBE 3.0
* compliant yet they don't implement the refresh rate control * compliant yet they don't implement the refresh rate control
* functions. * functions.
*/ */
if (vgaInfo->VESAVersion >= 0x300 && (strcmp(vgaInfo->OemProductNamePtr,"Matrox G400") == 0)) if (vgaInfo->VESAVersion >= 0x300 && (strcmp(vgaInfo->OemProductNamePtr,"Matrox G400") == 0))
vgaInfo->VESAVersion = 0x200; vgaInfo->VESAVersion = 0x200;
return (state->VBEVersion = vgaInfo->VESAVersion); return (state->VBEVersion = vgaInfo->VESAVersion);
} }
@ -305,70 +305,70 @@ ibool VBEAPI VBE_getModeInfo(int mode,VBE_modeInfo *modeInfo)
regs.x.cx = (ushort)mode; regs.x.cx = (ushort)mode;
VBE_callESDI(&regs, modeInfo, sizeof(*modeInfo)); VBE_callESDI(&regs, modeInfo, sizeof(*modeInfo));
if (regs.x.ax != VBE_SUCCESS) if (regs.x.ax != VBE_SUCCESS)
return false; return false;
if ((modeInfo->ModeAttributes & vbeMdAvailable) == 0) if ((modeInfo->ModeAttributes & vbeMdAvailable) == 0)
return false; return false;
/* Map out triple buffer and stereo flags for NVidia Riva128 /* Map out triple buffer and stereo flags for NVidia Riva128
* chips. * chips.
*/ */
if (haveRiva128) { if (haveRiva128) {
modeInfo->ModeAttributes &= ~vbeMdTripleBuf; modeInfo->ModeAttributes &= ~vbeMdTripleBuf;
modeInfo->ModeAttributes &= ~vbeMdStereo; modeInfo->ModeAttributes &= ~vbeMdStereo;
} }
/* Support old style RGB definitions for VBE 1.1 BIOSes */ /* Support old style RGB definitions for VBE 1.1 BIOSes */
bits = modeInfo->BitsPerPixel; bits = modeInfo->BitsPerPixel;
if (modeInfo->MemoryModel == vbeMemPK && bits > 8) { if (modeInfo->MemoryModel == vbeMemPK && bits > 8) {
modeInfo->MemoryModel = vbeMemRGB; modeInfo->MemoryModel = vbeMemRGB;
switch (bits) { switch (bits) {
case 15: case 15:
modeInfo->RedMaskSize = 5; modeInfo->RedMaskSize = 5;
modeInfo->RedFieldPosition = 10; modeInfo->RedFieldPosition = 10;
modeInfo->GreenMaskSize = 5; modeInfo->GreenMaskSize = 5;
modeInfo->GreenFieldPosition = 5; modeInfo->GreenFieldPosition = 5;
modeInfo->BlueMaskSize = 5; modeInfo->BlueMaskSize = 5;
modeInfo->BlueFieldPosition = 0; modeInfo->BlueFieldPosition = 0;
modeInfo->RsvdMaskSize = 1; modeInfo->RsvdMaskSize = 1;
modeInfo->RsvdFieldPosition = 15; modeInfo->RsvdFieldPosition = 15;
break; break;
case 16: case 16:
modeInfo->RedMaskSize = 5; modeInfo->RedMaskSize = 5;
modeInfo->RedFieldPosition = 11; modeInfo->RedFieldPosition = 11;
modeInfo->GreenMaskSize = 5; modeInfo->GreenMaskSize = 5;
modeInfo->GreenFieldPosition = 5; modeInfo->GreenFieldPosition = 5;
modeInfo->BlueMaskSize = 5; modeInfo->BlueMaskSize = 5;
modeInfo->BlueFieldPosition = 0; modeInfo->BlueFieldPosition = 0;
modeInfo->RsvdMaskSize = 0; modeInfo->RsvdMaskSize = 0;
modeInfo->RsvdFieldPosition = 0; modeInfo->RsvdFieldPosition = 0;
break; break;
case 24: case 24:
modeInfo->RedMaskSize = 8; modeInfo->RedMaskSize = 8;
modeInfo->RedFieldPosition = 16; modeInfo->RedFieldPosition = 16;
modeInfo->GreenMaskSize = 8; modeInfo->GreenMaskSize = 8;
modeInfo->GreenFieldPosition = 8; modeInfo->GreenFieldPosition = 8;
modeInfo->BlueMaskSize = 8; modeInfo->BlueMaskSize = 8;
modeInfo->BlueFieldPosition = 0; modeInfo->BlueFieldPosition = 0;
modeInfo->RsvdMaskSize = 0; modeInfo->RsvdMaskSize = 0;
modeInfo->RsvdFieldPosition = 0; modeInfo->RsvdFieldPosition = 0;
break; break;
} }
} }
/* Convert the 32k direct color modes of VBE 1.2+ BIOSes to /* Convert the 32k direct color modes of VBE 1.2+ BIOSes to
* be recognised as 15 bits per pixel modes. * be recognised as 15 bits per pixel modes.
*/ */
if (bits == 16 && modeInfo->RsvdMaskSize == 1) if (bits == 16 && modeInfo->RsvdMaskSize == 1)
modeInfo->BitsPerPixel = 15; modeInfo->BitsPerPixel = 15;
/* Fix up bogus BIOS'es that report incorrect reserved pixel masks /* Fix up bogus BIOS'es that report incorrect reserved pixel masks
* for 32K color modes. Quite a number of BIOS'es have this problem, * for 32K color modes. Quite a number of BIOS'es have this problem,
* and this affects our OS/2 drivers in VBE fallback mode. * and this affects our OS/2 drivers in VBE fallback mode.
*/ */
if (bits == 15 && (modeInfo->RsvdMaskSize != 1 || modeInfo->RsvdFieldPosition != 15)) { if (bits == 15 && (modeInfo->RsvdMaskSize != 1 || modeInfo->RsvdFieldPosition != 15)) {
modeInfo->RsvdMaskSize = 1; modeInfo->RsvdMaskSize = 1;
modeInfo->RsvdFieldPosition = 15; modeInfo->RsvdFieldPosition = 15;
} }
return true; return true;
} }
@ -391,20 +391,20 @@ long VBEAPI VBE_getPageSize(VBE_modeInfo *mi)
size = (long)mi->BytesPerScanLine * (long)mi->YResolution; size = (long)mi->BytesPerScanLine * (long)mi->YResolution;
if (mi->BitsPerPixel == 4) { if (mi->BitsPerPixel == 4) {
/* We have a 16 color video mode, so round up the page size to /* We have a 16 color video mode, so round up the page size to
* 8k, 16k, 32k or 64k boundaries depending on how large it is. * 8k, 16k, 32k or 64k boundaries depending on how large it is.
*/ */
size = (size + 0x1FFFL) & 0xFFFFE000L; size = (size + 0x1FFFL) & 0xFFFFE000L;
if (size != 0x2000) { if (size != 0x2000) {
size = (size + 0x3FFFL) & 0xFFFFC000L; size = (size + 0x3FFFL) & 0xFFFFC000L;
if (size != 0x4000) { if (size != 0x4000) {
size = (size + 0x7FFFL) & 0xFFFF8000L; size = (size + 0x7FFFL) & 0xFFFF8000L;
if (size != 0x8000) if (size != 0x8000)
size = (size + 0xFFFFL) & 0xFFFF0000L; size = (size + 0xFFFFL) & 0xFFFF0000L;
} }
} }
} }
else size = (size + 0xFFFFL) & 0xFFFF0000L; else size = (size + 0xFFFFL) & 0xFFFF0000L;
return size; return size;
} }
@ -425,26 +425,26 @@ ibool VBEAPI VBE_setVideoModeExt(int mode,VBE_CRTCInfo *crtc)
RMREGS regs; RMREGS regs;
if (state->VBEVersion < 0x200 && mode < 0x100) { if (state->VBEVersion < 0x200 && mode < 0x100) {
/* Some VBE implementations barf terribly if you try to set non-VBE /* Some VBE implementations barf terribly if you try to set non-VBE
* video modes with the VBE set mode call. VBE 2.0 implementations * video modes with the VBE set mode call. VBE 2.0 implementations
* must be able to handle this. * must be able to handle this.
*/ */
regs.h.al = (ushort)mode; regs.h.al = (ushort)mode;
regs.h.ah = 0; regs.h.ah = 0;
PM_int86(0x10,&regs,&regs); PM_int86(0x10,&regs,&regs);
} }
else { else {
if (state->VBEVersion < 0x300 && (mode & vbeRefreshCtrl)) if (state->VBEVersion < 0x300 && (mode & vbeRefreshCtrl))
return false; return false;
regs.x.ax = 0x4F02; regs.x.ax = 0x4F02;
regs.x.bx = (ushort)mode; regs.x.bx = (ushort)mode;
if ((mode & vbeRefreshCtrl) && crtc) if ((mode & vbeRefreshCtrl) && crtc)
VBE_callESDI(&regs, crtc, sizeof(*crtc)); VBE_callESDI(&regs, crtc, sizeof(*crtc));
else else
PM_int86(0x10,&regs,&regs); PM_int86(0x10,&regs,&regs);
if (regs.x.ax != VBE_SUCCESS) if (regs.x.ax != VBE_SUCCESS)
return false; return false;
} }
return true; return true;
} }
@ -475,7 +475,7 @@ int VBEAPI VBE_getVideoMode(void)
regs.x.ax = 0x4F03; regs.x.ax = 0x4F03;
PM_int86(0x10,&regs,&regs); PM_int86(0x10,&regs,&regs);
if (regs.x.ax != VBE_SUCCESS) if (regs.x.ax != VBE_SUCCESS)
return -1; return -1;
return regs.x.bx; return regs.x.bx;
} }
@ -515,7 +515,7 @@ int VBEAPI VBE_getBank(int window)
regs.h.bl = window; regs.h.bl = window;
PM_int86(0x10,&regs,&regs); PM_int86(0x10,&regs,&regs);
if (regs.x.ax != VBE_SUCCESS) if (regs.x.ax != VBE_SUCCESS)
return -1; return -1;
return regs.x.dx; return regs.x.dx;
} }
@ -637,7 +637,7 @@ ibool VBEAPI VBE_setDisplayStart(int x,int y,ibool waitVRT)
regs.x.ax = 0x4F07; regs.x.ax = 0x4F07;
if (waitVRT) if (waitVRT)
regs.x.bx = 0x80; regs.x.bx = 0x80;
else regs.x.bx = 0x00; else regs.x.bx = 0x00;
regs.x.cx = x; regs.x.cx = x;
regs.x.dx = y; regs.x.dx = y;
@ -685,12 +685,12 @@ ibool VBEAPI VBE_setDisplayStartAlt(ulong startAddr,ibool waitVRT)
RMREGS regs; RMREGS regs;
if (state->VBEVersion >= 0x300) { if (state->VBEVersion >= 0x300) {
regs.x.ax = 0x4F07; regs.x.ax = 0x4F07;
regs.x.bx = waitVRT ? 0x82 : 0x02; regs.x.bx = waitVRT ? 0x82 : 0x02;
regs.e.ecx = startAddr; regs.e.ecx = startAddr;
PM_int86(0x10,&regs,&regs); PM_int86(0x10,&regs,&regs);
return regs.x.ax == VBE_SUCCESS; return regs.x.ax == VBE_SUCCESS;
} }
return false; return false;
} }
@ -712,12 +712,12 @@ int VBEAPI VBE_getDisplayStartStatus(void)
RMREGS regs; RMREGS regs;
if (state->VBEVersion >= 0x300) { if (state->VBEVersion >= 0x300) {
regs.x.ax = 0x4F07; regs.x.ax = 0x4F07;
regs.x.bx = 0x0004; regs.x.bx = 0x0004;
PM_int86(0x10,&regs,&regs); PM_int86(0x10,&regs,&regs);
if (regs.x.ax == VBE_SUCCESS) if (regs.x.ax == VBE_SUCCESS)
return (regs.x.cx != 0); return (regs.x.cx != 0);
} }
return -1; return -1;
} }
@ -738,11 +738,11 @@ ibool VBEAPI VBE_enableStereoMode(void)
RMREGS regs; RMREGS regs;
if (state->VBEVersion >= 0x300) { if (state->VBEVersion >= 0x300) {
regs.x.ax = 0x4F07; regs.x.ax = 0x4F07;
regs.x.bx = 0x0005; regs.x.bx = 0x0005;
PM_int86(0x10,&regs,&regs); PM_int86(0x10,&regs,&regs);
return regs.x.ax == VBE_SUCCESS; return regs.x.ax == VBE_SUCCESS;
} }
return false; return false;
} }
@ -762,11 +762,11 @@ ibool VBEAPI VBE_disableStereoMode(void)
RMREGS regs; RMREGS regs;
if (state->VBEVersion >= 0x300) { if (state->VBEVersion >= 0x300) {
regs.x.ax = 0x4F07; regs.x.ax = 0x4F07;
regs.x.bx = 0x0006; regs.x.bx = 0x0006;
PM_int86(0x10,&regs,&regs); PM_int86(0x10,&regs,&regs);
return regs.x.ax == VBE_SUCCESS; return regs.x.ax == VBE_SUCCESS;
} }
return false; return false;
} }
@ -793,13 +793,13 @@ ibool VBEAPI VBE_setStereoDisplayStart(ulong leftAddr,ulong rightAddr,
RMREGS regs; RMREGS regs;
if (state->VBEVersion >= 0x300) { if (state->VBEVersion >= 0x300) {
regs.x.ax = 0x4F07; regs.x.ax = 0x4F07;
regs.x.bx = waitVRT ? 0x83 : 0x03; regs.x.bx = waitVRT ? 0x83 : 0x03;
regs.e.ecx = leftAddr; regs.e.ecx = leftAddr;
regs.e.edx = rightAddr; regs.e.edx = rightAddr;
PM_int86(0x10,&regs,&regs); PM_int86(0x10,&regs,&regs);
return regs.x.ax == VBE_SUCCESS; return regs.x.ax == VBE_SUCCESS;
} }
return false; return false;
} }
@ -832,14 +832,14 @@ ulong VBEAPI VBE_getClosestClock(ushort mode,ulong pixelClock)
RMREGS regs; RMREGS regs;
if (state->VBEVersion >= 0x300) { if (state->VBEVersion >= 0x300) {
regs.x.ax = 0x4F0B; regs.x.ax = 0x4F0B;
regs.h.bl = 0x00; regs.h.bl = 0x00;
regs.e.ecx = pixelClock; regs.e.ecx = pixelClock;
regs.x.dx = mode; regs.x.dx = mode;
PM_int86(0x10,&regs,&regs); PM_int86(0x10,&regs,&regs);
if (regs.x.ax == VBE_SUCCESS) if (regs.x.ax == VBE_SUCCESS)
return regs.e.ecx; return regs.e.ecx;
} }
return -1; return -1;
} }
@ -875,7 +875,7 @@ int VBEAPI VBE_getDACWidth(void)
regs.h.bl = 0x01; regs.h.bl = 0x01;
PM_int86(0x10,&regs,&regs); PM_int86(0x10,&regs,&regs);
if (regs.x.ax != VBE_SUCCESS) if (regs.x.ax != VBE_SUCCESS)
return -1; return -1;
return regs.h.bh; return regs.h.bh;
} }
@ -927,11 +927,11 @@ void * VBEAPI VBE_getBankedPointer(VBE_modeInfo *modeInfo)
*/ */
ulong seg = (ushort)modeInfo->WinASegment; ulong seg = (ushort)modeInfo->WinASegment;
if (seg != 0) { if (seg != 0) {
if (seg == 0xA000) if (seg == 0xA000)
return (void*)PM_getA0000Pointer(); return (void*)PM_getA0000Pointer();
else else
return (void*)PM_mapPhysicalAddr(seg << 4,0xFFFF,true); return (void*)PM_mapPhysicalAddr(seg << 4,0xFFFF,true);
} }
return NULL; return NULL;
} }
@ -956,14 +956,14 @@ void * VBEAPI VBE_getLinearPointer(VBE_modeInfo *modeInfo)
/* Search for an already mapped pointer */ /* Search for an already mapped pointer */
for (i = 0; i < numPtrs; i++) { for (i = 0; i < numPtrs; i++) {
if (physPtr[i] == modeInfo->PhysBasePtr) if (physPtr[i] == modeInfo->PhysBasePtr)
return linPtr[i]; return linPtr[i];
} }
if (numPtrs < MAX_LIN_PTRS) { if (numPtrs < MAX_LIN_PTRS) {
physPtr[numPtrs] = modeInfo->PhysBasePtr; physPtr[numPtrs] = modeInfo->PhysBasePtr;
linPtr[numPtrs] = PM_mapPhysicalAddr(modeInfo->PhysBasePtr,(state->VBEMemory * 1024L)-1,true); linPtr[numPtrs] = PM_mapPhysicalAddr(modeInfo->PhysBasePtr,(state->VBEMemory * 1024L)-1,true);
return linPtr[numPtrs++]; return linPtr[numPtrs++];
} }
return NULL; return NULL;
} }
@ -989,56 +989,56 @@ static void InitPMCode(void)
int pmLen; int pmLen;
if (!state->pmInfo && state->VBEVersion >= 0x200) { if (!state->pmInfo && state->VBEVersion >= 0x200) {
regs.x.ax = 0x4F0A; regs.x.ax = 0x4F0A;
regs.x.bx = 0; regs.x.bx = 0;
PM_int86x(0x10,&regs,&regs,&sregs); PM_int86x(0x10,&regs,&regs,&sregs);
if (regs.x.ax != VBE_SUCCESS) if (regs.x.ax != VBE_SUCCESS)
return; return;
if (VBE_shared) if (VBE_shared)
state->pmInfo = PM_mallocShared(regs.x.cx); state->pmInfo = PM_mallocShared(regs.x.cx);
else else
state->pmInfo = PM_malloc(regs.x.cx); state->pmInfo = PM_malloc(regs.x.cx);
if (state->pmInfo == NULL) if (state->pmInfo == NULL)
return; return;
state->pmInfo32 = state->pmInfo; state->pmInfo32 = state->pmInfo;
pmLen = regs.x.cx; pmLen = regs.x.cx;
/* Relocate the block into our local data segment */ /* Relocate the block into our local data segment */
code = PM_mapRealPointer(sregs.es,regs.x.di); code = PM_mapRealPointer(sregs.es,regs.x.di);
memcpy(state->pmInfo,code,pmLen); memcpy(state->pmInfo,code,pmLen);
/* Now do a sanity check on the information we recieve to ensure /* Now do a sanity check on the information we recieve to ensure
* that is is correct. Some BIOS return totally bogus information * that is is correct. Some BIOS return totally bogus information
* in here (Matrox is one)! Under DOS this works OK, but under OS/2 * in here (Matrox is one)! Under DOS this works OK, but under OS/2
* we are screwed. * we are screwed.
*/ */
if (state->pmInfo->setWindow >= pmLen || if (state->pmInfo->setWindow >= pmLen ||
state->pmInfo->setDisplayStart >= pmLen || state->pmInfo->setDisplayStart >= pmLen ||
state->pmInfo->setPalette >= pmLen || state->pmInfo->setPalette >= pmLen ||
state->pmInfo->IOPrivInfo >= pmLen) { state->pmInfo->IOPrivInfo >= pmLen) {
if (VBE_shared) if (VBE_shared)
PM_freeShared(state->pmInfo); PM_freeShared(state->pmInfo);
else else
PM_free(state->pmInfo); PM_free(state->pmInfo);
state->pmInfo32 = state->pmInfo = NULL; state->pmInfo32 = state->pmInfo = NULL;
return; return;
} }
/* Read the IO priveledge info and determine if we need to /* Read the IO priveledge info and determine if we need to
* pass a selector to MMIO registers to the bank switch code. * pass a selector to MMIO registers to the bank switch code.
* Since we no longer support selector allocation, we no longer * Since we no longer support selector allocation, we no longer
* support this mechanism so we disable the protected mode * support this mechanism so we disable the protected mode
* interface in this case. * interface in this case.
*/ */
if (state->pmInfo->IOPrivInfo && !state->MMIOSel) { if (state->pmInfo->IOPrivInfo && !state->MMIOSel) {
ushort *p = (ushort*)((uchar*)state->pmInfo + state->pmInfo->IOPrivInfo); ushort *p = (ushort*)((uchar*)state->pmInfo + state->pmInfo->IOPrivInfo);
while (*p != 0xFFFF) while (*p != 0xFFFF)
p++; p++;
p++; p++;
if (*p != 0xFFFF) if (*p != 0xFFFF)
VBE_freePMCode(); VBE_freePMCode();
} }
} }
} }
void * VBEAPI VBE_getSetBank(void) void * VBEAPI VBE_getSetBank(void)
@ -1050,10 +1050,10 @@ void * VBEAPI VBE_getSetBank(void)
****************************************************************************/ ****************************************************************************/
{ {
if (state->VBEVersion >= 0x200) { if (state->VBEVersion >= 0x200) {
InitPMCode(); InitPMCode();
if (state->pmInfo) if (state->pmInfo)
return (uchar*)state->pmInfo + state->pmInfo->setWindow; return (uchar*)state->pmInfo + state->pmInfo->setWindow;
} }
return NULL; return NULL;
} }
@ -1066,10 +1066,10 @@ void * VBEAPI VBE_getSetDisplayStart(void)
****************************************************************************/ ****************************************************************************/
{ {
if (state->VBEVersion >= 0x200) { if (state->VBEVersion >= 0x200) {
InitPMCode(); InitPMCode();
if (state->pmInfo) if (state->pmInfo)
return (uchar*)state->pmInfo + state->pmInfo->setDisplayStart; return (uchar*)state->pmInfo + state->pmInfo->setDisplayStart;
} }
return NULL; return NULL;
} }
@ -1082,10 +1082,10 @@ void * VBEAPI VBE_getSetPalette(void)
****************************************************************************/ ****************************************************************************/
{ {
if (state->VBEVersion >= 0x200) { if (state->VBEVersion >= 0x200) {
InitPMCode(); InitPMCode();
if (state->pmInfo) if (state->pmInfo)
return (uchar*)state->pmInfo + state->pmInfo->setPalette; return (uchar*)state->pmInfo + state->pmInfo->setPalette;
} }
return NULL; return NULL;
} }
@ -1104,13 +1104,13 @@ void VBEAPI VBE_freePMCode(void)
****************************************************************************/ ****************************************************************************/
{ {
if (state->pmInfo) { if (state->pmInfo) {
if (VBE_shared) if (VBE_shared)
PM_freeShared(state->pmInfo); PM_freeShared(state->pmInfo);
else else
PM_free(state->pmInfo); PM_free(state->pmInfo);
state->pmInfo = NULL; state->pmInfo = NULL;
state->pmInfo32 = NULL; state->pmInfo32 = NULL;
} }
} }
void VBEAPI VBE_sharePMCode(void) void VBEAPI VBE_sharePMCode(void)
@ -1183,31 +1183,31 @@ ibool VBEAPI VBE_getBankFunc32(int *codeLen,void **bankFunc,int dualBanks,
InitPMCode(); InitPMCode();
if (state->VBEVersion >= 0x200 && state->pmInfo32 && !state->MMIOSel) { if (state->VBEVersion >= 0x200 && state->pmInfo32 && !state->MMIOSel) {
code = (uchar*)state->pmInfo32 + state->pmInfo32->setWindow; code = (uchar*)state->pmInfo32 + state->pmInfo32->setWindow;
if (state->pmInfo32->extensionSig == VBE20_EXT_SIG) if (state->pmInfo32->extensionSig == VBE20_EXT_SIG)
len = state->pmInfo32->setWindowLen-1; len = state->pmInfo32->setWindowLen-1;
else { else {
/* We are running on a system without the UniVBE 5.2 extension. /* We are running on a system without the UniVBE 5.2 extension.
* We do as best we can by scanning through the code for the * We do as best we can by scanning through the code for the
* ret function to determine the length. This is not foolproof, * ret function to determine the length. This is not foolproof,
* but is the best we can do. * but is the best we can do.
*/ */
p = code; p = code;
while (*p != 0xC3) while (*p != 0xC3)
p++; p++;
len = p - code; len = p - code;
} }
if ((len + sizeof(VBE20A_bankFunc32_Start) + sizeof(VBE20_bankFunc32_End)) > sizeof(bankFunc32)) if ((len + sizeof(VBE20A_bankFunc32_Start) + sizeof(VBE20_bankFunc32_End)) > sizeof(bankFunc32))
PM_fatalError("32-bit bank switch function too long!"); PM_fatalError("32-bit bank switch function too long!");
copy(p,bankFunc32,VBE20A_bankFunc32_Start); copy(p,bankFunc32,VBE20A_bankFunc32_Start);
memcpy(p,code,len); memcpy(p,code,len);
p += len; p += len;
copy(p,p,VBE20_bankFunc32_End); copy(p,p,VBE20_bankFunc32_End);
*codeLen = p - bankFunc32; *codeLen = p - bankFunc32;
bankFunc32[VBE20_adjustOffset] = (uchar)bankAdjust; bankFunc32[VBE20_adjustOffset] = (uchar)bankAdjust;
*bankFunc = bankFunc32; *bankFunc = bankFunc32;
return true; return true;
} }
return false; return false;
} }

View File

@ -64,8 +64,8 @@ Initialise the counter and return the frequency of the counter.
static void GetCounterFrequency( static void GetCounterFrequency(
CPU_largeInteger *freq) CPU_largeInteger *freq)
{ {
// TODO: Return the frequency of the counter in here. You should try to /* TODO: Return the frequency of the counter in here. You should try to */
// normalise this value to be around 100,000 ticks per second. /* normalise this value to be around 100,000 ticks per second. */
freq->low = 1000000; freq->low = 1000000;
freq->high = 0; freq->high = 0;
} }

View File

@ -59,7 +59,7 @@ events.
****************************************************************************/ ****************************************************************************/
ulong _EVT_getTicks(void) ulong _EVT_getTicks(void)
{ {
// TODO: Implement this for your OS! /* TODO: Implement this for your OS! */
} }
/**************************************************************************** /****************************************************************************
@ -68,36 +68,36 @@ Pumps all messages in the application message queue into our event queue.
****************************************************************************/ ****************************************************************************/
static void _EVT_pumpMessages(void) static void _EVT_pumpMessages(void)
{ {
// TODO: The purpose of this function is to read all keyboard and mouse /* TODO: The purpose of this function is to read all keyboard and mouse */
// events from the OS specific event queue, translate them and post /* events from the OS specific event queue, translate them and post */
// them into the SciTech event queue. /* them into the SciTech event queue. */
// /* */
// NOTE: There are a couple of important things that this function must /* NOTE: There are a couple of important things that this function must */
// take care of: /* take care of: */
// /* */
// 1. Support for KEYDOWN, KEYREPEAT and KEYUP is required. /* 1. Support for KEYDOWN, KEYREPEAT and KEYUP is required. */
// /* */
// 2. Support for reading hardware scan code as well as ASCII /* 2. Support for reading hardware scan code as well as ASCII */
// translated values is required. Games use the scan codes rather /* translated values is required. Games use the scan codes rather */
// than ASCII values. Scan codes go into the high order byte of the /* than ASCII values. Scan codes go into the high order byte of the */
// keyboard message field. /* keyboard message field. */
// /* */
// 3. Support for at least reading mouse motion data (mickeys) from the /* 3. Support for at least reading mouse motion data (mickeys) from the */
// mouse is required. Using the mickey values, we can then translate /* mouse is required. Using the mickey values, we can then translate */
// to mouse cursor coordinates scaled to the range of the current /* to mouse cursor coordinates scaled to the range of the current */
// graphics display mode. Mouse values are scaled based on the /* graphics display mode. Mouse values are scaled based on the */
// global 'rangeX' and 'rangeY'. /* global 'rangeX' and 'rangeY'. */
// /* */
// 4. Support for a timestamp for the events is required, which is /* 4. Support for a timestamp for the events is required, which is */
// defined as the number of milliseconds since some event (usually /* defined as the number of milliseconds since some event (usually */
// system startup). This is the timestamp when the event occurred /* system startup). This is the timestamp when the event occurred */
// (ie: at interrupt time) not when it was stuff into the SciTech /* (ie: at interrupt time) not when it was stuff into the SciTech */
// event queue. /* event queue. */
// /* */
// 5. Support for mouse double click events. If the OS has a native /* 5. Support for mouse double click events. If the OS has a native */
// mechanism to determine this, it should be used. Otherwise the /* mechanism to determine this, it should be used. Otherwise the */
// time stamp information will be used by the generic event code /* time stamp information will be used by the generic event code */
// to generate double click events. /* to generate double click events. */
} }
/**************************************************************************** /****************************************************************************
@ -141,7 +141,7 @@ void EVTAPI EVT_init(
initEventQueue(); initEventQueue();
memset(keyUpMsg,0,sizeof(keyUpMsg)); memset(keyUpMsg,0,sizeof(keyUpMsg));
// TODO: Do any OS specific initialisation here /* TODO: Do any OS specific initialisation here */
/* Catch program termination signals so we can clean up properly */ /* Catch program termination signals so we can clean up properly */
signal(SIGABRT, _EVT_abort); signal(SIGABRT, _EVT_abort);
@ -171,7 +171,7 @@ and this function can be used to resume it again later.
****************************************************************************/ ****************************************************************************/
void EVT_resume(void) void EVT_resume(void)
{ {
// Do nothing for non DOS systems /* Do nothing for non DOS systems */
} }
/**************************************************************************** /****************************************************************************
@ -181,7 +181,7 @@ de-install the event handling code.
****************************************************************************/ ****************************************************************************/
void EVT_suspend(void) void EVT_suspend(void)
{ {
// Do nothing for non DOS systems /* Do nothing for non DOS systems */
} }
/**************************************************************************** /****************************************************************************
@ -195,5 +195,5 @@ void EVT_exit(void)
signal(SIGFPE, SIG_DFL); signal(SIGFPE, SIG_DFL);
signal(SIGINT, SIG_DFL); signal(SIGINT, SIG_DFL);
// TODO: Do any OS specific cleanup in here /* TODO: Do any OS specific cleanup in here */
} }

View File

@ -28,5 +28,5 @@
* *
****************************************************************************/ ****************************************************************************/
// This is where you include OS specific headers for the event handling /* This is where you include OS specific headers for the event handling */
// library. /* library. */

View File

@ -38,7 +38,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
// TODO: Include any BeOS specific headers here! /* TODO: Include any BeOS specific headers here! */
/*--------------------------- Global variables ----------------------------*/ /*--------------------------- Global variables ----------------------------*/
@ -48,12 +48,12 @@ static void (PMAPIP fatalErrorCleanup)(void) = NULL;
void PMAPI PM_init(void) void PMAPI PM_init(void)
{ {
// TODO: Do any initialisation in here. This includes getting IOPL /* TODO: Do any initialisation in here. This includes getting IOPL */
// access for the process calling PM_init. This will get called /* access for the process calling PM_init. This will get called */
// more than once. /* more than once. */
// TODO: If you support the supplied MTRR register stuff (you need to /* TODO: If you support the supplied MTRR register stuff (you need to */
// be at ring 0 for this!), you should initialise it in here. /* be at ring 0 for this!), you should initialise it in here. */
/* MTRR_init(); */ /* MTRR_init(); */
} }
@ -68,9 +68,9 @@ void PMAPI PM_backslash(char *s)
{ {
uint pos = strlen(s); uint pos = strlen(s);
if (s[pos-1] != '/') { if (s[pos-1] != '/') {
s[pos] = '/'; s[pos] = '/';
s[pos+1] = '\0'; s[pos+1] = '\0';
} }
} }
void PMAPI PM_setFatalErrorCleanup( void PMAPI PM_setFatalErrorCleanup(
@ -81,112 +81,112 @@ void PMAPI PM_setFatalErrorCleanup(
void PMAPI PM_fatalError(const char *msg) void PMAPI PM_fatalError(const char *msg)
{ {
// TODO: If you are running in a GUI environment without a console, /* TODO: If you are running in a GUI environment without a console, */
// this needs to be changed to bring up a fatal error message /* this needs to be changed to bring up a fatal error message */
// box and terminate the program. /* box and terminate the program. */
if (fatalErrorCleanup) if (fatalErrorCleanup)
fatalErrorCleanup(); fatalErrorCleanup();
fprintf(stderr,"%s\n", msg); fprintf(stderr,"%s\n", msg);
exit(1); exit(1);
} }
void * PMAPI PM_getVESABuf(uint *len,uint *rseg,uint *roff) void * PMAPI PM_getVESABuf(uint *len,uint *rseg,uint *roff)
{ {
// No BIOS access for the BeOS /* No BIOS access for the BeOS */
return NULL; return NULL;
} }
int PMAPI PM_kbhit(void) int PMAPI PM_kbhit(void)
{ {
// TODO: This function checks if a key is available to be read. This /* TODO: This function checks if a key is available to be read. This */
// should be implemented, but is mostly used by the test programs /* should be implemented, but is mostly used by the test programs */
// these days. /* these days. */
return true; return true;
} }
int PMAPI PM_getch(void) int PMAPI PM_getch(void)
{ {
// TODO: This returns the ASCII code of the key pressed. This /* TODO: This returns the ASCII code of the key pressed. This */
// should be implemented, but is mostly used by the test programs /* should be implemented, but is mostly used by the test programs */
// these days. /* these days. */
return 0xD; return 0xD;
} }
int PMAPI PM_openConsole(void) int PMAPI PM_openConsole(void)
{ {
// TODO: Opens up a fullscreen console for graphics output. If your /* TODO: Opens up a fullscreen console for graphics output. If your */
// console does not have graphics/text modes, this can be left /* console does not have graphics/text modes, this can be left */
// empty. The main purpose of this is to disable console switching /* empty. The main purpose of this is to disable console switching */
// when in graphics modes if you can switch away from fullscreen /* when in graphics modes if you can switch away from fullscreen */
// consoles (if you want to allow switching, this can be done /* consoles (if you want to allow switching, this can be done */
// elsewhere with a full save/restore state of the graphics mode). /* elsewhere with a full save/restore state of the graphics mode). */
return 0; return 0;
} }
int PMAPI PM_getConsoleStateSize(void) int PMAPI PM_getConsoleStateSize(void)
{ {
// TODO: Returns the size of the console state buffer used to save the /* TODO: Returns the size of the console state buffer used to save the */
// state of the console before going into graphics mode. This is /* state of the console before going into graphics mode. This is */
// used to restore the console back to normal when we are done. /* used to restore the console back to normal when we are done. */
return 1; return 1;
} }
void PMAPI PM_saveConsoleState(void *stateBuf,int console_id) void PMAPI PM_saveConsoleState(void *stateBuf,int console_id)
{ {
// TODO: Saves the state of the console into the state buffer. This is /* TODO: Saves the state of the console into the state buffer. This is */
// used to restore the console back to normal when we are done. /* used to restore the console back to normal when we are done. */
// We will always restore 80x25 text mode after being in graphics /* We will always restore 80x25 text mode after being in graphics */
// mode, so if restoring text mode is all you need to do this can /* mode, so if restoring text mode is all you need to do this can */
// be left empty. /* be left empty. */
} }
void PMAPI PM_restoreConsoleState(const void *stateBuf,int console_id) void PMAPI PM_restoreConsoleState(const void *stateBuf,int console_id)
{ {
// TODO: Restore the state of the console from the state buffer. This is /* TODO: Restore the state of the console from the state buffer. This is */
// used to restore the console back to normal when we are done. /* used to restore the console back to normal when we are done. */
// We will always restore 80x25 text mode after being in graphics /* We will always restore 80x25 text mode after being in graphics */
// mode, so if restoring text mode is all you need to do this can /* mode, so if restoring text mode is all you need to do this can */
// be left empty. /* be left empty. */
} }
void PMAPI PM_closeConsole(int console_id) void PMAPI PM_closeConsole(int console_id)
{ {
// TODO: Close the console when we are done, going back to text mode. /* TODO: Close the console when we are done, going back to text mode. */
} }
void PM_setOSCursorLocation(int x,int y) void PM_setOSCursorLocation(int x,int y)
{ {
// TODO: Set the OS console cursor location to the new value. This is /* TODO: Set the OS console cursor location to the new value. This is */
// generally used for new OS ports (used mostly for DOS). /* generally used for new OS ports (used mostly for DOS). */
} }
void PM_setOSScreenWidth(int width,int height) void PM_setOSScreenWidth(int width,int height)
{ {
// TODO: Set the OS console screen width. This is generally unused for /* TODO: Set the OS console screen width. This is generally unused for */
// new OS ports. /* new OS ports. */
} }
ibool PMAPI PM_setRealTimeClockHandler(PM_intHandler ih, int frequency) ibool PMAPI PM_setRealTimeClockHandler(PM_intHandler ih, int frequency)
{ {
// TODO: Install a real time clock interrupt handler. Normally this /* TODO: Install a real time clock interrupt handler. Normally this */
// will not be supported from most OS'es in user land, so an /* will not be supported from most OS'es in user land, so an */
// alternative mechanism is needed to enable software stereo. /* alternative mechanism is needed to enable software stereo. */
// Hence leave this unimplemented unless you have a high priority /* Hence leave this unimplemented unless you have a high priority */
// mechanism to call the 32-bit callback when the real time clock /* mechanism to call the 32-bit callback when the real time clock */
// interrupt fires. /* interrupt fires. */
return false; return false;
} }
void PMAPI PM_setRealTimeClockFrequency(int frequency) void PMAPI PM_setRealTimeClockFrequency(int frequency)
{ {
// TODO: Set the real time clock interrupt frequency. Used for stereo /* TODO: Set the real time clock interrupt frequency. Used for stereo */
// LC shutter glasses when doing software stereo. Usually sets /* LC shutter glasses when doing software stereo. Usually sets */
// the frequency to around 2048 Hz. /* the frequency to around 2048 Hz. */
} }
void PMAPI PM_restoreRealTimeClockHandler(void) void PMAPI PM_restoreRealTimeClockHandler(void)
{ {
// TODO: Restores the real time clock handler. /* TODO: Restores the real time clock handler. */
} }
char * PMAPI PM_getCurrentPath( char * PMAPI PM_getCurrentPath(
@ -219,8 +219,8 @@ const char * PMAPI PM_getNucleusConfigPath(void)
const char * PMAPI PM_getUniqueID(void) const char * PMAPI PM_getUniqueID(void)
{ {
// TODO: Return a unique ID for the machine. If a unique ID is not /* TODO: Return a unique ID for the machine. If a unique ID is not */
// available, return the machine name. /* available, return the machine name. */
static char buf[128]; static char buf[128];
gethostname(buf, 128); gethostname(buf, 128);
return buf; return buf;
@ -228,7 +228,7 @@ const char * PMAPI PM_getUniqueID(void)
const char * PMAPI PM_getMachineName(void) const char * PMAPI PM_getMachineName(void)
{ {
// TODO: Return the network machine name for the machine. /* TODO: Return the network machine name for the machine. */
static char buf[128]; static char buf[128];
gethostname(buf, 128); gethostname(buf, 128);
return buf; return buf;
@ -236,7 +236,7 @@ const char * PMAPI PM_getMachineName(void)
void * PMAPI PM_getBIOSPointer(void) void * PMAPI PM_getBIOSPointer(void)
{ {
// No BIOS access on the BeOS /* No BIOS access on the BeOS */
return NULL; return NULL;
} }
@ -244,212 +244,212 @@ void * PMAPI PM_getA0000Pointer(void)
{ {
static void *bankPtr; static void *bankPtr;
if (!bankPtr) if (!bankPtr)
bankPtr = PM_mapPhysicalAddr(0xA0000,0xFFFF,true); bankPtr = PM_mapPhysicalAddr(0xA0000,0xFFFF,true);
return bankPtr; return bankPtr;
} }
void * PMAPI PM_mapPhysicalAddr(ulong base,ulong limit,ibool isCached) void * PMAPI PM_mapPhysicalAddr(ulong base,ulong limit,ibool isCached)
{ {
// TODO: This function maps a physical memory address to a linear /* TODO: This function maps a physical memory address to a linear */
// address in the address space of the calling process. /* address in the address space of the calling process. */
// NOTE: This function *must* be able to handle any phsyical base /* NOTE: This function *must* be able to handle any phsyical base */
// address, and hence you will have to handle rounding of /* address, and hence you will have to handle rounding of */
// the physical base address to a page boundary (ie: 4Kb on /* the physical base address to a page boundary (ie: 4Kb on */
// x86 CPU's) to be able to properly map in the memory /* x86 CPU's) to be able to properly map in the memory */
// region. /* region. */
// NOTE: If possible the isCached bit should be used to ensure that /* NOTE: If possible the isCached bit should be used to ensure that */
// the PCD (Page Cache Disable) and PWT (Page Write Through) /* the PCD (Page Cache Disable) and PWT (Page Write Through) */
// bits are set to disable caching for a memory mapping used /* bits are set to disable caching for a memory mapping used */
// for MMIO register access. We also disable caching using /* for MMIO register access. We also disable caching using */
// the MTRR registers for Pentium Pro and later chipsets so if /* the MTRR registers for Pentium Pro and later chipsets so if */
// MTRR support is enabled for your OS then you can safely ignore /* MTRR support is enabled for your OS then you can safely ignore */
// the isCached flag and always enable caching in the page /* the isCached flag and always enable caching in the page */
// tables. /* tables. */
return NULL; return NULL;
} }
void PMAPI PM_freePhysicalAddr(void *ptr,ulong limit) void PMAPI PM_freePhysicalAddr(void *ptr,ulong limit)
{ {
// TODO: This function will free a physical memory mapping previously /* TODO: This function will free a physical memory mapping previously */
// allocated with PM_mapPhysicalAddr() if at all possible. If /* allocated with PM_mapPhysicalAddr() if at all possible. If */
// you can't free physical memory mappings, simply do nothing. /* you can't free physical memory mappings, simply do nothing. */
} }
ulong PMAPI PM_getPhysicalAddr(void *p) ulong PMAPI PM_getPhysicalAddr(void *p)
{ {
// TODO: This function should find the physical address of a linear /* TODO: This function should find the physical address of a linear */
// address. /* address. */
return 0xFFFFFFFFUL; return 0xFFFFFFFFUL;
} }
void PMAPI PM_sleep(ulong milliseconds) void PMAPI PM_sleep(ulong milliseconds)
{ {
// TODO: Put the process to sleep for milliseconds /* TODO: Put the process to sleep for milliseconds */
} }
int PMAPI PM_getCOMPort(int port) int PMAPI PM_getCOMPort(int port)
{ {
// TODO: Re-code this to determine real values using the Plug and Play /* TODO: Re-code this to determine real values using the Plug and Play */
// manager for the OS. /* manager for the OS. */
switch (port) { switch (port) {
case 0: return 0x3F8; case 0: return 0x3F8;
case 1: return 0x2F8; case 1: return 0x2F8;
} }
return 0; return 0;
} }
int PMAPI PM_getLPTPort(int port) int PMAPI PM_getLPTPort(int port)
{ {
// TODO: Re-code this to determine real values using the Plug and Play /* TODO: Re-code this to determine real values using the Plug and Play */
// manager for the OS. /* manager for the OS. */
switch (port) { switch (port) {
case 0: return 0x3BC; case 0: return 0x3BC;
case 1: return 0x378; case 1: return 0x378;
case 2: return 0x278; case 2: return 0x278;
} }
return 0; return 0;
} }
void * PMAPI PM_mallocShared(long size) void * PMAPI PM_mallocShared(long size)
{ {
// TODO: This is used to allocate memory that is shared between process /* TODO: This is used to allocate memory that is shared between process */
// that all access the common Nucleus drivers via a common display /* that all access the common Nucleus drivers via a common display */
// driver DLL. If your OS does not support shared memory (or if /* driver DLL. If your OS does not support shared memory (or if */
// the display driver does not need to allocate shared memory /* the display driver does not need to allocate shared memory */
// for each process address space), this should just call PM_malloc. /* for each process address space), this should just call PM_malloc. */
return PM_malloc(size); return PM_malloc(size);
} }
void PMAPI PM_freeShared(void *ptr) void PMAPI PM_freeShared(void *ptr)
{ {
// TODO: Free the shared memory block. This will be called in the context /* TODO: Free the shared memory block. This will be called in the context */
// of the original calling process that allocated the shared /* of the original calling process that allocated the shared */
// memory with PM_mallocShared. Simply call free if you do not /* memory with PM_mallocShared. Simply call free if you do not */
// need this. /* need this. */
PM_free(ptr); PM_free(ptr);
} }
void * PMAPI PM_mapToProcess(void *base,ulong limit) void * PMAPI PM_mapToProcess(void *base,ulong limit)
{ {
// TODO: This function is used to map a physical memory mapping /* TODO: This function is used to map a physical memory mapping */
// previously allocated with PM_mapPhysicalAddr into the /* previously allocated with PM_mapPhysicalAddr into the */
// address space of the calling process. If the memory mapping /* address space of the calling process. If the memory mapping */
// allocated by PM_mapPhysicalAddr is global to all processes, /* allocated by PM_mapPhysicalAddr is global to all processes, */
// simply return the pointer. /* simply return the pointer. */
return base; return base;
} }
void * PMAPI PM_mapRealPointer(uint r_seg,uint r_off) void * PMAPI PM_mapRealPointer(uint r_seg,uint r_off)
{ {
// No BIOS access on the BeOS /* No BIOS access on the BeOS */
return NULL; return NULL;
} }
void * PMAPI PM_allocRealSeg(uint size,uint *r_seg,uint *r_off) void * PMAPI PM_allocRealSeg(uint size,uint *r_seg,uint *r_off)
{ {
// No BIOS access on the BeOS /* No BIOS access on the BeOS */
return NULL; return NULL;
} }
void PMAPI PM_freeRealSeg(void *mem) void PMAPI PM_freeRealSeg(void *mem)
{ {
// No BIOS access on the BeOS /* No BIOS access on the BeOS */
} }
void PMAPI DPMI_int86(int intno, DPMI_regs *regs) void PMAPI DPMI_int86(int intno, DPMI_regs *regs)
{ {
// No BIOS access on the BeOS /* No BIOS access on the BeOS */
} }
int PMAPI PM_int86(int intno, RMREGS *in, RMREGS *out) int PMAPI PM_int86(int intno, RMREGS *in, RMREGS *out)
{ {
// No BIOS access on the BeOS /* No BIOS access on the BeOS */
return 0; return 0;
} }
int PMAPI PM_int86x(int intno, RMREGS *in, RMREGS *out, int PMAPI PM_int86x(int intno, RMREGS *in, RMREGS *out,
RMSREGS *sregs) RMSREGS *sregs)
{ {
// No BIOS access on the BeOS /* No BIOS access on the BeOS */
return 0; return 0;
} }
void PMAPI PM_callRealMode(uint seg,uint off, RMREGS *in, void PMAPI PM_callRealMode(uint seg,uint off, RMREGS *in,
RMSREGS *sregs) RMSREGS *sregs)
{ {
// No BIOS access on the BeOS /* No BIOS access on the BeOS */
} }
void PMAPI PM_availableMemory(ulong *physical,ulong *total) void PMAPI PM_availableMemory(ulong *physical,ulong *total)
{ {
// TODO: Report the amount of available memory, both the amount of /* TODO: Report the amount of available memory, both the amount of */
// physical memory left and the amount of virtual memory left. /* physical memory left and the amount of virtual memory left. */
// If the OS does not provide these services, report 0's. /* If the OS does not provide these services, report 0's. */
*physical = *total = 0; *physical = *total = 0;
} }
void * PMAPI PM_allocLockedMem(uint size,ulong *physAddr,ibool contiguous,ibool below16Meg) void * PMAPI PM_allocLockedMem(uint size,ulong *physAddr,ibool contiguous,ibool below16Meg)
{ {
// TODO: Allocate a block of locked, physical memory of the specified /* TODO: Allocate a block of locked, physical memory of the specified */
// size. This is used for bus master operations. If this is not /* size. This is used for bus master operations. If this is not */
// supported by the OS, return NULL and bus mastering will not /* supported by the OS, return NULL and bus mastering will not */
// be used. /* be used. */
return NULL; return NULL;
} }
void PMAPI PM_freeLockedMem(void *p,uint size,ibool contiguous) void PMAPI PM_freeLockedMem(void *p,uint size,ibool contiguous)
{ {
// TODO: Free a memory block allocated with PM_allocLockedMem. /* TODO: Free a memory block allocated with PM_allocLockedMem. */
} }
void PMAPI PM_setBankA(int bank) void PMAPI PM_setBankA(int bank)
{ {
// No BIOS access on the BeOS /* No BIOS access on the BeOS */
} }
void PMAPI PM_setBankAB(int bank) void PMAPI PM_setBankAB(int bank)
{ {
// No BIOS access on the BeOS /* No BIOS access on the BeOS */
} }
void PMAPI PM_setCRTStart(int x,int y,int waitVRT) void PMAPI PM_setCRTStart(int x,int y,int waitVRT)
{ {
// No BIOS access on the BeOS /* No BIOS access on the BeOS */
} }
ibool PMAPI PM_enableWriteCombine(ulong base,ulong length,uint type) ibool PMAPI PM_enableWriteCombine(ulong base,ulong length,uint type)
{ {
// TODO: This function should enable Pentium Pro and Pentium II MTRR /* TODO: This function should enable Pentium Pro and Pentium II MTRR */
// write combining for the passed in physical memory base address /* write combining for the passed in physical memory base address */
// and length. Normally this is done via calls to an OS specific /* and length. Normally this is done via calls to an OS specific */
// device driver as this can only be done at ring 0. /* device driver as this can only be done at ring 0. */
// /* */
// NOTE: This is a *very* important function to implement! If you do /* NOTE: This is a *very* important function to implement! If you do */
// not implement, graphics performance on the latest Intel chips /* not implement, graphics performance on the latest Intel chips */
// will be severly impaired. For sample code that can be used /* will be severly impaired. For sample code that can be used */
// directly in a ring 0 device driver, see the MSDOS implementation /* directly in a ring 0 device driver, see the MSDOS implementation */
// which includes assembler code to do this directly (if the /* which includes assembler code to do this directly (if the */
// program is running at ring 0). /* program is running at ring 0). */
return false; return false;
} }
ibool PMAPI PM_doBIOSPOST(ushort axVal,ulong BIOSPhysAddr,void *mappedBIOS) ibool PMAPI PM_doBIOSPOST(ushort axVal,ulong BIOSPhysAddr,void *mappedBIOS)
{ {
// TODO: This function is used to run the BIOS POST code on a secondary /* TODO: This function is used to run the BIOS POST code on a secondary */
// controller to initialise it for use. This is not necessary /* controller to initialise it for use. This is not necessary */
// for multi-controller operation, but it will make it a lot /* for multi-controller operation, but it will make it a lot */
// more convenicent for end users (otherwise they have to boot /* more convenicent for end users (otherwise they have to boot */
// the system once with the secondary controller as primary, and /* the system once with the secondary controller as primary, and */
// then boot with both controllers installed). /* then boot with both controllers installed). */
// /* */
// Even if you don't support full BIOS access, it would be /* Even if you don't support full BIOS access, it would be */
// adviseable to be able to POST the secondary controllers in the /* adviseable to be able to POST the secondary controllers in the */
// system using this function as a minimum requirement. Some /* system using this function as a minimum requirement. Some */
// graphics hardware has registers that contain values that only /* graphics hardware has registers that contain values that only */
// the BIOS knows about, which makes bring up a card from cold /* the BIOS knows about, which makes bring up a card from cold */
// reset difficult if the BIOS has not POST'ed it. /* reset difficult if the BIOS has not POST'ed it. */
return false; return false;
} }
@ -506,7 +506,7 @@ ibool PMAPI PM_driveValid(
char drive) char drive)
{ {
if (drive == 3) if (drive == 3)
return true; return true;
return false; return false;
} }
@ -533,7 +533,7 @@ void PMAPI PM_setFileAttr(
const char *filename, const char *filename,
uint attrib) uint attrib)
{ {
// TODO: Set the file attributes for a file /* TODO: Set the file attributes for a file */
(void)filename; (void)filename;
(void)attrib; (void)attrib;
} }

View File

@ -36,7 +36,7 @@ Initialise the Zen Timer module internals.
****************************************************************************/ ****************************************************************************/
void _ZTimerInit(void) void _ZTimerInit(void)
{ {
// TODO: Do any specific internal initialisation in here /* TODO: Do any specific internal initialisation in here */
} }
/**************************************************************************** /****************************************************************************
@ -46,8 +46,8 @@ Start the Zen Timer counting.
static void _LZTimerOn( static void _LZTimerOn(
LZTimerObject *tm) LZTimerObject *tm)
{ {
// TODO: Start the Zen Timer counting. This should be a macro if /* TODO: Start the Zen Timer counting. This should be a macro if */
// possible. /* possible. */
} }
/**************************************************************************** /****************************************************************************
@ -57,8 +57,8 @@ Compute the lap time since the timer was started.
static ulong _LZTimerLap( static ulong _LZTimerLap(
LZTimerObject *tm) LZTimerObject *tm)
{ {
// TODO: Compute the lap time between the current time and when the /* TODO: Compute the lap time between the current time and when the */
// timer was started. /* timer was started. */
return 0; return 0;
} }
@ -69,7 +69,7 @@ Stop the Zen Timer counting.
static void _LZTimerOff( static void _LZTimerOff(
LZTimerObject *tm) LZTimerObject *tm)
{ {
// TODO: Stop the timer counting. Should be a macro if possible. /* TODO: Stop the timer counting. Should be a macro if possible. */
} }
/**************************************************************************** /****************************************************************************
@ -79,7 +79,7 @@ Compute the elapsed time in microseconds between start and end timings.
static ulong _LZTimerCount( static ulong _LZTimerCount(
LZTimerObject *tm) LZTimerObject *tm)
{ {
// TODO: Compute the elapsed time and return it. Always microseconds. /* TODO: Compute the elapsed time and return it. Always microseconds. */
return 0; return 0;
} }
@ -95,9 +95,9 @@ Read the Long Period timer from the OS
****************************************************************************/ ****************************************************************************/
static ulong _ULZReadTime(void) static ulong _ULZReadTime(void)
{ {
// TODO: Read the long period timer from the OS. The resolution of this /* TODO: Read the long period timer from the OS. The resolution of this */
// timer should be around 1/20 of a second for timing long /* timer should be around 1/20 of a second for timing long */
// periods if possible. /* periods if possible. */
} }
/**************************************************************************** /****************************************************************************

View File

@ -98,9 +98,9 @@ static ibool TryPath(
strcpy(filename,bpdpath); strcpy(filename,bpdpath);
strcat(filename,dllname); strcat(filename,dllname);
if ((f = fopen(filename,"rb")) == NULL) if ((f = fopen(filename,"rb")) == NULL)
return false; return false;
if (cachedpath) if (cachedpath)
strcpy(cachedpath,bpdpath); strcpy(cachedpath,bpdpath);
fclose(f); fclose(f);
return true; return true;
} }
@ -121,20 +121,20 @@ static ibool GetLocalOverride(void)
static ibool local_override = -1; static ibool local_override = -1;
if (local_override == -1) { if (local_override == -1) {
local_override = false; local_override = false;
strcpy(filename,PM_getNucleusPath()); strcpy(filename,PM_getNucleusPath());
PM_backslash(filename); PM_backslash(filename);
strcat(filename,"graphics.ini"); strcat(filename,"graphics.ini");
if ((f = fopen(filename,"r")) != NULL) { if ((f = fopen(filename,"r")) != NULL) {
while (!feof(f) && fgets(filename,sizeof(filename),f)) { while (!feof(f) && fgets(filename,sizeof(filename),f)) {
if (strnicmp(filename,"uselocal",8) == 0) { if (strnicmp(filename,"uselocal",8) == 0) {
local_override = ((*(filename+9) - '0') == 1); local_override = ((*(filename+9) - '0') == 1);
break; break;
} }
} }
fclose(f); fclose(f);
} }
} }
return local_override; return local_override;
} }
@ -164,44 +164,44 @@ ibool PMAPI PM_findBPD(
/* On the first call determine the path to the Nucleus drivers */ /* On the first call determine the path to the Nucleus drivers */
if (cachedpath[0] == 0) { if (cachedpath[0] == 0) {
/* First try in the global system Nucleus driver path if /* First try in the global system Nucleus driver path if
* the local override setting is not enabled. * the local override setting is not enabled.
*/ */
PM_init(); PM_init();
if (!GetLocalOverride()) { if (!GetLocalOverride()) {
if (TryPath(bpdpath,cachedpath,PM_getNucleusPath(),"",dllname)) if (TryPath(bpdpath,cachedpath,PM_getNucleusPath(),"",dllname))
return true; return true;
} }
/* Next try in the local application directory if available */ /* Next try in the local application directory if available */
if (localBPDPath[0] != 0) { if (localBPDPath[0] != 0) {
if (TryPath(bpdpath,cachedpath,localBPDPath,"",dllname)) if (TryPath(bpdpath,cachedpath,localBPDPath,"",dllname))
return true; return true;
} }
else { else {
#if !defined(__WIN32_VXD__) && !defined(__NT_DRIVER__) #if !defined(__WIN32_VXD__) && !defined(__NT_DRIVER__)
char *mgl_root; char *mgl_root;
if ((mgl_root = getenv("MGL_ROOT")) != NULL) { if ((mgl_root = getenv("MGL_ROOT")) != NULL) {
if (TryPath(bpdpath,cachedpath,mgl_root,"drivers",dllname)) if (TryPath(bpdpath,cachedpath,mgl_root,"drivers",dllname))
return true; return true;
} }
#endif #endif
PM_getCurrentPath(bpdpath,PM_MAX_PATH); PM_getCurrentPath(bpdpath,PM_MAX_PATH);
if (TryPath(bpdpath,cachedpath,bpdpath,"drivers",dllname)) if (TryPath(bpdpath,cachedpath,bpdpath,"drivers",dllname))
return true; return true;
} }
/* Finally try in the global system path again so that we /* Finally try in the global system path again so that we
* will still find the drivers in the global system path if * will still find the drivers in the global system path if
* the local override option is on, but the application does * the local override option is on, but the application does
* not have any local override drivers. * not have any local override drivers.
*/ */
if (TryPath(bpdpath,cachedpath,PM_getNucleusPath(),"",dllname)) if (TryPath(bpdpath,cachedpath,PM_getNucleusPath(),"",dllname))
return true; return true;
/* Whoops, we can't find the BPD file! */ /* Whoops, we can't find the BPD file! */
return false; return false;
} }
/* Always try in the previously discovered path */ /* Always try in the previously discovered path */
return TryPath(bpdpath,NULL,cachedpath,"",dllname); return TryPath(bpdpath,NULL,cachedpath,"",dllname);
@ -216,9 +216,9 @@ static char *_stpcpy(
const char *_src) const char *_src)
{ {
if (!_dest || !_src) if (!_dest || !_src)
return 0; return 0;
while ((*_dest++ = *_src++) != 0) while ((*_dest++ = *_src++) != 0)
; ;
return --_dest; return --_dest;
} }
@ -233,13 +233,13 @@ static void safe_strncpy(
unsigned maxlen) unsigned maxlen)
{ {
if (dst) { if (dst) {
if(strlen(src) >= maxlen) { if(strlen(src) >= maxlen) {
strncpy(dst, src, maxlen); strncpy(dst, src, maxlen);
dst[maxlen] = 0; dst[maxlen] = 0;
} }
else else
strcpy(dst, src); strcpy(dst, src);
} }
} }
/**************************************************************************** /****************************************************************************
@ -250,16 +250,16 @@ static int findDot(
char *p) char *p)
{ {
if (*(p-1) == '.') if (*(p-1) == '.')
p--; p--;
switch (*--p) { switch (*--p) {
case ':': case ':':
if (*(p-2) != '\0') if (*(p-2) != '\0')
break; break;
case '/': case '/':
case '\\': case '\\':
case '\0': case '\0':
return true; return true;
} }
return false; return false;
} }
@ -299,25 +299,25 @@ void PMAPI PM_makepath(
const char *ext) const char *ext)
{ {
if (drive && *drive) { if (drive && *drive) {
*path++ = *drive; *path++ = *drive;
*path++ = ':'; *path++ = ':';
} }
if (dir && *dir) { if (dir && *dir) {
path = _stpcpy(path,dir); path = _stpcpy(path,dir);
if (*(path-1) != '\\' && *(path-1) != '/') if (*(path-1) != '\\' && *(path-1) != '/')
#ifdef __UNIX__ #ifdef __UNIX__
*path++ = '/'; *path++ = '/';
#else #else
*path++ = '\\'; *path++ = '\\';
#endif #endif
} }
if (name) if (name)
path = _stpcpy(path,name); path = _stpcpy(path,name);
if (ext && *ext) { if (ext && *ext) {
if (*ext != '.') if (*ext != '.')
*path++ = '.'; *path++ = '.';
path = _stpcpy(path,ext); path = _stpcpy(path,ext);
} }
*path = 0; *path = 0;
} }
@ -377,7 +377,7 @@ int PMAPI PM_splitpath(
/* Copy filename into template up to PM_MAX_PATH characters */ /* Copy filename into template up to PM_MAX_PATH characters */
p = buf; p = buf;
if ((temp = strlen(path)) > PM_MAX_PATH) if ((temp = strlen(path)) > PM_MAX_PATH)
temp = PM_MAX_PATH; temp = PM_MAX_PATH;
*p++ = 0; *p++ = 0;
strncpy(p, path, temp); strncpy(p, path, temp);
*(p += temp) = 0; *(p += temp) = 0;
@ -385,53 +385,53 @@ int PMAPI PM_splitpath(
/* Split the filename and fill corresponding nonzero pointers */ /* Split the filename and fill corresponding nonzero pointers */
temp = 0; temp = 0;
for (;;) { for (;;) {
switch (*--p) { switch (*--p) {
case '.': case '.':
if (!temp && (*(p+1) == '\0')) if (!temp && (*(p+1) == '\0'))
temp = findDot(p); temp = findDot(p);
if ((!temp) && ((ret & PM_HAS_EXTENSION) == 0)) { if ((!temp) && ((ret & PM_HAS_EXTENSION) == 0)) {
ret |= PM_HAS_EXTENSION; ret |= PM_HAS_EXTENSION;
safe_strncpy(ext, p, PM_MAX_PATH - 1); safe_strncpy(ext, p, PM_MAX_PATH - 1);
*p = 0; *p = 0;
} }
continue; continue;
case ':': case ':':
if (p != &buf[2]) if (p != &buf[2])
continue; continue;
case '\0': case '\0':
if (temp) { if (temp) {
if (*++p) if (*++p)
ret |= PM_HAS_DIRECTORY; ret |= PM_HAS_DIRECTORY;
safe_strncpy(dir, p, PM_MAX_PATH - 1); safe_strncpy(dir, p, PM_MAX_PATH - 1);
*p-- = 0; *p-- = 0;
break; break;
} }
case '/': case '/':
case '\\': case '\\':
if (!temp) { if (!temp) {
temp++; temp++;
if (*++p) if (*++p)
ret |= PM_HAS_FILENAME; ret |= PM_HAS_FILENAME;
safe_strncpy(name, p, PM_MAX_PATH - 1); safe_strncpy(name, p, PM_MAX_PATH - 1);
*p-- = 0; *p-- = 0;
if (*p == 0 || (*p == ':' && p == &buf[2])) if (*p == 0 || (*p == ':' && p == &buf[2]))
break; break;
} }
continue; continue;
case '*': case '*':
case '?': case '?':
if (!temp) if (!temp)
ret |= PM_HAS_WILDCARDS; ret |= PM_HAS_WILDCARDS;
default: default:
continue; continue;
} }
break; break;
} }
if (*p == ':') { if (*p == ':') {
if (buf[1]) if (buf[1])
ret |= PM_HAS_DRIVE; ret |= PM_HAS_DRIVE;
safe_strncpy(drive, &buf[1], PM_MAX_DRIVE - 1); safe_strncpy(drive, &buf[1], PM_MAX_DRIVE - 1);
} }
return ret; return ret;
} }
@ -466,15 +466,15 @@ void PMAPI PM_blockUntilTimeout(
static ibool firstTime = true; static ibool firstTime = true;
if (firstTime) { if (firstTime) {
firstTime = false; firstTime = false;
LZTimerOnExt(&tm); LZTimerOnExt(&tm);
} }
else { else {
if ((msDelay = (microseconds - LZTimerLapExt(&tm)) / 1000L) > 0) if ((msDelay = (microseconds - LZTimerLapExt(&tm)) / 1000L) > 0)
PM_sleep(msDelay); PM_sleep(msDelay);
while (LZTimerLapExt(&tm) < microseconds) while (LZTimerLapExt(&tm) < microseconds)
; ;
LZTimerOffExt(&tm); LZTimerOffExt(&tm);
LZTimerOnExt(&tm); LZTimerOnExt(&tm);
} }
} }

View File

@ -54,22 +54,22 @@ size of the available AGP aperture in megabytes.
ulong PMAPI PM_agpInit(void) ulong PMAPI PM_agpInit(void)
{ {
if ((agp = AGP_loadDriver(0)) == NULL) if ((agp = AGP_loadDriver(0)) == NULL)
return 0; return 0;
driver.dwSize = sizeof(driver); driver.dwSize = sizeof(driver);
if (!agp->QueryFunctions(AGP_GET_DRIVERFUNCS,&driver)) if (!agp->QueryFunctions(AGP_GET_DRIVERFUNCS,&driver))
return 0; return 0;
switch (driver.GetApertureSize()) { switch (driver.GetApertureSize()) {
case agpSize4MB: return 4; case agpSize4MB: return 4;
case agpSize8MB: return 8; case agpSize8MB: return 8;
case agpSize16MB: return 16; case agpSize16MB: return 16;
case agpSize32MB: return 32; case agpSize32MB: return 32;
case agpSize64MB: return 64; case agpSize64MB: return 64;
case agpSize128MB: return 128; case agpSize128MB: return 128;
case agpSize256MB: return 256; case agpSize256MB: return 256;
case agpSize512MB: return 512; case agpSize512MB: return 512;
case agpSize1GB: return 1024; case agpSize1GB: return 1024;
case agpSize2GB: return 2048; case agpSize2GB: return 2048;
} }
return 0; return 0;
} }
@ -106,18 +106,18 @@ ibool PMAPI PM_agpReservePhysical(
PM_physAddr *physAddr) PM_physAddr *physAddr)
{ {
switch (type) { switch (type) {
case PM_agpUncached: case PM_agpUncached:
type = agpUncached; type = agpUncached;
break; break;
case PM_agpWriteCombine: case PM_agpWriteCombine:
type = agpWriteCombine; type = agpWriteCombine;
break; break;
case PM_agpIntelDCACHE: case PM_agpIntelDCACHE:
type = agpIntelDCACHE; type = agpIntelDCACHE;
break; break;
default: default:
return false; return false;
} }
return driver.ReservePhysical(numPages,type,physContext,physAddr) == nOK; return driver.ReservePhysical(numPages,type,physContext,physAddr) == nOK;
} }
@ -187,4 +187,3 @@ ibool PMAPI PM_agpFreePhysical(
} }
#endif /* !REALMODE */ #endif /* !REALMODE */

View File

@ -52,18 +52,18 @@ static uchar translateScan(
int n,pivot,val; int n,pivot,val;
for (n = count; n > 0; ) { for (n = count; n > 0; ) {
pivot = n >> 1; pivot = n >> 1;
test = table + pivot; test = table + pivot;
val = scanCode - test->scanCode; val = scanCode - test->scanCode;
if (val < 0) if (val < 0)
n = pivot; n = pivot;
else if (val == 0) else if (val == 0)
return test->asciiCode; return test->asciiCode;
else { else {
table = test + 1; table = test + 1;
n -= pivot + 1; n -= pivot + 1;
} }
} }
return 0; return 0;
} }
@ -84,35 +84,35 @@ void _EVT_maskKeyCode(
evt->message &= ~0xFF; evt->message &= ~0xFF;
if (evt->modifiers & EVT_NUMLOCK) { if (evt->modifiers & EVT_NUMLOCK) {
if ((ascii = translateScan(scan,EVT.codePage->numPad,EVT.codePage->numPadLen)) != 0) { if ((ascii = translateScan(scan,EVT.codePage->numPad,EVT.codePage->numPadLen)) != 0) {
evt->message |= ascii; evt->message |= ascii;
return; return;
} }
} }
if (evt->modifiers & EVT_CTRLSTATE) { if (evt->modifiers & EVT_CTRLSTATE) {
evt->message |= translateScan(scan,EVT.codePage->ctrl,EVT.codePage->ctrlLen); evt->message |= translateScan(scan,EVT.codePage->ctrl,EVT.codePage->ctrlLen);
return; return;
} }
if (evt->modifiers & EVT_CAPSLOCK) { if (evt->modifiers & EVT_CAPSLOCK) {
if (evt->modifiers & EVT_SHIFTKEY) { if (evt->modifiers & EVT_SHIFTKEY) {
if ((ascii = translateScan(scan,EVT.codePage->shiftCaps,EVT.codePage->shiftCapsLen)) != 0) { if ((ascii = translateScan(scan,EVT.codePage->shiftCaps,EVT.codePage->shiftCapsLen)) != 0) {
evt->message |= ascii; evt->message |= ascii;
return; return;
} }
} }
else { else {
if ((ascii = translateScan(scan,EVT.codePage->caps,EVT.codePage->capsLen)) != 0) { if ((ascii = translateScan(scan,EVT.codePage->caps,EVT.codePage->capsLen)) != 0) {
evt->message |= ascii; evt->message |= ascii;
return; return;
} }
} }
} }
if (evt->modifiers & EVT_SHIFTKEY) { if (evt->modifiers & EVT_SHIFTKEY) {
if ((ascii = translateScan(scan,EVT.codePage->shift,EVT.codePage->shiftLen)) != 0) { if ((ascii = translateScan(scan,EVT.codePage->shift,EVT.codePage->shiftLen)) != 0) {
evt->message |= ascii; evt->message |= ascii;
return; return;
} }
} }
evt->message |= translateScan(scan,EVT.codePage->normal,EVT.codePage->normalLen); evt->message |= translateScan(scan,EVT.codePage->normal,EVT.codePage->normalLen);
} }
@ -124,9 +124,9 @@ static ibool _EVT_isKeyDown(
uchar scanCode) uchar scanCode)
{ {
if (scanCode > 0x7F) if (scanCode > 0x7F)
return false; return false;
else else
return EVT.keyTable[scanCode] != 0; return EVT.keyTable[scanCode] != 0;
} }
/**************************************************************************** /****************************************************************************
@ -139,7 +139,7 @@ Adds a new keyboard event to the event queue. This routine is called from
within the keyboard interrupt subroutine! within the keyboard interrupt subroutine!
NOTE: Interrupts are OFF when this routine is called by the keyboard ISR, NOTE: Interrupts are OFF when this routine is called by the keyboard ISR,
and we leave them OFF the entire time. and we leave them OFF the entire time.
****************************************************************************/ ****************************************************************************/
static void addKeyEvent( static void addKeyEvent(
uint what, uint what,
@ -148,31 +148,31 @@ static void addKeyEvent(
event_t evt; event_t evt;
if (EVT.count < EVENTQSIZE) { if (EVT.count < EVENTQSIZE) {
/* Save information in event record */ /* Save information in event record */
evt.when = _EVT_getTicks(); evt.when = _EVT_getTicks();
evt.what = what; evt.what = what;
evt.message = message | 0x10000UL; evt.message = message | 0x10000UL;
evt.where_x = 0; evt.where_x = 0;
evt.where_y = 0; evt.where_y = 0;
evt.relative_x = 0; evt.relative_x = 0;
evt.relative_y = 0; evt.relative_y = 0;
evt.modifiers = EVT.keyModifiers; evt.modifiers = EVT.keyModifiers;
if (evt.what == EVT_KEYREPEAT) { if (evt.what == EVT_KEYREPEAT) {
if (EVT.oldKey != -1) if (EVT.oldKey != -1)
EVT.evtq[EVT.oldKey].message += 0x10000UL; EVT.evtq[EVT.oldKey].message += 0x10000UL;
else { else {
EVT.oldKey = EVT.freeHead; EVT.oldKey = EVT.freeHead;
addEvent(&evt); /* Add to tail of event queue */ addEvent(&evt); /* Add to tail of event queue */
} }
} }
else { else {
#ifdef __QNX__ #ifdef __QNX__
_EVT_maskKeyCode(&evt); _EVT_maskKeyCode(&evt);
#endif #endif
addEvent(&evt); /* Add to tail of event queue */ addEvent(&evt); /* Add to tail of event queue */
} }
EVT.oldMove = -1; EVT.oldMove = -1;
} }
} }
/**************************************************************************** /****************************************************************************
@ -184,7 +184,7 @@ static int kbWaitForWriteReady(void)
{ {
int timeout = 8192; int timeout = 8192;
while ((timeout > 0) && (PM_inpb(0x64) & 0x02)) while ((timeout > 0) && (PM_inpb(0x64) & 0x02))
timeout--; timeout--;
return (timeout > 0); return (timeout > 0);
} }
@ -197,7 +197,7 @@ static int kbWaitForReadReady(void)
{ {
int timeout = 8192; int timeout = 8192;
while ((timeout > 0) && (!(PM_inpb(0x64) & 0x01))) while ((timeout > 0) && (!(PM_inpb(0x64) & 0x01)))
timeout--; timeout--;
return (timeout > 0); return (timeout > 0);
} }
@ -215,20 +215,20 @@ static int kbSendData(
int timeout, temp; int timeout, temp;
do { do {
if (!kbWaitForWriteReady()) if (!kbWaitForWriteReady())
return 0; return 0;
PM_outpb(0x60,data); PM_outpb(0x60,data);
timeout = 8192; timeout = 8192;
while (--timeout > 0) { while (--timeout > 0) {
if (!kbWaitForReadReady()) if (!kbWaitForReadReady())
return 0; return 0;
temp = PM_inpb(0x60); temp = PM_inpb(0x60);
if (temp == 0xFA) if (temp == 0xFA)
return 1; return 1;
if (temp == 0xFE) if (temp == 0xFE)
break; break;
} }
} while ((resends-- > 0) && (timeout > 0)); } while ((resends-- > 0) && (timeout > 0));
return 0; return 0;
} }
@ -245,10 +245,10 @@ static void setLEDS(
uint modifiers) uint modifiers)
{ {
if (EVT.allowLEDS) { if (EVT.allowLEDS) {
if (!kbSendData(0xED) || !kbSendData((modifiers>>9) & 7)) { if (!kbSendData(0xED) || !kbSendData((modifiers>>9) & 7)) {
kbSendData(0xF4); kbSendData(0xF4);
} }
} }
} }
/**************************************************************************** /****************************************************************************
@ -256,7 +256,7 @@ REMARKS:
Function to process raw scan codes read from the keyboard controller. Function to process raw scan codes read from the keyboard controller.
NOTE: Interrupts are OFF when this routine is called by the keyboard ISR, NOTE: Interrupts are OFF when this routine is called by the keyboard ISR,
and we leave them OFF the entire time. and we leave them OFF the entire time.
{secret} {secret}
****************************************************************************/ ****************************************************************************/
void processRawScanCode( void processRawScanCode(
@ -267,156 +267,156 @@ void processRawScanCode(
int what; int what;
if (pauseLoop) { if (pauseLoop) {
/* Skip scan codes until the pause key sequence has been read */ /* Skip scan codes until the pause key sequence has been read */
pauseLoop--; pauseLoop--;
} }
else if (scan == 0xE0) { else if (scan == 0xE0) {
/* This signals the start of an extended scan code sequence */ /* This signals the start of an extended scan code sequence */
extended = 1; extended = 1;
} }
else if (scan == 0xE1) { else if (scan == 0xE1) {
/* The Pause key sends a strange scan code sequence, which is: /* The Pause key sends a strange scan code sequence, which is:
* *
* E1 1D 52 E1 9D D2 * E1 1D 52 E1 9D D2
* *
* However there is never any release code nor any auto-repeat for * However there is never any release code nor any auto-repeat for
* this key. For this reason we simply ignore the key and skip the * this key. For this reason we simply ignore the key and skip the
* next 5 scan codes read from the keyboard. * next 5 scan codes read from the keyboard.
*/ */
pauseLoop = 5; pauseLoop = 5;
} }
else { else {
/* Process the scan code normally (it may be an extended code /* Process the scan code normally (it may be an extended code
* however!). Bit 7 means key was released, and bits 0-6 are the * however!). Bit 7 means key was released, and bits 0-6 are the
* scan code. * scan code.
*/ */
what = (scan & 0x80) ? EVT_KEYUP : EVT_KEYDOWN; what = (scan & 0x80) ? EVT_KEYUP : EVT_KEYDOWN;
scan &= 0x7F; scan &= 0x7F;
if (extended) { if (extended) {
extended = 0; extended = 0;
if (scan == 0x2A || scan == 0x36) { if (scan == 0x2A || scan == 0x36) {
/* Ignore these extended scan code sequences. These are /* Ignore these extended scan code sequences. These are
* used by the keyboard controller to wrap around certain * used by the keyboard controller to wrap around certain
* key sequences for the keypad (and when NUMLOCK is down * key sequences for the keypad (and when NUMLOCK is down
* internally). * internally).
*/ */
return; return;
} }
/* Convert extended codes for key sequences that we map to /* Convert extended codes for key sequences that we map to
* virtual scan codes so the user can detect them in their * virtual scan codes so the user can detect them in their
* code. * code.
*/ */
switch (scan) { switch (scan) {
case KB_leftCtrl: scan = KB_rightCtrl; break; case KB_leftCtrl: scan = KB_rightCtrl; break;
case KB_leftAlt: scan = KB_rightAlt; break; case KB_leftAlt: scan = KB_rightAlt; break;
case KB_divide: scan = KB_padDivide; break; case KB_divide: scan = KB_padDivide; break;
case KB_enter: scan = KB_padEnter; break; case KB_enter: scan = KB_padEnter; break;
case KB_padTimes: scan = KB_sysReq; break; case KB_padTimes: scan = KB_sysReq; break;
} }
} }
else { else {
/* Convert regular scan codes for key sequences that we map to /* Convert regular scan codes for key sequences that we map to
* virtual scan codes so the user can detect them in their * virtual scan codes so the user can detect them in their
* code. * code.
*/ */
switch (scan) { switch (scan) {
case KB_left: scan = KB_padLeft; break; case KB_left: scan = KB_padLeft; break;
case KB_right: scan = KB_padRight; break; case KB_right: scan = KB_padRight; break;
case KB_up: scan = KB_padUp; break; case KB_up: scan = KB_padUp; break;
case KB_down: scan = KB_padDown; break; case KB_down: scan = KB_padDown; break;
case KB_insert: scan = KB_padInsert; break; case KB_insert: scan = KB_padInsert; break;
case KB_delete: scan = KB_padDelete; break; case KB_delete: scan = KB_padDelete; break;
case KB_home: scan = KB_padHome; break; case KB_home: scan = KB_padHome; break;
case KB_end: scan = KB_padEnd; break; case KB_end: scan = KB_padEnd; break;
case KB_pageUp: scan = KB_padPageUp; break; case KB_pageUp: scan = KB_padPageUp; break;
case KB_pageDown: scan = KB_padPageDown; break; case KB_pageDown: scan = KB_padPageDown; break;
} }
} }
/* Determine if the key is an UP, DOWN or REPEAT and maintain the /* Determine if the key is an UP, DOWN or REPEAT and maintain the
* up/down status of all keys in our global key array. * up/down status of all keys in our global key array.
*/ */
if (what == EVT_KEYDOWN) { if (what == EVT_KEYDOWN) {
if (EVT.keyTable[scan]) if (EVT.keyTable[scan])
what = EVT_KEYREPEAT; what = EVT_KEYREPEAT;
else else
EVT.keyTable[scan] = scan; EVT.keyTable[scan] = scan;
} }
else { else {
EVT.keyTable[scan] = 0; EVT.keyTable[scan] = 0;
} }
/* Handle shift key modifiers */ /* Handle shift key modifiers */
if (what != EVT_KEYREPEAT) { if (what != EVT_KEYREPEAT) {
switch (scan) { switch (scan) {
case KB_capsLock: case KB_capsLock:
if (what == EVT_KEYDOWN) if (what == EVT_KEYDOWN)
EVT.keyModifiers ^= EVT_CAPSLOCK; EVT.keyModifiers ^= EVT_CAPSLOCK;
setLEDS(EVT.keyModifiers); setLEDS(EVT.keyModifiers);
break; break;
case KB_numLock: case KB_numLock:
if (what == EVT_KEYDOWN) if (what == EVT_KEYDOWN)
EVT.keyModifiers ^= EVT_NUMLOCK; EVT.keyModifiers ^= EVT_NUMLOCK;
setLEDS(EVT.keyModifiers); setLEDS(EVT.keyModifiers);
break; break;
case KB_scrollLock: case KB_scrollLock:
if (what == EVT_KEYDOWN) if (what == EVT_KEYDOWN)
EVT.keyModifiers ^= EVT_SCROLLLOCK; EVT.keyModifiers ^= EVT_SCROLLLOCK;
setLEDS(EVT.keyModifiers); setLEDS(EVT.keyModifiers);
break; break;
case KB_leftShift: case KB_leftShift:
if (what == EVT_KEYUP) if (what == EVT_KEYUP)
EVT.keyModifiers &= ~EVT_LEFTSHIFT; EVT.keyModifiers &= ~EVT_LEFTSHIFT;
else else
EVT.keyModifiers |= EVT_LEFTSHIFT; EVT.keyModifiers |= EVT_LEFTSHIFT;
break; break;
case KB_rightShift: case KB_rightShift:
if (what == EVT_KEYUP) if (what == EVT_KEYUP)
EVT.keyModifiers &= ~EVT_RIGHTSHIFT; EVT.keyModifiers &= ~EVT_RIGHTSHIFT;
else else
EVT.keyModifiers |= EVT_RIGHTSHIFT; EVT.keyModifiers |= EVT_RIGHTSHIFT;
break; break;
case KB_leftCtrl: case KB_leftCtrl:
if (what == EVT_KEYUP) if (what == EVT_KEYUP)
EVT.keyModifiers &= ~EVT_LEFTCTRL; EVT.keyModifiers &= ~EVT_LEFTCTRL;
else else
EVT.keyModifiers |= EVT_LEFTCTRL; EVT.keyModifiers |= EVT_LEFTCTRL;
break; break;
case KB_rightCtrl: case KB_rightCtrl:
if (what == EVT_KEYUP) if (what == EVT_KEYUP)
EVT.keyModifiers &= ~EVT_RIGHTCTRL; EVT.keyModifiers &= ~EVT_RIGHTCTRL;
else else
EVT.keyModifiers |= EVT_RIGHTCTRL; EVT.keyModifiers |= EVT_RIGHTCTRL;
break; break;
case KB_leftAlt: case KB_leftAlt:
if (what == EVT_KEYUP) if (what == EVT_KEYUP)
EVT.keyModifiers &= ~EVT_LEFTALT; EVT.keyModifiers &= ~EVT_LEFTALT;
else else
EVT.keyModifiers |= EVT_LEFTALT; EVT.keyModifiers |= EVT_LEFTALT;
break; break;
case KB_rightAlt: case KB_rightAlt:
if (what == EVT_KEYUP) if (what == EVT_KEYUP)
EVT.keyModifiers &= ~EVT_RIGHTALT; EVT.keyModifiers &= ~EVT_RIGHTALT;
else else
EVT.keyModifiers |= EVT_RIGHTALT; EVT.keyModifiers |= EVT_RIGHTALT;
break; break;
#ifdef SUPPORT_CTRL_ALT_DEL #ifdef SUPPORT_CTRL_ALT_DEL
case KB_delete: case KB_delete:
if ((EVT.keyModifiers & EVT_CTRLSTATE) && (EVT.keyModifiers & EVT_ALTSTATE)) if ((EVT.keyModifiers & EVT_CTRLSTATE) && (EVT.keyModifiers & EVT_ALTSTATE))
Reboot(); Reboot();
break; break;
#endif #endif
} }
} }
/* Add the untranslated key code to the event queue. All /* Add the untranslated key code to the event queue. All
* translation to ASCII from the key codes occurs when the key * translation to ASCII from the key codes occurs when the key
* is extracted from the queue, saving time in the low level * is extracted from the queue, saving time in the low level
* interrupt handler. * interrupt handler.
*/ */
addKeyEvent(what,scan << 8); addKeyEvent(what,scan << 8);
} }
} }
/**************************************************************************** /****************************************************************************
@ -442,9 +442,8 @@ void EVTAPI EVT_allowLEDS(
{ {
EVT.allowLEDS = true; EVT.allowLEDS = true;
if (enable) if (enable)
setLEDS(EVT.keyModifiers); setLEDS(EVT.keyModifiers);
else else
setLEDS(0); setLEDS(0);
EVT.allowLEDS = enable; EVT.allowLEDS = enable;
} }

Some files were not shown because too many files have changed in this diff Show More