Author: wmb
Date: 2008-12-28 04:58:44 +0100 (Sun, 28 Dec 2008)
New Revision: 1050
Added:
cpu/x86/pc/emu/
cpu/x86/pc/emu/addrs.fth
cpu/x86/pc/emu/build/
cpu/x86/pc/emu/build/Makefile
cpu/x86/pc/emu/config.fth
cpu/x86/pc/emu/devices.fth
cpu/x86/pc/emu/emuofw.bth
cpu/x86/pc/emu/fw.bth
cpu/x86/pc/emu/pcinode.fth
cpu/x86/pc/emu/pmreset.bth
cpu/x86/pc/emu/probemem.fth
cpu/x86/pc/emu/rmreset.bth
cpu/x86/startmacros.fth
dev/isa/soundblaster.fth
dev/ne2000/build/
dev/ne2000/ne2kpci.bth
dev/ne2000/ne2kpci.fth
dev/video/build/video.bth
dev/video/cirrus.bth
dev/video/controlr/cirruspci.fth
dev/video/loadcirrus.fth
Modified:
cpu/arm/Linux/
cpu/arm/build/
cpu/x86/pc/linux.fth
dev/video/common/pci.fth
dev/video/controlr/cirrus.fth
dev/video/controlr/vga.fth
Log:
Added a new platform directory "cpu/x86/pc/emu" for building a version
that can run as a direct ROM image under QEMU and perhaps eventually
VirtualBox and VMWare. Also added some drivers in support of that version,
notably ne2000 Ethernet, Cirrus video, and SoundBlaster.
Property changes on: cpu/arm/Linux
___________________________________________________________________
Added: svn:ignore
+ armforth
forth
Property changes on: cpu/arm/build
___________________________________________________________________
Added: svn:ignore
+ armbuild
build
Added: cpu/x86/pc/emu/addrs.fth
===================================================================
--- cpu/x86/pc/emu/addrs.fth (rev 0)
+++ cpu/x86/pc/emu/addrs.fth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -0,0 +1,65 @@
+\ See license at end of file
+purpose: Establish address and I/O configuration definitions
+
+\ Dropin-base is where the set of dropin modules, the verbatim
+\ image of what is stored in ROM or on disk, ends up in memory.
+\ If OFW is in FLASH, dropin-base can just be the FLASH address.
+\ If OFW is pulled in from disk, dropin-base is where the very
+\ early startup code - the first few instructions in the image -
+\ copies it to get it out of the way of things like OS load areas.
+
+h# fff8.0000 constant dropin-base \ Location of payload in FLASH
+dropin-base h# 20 + constant ResetBase \ Location of "reset" dropin in ROM
+h# 08.0000 constant dropin-size
+
+h# 1.0000 constant dma-base \ DMA heap
+h# 8.0000 constant dma-size
+
+\ This is considerably more memory than Open Firmware needs
+\ on platforms where you have a well bounded set of I/O devices.
+
+h# 20.0000 constant /fw-ram
+h# 20.0000 constant heap-size
+
+[ifndef] virtual-mode
+h# 200.0000 constant ramsize \ 32 MB
+\ h# 2000.0000 constant ramsize \ 512 MB
+
+ramsize heap-size - constant heap-base \ Dynamic allocation heap
+heap-base /fw-ram - constant fw-pa \ OFW dictionary location
+[then]
+
+\ Where OFW initially loads an OS that it is going to boot
+\ OFW will then move it to the address where the OS wants to run from.
+
+h# 100.0000 constant def-load-base
+
+fload ${BP}/cpu/x86/pc/virtaddr.fth
+
+[ifdef] virtual-mode
+h# 3 constant pte-control \ Page table entry attributes
+[then]
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2008 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Property changes on: cpu/x86/pc/emu/build
___________________________________________________________________
Added: svn:ignore
+ build
builton.fth
emuofw.rom
Added: cpu/x86/pc/emu/build/Makefile
===================================================================
--- cpu/x86/pc/emu/build/Makefile (rev 0)
+++ cpu/x86/pc/emu/build/Makefile 2008-12-28 03:58:44 UTC (rev 1050)
@@ -0,0 +1,24 @@
+OS := $(shell uname)
+
+all: emuofw.rom
+
+emuofw.rom: FORCE build ../../../build/inflate.bin
+ ./build $@
+
+../../../${OS}/forth:
+ @make -C ../../../${OS} forth
+
+../../../build/inflate.bin:
+ @make -C ../../../build inflate.bin
+
+build: ../../../${OS}/forth
+ @ln -sf ../../../${OS}/forth build
+
+clean:
+ rm -f *.dic *.log headers *~ *.elf *.di *.img builton.fth build *.c32 *.rom
+
+clean-all: clean
+ @make -C ../../../build clean
+ @make -C ../../../${OS} clean
+
+.PHONY: FORCE clean all clean-all
Added: cpu/x86/pc/emu/config.fth
===================================================================
--- cpu/x86/pc/emu/config.fth (rev 0)
+++ cpu/x86/pc/emu/config.fth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -0,0 +1,154 @@
+\ See license at end of file
+purpose: Establish configuration definitions
+
+\ create pc \ Demo version for generic PC
+\ create pc-linux \ Demo version for generic PC and Linux
+\ create pc-serial \ Demo version for generic PC
+
+\ --- The environment that "boots" OFW ---
+\ - Image Format - Example Media - previous stage bootloader
+
+create rom-loaded
+
+\ debug-startup enables early-startup reports on COM1
+
+create debug-startup
+
+\ serial-console makes COM1 the default OFW console device
+
+\ create serial-console
+
+\ resident-packages causes a lot of support packages to be
+\ precompiled into the Forth dictionary, instead of being
+\ demand-loaded from dropin modules
+
+create resident-packages
+
+\ addresses-assigned suppresses PCI address autoconfiguration.
+\ It is useful when OFW is loaded by lower-level firmware that
+\ has already assigned PCI addresses.
+
+\ create addresses-assigned
+
+\ use-root-isa puts the ISA bus device node directly under the
+\ device tree root (/isa), instead of under the PCI node (/pci/isa).
+\ For modern machines, it is usually best not to define use-root-isa .
+
+\ create use-root-isa
+
+\ use-pci-isa puts the ISA bus device node under the PCI node (/pci/isa),
+\ which is usually accurate for modern machines.
+
+create use-pci-isa
+
+\ use-timestamp-counter makes low-level timing operations use the
+\ timestamp counter (TSC) register. This is a good thing for modern
+\ CPUs that have that register.
+
+create use-timestamp-counter
+
+\ use-isa-ide enables support for a legacy IDE controller accessed
+\ directly via I/O ports. It is usually better to use the PCI IDE
+\ controller support via a dynamically-bound FCode driver.
+
+\ create use-isa-ide
+
+\ use-ega enables support for an OFW console that uses EGA text-mode
+\ This typically only works when OFW is loaded on top of a conventional
+\ BIOS, because it assumes that the display device is already in the
+\ correct mode and OFW can just start writing to the text mode framebuffer.
+
+\ create use-ega
+
+\ use-vga enables support for an OFW console on a legacy VGA device,
+\ with OFW initializing the VGA registers to establish the mode.
+\ This does not work very well. It is better to bind the "super driver"
+\ (dev/video/build/video.fc) to the PCI display class code.
+
+\ create use-vga
+
+\ use-elf enables support for loading and debugging ELF binaries
+
+create use-elf
+
+\ use-ne2000 enables support for a legacy ISA bus NE2000 network interface
+
+\ create use-ne2000
+
+\ use-watch-all enables the "watch-all" diagnostic command that
+\ exercises a variety of common I/O devices.
+
+\ create use-watch-all
+
+\ use-null-nvram installs stub implementations of non-volatile
+\ access routines, thus disabling persistent storage of OFW
+\ configuration variables. Generic PCs generally have no good
+\ place to store those configuration variables, as the CMOS RAM
+\ is too small for typical string-valued variables.
+
+create use-null-nvram
+
+\ pseudo-nvram installs non-volatile access routines that use
+\ a fixed-name file on drive A to store the data. It is a
+\ reasonable way to enable configuration variable storage
+\ when running OFW under an emulator where such a drive is
+\ "always" present, but it is not particularly useful for
+\ real hardware platforms.
+
+\ create pseudo-nvram
+
+
+\ no-floppy-node prevents the creation of a floppy disk device node
+\ among the set of legacy ISA devices. Modern PCs rarely have
+\ floppy drives.
+
+\ create no-floppy-node
+
+\ In virtual mode, OFW runs with the MMU on. The advantages are
+\ that OFW can automatically locate itself out of the way, at the
+\ top of physical memory, it can dynamically allocate exactly as
+\ much physical memory as it needs, and it can remain alive after
+\ the OS starts. The disadvantage is that it is more confusing -
+\ you always have to be aware of the distinction between virtual
+\ and physical addresses.
+
+\ If you use virtual mode for Linux, you can debug past the point
+\ where Linux starts using the MMU. It is not strictly
+\ necessary to use virtual mode if you just want to boot Linux
+\ and then have OFW disappear.
+
+create virtual-mode
+
+\ linux-support enables support for ext2 filesystems and bzimage format
+
+create linux-support
+
+
+\ cpu/x86/pc/<platform>/addrs.fth configures the basic system
+\ address assignment.
+
+fload ${BP}/cpu/x86/pc/emu/addrs.fth
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2008 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: cpu/x86/pc/emu/devices.fth
===================================================================
--- cpu/x86/pc/emu/devices.fth (rev 0)
+++ cpu/x86/pc/emu/devices.fth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -0,0 +1,325 @@
+\ See license at end of file
+purpose: Load device drivers according to configuration definitions
+
+fload ${BP}/cpu/x86/pc/isaio.fth
+
+fload ${BP}/dev/pci/configm1.fth \ Generic PCI configuration access
+
+0 0 " " " /" begin-package
+ fload ${BP}/cpu/x86/pc/mappci.fth \ Map PCI to root
+ fload ${BP}/dev/pcibus.fth \ Generic PCI bus package
+
+[ifdef] addresses-assigned
+ \ Suppress PCI address assignment; use the addresses the BIOS assigned
+ patch false true master-probe
+ patch noop assign-all-addresses prober
+ patch noop clear-addresses populate-device-node
+ patch noop clear-addresses populate-device-node
+ patch noop temp-assign-addresses find-fcode?
+ patch 2drop my-w! populate-device-node
+ : or-w! ( bitmask reg# -- ) tuck my-w@ or swap my-w! ;
+ patch or-w! my-w! find-fcode?
+ patch 2drop my-w! find-fcode?
+[then]
+
+ fload ${BP}/cpu/x86/pc/biosload/pcinode.fth \ System-specific words for PCI
+end-package
+stand-init: PCI host bridge
+ " /pci" " init" execute-device-method drop
+;
+
+fload ${BP}/dev/pciprobe.fth \ Generic PCI probing
+
+[ifdef] use-timestamp-counter
+\ Use the CPU chip's Time Stamp Counter for timing; it does just what we want
+fload ${BP}/cpu/x86/tsc.fth
+[then]
+
+[ifdef] use-ega
+0 0 " " " /" begin-package
+ fload ${BP}/dev/egatext.fth
+end-package
+devalias screen /ega-text
+[then]
+
+[ifdef] use-root-isa
+0 0 " " " /" begin-package
+ fload ${BP}/cpu/x86/pc/isabus.fth \ ISA Bus Bridge under root node
+end-package
+[then]
+
+[ifndef] use-timestamp-counter
+fload ${BP}/cpu/x86/pc/getms.fth
+[then]
+
+[ifdef] use-pci-isa
+
+\ This must precede isamisc.fth in the load file, to execute it first
+fload ${BP}/cpu/x86/pc/moveisa.fth
+
+0 0 " 0" " /pci" begin-package
+ fload ${BP}/dev/pci/isa.fth \ ISA bus bridge under PCI node
+ fload ${BP}/dev/pci/isamisc.fth
+end-package
+[then]
+
+[ifdef] use-pc87560
+0 0 " 5,1" " /pci" begin-package \ ISA bus bridge
+ fload ${BP}/dev/pc87560.fth \ SouthBridge ISA bus bridge
+end-package
+[then]
+
+dev /interrupt-controller
+h# 20 to vector-base0
+h# 28 to vector-base1
+device-end
+
+[ifdef] use-pc87317
+fload ${BP}/dev/pc87317.fth \ National PC87317 superIO
+[then]
+
+0 0 dropin-base <# u#s u#> " /" begin-package
+ " flash" device-name
+
+ dropin-size
+ dup value /device
+ constant /device-phys
+ my-address my-space /device-phys reg
+\ fload ${BP}/cpu/x86/pc/flashpkg.fth
+ fload ${BP}/dev/flashpkg.fth
+end-package
+
+[ifdef] notdef
+\ Create a node below the top-level FLASH node to accessing the portion
+\ containing the dropin modules
+0 0 0 0 " flash" begin-package
+ " dropins" device-name
+
+ dropin-size constant /device
+ fload ${BP}/dev/subrange.fth
+end-package
+[then]
+
+\ devalias dropins /dropins
+devalias dropins /flash
+
+\ Create a pseudo-device that presents the dropin modules as a filesystem.
+fload ${BP}/ofw/fs/dropinfs.fth
+
+\ This devalias lets us say, for example, "dir rom:"
+devalias rom /dropin-fs
+
+fload ${BP}/cpu/x86/forthint.fth \ Low-level interrupt handling code
+fload ${BP}/dev/isa/irq.fth \ ISA interrupt dispatcher
+fload ${BP}/cpu/x86/pc/isatick.fth \ Use ISA timer as the alarm tick timer
+
+[ifdef] resident-packages
+support-package: 16550
+fload ${BP}/dev/16550pkg/16550.fth \ Serial port support package
+end-support-package
+[then]
+
+fload ${BP}/dev/pci/isaall.fth
+devalias seriala /isa/serial@i3f8
+devalias com1 /isa/serial@i3f8:115200
+devalias serialb /isa/serial@i2f8
+devalias com2 /isa/serial@i2f8
+devalias a /isa/fdc/disk@0
+devalias b /isa/fdc/disk@1
+devalias mouse /isa/8042/mouse
+
+[ifdef] use-timestamp-counter
+fload ${BP}/cpu/x86/pc/tsccal1.fth
+[then]
+
+[ifdef] use-ega
+dev /8042 patch false ctlr-selftest open device-end
+[then]
+
+[ifdef] use-16552
+0 0 " i3a0" " /isa" begin-package
+ 3 encode-int 0 encode-int encode+ " interrupts" property
+ fload ${BP}/dev/16550pkg/ns16550p.fth
+ fload ${BP}/dev/16550pkg/isa-int.fth
+end-package
+
+0 0 " i3a8" " /isa" begin-package
+ 4 encode-int 0 encode-int encode+ " interrupts" property
+ fload ${BP}/dev/16550pkg/ns16550p.fth
+ fload ${BP}/dev/16550pkg/isa-int.fth
+end-package
+
+devalias seriald /isa/serial@i3a0 : seriald " seriald" ;
+devalias serialc /isa/serial@i3a8 : serialc " serialc" ;
+[then]
+
+0 0 " i70" " /isa" begin-package \ Real-time clock node
+ fload ${BP}/dev/ds1385r.fth
+ 8 encode-int 0 encode-int encode+ " interrupts" property
+ 2 encode-int " device#" property
+end-package
+stand-init: RTC
+ " /rtc" open-dev clock-node !
+;
+
+fload ${BP}/cpu/x86/pc/cpunode.fth
+
+[ifndef] serial-console
+fload ${BP}/ofw/core/bailout.fth
+stand-init: Keyboard overrides
+ ?bailout
+;
+[then]
+
+fload ${BP}/ofw/core/countdwn.fth \ Startup countdown
+fload ${BP}/forth/lib/pattern.fth \ Text string pattern matching
+\ XXX remove the OS file commands from tools.dic
+fload ${BP}/ofw/core/filecmds.fth \ File commands: dir, del, ren, etc.
+
+[ifdef] pseudo-nvram
+fload ${BP}/cpu/x86/pc/biosload/filenv.fth
+dev /file-nvram
+: hd-nv-file ( -- ) " c:\nvram.dat" ;
+' hd-nv-file to nv-file
+device-end
+stand-init: Pseudo-NVRAM
+ " /file-nvram" open-dev to nvram-node
+ nvram-node 0= if
+ ." The configuration EEPROM is not working" cr
+ then
+ ['] init-config-vars catch drop
+;
+[then]
+
+fload ${BP}/dev/isa/soundblaster.fth
+
+[ifdef] use-vga
+0 0 " i3c0" " /isa" begin-package
+ " vga" name
+ my-address my-space h# 20 reg
+ fload ${BP}/dev/video/common/defer.fth \ Defered words
+ fload ${BP}/dev/video/common/graphics.fth \ Graphics and color routines
+ fload ${BP}/dev/video/controlr/vga.fth \ Controller code
+ use-vga
+ fload ${BP}/dev/video/common/init.fth \ Init code
+ fload ${BP}/dev/video/common/display.fth \ High level interface code
+ fload ${BP}/dev/video/common/textmode.fth \ VGA text mode
+ : (map-io-regs) h# ffff0000 to io-base ;
+ ' (map-io-regs) to map-io-regs
+end-package
+[then]
+
+[ifdef] use-ct65550
+0 0 " i3b0" " /isa" begin-package
+ fload ${BP}/dev/ct6555x/loadpkg.fth \ Video driver
+end-package
+devalias screen /isa/display \ Explicit, because it's not probed
+[then]
+
+[ifdef] use-es1887
+fload ${BP}/dev/isa/es1887.fth \ Sound chip driver
+devalias audio /isa/sound
+fload ${BP}/cpu/x86/decnc/sound.fth \ Startup sound
+[then]
+
+[ifdef] use-isa-ide
+0 0 " i1f0" " /isa" begin-package
+ fload ${BP}/dev/ide/isaintf.fth
+ fload ${BP}/dev/ide/generic.fth
+ 2 to max#drives
+ fload ${BP}/dev/ide/onelevel.fth
+end-package
+\ One-level IDE
+[then]
+
+\ Create the alias unless it already exists
+: $?devalias ( alias$ value$ -- )
+ 2over not-alias? if $devalias exit then ( alias$ value$ alias$ )
+ 2drop 4drop
+;
+
+: report-pci-fb ( -- )
+ " /pci/display" locate-device 0= if ( phandle )
+ " open" rot find-method if ( xt )
+ drop
+ " screen" " /pci/display" $devalias
+ then
+ then
+;
+
+: report-disk ( -- )
+ " /scsi" locate-device 0= if
+ drop
+ " scsi" " /scsi" $devalias
+ " disk" " /scsi/disk@0" $devalias
+ " c" " /scsi/disk@0" $devalias
+ " d" " /scsi/disk@1" $devalias
+ " e" " /scsi/disk@2" $devalias
+ " f" " /scsi/disk@3" $devalias
+ exit
+ then
+ " /pci-ide" locate-device 0= if
+ drop
+ " disk" " /pci-ide/ide@0/disk@0" $devalias
+ " c" " /pci-ide/ide@0/disk@0" $devalias
+ " d" " /pci-ide/ide@0/disk@1" $devalias
+ " e" " /pci-ide/ide@1/disk@0" $devalias
+ " f" " /pci-ide/ide@1/disk@1" $devalias
+ exit
+ then
+ " /ide" locate-device 0= if
+ drop
+ " disk" " /ide@1f0/disk@0" $devalias
+ " c" " /ide@1f0/disk@0" $devalias
+ " d" " /ide@170/disk@1" $devalias
+ " e" " /ide@1f0/disk@0" $devalias
+ " f" " /ide@170/disk@2" $devalias
+ exit
+ then
+;
+
+fload ${BP}/cpu/x86/inoutstr.fth \ Multiple I/O port read/write
+[ifdef] use-isa-ide
+dev /ide
+' pseudo-dma-in ' pseudo-dma-out set-blk-w
+device-end
+[then]
+
+[ifdef] use-ne2000
+0 0 " i300" " /isa" begin-package
+ start-module
+ fload ${BP}/dev/ne2000/ne2000.fth \ Ethernet Driver
+ end-module
+end-package
+[then]
+
+fload ${BP}/dev/isa/diaguart.fth \ ISA COM port driver
+h# 3f8 is uart-base
+fload ${BP}/forth/lib/sysuart.fth \ Use UART for key and emit
+\ fload ${BP}/cpu/x86/pc/egauart.fth \ Output also to EGA
+
+fload ${BP}/cpu/x86/pc/reset.fth \ reset-all
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2008 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: cpu/x86/pc/emu/emuofw.bth
===================================================================
--- cpu/x86/pc/emu/emuofw.bth (rev 0)
+++ cpu/x86/pc/emu/emuofw.bth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -0,0 +1,110 @@
+purpose: Construct the final OFW image
+
+command: &builder &this
+\ in: biostart.img
+in: rmreset.img
+in: pmreset.di
+in: paging.di
+in: fw.img
+in: ${BP}/dev/usb2/hcd/ohci/build/ohci.fc
+in: ${BP}/dev/usb2/hcd/uhci/build/uhci.fc
+in: ${BP}/dev/usb2/hcd/ehci/build/ehci.fc
+in: ${BP}/dev/usb2/device/hub/build/hub.fc
+in: ${BP}/dev/usb2/device/net/build/usbnet.fc
+in: ${BP}/dev/usb2/device/serial/build/usbserial.fc
+in: ${BP}/dev/usb2/device/storage/build/usbstorage.fc
+in: ${BP}/dev/usb2/device/keyboard/build/usbkbd.fc
+\ in: ${BP}/ofw/fs/nfs/build/nfs.di
+\ in: ${BP}/ofw/fs/cdfs/build/cdfs.di
+\ in: ${BP}/ofw/fs/fatfs/build/fatfs.di
+\ in: ${BP}/ofw/disklabel/build/disklabel.di
+\ in: ${BP}/ofw/inet/build/obptftp.di
+in: ${BP}/dev/pci/build/pcibridg.fc
+in: ${BP}/dev/ide/build/leghier.fc
+in: ${BP}/dev/video/build/cirrus.fc
+in: ${BP}/dev/ne2000/build/ne2kpci.fc
+in: ${BP}/dev/amd79970/build/vmlance.fc
+\ in: ${BP}/dev/video/build/video.fc
+in: ${BP}/cpu/x86/pc/biosload/linux.fth
+
+build-now
+
+fload ${BP}/cpu/x86/pc/emu/config.fth
+
+\ Always re-create the builton.fth file when we make a new rom.img
+fload ${BP}/cpu/x86/pc/builton.bth
+
+hex
+
+: pad-file ( location -- )
+ ofd @ fsize
+ 2dup u< abort" The ROM image is too large"
+ ?do h# ff ofd @ fputc loop
+;
+
+.( --- Saving as emuofw.rom - Binary ROM image format for emulator) cr
+writing emuofw.rom
+ " pmreset.di" $add-file
+ " paging.di" $add-file
+ " ${BP}/cpu/x86/build/inflate.bin" " inflate" $add-dropin
+ " fw.img" " firmware" $add-deflated-dropin
+ " ${BP}/dev/pci/build/pcibridg.fc" " class060400" $add-deflated-dropin
+ " ${BP}/dev/ide/build/leghier.fc" " class010180" $add-deflated-dropin
+
+\ The super-driver is overkill, we don't need support for lots of obsolete video cards
+\ " ${BP}/dev/video/build/video.fc" " class030000" $add-deflated-dropin
+
+\ Just use a driver targeted at the specific chipset that QEMU emulates
+ " ${BP}/dev/video/build/cirrus.fc" " pci1013,b8" $add-deflated-dropin
+
+ " ${BP}/dev/ne2000/build/ne2kpci.fc" " pci10ec,8029" $add-deflated-dropin
+ " ${BP}/dev/amd79970/build/vmlance.fc" " pci1022,2000" $add-deflated-dropin
+
+ " ${BP}/dev/usb2/hcd/uhci/build/uhci.fc" " class0c0300" $add-deflated-dropin
+ " ${BP}/dev/usb2/hcd/ohci/build/ohci.fc" " class0c0310" $add-deflated-dropin
+ " ${BP}/dev/usb2/hcd/ehci/build/ehci.fc" " class0c0320" $add-deflated-dropin
+
+ " ${BP}/dev/usb2/device/hub/build/hub.fc" " usb,class9" $add-dropin
+ " ${BP}/dev/usb2/device/keyboard/build/usbkbd.fc" " usb,class3,1" $add-dropin
+ " ${BP}/dev/usb2/device/net/build/usbnet.fc" " usbnet" $add-deflated-dropin
+ " ${BP}/dev/usb2/device/serial/build/usbserial.fc" " usbserial" $add-deflated-dropin
+ " ${BP}/dev/usb2/device/storage/build/usbstorage.fc" " usbstorage" $add-deflated-dropin
+
+ " builton.fth" " probe-" $add-dropin
+[ifndef] resident-packages
+ " ${BP}/ofw/fs/cdfs/build/cdfs.di" $add-file
+ " ${BP}/ofw/fs/fatfs/build/fatfs.di" $add-file
+ " ${BP}/ofw/fs/nfs/build/nfs.di" $add-file
+ " ${BP}/ofw/fs/dropinfs.fth" " dropin-file-system" $add-deflated-dropin
+ " ${BP}/ofw/disklabel/build/disklabel.di" $add-file
+ " ${BP}/ofw/inet/build/obptftp.di" $add-file
+ " ${BP}/dev/16550pkg/16550.fth" " 16550" $add-deflated-dropin
+ " ${BP}/cpu/x86/disassem.fth" " disassem.fth" $add-deflated-dropin
+ " ${BP}/ofw/ppp/build/ppp.di" $add-file
+\ " ${BP}/ofw/fs/ufs/ufs.fth" " ufs-file-system" $add-deflated-dropin
+ " ${BP}/ofw/fs/zipfs.fth" " zip-file-system" $add-deflated-dropin
+ " ${BP}/ofw/inet/tcp.fth" " tcp" $add-deflated-dropin
+ " ${BP}/ofw/inet/http.fth" " http" $add-deflated-dropin
+ " ${BP}/ofw/fs/ext2fs/ext2fs.fth" " ext2-file-system" $add-deflated-dropin
+ " ${BP}/ofw/inet/telnetd.fth" " telnetd" $add-deflated-dropin
+ " ${BP}/ofw/fs/fatfs/fdisk2.fth" " fdisk2.fth" $add-deflated-dropin
+[then]
+ " ${BP}/ofw/fcode/memtest.fth" " memtest.fth" $add-deflated-dropin
+
+ " ${BP}/ofw/inet/telnetd.fth" " telnetd" $add-deflated-dropin
+
+ " ${BP}/ofw/inet/httpdemo/index.htm" " index.htm" $add-dropin
+ " ${BP}/ofw/inet/httpdemo/config.htm" " config.htm" $add-dropin
+\ " ${BP}/ofw/inet/httpdemo/post.htm" " post.htm" $add-dropin
+ " ${BP}/ofw/inet/httpdemo/free.htm" " free.htm" $add-dropin
+ " ${BP}/ofw/inet/httpdemo/homelogo.gif" " homelogo.gif" $add-dropin
+
+ " ${BP}/cpu/x86/pc/biosload/linux.fth" " linux.fth" $add-dropin
+ " ${BP}/ofw/linux/penguin.txt" " penguin.txt" $add-dropin
+
+ " ${BP}/ofw/termemu/cp881-16.obf" " font" $add-deflated-dropin
+
+ h# 7.fc00 pad-file
+ " rmreset.img" $add-file
+ ofd @ fsize dropin-size <> if ." Size is wrong" cr then
+ofd @ fclose
Added: cpu/x86/pc/emu/fw.bth
===================================================================
--- cpu/x86/pc/emu/fw.bth (rev 0)
+++ cpu/x86/pc/emu/fw.bth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -0,0 +1,361 @@
+\ See license at end of file
+purpose: Build Open Firmware core for PC
+
+dictionary: ${BP}/cpu/x86/build/basefw.dic
+command: &x86forth &dictionary &this
+in: builton.fth
+build-now
+
+hex
+\ ' $report-name is include-hook
+
+fload ${BP}/cpu/x86/pc/emu/config.fth
+
+: headerless ; : headers ; : headerless0 ;
+
+' (quit) to quit
+
+create debug-startup
+: \Tags [compile] \ ; immediate
+: \NotTags [compile] \ ; immediate
+
+: RAMbase ( -- adr ) fw-virt-base ;
+: RAMtop ( -- adr ) RAMbase /fw-ram + ;
+
+h# 00.0000 value dp-loc \ Set in patchboot
+: stacktop ( -- adr ) RAMtop ;
+: dict-limit ( -- adr ) RAMtop h# 06.0000 - ;
+
+\ XXX What we should do is pass in the top address in SP, and have
+\ boot.fth allocate the user area by subtracting user-size. But
+\ we need some way of finding it again for exception re-entry.
+\ prom-main-task is used in arch/pc/boot.fth . The constant
+\ value is wired into the assembly code
+stacktop user-size - ( fw-virt-base - ) constant prom-main-task \ user area for main task
+
+0 value load-limit \ Top address of area at load-base
+' 2drop to sync-cache
+
+def-load-base ' load-base set-config-int-default
+
+true ' fcode-debug? set-config-int-default
+\ false ' auto-boot? set-config-int-default
+
+[ifdef] serial-console
+" com1" ' output-device set-config-string-default
+" com1" ' input-device set-config-string-default
+[then]
+
+\ XXX should be loaded by basefw.bth
+fload ${BP}/cpu/x86/initpgm.fth \ Basic boot handler
+
+: (cpu-arch ( -- adr len )
+ " architecture" ['] root-node get-package-property drop
+ get-encoded-string
+;
+' (cpu-arch to cpu-arch
+
+h# 1000 to pagesize
+d# 12 to pageshift
+
+dev /
+1 encode-int " #address-cells" property
+
+" Emulated PC" model
+" PC" encode-string " architecture" property
+
+\ XXX figure out bus frequency. How?
+\ d# 33,333,333 " clock-frequency" integer-property
+device-end
+
+\ Memory management services
+[ifdef] virtual-mode
+fload ${BP}/ofw/core/clntmem1.fth \ client services for memory
+[else]
+fload ${BP}/ofw/core/clntphy1.fth \ client services for memory
+[then]
+fload ${BP}/ofw/core/memlist.fth \ Resource list common routines
+fload ${BP}/ofw/core/showlist.fth \ Linked list display tool
+fload ${BP}/ofw/core/allocph1.fth \ S Physical memory allocator
+fload ${BP}/ofw/core/availpm.fth \ Available memory list
+
+fload ${BP}/cpu/x86/pc/rootnode.fth \ Platform-specific root node changes
+
+fload ${BP}/cpu/x86/pc/emu/probemem.fth \ Memory probing
+
+[ifdef] virtual-mode
+fload ${BP}/cpu/x86/loadvmem.fth \ /mmu node
+stand-init: MMU
+ " /mmu" open-dev mmu-node !
+;
+fload ${BP}/cpu/x86/pc/initdict.fth \ Dynamic dictionary allocation
+[then]
+
+\ XXX should be elsewhere
+dev /client-services
+: chain ( len args entry size virt -- )
+ release ( len args entry )
+ h# 8000 alloc-mem h# 8000 + (init-program) ( len args )
+ to %ebx to %ecx
+ go
+;
+device-end
+
+fload ${BP}/cpu/x86/crc32.fth \ Assembly language Zip CRC calculation
+fload ${BP}/forth/lib/crc32.fth \ High-level portion of CRC calculation
+
+[ifdef] resident-packages
+
+[ifdef] use-ufs
+support-package: ufs-file-system
+ fload ${BP}/ofw/fs/ufs/ufs.fth \ Unix file system
+end-support-package
+[then]
+
+[ifdef] linux-support
+\needs unix-seconds> fload ${BP}/ofw/fs/unixtime.fth \ Unix time calculation
+support-package: ext2-file-system
+ fload ${BP}/ofw/fs/ext2fs/ext2fs.fth \ Linux file system
+end-support-package
+[then]
+
+support-package: zip-file-system
+ fload ${BP}/ofw/fs/zipfs.fth \ Zip file system
+end-support-package
+
+support-package: dropin-file-system
+ fload ${BP}/ofw/fs/dropinfs.fth \ Dropin file system
+end-support-package
+[then]
+
+\ Load file format handlers
+
+: call32 ;
+
+fload ${BP}/ofw/core/allocsym.fth \ Allocate memory for symbol table
+fload ${BP}/ofw/core/symcif.fth
+fload ${BP}/ofw/core/symdebug.fth
+: release-load-area ( boundary-adr -- ) drop ;
+
+fload ${BP}/cpu/x86/pc/fixkbd.fth \ Switch keyboard scan codes
+
+[ifdef] use-elf
+fload ${BP}/ofw/elf/elf.fth
+fload ${BP}/ofw/elf/elfdebug.fth
+[ifdef] virtual-mode
+\ Depends on the assumption that physical memory is mapped 1:1 already
+: (elf-map-in) ( va size -- ) 0 mem-claim drop ;
+' (elf-map-in) is elf-map-in
+[else]
+' 2drop is elf-map-in
+[then]
+[then]
+
+\ Reboot and re-entry code
+fload ${BP}/cpu/x86/pc/reboot.fth \ Restart the client program
+fload ${BP}/cpu/x86/pc/reenter.fth \ Various entries into Forth
+
+headerless
+[ifdef] virtual-mode
+: (initial-heap) ( -- adr len )
+ mem-info-pa la1+ l@ heap-size - ( adr )
+ dup mem-info-pa la1+ l! ( adr )
+ heap-size
+;
+[else]
+: (initial-heap) ( -- adr len ) heap-base heap-size ;
+[then]
+' (initial-heap) is initial-heap
+headers
+
+" /openprom" find-device
+ " FirmWorks,3.0" encode-string " model" property
+device-end
+
+[ifdef] virtual-mode
+fload ${BP}/cpu/x86/pc/mmusetup.fth \ Initial values for MMU lists
+[then]
+
+fload ${BP}/cpu/x86/pc/emu/devices.fth
+
+fload ${BP}/dev/scsi/probscsi.fth \ probe-scsi and probe-scsi-all
+
+true ' local-mac-address? set-config-int-default
+[ifdef] resident-packages
+support-package: nfs
+ fload ${BP}/ofw/fs/nfs/loadpkg.fth
+end-support-package
+[then]
+devalias nfs net//obp-tftp:last//nfs
+
+fload ${BP}/ofw/inet/loadtcp.fth
+
+support-package: http
+ fload ${BP}/ofw/inet/http.fth \ HTTP client
+end-support-package
+
+[ifndef] use-timestamp-counter
+fload ${BP}/cpu/x86/pc/mscal.fth
+[then]
+fload ${BP}/cpu/x86/pc/boot.fth
+
+hex
+\ If there is a PCI ethernet adapter, use it as the default net device,
+\ otherwise use any ethernet that can be found in the device tree.
+: report-net ( -- )
+ " /pci/ethernet" 2dup find-package if ( name$ phandle )
+ drop ( name$ )
+ else ( name$ )
+ 2drop " /ethernet" ( name$' )
+ then ( name$ )
+ " net" 2swap $devalias ( )
+;
+
+fload ${BP}/cpu/x86/pc/biosload/usb.fth
+
+\ false to stand-init-debug?
+true to stand-init-debug?
+
+hex
+stand-init-debug? [if]
+warning @ warning off
+: init
+\ initial-heap add-memory
+ init
+
+ standalone? if
+ cr ." Type 'i' to interrupt stand-init sequence" cr
+ d# 2000 ms
+ key? if
+ key upc ascii I = if ." Interacting" cr hex interact then
+ then
+ then
+
+\ cr0@ h# 9fff.ffff and cr0! \ enable L1 and L2 caches
+
+;
+warning !
+[then]
+
+[ifdef] virtualbox-loaded
+also hidden also keys-forth definitions
+\ The VirtualBox "serial port" can be accessed via a telnet client.
+\ Telnet normally sends CR-LF at the end of the line and it is hard
+\ to turn that off because of incompatibilies between various clients
+\ and servers. So if there is a key already queued up right after a
+\ newline, we just eat it.
+: telnet-newline ( -- )
+ new-line-or-done key? if key drop then
+;
+warning @ warning off
+: ^m telnet-newline ;
+: ^j telnet-newline ;
+warning !
+previous previous definitions
+[then]
+
+: (.firmware) ( -- )
+ ." Open Firmware " .built cr
+ ." Copyright 1999 FirmWorks All Rights Reserved" cr
+;
+' (.firmware) to .firmware
+
+: linux-logo ( -- )
+ " penguin.txt" find-drop-in if page type then
+;
+
+: probe-all ( -- )
+ " probe-" do-drop-in
+ ." probe-pci" cr
+\ debug-me
+ probe-pci
+[ifdef] probe-isa-modem
+ probe-isa-modem
+[then]
+ probe-usb
+ report-disk
+ report-net
+ report-pci-fb
+;
+
+: startup ( -- )
+ standalone? 0= if exit then
+\ ." calibrate-ms" cr
+\ calibrate-ms
+
+ ." nvramrc" cr
+ use-nvramrc? if nvramrc safe-evaluate then
+
+ auto-banner? if
+ " Probing" ?type probe-all
+ " Install console" ?type install-console
+ banner
+ then
+
+ hex
+ warning on
+ only forth also definitions
+
+\ install-alarm
+
+ #line off
+
+ ." Open Firmware demonstration version by FirmWorks (info(a)firmworks.com)" cr
+
+ quit
+;
+
+[ifdef] use-watch-all
+fload ${BP}/cpu/x86/pc/watchall.fth
+[then]
+
+alias crcgen drop ( crc byte -- crc' )
+fload ${BP}/cpu/x86/pc/saveabs.fth
+
+fload ${BP}/forth/lib/selstr.fth
+
+[ifdef] pc-linux
+" a:\initrd.imz" d# 128 config-string ramdisk
+" root=/dev/ram0 mount_ramdisk=1" ' boot-file set-config-string-default
+" a:\vmlinuz" ' boot-device set-config-string-default
+true ' client-symbols? set-config-int-default
+\ Also try " console=/dev/ttyS0,9600 console=/dev/tty0" in boot-file
+[then]
+
+[ifdef] linux-support
+fload ${BP}/cpu/x86/pc/linux.fth
+[then]
+
+fload ${BP}/cpu/x86/pc/biosload/vmdoor.fth \ VMware interfaces
+
+" dhcp" ' ip-address set-config-string-default
+
+.( SAVING FW.dic ...)
+" fw.dic" $save-forth cr
+
+.( Saving fw.img ...)
+" fw.img" RAMbase save-abs-rom cr
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2006 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: cpu/x86/pc/emu/pcinode.fth
===================================================================
--- cpu/x86/pc/emu/pcinode.fth (rev 0)
+++ cpu/x86/pc/emu/pcinode.fth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -0,0 +1,115 @@
+\ See license at end of file
+purpose: PCI bus package
+
+also forth definitions
+
+\ probe all slots
+" 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,10,11,12,13,14,15,16,17,18,19,1a,1b,1c,1d,1e,1f"
+\ " 1,2,3,4,5,6,7,8,9,a,b,c,d,e,f"
+ dup config-string pci-probe-list
+
+previous definitions
+
+h# c000.0000 to first-mem \ Avoid RAM at low addresses
+h# e000.0000 to mem-space-top
+h# 0000.8000 to first-io \ Avoid mappings established by BIOS
+
+defer config-setup
+defer config-done
+
+\ Configuration mechanism #1 as defined in the PCI spec.
+: config-setup1 ( config-adr -- vaddr )
+ \ Bit 31 ("enable") must be 1, bits 30:24 ("reserved") must be 0,
+ \ bits 1:0 must be 0.
+ dup h# ff.fffc and h# 8000.0000 or h# cf8 pl! ( config-adr )
+
+ 3 and h# cfc + \ Merge in the byte selector bits
+;
+
+\ These versions of config-x@/! are for "configuration mechanism #2"
+\ as described in the PCI design guide. That mechanism is not the
+\ recommended one, but several PC PCI chipsets use it.
+
+: config-setup2 ( bus#|dev#|function|reg# -- port-adr )
+ \ XXX For now, we ignore the bus number
+ \ Write function number and "access config space" key to the config
+ \ space enable register
+ dup 7 >> h# e and h# 10 or h# cf8 pc! ( bus#|dev#|function#|reg#)
+ dup h# ff and swap d# 11 >> h# f and 8 << or h# c000 or
+;
+: config-done2 ( -- ) 0 h# cf8 pc! ;
+
+: config-b@ ( config-adr -- b ) config-setup pc@ config-done ;
+: config-w@ ( config-adr -- w ) config-setup pw@ config-done ;
+: config-l@ ( config-adr -- l ) config-setup pl@ config-done ;
+: config-b! ( b config-adr -- ) config-setup pc! config-done ;
+: config-w! ( w config-adr -- ) config-setup pw! config-done ;
+: config-l! ( l config-adr -- ) config-setup pl! config-done ;
+
+: mechanism1 ( -- )
+ ['] config-setup1 to config-setup
+ ['] noop to config-done
+;
+mechanism1
+: mechanism2 ( -- )
+ ['] config-setup2 to config-setup
+ ['] config-done2 to config-done
+;
+
+\ !!! assumes a device in either slot 0 or slot 1 !!!
+\ and that failed reads return -1.
+: init ( -- )
+ mechanism1
+ 0 config-l@ -1 = h# 800 config-l@ -1 = and if
+ mechanism2
+\ h# 0000.5000 to first-io \ Avoid on-board SCSI chip's BIOS mapping
+\ " 3,4,5" to pci-probe-list
+ then
+;
+
+\ Determine the parent interrupt information (the "interrupt line" in PCI
+\ parlance) from the child's "interrupt pin" and the child's address,
+\ returning "int-line true" if the child's interrupt line register should
+\ be set or "false" otherwise.
+: assign-int-line ( phys.hi.func INTx -- irq true )
+ \ Reiterate the value that is already in the int line register,
+ \ which was presumably placed there by the BIOS
+ drop h# 3c + config-b@ true
+;
+
+\ XXX we should keep a table of already-mapped addresses so that
+\ successive map/unmaps of the same address will succeed.
+
+
+\ The io-base handling really ought to be in the root node, but
+\ that would require more changes than I'm willing to do at present.
+warning @ warning off
+: map-out ( vaddr size -- )
+ over io-base u>= if 2drop exit then ( vaddr size )
+ map-out ( )
+;
+warning !
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2006 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: cpu/x86/pc/emu/pmreset.bth
===================================================================
--- cpu/x86/pc/emu/pmreset.bth (rev 0)
+++ cpu/x86/pc/emu/pmreset.bth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -0,0 +1,156 @@
+\ See license at end of file
+purpose: Build file for dropin dispatcher - version for direct ROM startup
+
+command: &builder &this
+build-now
+
+fload ${BP}/cpu/x86/pc/emu/config.fth
+
+\ If debug-startup is not defined in config.fth, the "init-com1" and "report"
+\ macros will be noops; otherwise they will generate COM port access code.
+
+\needs start-assembling fload ${BP}/cpu/x86/asmtools.fth
+\needs write-dropin fload ${BP}/forth/lib/mkdropin.fth
+
+fload ${BP}/cpu/x86/mmuparam.fth
+
+\ startmacros.fth defines some assembler macros that make it easy to
+\ access MSRs, I/O ports, and PCI config registers.
+
+fload ${BP}/cpu/x86/startmacros.fth
+
+hex
+
+fload ${BP}/cpu/x86/pc/finddi.fth \ find-dropin and other tools
+
+h# 3e.0000 constant inflate-base \ Where to put the inflater in memory
+h# 30.0000 constant workspace \ when inflating the Forth part of OFW
+
+start-assembling
+
+label my-entry
+ h# e9 c, 0 l, \ Skip support subroutines, jmp offset patched later
+end-code
+
+[ifdef] debug-startup
+fload ${BP}/cpu/x86/pc/dot.fth \ Numeric output
+[then]
+
+fload ${BP}/cpu/x86/pc/romfind.fth \ Support subroutine: find-dropin
+
+label startup \ Target of jmp instruction at my-entry
+ h# 10 port80
+
+\ Perform low-level initialization of bridges here, typically at least
+\ to the level where it's possible to talk to the COM port
+
+ h# 12 port80
+
+ init-com1
+ carret report linefeed report
+ char F report
+
+\ Perform RAM controller initialization here.
+
+ h# 14 port80
+ char o report
+
+ h# 80000 # sp mov \ Temporary stack pointer for debugging
+
+[ifdef] notdef
+ \ This is an example of how you could display numeric information
+ \ on the serial port during startup. This only works after memory
+ \ is turned on, because it requires a stack. Before memory is on,
+ \ you can display individual characters with "report", but not numbers.
+ ax push \ Save EAX because "dot" destroys it
+ dot #) call \ Display whatever is in EAX as a hex number
+ ax pop \ Restore saved EAX
+[then]
+
+ \ Determine the memory size
+
+ \ Adjust assembler structured conditionals to permit long blocks
+ long-offsets on
+
+ \ Set locations just below power-of-two boundaries to the boundary value
+ h# 8000.0000 # si mov \ Start address
+ h# 200.0000 # di mov \ End address (assume at least 32 MiB)
+ si ax mov
+ begin
+ ax -4 [ax] mov \ Set e.g. loc 3ffffffc to 40000000
+ 1 # ax shr \ Step down to the next power of two
+ di ax cmp \ Stop at lower limit
+ < until
+
+ \ Look for a location that contains the expected data
+ si ax mov
+ begin
+ -4 [ax] bx mov
+ bx ax cmp
+ <> while
+ 1 # ax shr
+ di ax cmp
+ < if
+ \ Halt with a message if we go below the end address
+ h# 1e port80
+ bl report
+ char B report char A report char D report
+ char M report char E report char M report
+ begin hlt again
+ then
+ repeat
+
+ \ Put the memory size where resetend.fth can find it
+ ax mem-info-pa #) mov \ Total size
+ ax mem-info-pa 4 + #) mov \ Allocation pointer
+
+ \ Turn on the cache
+ cr0 ax mov
+ 6000.0000 bitclr \ Cache-disable off, coherent
+ ax cr0 mov
+ invd
+
+ \ Now we can use the stack and do conventional subroutine calls
+ h# 16 port80
+ char r report
+
+ \ resetend.fth finds the Forth part of OFW, moves/uncompresses it
+ \ into RAM, and runs it. It's independent of board-specific
+ \ I/O hardware, so it can be shared between different board ports.
+
+ fload ${BP}/cpu/x86/pc/resetend.fth
+end-code
+
+also 386-assembler
+startup my-entry put-branch
+previous
+
+end-assembling
+
+writing pmreset.di
+asm-base here over - 0 " pmreset" write-dropin
+ofd @ fclose
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2008 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: cpu/x86/pc/emu/probemem.fth
===================================================================
--- cpu/x86/pc/emu/probemem.fth (rev 0)
+++ cpu/x86/pc/emu/probemem.fth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -0,0 +1,66 @@
+\ See license at end of file
+purpose: Create memory node properties and lists
+
+dev /memory
+
+: cmos@ ( offset -- byte ) h# 70 pc! h# 71 pc@ ;
+: /ram ( -- #bytes ) mem-info-pa l@ ;
+
+: release-range ( start-adr end-adr -- ) over - release ;
+
+: probe ( -- )
+ 0 /ram reg \ Report extant memory
+
+ \ Put h# 10.0000-1f.ffff and 28.0000-memsize in pool,
+ \ reserving 0..10.0000 for the firmware
+ \ and 20.0000-27.ffff for the "flash"
+
+\ h# 0.0000 h# 02.0000 release \ A little bit of DMA space, we hope
+\ h# 10.0000 h# 0f.ffff release
+\ h# 28.0000 h# 80.0000 h# 28.0000 - release
+
+\ Release some of the first meg, between the page tables and the DOS hole,
+\ for use as DMA memory.
+ mem-info-pa 2 la+ l@ h# a.0000 release-range \ Below DOS hole
+
+[ifdef] virtual-mode
+ h# 10.0000 mem-info-pa la1+ l@ over - release
+[else]
+ fw-pa h# 10.0000 u> if
+ h# 10.0000 fw-pa over - release
+ fw-pa /fw-ram + heap-base heap-size + umax /ram release
+ then
+[then]
+;
+
+device-end
+
+also forth definitions
+stand-init: Probing memory
+ " probe" memory-node @ $call-method
+;
+previous definitions
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2006 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: cpu/x86/pc/emu/rmreset.bth
===================================================================
--- cpu/x86/pc/emu/rmreset.bth (rev 0)
+++ cpu/x86/pc/emu/rmreset.bth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -0,0 +1,260 @@
+\ See license at end of file
+purpose: x86 real mode startup code.
+
+command: &builder &this
+build-now
+
+fload ${BP}/cpu/x86/pc/emu/config.fth
+
+\ 386/486 processors begin executing at address ffff.fff0 in real mode
+\ when they come out of reset. Normally, that address would not be
+\ accessable in real mode, but the processor does some magic things to
+\ the Code Segment register so that the high order address lines are
+\ "boosted" up to the ffff.xxxx range just after reset. The "boosting"
+\ persists until the CS register is modified (i.e. with a far jump).
+
+\ The other segment register are not "boosted", so they can only access
+\ the normal real mode range, essentially just the first megabyte.
+
+\ The startup code must establish a Global Descriptor Table containing
+\ suitable mappings, and then enter protected mode. The space between
+\ ffff.fff0 and the end of the ROM is insufficient to do this, so the
+\ first few instructions must jump elsewhere, to a place where there
+\ is enough room.
+
+\ The code below is rather tricky, especially since the Forth assembler
+\ always assumes 32-bit operand size and 32-bit addressing modes.
+\ The code is executing in 16-bit mode, so the assembler must be used
+\ carefully to ensure generation of the correct opcodes, and override
+\ prefixes where necessary.
+
+
+\needs start-assembling fload ${BP}/cpu/x86/asmtools.fth
+\needs write-dropin fload ${BP}/forth/lib/mkdropin.fth
+
+hex
+
+start-assembling
+hex
+
+\ Addresses where the following items will be located in the processor's
+\ physical address space:
+
+\ ffff.fc00: GDT ( 3 entries ) + padding
+\ ffff.fc20: GDT address + size ( 6 bytes ) plus padding
+\ ffff.fc28: Startup code plus padding
+\ ffff.fff0: Reset entry point - jump to startup code plus padding to end
+
+\ Assembler macros for startup diagnostics
+
+\ write a byte to an ISA port
+: risa-c! ( n a - ) " # dx mov # al mov al dx out " evaluate ;
+
+: num>asc ( al: b -- al: low ah: hi )
+ " al ah mov " evaluate
+ " h# f # al and " evaluate
+ " h# 9 # al cmp > if h# 57 # al add else h# 30 # al add then " evaluate
+
+ " ah shr ah shr ah shr ah shr " evaluate \ shift down four bits
+ " h# f # ah and " evaluate
+ " h# 9 # ah cmp > if h# 57 # ah add else h# 30 # ah add then " evaluate
+
+ " al bl mov ah al mov bl ah mov " evaluate
+
+;
+
+[ifdef] no-port80
+: port80 ( byte -- ) drop ;
+[else]
+: port80 ( byte -- ) " # al mov al h# 80 # out" evaluate ;
+[then]
+
+\ The simple COM port initialization in this file assumes that the hardware
+\ path to the COM port (southbridge+superIO or whatever) is active immediately
+\ after reset, requiring no special initialization. That's usually not a good
+\ assumption for modern machines. So it's often best to ignore the serial
+\ debugging feature in this file, perhaps using it in later files after the
+\ bridges have been set up. Port80 debug generally suffices herein.
+
+[ifdef] debug-reset
+.( debug reports enabled ) cr
+: init-com1 ( -- )
+ 1 3fc risa-c! \ DTR on
+ 80 3fb risa-c! \ Switch to bank 1 to program baud rate
+ 01 3f8 risa-c! \ Baud rate divisor low - 115200 baud
+ 0 3f9 risa-c! \ Baud rate divisor high - 115200 baud
+ 3 3fb risa-c! \ 8 bits, no parity, switch to bank 0
+;
+\ Assembler macro to assemble code to send the character "char" to COM1
+: report ( char -- )
+ " begin 3fd # dx mov dx al in 20 # al and 0<> until" evaluate
+ ( char ) " # al mov 3f8 # dx mov al dx out " evaluate
+ " begin 3fd # dx mov dx al in 20 # al and 0<> until" evaluate
+;
+\ Put character in al
+: reportc
+ " al ah mov " eval
+ " begin 3fd # dx mov dx al in 20 # al and 0<> until" evaluate
+ ( char ) " ah al mov 3f8 # dx mov al dx out " evaluate
+ " begin 3fd # dx mov dx al in 20 # al and 0<> until" evaluate
+;
+[else]
+: report ( char -- ) drop ;
+: reportc ( -- ) ;
+[then]
+
+\ Real Mode Startup
+
+label rm-startup \ Executes in real mode with 16-bit operand forms
+
+ \ ffff.fc00 GDT
+hex
+
+ 0 w, 0 l, 0 w, \ 0 Mandatory null descriptor
+ 0 w, 0 l, 0 w, \ * Another null descriptor
+ ffff w, 9b.000000 l, 00.c.f w, \ 10 Code, linear=physical, full 4Gbytes
+ ffff w, 93.000000 l, 00.c.f w, \ 18 Data, linear=physical, full 4Gbytes
+
+ \ ffff.fc20 GDT limit + address
+
+ 1f w, ffff.fc00 l, \ # slots (4 * 8 - 1) , starting address
+ 0 w, \ Padding
+
+ \ ------->>>>> Startup code, reached by branch from main entry point below
+ \
+ \ ffff.fc28
+
+ here \ Mark the beginning of this code so its size may be determined
+ \ and so that a jump to it may be assembled later.
+
+ 16-bit
+
+ h# 01 port80
+ cld
+
+\ Normally it's best to keep this file short, thus minimizing the time spend
+\ in 16-bit real mode (which is painful to program in). But some CPUs start
+\ out with a really slow clock, only running fast after you turn on the PLL.
+\ On such machines, if you are trying to achieve the fastest possible startup,
+\ it makes sense to put the PLL turnon code here, thus minimizing the number
+\ of instructions executed in slow mode.
+
+ h# 02 port80
+
+[ifdef] debug-reset
+init-com1
+carret report \ send it to com1 if you can...
+linefeed report \ send it to com1 if you can...
+ascii F report \ send it to com1 if you can...
+[then]
+
+ \ The following instruction uses the CS: segment override because
+ \ that segment is currently "boosted" up into the ROM space.
+ \ It uses the operation size override to load a 32-bit pointer.
+ \ The address override is not used; the GDT limit/address data structure
+ \ above is reachable with a 16-bit address and through the "boosted"
+ \ code segment.
+
+ op: cs: 0f c, 01 c, 16 c, fc20 w, \ lgdte cs:[fc20] Setup GDT
+
+ op: cr0 bx mov \ Get existing CR0 value
+
+ 1 # bl or \ Set "protected mode" bit
+
+ bx cr0 mov \ Enter protected mode
+ ahead then \ jmp to next location to flush prefetch queue
+ \ note: CPL is now 0
+
+ h# 03 port80
+
+ \ We are in protected mode, but we are still executing from old
+ \ 16-bit code segment, and will continue to do so until the far jump
+ \ below
+
+[ifdef] debug-reset
+ascii o report
+[then]
+
+ \ set segment registers
+ bx bx xor \ Clear high byte
+ h# 18 # bl mov \ Data segment selector
+ bx ds mov \ Set segment register
+ bx es mov \ Set segment register
+ bx fs mov \ Set segment register
+ bx gs mov \ Set segment register
+
+[ifdef] debug-reset
+ascii r report
+[then]
+
+ bx ss mov \ Set segment register
+
+[ifdef] debug-reset
+ascii t report
+ascii h report
+[then]
+
+ h# 0f port80
+
+ op: ad: ResetBase h# 10 #) far jmp \ Jump to Forth startup
+
+ \ Pad the startup code so that the main entry point ends up at the
+ \ correct address.
+
+ here over - ( adr , size-of-preceding-code )
+
+ \ ffff.fc28 is the location of the code that follows the GDT
+ h# ffff.fff0 h# ffff.fc28 - swap - ( address #bytes-to-pad )
+
+ \ The code mustn't extend past ffff.ffc0, because that is where PC
+ \ manufacturers put the 0x10-byte BIOS version string.
+ dup h# 30 - also forth 0< previous abort" Real mode startup code is too big"
+
+ also forth here over h# ff fill previous \ fill with FFs
+ ( #bytes-to-pad ) allot \ Pad out to ffff.fff0
+
+ \ ------->>>>> Main Entry Point
+ \
+ \ ffff.fff0 - This is the hardwired address where the processor jumps
+ \ when it comes out of reset
+
+ 16-bit
+ cli \ Turn off interrupts (does not affect NMI)
+ #) jmp \ Relative jump back to ffff.fc28
+ h# ffffffff l,
+ h# ffffffff l,
+ h# ffffffff l, \ Good place to put a CRC
+end-code
+
+end-assembling
+
+writing rmreset.img
+rm-startup here over - ofd @ fputs
+ofd @ fclose
+
+here rm-startup - constant /rm-startup
+/rm-startup h# 400 <> abort" Real mode startup code is not the right size"
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2008 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Modified: cpu/x86/pc/linux.fth
===================================================================
--- cpu/x86/pc/linux.fth 2008-12-24 21:16:22 UTC (rev 1049)
+++ cpu/x86/pc/linux.fth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -135,6 +135,7 @@
\ If we are running in physical address mode, make a page directory
\ that will map up when the kernel turns on paging.
+[ifdef] fw-map-limit
: v=p-pde ( adr -- )
dup h# 83 or cr3@ rot d# 22 rshift la+ l!
;
@@ -145,6 +146,7 @@
fw-map-limit fw-map-base do i v=p-pde h# 40.0000 +loop
cr4@ h# 10 or cr4!
;
+[then]
: linux-fixup ( -- )
[ifdef] linux-logo linux-logo [then]
@@ -153,7 +155,7 @@
linux-base linux-params (init-program)
linux-params to %esi
- make-ofw-pdir
+ [ifdef] make-ofw-pdir make-ofw-pdir [then]
linux-hook
;
Added: cpu/x86/startmacros.fth
===================================================================
--- cpu/x86/startmacros.fth (rev 0)
+++ cpu/x86/startmacros.fth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -0,0 +1,148 @@
+\ See license at end of file
+
+\ Some x86 assembler macros to make it easier to write x86 early
+\ startup code. There are macros to set MSRs to specific values,
+\ to set and clear individual MSR bits, to read and write PCI
+\ configuration registers with the common CF8/CFC mechanism,
+\ and to read and write I/O ports.
+
+\ The code keeps the MSR register number in %ecx, the low 32 bits
+\ of the value in %eax, and the high 32 bits in %edx, consistent
+\ with the way the rdmsr and wrmsr machine instructions work.
+
+\ The bitset and bitclr operations work on %eax, and the -hi versions
+\ work on %edx.
+
+\ The I/O port operations also leave the data in %eax, so you can
+\ use bitset and bitclr with them too.
+
+-1 value last-cx
+also 386-assembler definitions
+
+\ If you do any direct manipulation of ECX in your startup code,
+\ say "forget-msr" afterwards, so the MSR access macro will know
+\ that ECX needs to be reloaded.
+
+: forget-msr -1 to last-cx ;
+
+\ set-cx is an internal implementation factor used by wmsr and rmsr.
+\ It assembles code to put an MSR number in %ecx, optimizing out
+\ unnecessary code by remembering what was last put there.
+
+: set-cx ( reg# -- )
+ [ also forth ]
+ dup last-cx = if
+ drop
+ else
+ dup to last-cx
+ [ previous ] # cx mov [ also forth ]
+ then
+ [ previous ]
+;
+
+\ Read/write an MSR to/from %edx,%eax
+: rmsr ( reg# -- ) set-cx h# 0f c, h# 32 c, ;
+: wmsr ( reg# -- ) set-cx h# 0f c, h# 30 c, ;
+
+\ These bit operations can be used between "rmsr" and "wmsr"
+
+\ Bit operations on the low 32-bit value in %eax
+: bitset ( mask -- ) # ax or ;
+: bitand ( mask -- ) # ax and ;
+: bitclr ( mask -- ) invert bitand ;
+
+\ Bit operations on the high 32-bit value in %edx
+: bitset-hi ( mask -- ) # dx or ;
+: bitand-hi ( mask -- ) # dx and ;
+: bitclr-hi ( mask -- ) invert bitand-hi ;
+
+\ Set an MSR to a verbatim 64-bit value
+: set-msr ( d.val reg# -- ) -rot # dx mov # ax mov wmsr ;
+
+\ Set or clear bits in an MSR (read-modify-write the register)
+: bitset-msr ( mask reg# -- ) tuck rmsr bitset wmsr ;
+: bitclr-msr ( mask reg# -- ) tuck rmsr bitclr wmsr ;
+
+\ Some I/O port operations
+\ These could be optimized to generate the immediate forms of in and out
+\ for 8-bit port numbers, but it's not worth the trouble because we
+\ access very few low-numbered ports.
+: port-wb ( b port# -- ) swap # al mov # dx mov al dx out ;
+: port-rb ( port# -- ) # dx mov dx al in ;
+: port-ww ( w port# -- ) swap # ax mov # dx mov op: ax dx out ;
+: port-rw ( port# -- ) ax ax xor # dx mov op: dx ax in ;
+: port-wl ( l port# -- ) swap # ax mov # dx mov ax dx out ;
+: port-rl ( port# -- ) # dx mov dx ax in ;
+
+[ifdef] no-port80
+: port80 ( byte -- ) drop ;
+[else]
+: port80 ( byte -- ) " # al mov al h# 80 # out" evaluate ;
+[then]
+
+: config-setup ( config-adr -- )
+ [ also forth ]
+ dup 3 invert and h# 8000.0000 or ( config-adr cf8-value )
+ [ previous ]
+ # ax mov ( config-adr )
+ h# cf8 # dx mov ( config-adr )
+ ax dx out ( config-adr )
+ [ also forth ]
+ 3 and h# cfc or ( data-port )
+ [ previous ]
+ # dx mov
+;
+: config-wl ( l config-adr -- )
+ config-setup ( l )
+ # ax mov
+ ax dx out
+;
+: config-rl ( config-adr -- ) \ Returns value in EAX
+ config-setup
+ dx ax in
+;
+: config-ww ( w config-adr -- )
+ config-setup ( w )
+ op: # ax mov ( )
+ op: ax dx out
+;
+: config-rw ( config-adr -- ) \ Returns value in AX
+ config-setup ( )
+ ax ax xor
+ op: dx ax in
+;
+: config-rb ( config-adr -- ) \ Returns value in AL
+ config-setup ( )
+ ax ax xor
+ dx al in
+;
+
+: set-base ( adr -- ) # bx mov ;
+: reg-save ( offset -- ) [bx] ax mov ax stos ;
+: reg-restore ( offset -- ) ax lods ax swap [bx] mov ;
+
+previous definitions
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2006 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/isa/soundblaster.fth
===================================================================
--- dev/isa/soundblaster.fth (rev 0)
+++ dev/isa/soundblaster.fth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -0,0 +1,378 @@
+purpose: SoundBlaster driver
+copyright: Copyright 1997 FirmWorks All Rights Reserved
+
+hex
+
+headers
+\needs +i : +i ( adr len n -- adr' len' ) encode-int encode+ ;
+\needs encode-null : encode-null ( -- adr len ) 0 0 encode-bytes ;
+\needs microseconds : microseconds ( n -- ) 0 do d# 4 0 do loop loop ;
+
+0 0 " i220" " /isa" begin-package
+ " sound" device-name
+ " sound" device-type
+
+ h# 10 encode-int " #channels" property
+
+ encode-null " built-in" property
+
+ encode-null
+ d# 9 encode-int encode+ 1 encode-int encode+ \ Input (capture)
+ d# 15 encode-int encode+ 1 encode-int encode+ \ Output (playback)
+ " interrupts" property
+
+ encode-null
+ \ Channel Type(2=F) DataBits CountBits BusMastering?
+ 0 +i 3 +i 8 +i d# 16 +i 0 +i \ First channel
+ 5 +i 3 +i 8 +i d# 16 +i 0 +i \ Second channel
+ " dma" property
+
+
+true instance value use-dma? \ set at open
+false instance value polled-mode? \ set at read/write/tone
+
+: dma-alloc ( n -- vaddr ) " dma-alloc" $call-parent ;
+: dma-free ( vaddr n -- ) " dma-free" $call-parent ;
+
+1 value dma-channel#
+: >chan ( offset -- port ) dma-channel# wa+ ;
+: low-page ( -- port ) " "(87 83 81 82)" drop dma-channel# + c@ ;
+: high-page ( -- port ) low-page h# 400 + ;
+: dma-setup ( vadr len write-memory? -- vadr devaddr len )
+ if 44 else 48 then dma-channel# + b pc! \ single transfer, increment addr,
+ \ no autoinit, ch 0
+ \ Autoinit adds the 0x10 bit
+
+ 2dup true " dma-map-in" $call-parent swap ( vadr devadr len )
+
+ \ Load count
+ 0 c pc! \ Reset address byte pointer
+ dup 1- wbsplit swap 1 >chan pc! 1 >chan pc! ( vadr devadr len )
+
+ \ Load address
+ 0 c pc! \ Reset address byte pointer
+ over lbsplit 2swap swap
+ 0 >chan pc! 0 >chan pc! ( vadr devadr len page-byte hi-byte )
+ swap low-page pc! ( vadr devadr len hi-byte )
+ high-page pc! ( vadr devadr len )
+
+ c0 d6 pc! \ Set cascade mode for channel 4
+ 0 d4 pc! \ Release channel 4 (master for chs. 0-3)
+
+ 0 dma-channel# + a pc! \ Release channel
+
+\ 10 8 pc! \ re-enable the chip
+;
+: dma-wait ( vaddr devaddr len -- timeout? )
+ 1 dma-channel# << true swap
+ d# 400 0 do
+ dup 8 pc@ and if nip 0 swap leave then
+ d# 10 ms
+ loop
+ drop
+ >r
+ " dma-map-out" $call-parent
+ r>
+;
+
+: mixer! ( byte regnum -- ) h# 224 pc! h# 225 pc! ;
+: mixer@ ( regnum -- byte) h# 224 pc! h# 225 pc@ ;
+
+\ 82 is the IRQ status register
+: irq-wait ( vaddr devaddr len bit -- timeout? )
+ true swap ( vaddr devaddr len timeout? bit )
+ d# 400 0 do ( vaddr devaddr len timeout? bit )
+ dup 82 mixer@ and if nip 0 swap leave then
+ d# 10 ms ( vaddr devaddr len timeout? bit )
+ loop ( vaddr devaddr len timeout? bit )
+ drop ( vaddr devaddr len timeout? )
+ >r
+ " dma-map-out" $call-parent
+ r>
+;
+
+\ The SCR0 value "1c" enables the audio device at port 220, the joystick
+\ at port 201, and establishes the port address of (but does not enable)
+\ the FM synthesizer at port 388.
+: enable ( -- )
+\ 0 h# fb pc! 0 h# e0 pc! h# 1c h# e1 pc! 0 h# f9 pc!
+ 3 h# 40 mixer! \ Enable the synthesizer and game ports
+;
+
+: read1 ( -- byte ) begin h# 22e pc@ h# 80 and until h# 22a pc@ ;
+
+: wait-reset ( -- )
+ get-msecs
+ begin ( old-ms )
+ h# 22e pc@ h# 80 and if ( old-ms )
+ h# 22a pc@ h# aa = if drop exit then ( old-ms )
+ then ( old-ms )
+ get-msecs over - 2 >= ( old-ms flag )
+ until ( old-ms )
+ drop
+;
+
+: rddata@ ( -- b ) 22c pc@ ;
+: cmd ( cmd -- ) begin rddata@ h# 80 and 0= until h# 22c pc! ;
+: cmd1! ( data cmd -- data ) cmd cmd ;
+: cmd1@ ( cmd -- data ) cmd read1 ;
+: cmd2! ( data data cmd -- data ) cmd cmd cmd ;
+: cmd2@ ( cmd -- data data ) cmd read1 read1 ;
+
+: put8 ( byte -- ) 10 cmd1! ;
+: get8 ( -- byte ) 20 cmd1@ ;
+\ : put16 ( word -- ) 11 cmd1! ;
+\ : get16 ( -- word ) 21 cmd1@ ;
+
+: start-out8-normal ( length -- ) 1- wbsplit swap 14 cmd2! ;
+\ : start-out16-normal ( length -- ) 1- wbsplit swap 15 cmd2! ;
+: start-out8-auto ( length -- ) 1- wbsplit swap 1c cmd2! ;
+\ : start-out16-auto ( length -- ) 1- wbsplit swap 1d cmd2! ;
+
+: start-out8-fast ( -- ) 90 cmd ;
+: start-out16-fast ( -- ) 91 cmd ;
+: halt-dma8 ( -- ) d0 cmd ;
+\ d1 and d3 above
+: continue-dma8 ( -- ) d4 cmd ;
+: halt-dma16 ( -- ) d5 cmd ;
+: continue-dma16 ( -- ) d6 cmd ;
+: exit-dma16 ( -- ) d9 cmd ;
+: exit-dma8 ( -- ) da cmd ;
+\ e0 returns the bitwise inverse of its argument byte, for probing
+\ e3 returns a copyright string
+\ e4 writes a test register, e8 reads it back
+\ f2 and f3 force an irq
+
+\ : start-in8-normal ( length -- ) 1- wbsplit swap 24 cmd2! ;
+\ : start-in16-normal ( length -- ) 1- wbsplit swap 25 cmd2! ;
+\ : start-in8-auto ( length -- ) 1- wbsplit swap 2c cmd2! ;
+\ : start-in16-auto ( length -- ) 1- wbsplit swap 2d cmd2! ;
+
+: set-block-size ( n -- ) 1- wbsplit swap 48 cmd2! ;
+
+: set-time-constant ( b -- ) 40 cmd1! ; \ rate = 1,000,000 / (256 - n)
+: set-freq ( w -- ) 1- wbsplit swap 41 cmd2! ; \
+
+0 instance value sample-counts
+0 instance value sample-rate
+
+: 1sample-time ( -- ) sample-counts 0 do loop ;
+: sb-sample! ( byte -- ) put8 1sample-time ;
+: sb-sample@ ( -- byte ) get8 1sample-time ;
+: passthrough ( seconds -- )
+ sample-rate * 0 do get8 put8 1sample-time loop
+;
+
+: set-sample-rate ( hz -- )
+ dup to sample-rate
+ ms-factor d# 1000 rot */ to sample-counts
+;
+
+: 8kmono ( -- ) d# 131 set-time-constant h# 8000 set-sample-rate ;
+: 8kstereo ( -- ) d# 16000 set-freq h# 8000 set-sample-rate ;
+: 16kmono ( -- ) d# 16000 set-freq h# 16000 set-sample-rate ;
+: 11kmono ( -- ) d# 165 set-time-constant h# 11025 set-sample-rate ;
+: 11kstereo ( -- ) d# 11025 set-freq h# 11025 set-sample-rate ;
+: 22kmono ( -- ) d# 22050 set-freq h# 22050 set-sample-rate ;
+
+: dac>mixer ( -- ) d# 100 ms h# d1 cmd ;
+: undac>mixer ( -- ) d# 25 ms h# d3 cmd ;
+: reset ( -- )
+ enable
+ 1 h# 226 pc!
+ d# 300 ms 0 h# 226 pc! wait-reset dac>mixer
+;
+
+[ifndef] rounded-/
+\ Integer division which rounds to nearest instead of truncating
+: rounded-/ ( dividend divisor -- rounded-result )
+ swap 2* swap / ( result*2 )
+ dup 1 and + \ add 1 to the result if it is odd
+ 2/ ( rounded-result )
+;
+[then]
+
+defer sample! ['] sb-sample! to sample!
+defer sample@ ['] sb-sample@ to sample@
+
+: dma-sample@ ( adr size -- actual )
+\ dup set-block-size
+ tuck ( size adr size )
+ true dma-setup ( size vadr devadr len )
+ \ use "2 irq-wait" for 16-bit DMA
+ 1 irq-wait if drop 0 then ( actual )
+;
+: dma-sample! ( adr size -- actual )
+\ dup set-block-size
+ tuck ( size adr size )
+ false dma-setup ( size vadr devadr len )
+ dac>mixer ( size vadr devadr len )
+ dup start-out8-normal ( size vadr devadr len )
+ 1 irq-wait if drop 0 then ( actual )
+ undac>mixer ( actual )
+;
+
+\ Mixer 80 is IRQ#
+\ Mixer 81 is DMA hdma and dma
+\ Mixer 82 is IRQ status
+
+: stereo ( -- ) 2 h# 0e mixer! ;
+: mono ( -- ) 0 h# 0e mixer! ;
+
+: reset-mixer ( -- ) 0 0 mixer! ;
+
+: dac-volume ( l/r -- ) 14 mixer! ;
+: mic-mix-volume ( l/r ) 1a mixer! ;
+: record-mic ( -- ) 0 1c mixer! ;
+: record-cd ( -- ) 2 1c mixer! ;
+: record-line ( -- ) 6 1c mixer! ;
+: record-mixer ( -- ) 7 1c mixer! ;
+
+: master-volume ( l/r -- ) 22 mixer! ;
+: fm-volume ( l/r -- ) 26 mixer! ;
+: auxa-volume ( l/r -- ) 28 mixer! ;
+: auxb-volume ( l/r -- ) 2a mixer! ;
+: pc-speaker-volume ( l/r -- ) 2c mixer! ;
+\ : line-volume ( l/r -- ) 2e mixer! ;
+
+h# cc constant initial-gain
+
+external
+
+\ Determine chip type by looking for register bit differences
+: init ( -- )
+ enable
+ " SoundBlaster"
+ 2dup model ( $ )
+ encode-string
+\ " pnpPNP,b007" encode-string encode+ \ Windows Sound System compatible
+ " pnpPNP,b002" encode-string encode+ \ SoundBlaster Pro compatible
+ " pnpPNP,b000" encode-string encode+ \ SoundBlaster compatible
+ " compatible" property
+
+ \ Probe for the FM synthesizer
+
+ h# 220 my-space d# 16 encode-reg ( adr len ) \ Soundblaster
+
+ \ If the synthesizer address port is writeable, add the synthesizer
+ \ register to the property value
+
+ h# 5a 38a pc! 38a pc@ h# 5a = if
+ h# 388 my-space d# 4 encode-reg encode+ \ Synthesizer
+ then
+ " reg" property
+
+ \ Put the synthesizer address port back to its default value, just in case
+ 1 h# 38a pc!
+;
+
+: dma ( -- ) true to use-dma? ;
+: pio ( -- ) false to use-dma? ;
+: change-mode ( -- )
+ my-args begin dup while \ Execute mode modifiers
+ ascii , left-parse-string ( rem$ first$ )
+ my-self ['] $call-method catch if ( rem$ x x x )
+ ." Unknown argument" cr
+ 3drop 2drop false exit
+ then ( rem$ )
+ repeat ( rem$ )
+ 2drop
+;
+: open ( -- flag? )
+ change-mode
+ reset
+ initial-gain master-volume
+ true
+;
+: close ( -- ) 0 master-volume ;
+
+: read ( addr size -- actual )
+ use-dma? if
+ false to polled-mode?
+
+ dup dma-alloc over 2dup 2>r
+ dma-sample@
+ nip 2r@ drop -rot dup >r move r>
+ 2r> dma-free
+ else
+ true to polled-mode?
+
+ tuck bounds ?do sample@ i c! loop
+ then
+;
+: write ( adr size -- actual )
+ use-dma? if
+ false to polled-mode?
+
+ dup dma-alloc swap 2dup 2>r move
+ 2r@ dma-sample!
+ 2r> dma-free
+ else
+ true to polled-mode?
+ tuck bounds ?do i c@ sample! loop
+ then
+;
+decimal
+
+\ This table contains all 4 quadrants of the sine function, biased with the
+\ zero point at d# 128, and beginning at -pi/2 radians (-90 degrees). This
+\ is convenient for sampling.
+create sine
+ 0 c, 3 c, 10 c, 22 c, 38 c, 57 c, 79 c, 104 c,
+ 128 c, 152 c, 177 c, 199 c, 218 c, 234 c, 246 c, 253 c,
+ 255 c, 253 c, 246 c, 234 c, 218 c, 199 c, 177 c, 152 c,
+ 128 c, 104 c, 79 c, 57 c, 38 c, 22 c, 10 c, 3 c,
+hex
+
+0 value sample-buf
+0 value /sample-buf
+
+\ Play a tone of the given frequency and duration
+: tone ( hz msecs -- )
+ 8kmono
+
+ 8 * ( hz samples )
+ dup to /sample-buf dup dma-alloc to sample-buf
+
+ \ We divide the circle into 64K counts, increment the angle by "delta"
+ \ counts each sample, and pick the closest entry in the sine table.
+ \ Here we compute the delta angle from the frequency as:
+ \ delta (counts/sample) =
+ \ freq (cycles/sec) * 64K (counts/cycle) / 8000 (samples/sec)
+
+ swap d# 16 lshift d# 8000 / swap ( delta samples )
+
+ true to polled-mode? ( delta samples )
+
+ 0 swap 0 do ( delta angle )
+ \ Round to nearest sample ("400 +). For lower distortion,
+ \ we could increase the number of entries in the sine table
+ \ and/or interpolate between entries, but it hardly seems
+ \ worth the trouble for this application.
+ dup h# 400 + d# 11 rshift h# 1f and sine + c@
+
+ sample-buf i + c!
+
+ \ Update angle, taking advantage of 2-complement arithmetic
+ \ to do the modulus for us. We don't worry about the carry
+ \ into the high bits here, because the "1f and" above will
+ \ throw them away for us.
+ over + ( delta angle' )
+ loop ( delta angle' )
+ 2drop ( )
+
+ sample-buf /sample-buf dma-sample! drop
+ sample-buf /sample-buf dma-free
+;
+
+: ring-bell ( -- )
+ open drop
+ d# 2000 d# 100 tone close
+;
+end-package
+
+also forth definitions
+stand-init: Sound
+ " /isa/sound" " init" execute-device-method drop
+;
+previous definitions
Added: dev/ne2000/ne2kpci.bth
===================================================================
--- dev/ne2000/ne2kpci.bth (rev 0)
+++ dev/ne2000/ne2kpci.bth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -0,0 +1,17 @@
+\ See license at end of file
+purpose: Main load file for driver
+
+command: &tokenize &this
+build-now
+
+silent on
+
+begin-tokenizing ne2kpci.fc
+
+FCode-version2
+
+fload ${BP}/dev/ne2000/ne2kpci.fth
+
+end0
+
+end-tokenizing
Added: dev/ne2000/ne2kpci.fth
===================================================================
--- dev/ne2000/ne2kpci.fth (rev 0)
+++ dev/ne2000/ne2kpci.fth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -0,0 +1,660 @@
+purpose: PCI variant of NE2000 network controller
+\ See license at end of file
+
+\ 0 0 " i300" " /isa" begin-package
+
+\ NE2000 controller board offsets
+
+" ethernet" device-name
+
+h# 10 constant dataport \ NE2000 Port Window.
+
+[ifdef] ISA
+my-address my-space h# 20 reg
+my-address value chip-base
+: 1us ( -- ) h# 61 pc@ drop ; \ Touch timer port to pause
+: reg! ( b offset -- ) chip-base + pc! 1us ;
+: reg@ ( offset -- b ) chip-base + pc@ 1us ;
+: data-out ( adr -- ) le-w@ dataport chip-base + pw! ;
+: data-in ( adr -- ) dataport chip-base + pw@ swap le-w! ;
+: map-regs ; : unmap-regs ;
+[else]
+h# 100 constant /regs
+
+\ Configuration space registers
+my-address my-space encode-phys
+ 0 encode-int encode+ 0 encode-int encode+
+
+\ I/O space registers
+0 0 my-space 0100.0010 + encode-phys encode+
+ 0 encode-int encode+ /regs encode-int encode+
+ " reg" property
+
+0 instance value chip-base
+
+: my-w@ ( offset -- w ) my-space + " config-w@" $call-parent ;
+: my-w! ( w offset -- ) my-space + " config-w!" $call-parent ;
+: unmap-regs ( -- )
+ 4 my-w@ 6 invert and 4 my-w!
+ chip-base /regs " map-out" $call-parent
+;
+: map-regs ( -- )
+ 0 0 my-space h# 0100.0010 + /regs " map-in" $call-parent to chip-base
+ 4 my-w@ 5 or 4 my-w!
+;
+: reg! ( b offset -- ) chip-base + rb! ;
+: reg@ ( offset -- b ) chip-base + rb@ ;
+: data-out ( adr -- ) w@ dataport chip-base + rw! ;
+: data-in ( adr -- ) dataport chip-base + rw@ swap w! ;
+
+[then]
+
+" network" device-type
+
+headerless
+
+[ifdef] 386-assembler
+[ifndef] pseudo-dma-in
+fload ${BP}/cpu/i386/inoutstr.fth
+[then]
+[then]
+
+\ The EN registers - the DS8390 chip registers
+\ There are two (really 3) pages of registers in the chip. You select
+\ which page you want, then address them at offsets 00-0F from base.
+\ The chip command register (CCMD; offset 0) appears in both pages.
+
+\ Page 1
+
+h# 001 constant PHYS \ This board's physical enet addr RD WR
+h# 007 constant CURPAG \ Current memory page RD WR
+h# 008 constant MULT \ Multicast filter mask array (8 bytes) RD WR
+
+\ Chip commands in command register
+h# 001 constant STOP \ Stop the chip
+h# 002 constant START \ Start the chip
+h# 004 constant TRANS \ Transmit a frame
+h# 008 constant RREAD \ remote read
+h# 010 constant RWRITE \ remote write
+h# 020 constant NODMA \ No remote DMA used on this card
+h# 000 constant PAGE0 \ Select page 0 of chip registers
+h# 040 constant PAGE1 \ Select page 1 of chip registers
+
+\ Commands for RXCR - RX control reg
+h# 001 constant RCRC \ Save error pkts
+h# 002 constant RUNT \ Accept runt pkt
+h# 004 constant BCST \ Accept broadcasts
+h# 008 constant MULTI \ Multicast (if pass filter)
+h# 010 constant PROMP \ Promiscuous physical addresses
+h# 020 constant MON \ Monitor mode (no packets rcvd)
+
+\ Bits in TXCR - transmit control reg
+h# 001 constant TCRC \ inhibit CRC, do not append crc
+h# 002 constant LOOPB \ Set loopback mode
+h# 006 constant LB01 \ encoded loopback control
+h# 008 constant ATD \ auto tx disable
+h# 010 constant OFST \ collision offset enable
+
+\ Bits in DCFG - Data config register
+h# 001 constant WTS \ word transfer mode selection
+\ h# 002 constant BOS \ byte order selection
+\ h# 004 constant LAS \ long addr selection
+\ h# 008 constant BMS \ burst mode selection
+\ h# 010 constant ARM \ autoinitialize remote
+\ h# 000 constant FT00 \ burst length selection
+\ h# 020 constant FT01 \ burst length selection
+\ h# 040 constant FT10 \ burst length selection
+\ h# 060 constant FT11 \ burst length selection
+
+\ Bits in ISR - Interrupt status register
+h# 001 constant RX \ Receiver, no error
+h# 002 constant TX \ Transmitter, no error
+h# 004 constant RX-ERR \ Receiver, with error
+h# 008 constant TX-ERR \ Transmitter, with error
+h# 010 constant OVR \ Receiver overwrote the ring
+h# 020 constant COUNTERS \ Counters need emptying
+h# 040 constant RDC \ remote dma complete
+h# 080 constant RESET \ Reset completed
+
+h# 03f constant ALL \ Interrupts we will enable
+
+\ Bits in received packet status byte and RSR
+h# 001 constant RXOK \ Received a good packet
+h# 002 constant CRCE \ CRC error
+h# 004 constant FAE \ frame alignment error
+h# 008 constant FO \ FIFO overrun
+h# 010 constant MPA \ missed pkt
+h# 020 constant PHY \ physical/multicase address
+h# 040 constant DIS \ receiver disable. set in monitor mode
+h# 080 constant DEF \ deferring
+
+\ Bits in TSR - TX status reg
+
+h# 001 constant PTX \ Packet transmitted without error
+h# 002 constant DFR \ non deferred tx
+h# 004 constant COLL \ Collided at least once
+h# 008 constant COLL16 \ Collided 16 times and was dropped
+h# 010 constant CRS \ carrier sense lost
+h# 020 constant FU \ TX FIFO Underrun
+h# 040 constant CDH \ collision detect heartbeat
+h# 080 constant OWC \ out of window collision
+
+\ Description of header of each packet in receive area of memory
+
+h# 0 constant STAT \ Received frame status
+h# 1 constant NXT-PG \ Page after this frame
+h# 2 constant SIZE-LO \ Length of this frame
+h# 3 constant SIZE-HI \ Length of this frame
+h# 4 constant NHDR \ Length of above header area
+
+
+\ Shared memory management parameters
+
+h# 040 constant TSTART-PG \ First page of TX buffer
+h# 046 constant RSTART-PG \ Starting page of RX ring
+h# 080 constant RSTOP-PG \ Last page +1 of RX ring
+
+: longpause ( -- ) 2 ms ; \ Should be 1.6 ms
+
+0 instance value #crc-errors
+0 instance value #alignment-errors
+0 instance value #missed
+
+\ Page 0 registers
+: cmd! ( b -- ) 0 reg! ;
+: stat@ ( -- b ) 0 reg@ ;
+: startpg! ( page# -- ) 1 reg! ; \ Starting page of ring buffer
+: stoppg! ( page# -- ) 2 reg! ; \ Ending page + 1 of ring buffer
+: clda@ ( -- adr ) 1 reg@ 2 reg@ bwjoin ; \ Current local DMA address
+: boundary@ ( -- page# ) 3 reg@ ; \ Boundary page of ring bfr
+: boundary! ( page# -- ) 3 reg! ;
+: tsr@ ( -- bits ) 4 reg@ ; \ Transmit status reg
+: tpsr! ( page# -- ) 4 reg! ; \ Transmit starting page
+: ncr@ ( -- count ) 5 reg@ ; \ Number of collision reg
+: fifo@ ( -- data ) 6 reg@ ; \ FIFO data
+: rcnt! ( cnt -- ) wbsplit swap h# 0a reg! h# 0b reg! ;
+: tcnt! ( cnt -- ) wbsplit swap 5 reg! 6 reg! ;
+: isr@ ( -- mask ) 7 reg@ ; \ Interrupt status reg
+: isr! ( mask -- ) 7 reg! ;
+: rsr@ ( -- mask ) h# c reg@ ; \ Receive status reg
+: imr! ( mask -- ) h# f reg! ; \ Interrupt mask reg
+: rxcr! ( bits -- ) h# c reg! ; \ Receive control reg
+: txcr! ( bits -- ) h# d reg! ; \ Transmit control reg
+: dcfg! ( bits -- ) h# e reg! ; \ Data configuration reg
+: counter0@ ( -- count ) h# d reg@ ; \ Rcv alignment error counter
+: counter1@ ( -- count ) h# e reg@ ; \ Rcv CRC error counter
+: counter2@ ( -- count ) h# f reg@ ; \ Rcv missed frame error counter
+: rda! ( page# -- ) wbsplit swap 8 reg! 9 reg! ;
+: crda@ ( -- adr ) 8 reg@ 9 reg@ bwjoin ; \ Current remote DMA address
+
+: set-page ( page# -- old-cmd-reg ) 6 lshift stat@ tuck or cmd! ;
+: preg@ ( reg# page# -- b ) set-page >r reg@ r> cmd! ;
+: preg! ( b reg# page# -- ) set-page >r reg! r> cmd! ;
+
+: curpag@ ( -- page# ) 7 1 preg@ ;
+: curpag! ( page# -- ) 7 1 preg! ;
+
+: stop-chip ( -- ) NODMA STOP or cmd! ;
+: reset-8390 ( -- )
+ h# 1f reg@ longpause h# 1f reg! \ should set command 21, 80
+;
+
+0 value endcfg
+
+\ Block input routine
+
+: block-input ( adr len offset -- )
+ NODMA START or cmd!
+ rda! dup rcnt! ( adr len )
+ RREAD START or cmd! \ read and start
+
+\ [ endcfg WTS and ] [if]
+ ( buf len )
+[ifdef] pseudo-dma-in
+ dataport chip-base + pseudo-dma-in
+[else]
+ 2dup 1 invert and bounds ?do ( adr len )
+ i data-in ( adr len )
+ /w +loop ( adr len )
+ dup 1 and if ( adr len )
+ + 1- dataport reg@ swap c!
+ else
+ 2drop
+ then
+[then]
+\ [else]
+\ bounds ?do dataport reg@ i c! loop
+\ [then]
+;
+
+: block-output ( adr len offset -- error? )
+ NODMA START or cmd! \ stop & clear the chip
+ rda! dup 1 and + dup rcnt! ( adr len )
+ RWRITE START or cmd! \ write and start
+ ( buf len )
+[ifdef] pseudo-dma-out
+ dataport chip-base + pseudo-dma-out
+[else]
+ bounds ?do i data-out /w +loop
+[then]
+
+ h# 10000 0 do
+ isr@ RDC and if unloop false exit then
+ loop
+ true
+;
+
+RSTOP-PG value sm-rstop-ptr
+
+[ifdef] board-features
+0 value is-overrun-690
+[then]
+
+\ a temp buffer for the received header
+d# 4 constant RCV-HDR-SIZE
+RCV-HDR-SIZE buffer: rcv-hdr
+
+0 instance value #rx-errors
+0 instance value #rx-overruns
+0 instance value #tx-errors
+
+\ Next Packet Pointer
+\
+\ Initialize to the same value as the current page pointer (start page 1).
+\ Update after each reception to be the value of the next packet pointer
+\ read from the NIC Header.
+\ Copy value -1 to boundry register after each update.
+\ Compare value with contents of current page pointer to verify that a
+\ packet has been received (don't trust ISR RXE/PRX bits). If !=, one
+\ or more packets have been received.
+
+0 value next-page
+0 value last-curpag
+
+\ Added flags and temp storage for new receive overrun processing
+
+: tx-wait ( -- )
+ d# 1024 7 * 0 do \ max coll time in Ethernet slot units
+ d# 51 0 do \ Wait 1 time slot, assuming 1 usec I/O
+ stat@ TRANS and 0= if \ transmitter still running?
+ unloop unloop exit
+ then
+ loop
+ loop
+ #tx-errors 1+ to #tx-errors \ count hard errors.
+;
+
+[ifdef] interrupt-driven
+: tx-ack ( -- )
+ tsr@ drop \ get state from prior TX
+
+ \ Acknowledge the TX interrupt
+ TX TX-ERR or isr! \ clr either possible TX int bit
+;
+[then]
+
+headers
+: write ( adr len -- actual )
+ stat@ TRANS and if
+ tx-wait
+[ifdef] interrupt-driven
+ tx-ack
+ else
+ \ Check for recent TX completions in the interrupt status register
+ isr@ TX TX-ERR and if
+ tx-ack
+ then
+[then]
+ then
+
+ d# 1514 min tuck ( len adr len' )
+ d# 60 max ( len adr len' )
+
+ RDC isr! \ clear remote interrupt int.
+
+ dup tcnt! ( len adr len' )
+ TSTART-PG 8 lshift block-output ( len error? )
+ if drop -1 exit then ( len )
+
+ TSTART-PG tpsr! \ Transmit Page Start Register
+ TRANS NODMA or START or cmd! \ Start the transmitter
+;
+headerless
+
+: set-address ( adr len -- )
+ 0 do dup i + c@ PHYS i + 1 preg! loop drop
+;
+
+false value promiscuous?
+false value loopback?
+false value dma?
+BCST value rx-mode
+
+\ Set the multicast filter mask bits for promiscuous reception
+: set-multicast ( -- )
+ NODMA PAGE1 or STOP or cmd! \ Select page 1
+ 8 0 do h# ff MULT i + reg! loop
+ NODMA START or cmd! \ Select page 0
+;
+
+: set-rx-mode ( -- ) \ Set receiver to selected mode
+ BCST promiscuous? if MULTI or PROMP or then rxcr!
+;
+: set-tx-mode ( -- ) loopback? if LOOPB else 0 then txcr! ;
+
+: reset-board ( -- )
+ reset-8390
+ stop-chip
+
+ \ Wait 1.6ms for the NIC to stop transmitting or receiving a packet.
+ \ National says monitoring the ISR RST bit is not reliable, so a wait
+ \ of the maximum packet time (1.2ms) plus some padding is required.
+
+ longpause
+;
+
+: reset-interface ( -- )
+ reset-board
+ h# ff isr! \ Clear all pending interrupts
+ 0 imr! \ Turn off all interrupt enables
+;
+: rx-error ( -- )
+ #rx-errors 1+ to #rx-errors
+
+ \ Error recovery:
+ \ Copy the last known current page pointer into the next packet pointer
+ \ which will result in skipping all the packets from the errored one to
+ \ where the NIC was storing them when we entered this ISR, but prevents
+ \ us from trying to follow totally bogus next packet pointers through
+ \ the card RAM space.
+
+ last-curpag to next-page
+;
+
+: +boundary ( -- )
+ next-page 1- dup RSTART-PG < if drop sm-rstop-ptr 1- then
+ boundary!
+;
+
+: next-buffer ( -- page# ) rcv-hdr NXT-PG + c@ ;
+[ifndef] le-w@ : le-w@ ( adr -- w ) dup c@ swap 1+ c@ bwjoin ; [then]
+: packet-ok? ( -- len true | false )
+ rcv-hdr RCV-HDR-SIZE next-page 8 lshift block-input ( )
+ rcv-hdr STAT + c@ RXOK and if ( )
+ next-buffer RSTART-PG sm-rstop-ptr within if
+ rcv-hdr SIZE-LO + le-w@ NHDR - ( len )
+ true ( len true )
+ exit
+ then
+ then
+ \ Bad packet or chip screwup
+ rx-error +boundary false ( false )
+;
+
+\ Do the work of copying out a receive frame.
+: do-receive ( adr len -- len )
+ tuck next-page 8 << NHDR + block-input ( len )
+ next-buffer to next-page ( len )
+ +boundary ( len )
+;
+
+fload ${BP}/dev/ne2000/queue.fth
+
+: pull-packets ( -- )
+ begin last-curpag next-page <> while ( )
+ packet-ok? if ( length )
+ new-buffer ( handle adr len )
+ do-receive drop ( handle )
+ enque-buffer ( )
+ then ( )
+ repeat ( )
+;
+
+0 value rcv-ovr-resend \ flag to indicate resend needed
+: overrun ( mask -- )
+ drop
+[ifdef] board-features
+ board-features BF-NIC-690 and if
+ 1 to is-overrun-690
+ exit
+ then
+[then]
+
+ #rx-overruns 1+ to #rx-overruns
+
+ \ Get the command register TXP bit to test for incomplete transmission later
+
+ stat@ ( status )
+
+ stop-chip
+
+ \ Wait for the NIC to stop transmitting or receiving a packet.
+ longpause
+
+ \ Clear the remote byte count registers
+ 0 rcnt!
+
+ \ check the saved state of the TXP bit in the command register
+ 0 to rcv-ovr-resend \ clear the resend flag
+ ( status ) TRANS and if \ Was transmitter still running?
+ \ Transmitter was running, see if it finished or died
+ isr@ TX TX-ERR or 0= if
+ \ Transmitter did not complete, remember to resend the packet later.
+ true to rcv-ovr-resend
+ then
+ then
+
+ \ Put the NIC chip into loopback so it won't keep trying to
+ \ receive into a full ring
+
+ LOOPB txcr! \ Put transmitter in loopback mode
+ START NODMA or cmd! \ Start the chip running again
+
+ \ Verify that there is really a packet to receive by fetching the current
+ \ page pointer and comparing it to the next packet pointer.
+
+ curpag@ curpag! \ Rewrite current page to fix SMC bug.
+
+ pull-packets
+
+ +boundary
+
+ \ When we get here we have either removed one packet from the ring and
+ \ updated the boundary register, or determined that there really were
+ \ no new packets in the ring.
+
+ OVER isr! \ Clear the overrun interrupt bit
+ set-tx-mode \ Take the NIC out of loopback
+
+ \ Resend any incomplete transmission
+ rcv-ovr-resend if
+ TRANS NODMA or START or cmd! \ Start the transmitter
+ then
+;
+
+[ifdef] board-features
+: recv-690-overrun ( -- )
+ false to is-overrun-690
+ boundary@ boundary! \ rewrite bndry with itself
+ OVER isr! \ Clear overrun interrupt bit
+;
+[then]
+
+: empty-counters ( -- )
+ \ We have to read the counters to clear them and to clear the interrupt.
+ counter0@ #alignment-errors + to #alignment-errors
+ counter1@ #crc-errors + to #crc-errors
+ counter2@ #missed + to #missed
+;
+: .errors ( -- )
+ isr@
+ dup RX-ERR and if ." RX-ERR " then
+ dup TX-ERR and if ." TX-ERR " then
+ dup OVR and if ." OVR " dup overrun then
+ dup COUNTERS and if ." COUNTERS " empty-counters then
+ isr!
+;
+
+headers
+: read ( adr len -- -2 | actual )
+ curpag@ to last-curpag ( adr len )
+
+ .errors ( adr len )
+
+ ?return-queued 0= if ( adr len )
+ last-curpag next-page <> if ( adr len )
+ packet-ok? if ( adr len actual )
+ min do-receive ( actual | -1 ) \ Good packet
+ else ( adr len )
+ 2drop -1 ( -1 ) \ Bad packet
+ then ( actual | -1 )
+ else ( adr len )
+ 2drop -2 ( -2 ) \ No packet
+ then ( actual | -2 )
+ then ( actual | -2 )
+
+ pull-packets
+;
+
+headerless
+h# 10 buffer: board-data
+h# 6 buffer: rom-address
+: init-card ( -- okay? )
+ \ Put the board data, which is 16 bytes starting at remote
+ \ dma address 0, into a buffer called board-data.
+
+\ [ base c@ base @ <> ] [if]
+ endcfg WTS or to endcfg
+\ [then]
+ endcfg dcfg!
+
+ NODMA PAGE0 or START or cmd!
+
+ 0 rda! h# 20 rcnt! \ address is 0, byte count is 0x10*2
+ RREAD START or cmd! \ read and start
+
+ board-data h# 10 bounds do dataport reg@ i c! loop
+
+ board-data rom-address 6 move
+ rom-address 6 encode-bytes " local-mac-address" property
+ true
+;
+
+[ifndef] $=
+: $= ( $1 $2 -- equal? )
+ rot tuck <> if 3drop false exit then ( adr1 adr2 len1 )
+ comp 0=
+;
+[then]
+
+0 value tftp-args
+0 value tftp-len
+: parse-args ( -- )
+ my-args begin ( rem$ )
+ 2dup to tftp-len to tftp-args ( rem$ )
+ dup while ( rem$ )
+ ascii , left-parse-string ( rem$ head$ )
+ 2dup " promiscuous" $= if true to promiscuous? else ( rem$ head$ )
+ 2dup " loopback" $= if true to loopback? else ( rem$ head$ )
+ 2dup " pio" $= if false to dma? else ( rem$ head$ )
+ 2dup " dma" $= if true to dma? else ( rem$ head$ )
+ 2drop 2drop exit ( )
+ then then then then ( rem$ head$ )
+ 2drop ( rem$ )
+ repeat ( rem$ )
+ 2drop ( )
+;
+
+headers
+\ Called once to initialize the card
+: open ( -- )
+ map-regs
+ parse-args
+
+ \ Set burst mode, 8 deep FIFO, maybe big-endian
+ h# 48 base c@ base @ <> if 2 or then to endcfg
+
+ reset-board \ Reset and stop the 8390.
+ endcfg dcfg! \ Init the Data Config Reg.
+ stop-chip \ Stop chip and select page 0
+ 0 rcnt! \ Clear Remote Byte Count Regs.
+ MON rxcr! \ Set receiver to monitor mode
+ LOOPB txcr! \ Put NIC in Loopback Mode 1.
+
+ \ Do anything special that the card needs.
+ \ Read the Ethernet address into rom-address.
+ init-card 0= if false exit then
+
+ endcfg dcfg! \ Re-init endcfg in case they
+ \ put it into word mode.
+
+ \ Init STARTPG to same value as BOUNDARY
+ RSTART-PG dup startpg! boundary!
+ sm-rstop-ptr stoppg!
+
+ h# ff isr! \ Clear pending interrupts.
+
+\ ALL imr! \ Init IMR
+ 0 imr! \ Init IMR
+
+ \ Init the Ethernet address and multicast filters.
+ mac-address set-address \ Now set the address in the 8390 chip
+ set-multicast \ Set the multicast masks
+
+ \ Program the Current Page Register to Boundary Pointer + 1
+ RSTART-PG 1+ dup curpag!
+ dup to last-curpag to next-page
+
+ set-rx-mode
+ set-tx-mode
+
+ NODMA START or cmd! \ Start chip
+
+ init-queue
+
+ true
+;
+: close ( -- )
+ NODMA STOP or cmd! \ Start chip
+ drain-queue
+ unmap-regs
+;
+
+: load ( adr -- len )
+ " obp-tftp" find-package if ( adr phandle )
+ my-args rot open-package ( adr ihandle|0 )
+ else ( adr )
+ 0 ( adr 0 )
+ then ( adr ihandle|0 )
+
+ dup 0= if ." Can't open obp-tftp support package" abort then
+ ( adr ihandle )
+
+ >r
+ " load" r@ $call-method ( len )
+ r> close-package
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2006 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Added: dev/video/build/video.bth
===================================================================
--- dev/video/build/video.bth (rev 0)
+++ dev/video/build/video.bth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -0,0 +1,12 @@
+purpose: Load file for Video "super driver"
+
+command: &tokenize &this
+build-now
+
+silent on
+
+begin-tokenizing video.fc
+
+fload ${BP}/dev/video/build/loadfcod.fth
+
+end-tokenizing
Added: dev/video/cirrus.bth
===================================================================
--- dev/video/cirrus.bth (rev 0)
+++ dev/video/cirrus.bth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -0,0 +1,42 @@
+\ See license at end of file
+purpose: Main load file for driver
+
+command: &tokenize &this
+build-now
+
+silent on
+
+begin-tokenizing cirrus.fc
+
+FCode-version2
+
+fload ${BP}/dev/video/loadcirrus.fth
+probe
+
+end0
+
+end-tokenizing
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2006 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Modified: dev/video/common/pci.fth
===================================================================
--- dev/video/common/pci.fth 2008-12-24 21:16:22 UTC (rev 1049)
+++ dev/video/common/pci.fth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -69,6 +69,7 @@
0 instance value fb-base-reg
: munge-map-size ( raw -- new ) \ Makes a proper map-size argument
+ dup 0= if exit then
1 to mask-val \ Basically, just walk a one up mask-val value,
begin \ anding all the way looking for first non-zero
@@ -128,7 +129,7 @@
use-cirrus-words \ Cirrus stuff is inside S3 code
" CL54xx" add-arc-ident
dup case \ Look for known ID values.
- b8 of gd5434 endof
+ b8 of gd5434 endof \ Actually gd5446, but gd5434 is close enough
a8 of gd5434 endof
a0 of gd5430 endof
ac of gd5436 endof
@@ -220,23 +221,26 @@
0 encode-int encode+ r> encode-int encode+
;
-false instance value needs-rom
+: add-rom-regs ( -- )
+ \ If this driver is used for an on board frame buffer, the builtin.fth
+ \ file for that platform should declare a "no-rom" property in the node
+ \ where this driver is used. This will prevent the reg property from
+ \ including an entry for a non-existent ROM
+ " no-rom" get-my-property 0= if
+ 2drop exit
+ then
+
+ h# 30 get-map-size if
+ 0 0m h# 200.0030 0 h# 30 get-map-size h# 30 >reg-props \ ROM
+ then
+;
+
: encode-reg-property ( -- )
- " no-rom" get-my-property 0= if \ If this driver is used for an on
- false to needs-rom 2drop \ board frame buffer, the builtin.fth
- else \ file for that platform should declare
- true to needs-rom \ a "no-rom" property in the node
- then \ where this driver is used. This will
- \ prevent the reg property from
- \ including an entry for a non-existent
- \ ROM
cirrus? if
0 0m h# 200.0010 0 h# 10 get-map-size h# 10 >reg-props \ Frame buffer
- needs-rom if
- 0 0m h# 200.0030 0 h# 30 get-map-size h# 30 >reg-props \ ROM
- then
+ add-rom-regs
legacy-regs
then
@@ -244,9 +248,7 @@
s3-928? s3-964? or s3-864? or s3-868? or if
h# 000.0000 0m 200.0010 0 h# 100.0000 10 >reg-props \ Frame buffer
- needs-rom if
- 0 0m h# 200.0030 0 h# 30 get-map-size h# 30 >reg-props \ ROM
- then
+ add-rom-regs
legacy-regs
h# 102 0m a100.0000 0 1 0 >reg-props \ Non-relocatable regs
s3-common-regs
@@ -258,9 +260,7 @@
h# 100.0000 0m 200.0010 0 h# 1.80a0 10 >reg-props \ LE MMIO regs
h# 300.0000 0m 200.0010 0 h# 1.80a0 10 >reg-props \ BE MMIO regs
- needs-rom if
- 0 0m h# 200.0030 0 h# 30 get-map-size h# 30 >reg-props \ ROM
- then
+ add-rom-regs
legacy-regs
h# 102 0m a100.0000 0 1 0 >reg-props \ Non-relocatable regs
@@ -282,9 +282,7 @@
h# 100.0000 0m 200.0010 0 h# 1.80a0 10 >reg-props \ LE MMIO regs
h# 300.0000 0m 200.0010 0 h# 1.80a0 10 >reg-props \ BE MMIO regs
- needs-rom if
- 0 0m h# 200.0030 0 h# 30 get-map-size h# 30 >reg-props \ ROM
- then
+ add-rom-regs
h# a8000 0m a200.0000 0 6900 0 >reg-props \ MMIO regs
legacy-regs
@@ -302,26 +300,20 @@
0 0m h# 200.001c 0 h# 14 get-map-size h# 1c >reg-props
\ Can't actually probe 20, set = 18
0 0m h# 200.0020 0 h# 18 get-map-size h# 20 >reg-props
- needs-rom if
- 0 0m h# 200.0030 0 h# 30 get-map-size h# 30 >reg-props \ ROM
- then
+ add-rom-regs
then
mga? if
0 0m h# 200.0014 0 h# 14 get-map-size h# 14 >reg-props \ Frame Buffer
0 0m h# 200.0010 0 h# 10 get-map-size h# 10 >reg-props \ IO
- needs-rom if
- 0 0m h# 200.0030 0 h# 30 get-map-size h# 30 >reg-props \ ROM
- then
+ add-rom-regs
legacy-regs
then
weitek? if
0 0m h# 200.0010 0 h# 10 get-map-size h# 10 >reg-props \ Memory
- needs-rom if
- 0 0m h# 200.0030 0 h# 30 get-map-size h# 30 >reg-props \ ROM
- then
+ add-rom-regs
legacy-regs
h# 102 0m a100.0000 0 1 0 >reg-props \ Unique non-relocateable IO
s3-common-regs
@@ -334,16 +326,12 @@
0 0m h# 200.001c 0 h# 1c get-map-size h# 1c >reg-props \ Base 3
0 0m h# 200.0020 0 h# 20 get-map-size h# 20 >reg-props \ Base 4
0 0m h# 100.0024 0 h# 24 get-map-size h# 24 >reg-props \ Base 5
- needs-rom if
- 0 0m h# 200.0030 0 h# 30 get-map-size h# 30 >reg-props \ ROM
- then
+ add-rom-regs
then
ct? if
0 0m h# 200.0010 0 h# 10 get-map-size h# 10 >reg-props \ Frame buffer
- needs-rom if
- 0 0m h# 200.0030 0 h# 30 get-map-size h# 30 >reg-props \ ROM
- then
+ add-rom-regs
legacy-regs
then
@@ -373,7 +361,6 @@
" reg" property
reg-props /reg-props free-mem \ Release the tempory buffer
-
;
encode-reg-property \ Build the reg property now
Modified: dev/video/controlr/cirrus.fth
===================================================================
--- dev/video/controlr/cirrus.fth 2008-12-24 21:16:22 UTC (rev 1049)
+++ dev/video/controlr/cirrus.fth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -58,13 +58,14 @@
: use-cirrus-words ( -- ) \ Turns on the Cirrus-specific words
['] init-cirrus-controller to init-controller
['] cirrus-textmode to ext-textmode
- use-vga-dac
+ use-vga
;
: probe-dac ( -- ) \ Chained probing word...sets the dac type
- cirrus? if use-cirrus-dac exit then
+ cirrus? if use-cirrus-dac exit then
probe-dac \ Try someone else's probe
;
+
\ LICENSE_BEGIN
\ Copyright (c) 2006 FirmWorks
\
Added: dev/video/controlr/cirruspci.fth
===================================================================
--- dev/video/controlr/cirruspci.fth (rev 0)
+++ dev/video/controlr/cirruspci.fth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -0,0 +1,198 @@
+\ See license at end of file
+purpose: PCI Methods
+
+\ PCI access code.
+\ This code is used to determine which controller is present and
+\ to begin the process of sorting out which specific words are to
+\ be plugged into the various defered words. Also, and just as important,
+\ the REG property gets formed here.
+
+hex
+headers
+
+struct
+ 04 field >physlo \ phys.lo address
+ 04 field >physmid \ phys.mid address
+ 04 field >physhi \ phys.hi address
+ 04 field >hiflag \ phis.hi modifiers (n/p/t... bits)
+ 04 field >size1 \ First size
+ 04 field >size2 \ Second size
+ 04 field >reg# \ PCI Base address register offset (10,14,18...)
+constant /array
+
+0 instance value reg-props \ Pointer for temp storage
+0 instance value tpoint \ A second pointer
+d# 50 /array * instance value /reg-props \ Allocate 50 entries for now
+
+/reg-props alloc-mem to reg-props \ Allocate some memory
+reg-props /reg-props erase \ Clean it up
+
+: >reg-props ( phys.[lo,mid,hi] hi.flag size size -- )
+
+ reg-props /array - to tpoint
+ begin
+ tpoint /array + to tpoint
+ tpoint >physhi l@ 0=
+ until \ tpoint now points to first empty slot
+
+ ( phys.[lo,mid,hi] hi.flag size size reg# )
+ tpoint >reg# l! ( phys.[lo,mid,hi] hi.flag size size )
+ tpoint >size2 l! ( phys.[lo,mid,hi] hi.flag size )
+ tpoint >size1 l! ( phys.[lo,mid,hi] hi.flag )
+ tpoint >hiflag l! ( phys.[lo,mid,hi] )
+ tpoint >physhi l! ( phys.lo phys.mid )
+ tpoint >physmid l! ( phys.lo )
+ tpoint >physlo l! ( )
+;
+
+: 0m ( -- 0 my-space ) 0 my-space ;
+
+: legacy-regs ( -- )
+ h# 3b0 0m h# a100.0000 0 h# C 0 >reg-props
+ h# 3c0 0m h# a100.0000 0 h# 20 0 >reg-props
+ h# a.0000 0m h# a200.0000 0 h# 2.0000 0 >reg-props
+;
+
+0 instance value mask-val
+
+: munge-map-size ( raw -- new ) \ Makes a proper map-size argument
+ dup 0= if exit then
+
+ 1 to mask-val \ Basically, just walk a one up mask-val value,
+ begin \ anding all the way looking for first non-zero
+ mask-val 2 * to mask-val \ bit. If chip is working correctly, first non
+ dup mask-val and 0 <> \ zero bit location tells you how big a
+ until \ map-size you need.
+ drop
+ mask-val
+;
+
+: get-map-size ( reg# -- map-size ) \ Returns the amount of memory required
+ >r r@ c-l@ ( old-val ) \ Get old value
+ -1 r@ c-l! ( old-val ) \ Write all ones
+ r@ c-l@ ( old-val raw ) \ Read back
+ ff invert and ( old-val raw ) \ Mask off low bits
+ swap r> c-l! ( raw ) \ Put old value back
+ munge-map-size ( map-size ) \ Mask off high bits
+;
+
+: add-arc-ident ( adr len -- )
+ encode-string " arc-identifier" property
+;
+
+: determine-controller ( -- ) \ Determines which PCI controller we have
+ 0 c-w@ ( id ) \ PCI ID now on stack
+
+ case ( id ) \ First we figure out which chip set...
+ h# 1013 of cirrus to chip endof
+ endcase ( )
+
+ 2 c-w@ ff and ( version )
+
+ cirrus? if \ Cirrus based, sort out various controllers
+ use-cirrus-words \ Cirrus stuff is inside S3 code
+ " CL54xx" add-arc-ident
+ dup case \ Look for known ID values.
+ b8 of gd5434 endof \ Actually gd5446, but gd5434 is close enough
+ a8 of gd5434 endof
+ a0 of gd5430 endof
+ ac of gd5436 endof
+ ( default ) -1 swap \ Well, maybe we can't program it...
+ endcase
+ to variant
+ then ( version )
+
+ drop ( )
+
+ variant -1 <> to safe? \ If varient is <> -1, then we know what it is.
+;
+
+headers
+
+: reg-entry ( map reg size -- )
+ >r >r >r
+ 0 0 my-space
+ r> r> + +
+ encode-phys encode+
+ 0 encode-int encode+ r> encode-int encode+
+;
+
+: add-rom-regs ( -- )
+ \ If this driver is used for an on board frame buffer, the builtin.fth
+ \ file for that platform should declare a "no-rom" property in the node
+ \ where this driver is used. This will prevent the reg property from
+ \ including an entry for a non-existent ROM
+
+ " no-rom" get-my-property 0= if
+ 2drop exit
+ then
+
+ h# 30 get-map-size if
+ 0 0m h# 200.0030 0 h# 30 get-map-size h# 30 >reg-props \ ROM
+ then
+;
+
+: encode-reg-property ( -- )
+
+ cirrus? if
+ 0 0m h# 200.0010 0 h# 10 get-map-size h# 10 >reg-props \ Frame buffer
+ add-rom-regs
+ legacy-regs
+ then
+
+ \ Now we build reg entry up
+
+ my-address my-space encode-phys 0 encode-int encode+ 0 encode-int encode+
+
+ reg-props to tpoint
+ begin
+ tpoint >physhi l@ 0<> if
+ tpoint >physlo l@ ( phys.lo )
+ tpoint >physmid l@ ( phys.lo phys.mid )
+ tpoint >physhi l@ ( phys.lo phys.mid phys.hi )
+ tpoint >hiflag l@ or ( phys.lo phys.mid phys.hi )
+ encode-phys encode+
+ tpoint >size1 l@ ( size )
+ encode-int encode+
+ tpoint >size2 l@ ( size )
+ encode-int encode+
+ tpoint /array + to tpoint
+ false
+ else
+ true
+ then
+ until
+
+ " reg" property
+
+ reg-props /reg-props free-mem \ Release the tempory buffer
+;
+
+: probe
+ determine-controller
+ encode-reg-property \ Build the reg property now
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2006 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
Modified: dev/video/controlr/vga.fth
===================================================================
--- dev/video/controlr/vga.fth 2008-12-24 21:16:22 UTC (rev 1049)
+++ dev/video/controlr/vga.fth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -120,7 +120,7 @@
: crtc@ ( index -- value ) crtcbuf + c@ ;
: .vga-mode ( -- )
- push-decimal
+ base @ >r decimal
." HTotal: " 0 crtc@ 4 u.r cr
." HDispEnd: " 1 crtc@ 4 u.r cr
." HBlankStart: " 2 crtc@ 4 u.r cr
@@ -154,7 +154,7 @@
." SelectRowScn:" h# 17 crtc@ 1 rshift 1 and 4 u.r cr
." SelectA13: " h# 17 crtc@ 1 and 4 u.r cr
." LineCompare: " h# 18 crtc@ 4 u.r cr
- pop-base
+ r> base !
;
: showmode ( adr len -- ) crtcbuf swap move .vga-mode ;
@@ -189,6 +189,22 @@
['] vga-video-on to video-on
;
+: basic-vga-init ( -- )
+ vga-reset
+ seq-regs
+ attr-regs
+ grf-regs
+
+ crt-regs
+ 4 feature-ctl! \ Vertical sync ctl
+ hsync-on
+;
+: basic-vga ( -- )
+ ['] (vga-crt-table) to crt-table
+ ['] basic-vga-init to init-controller
+ ['] noop is init-dac
+;
+
\ LICENSE_BEGIN
\ Copyright (c) 2006 FirmWorks
\
Added: dev/video/loadcirrus.fth
===================================================================
--- dev/video/loadcirrus.fth (rev 0)
+++ dev/video/loadcirrus.fth 2008-12-28 03:58:44 UTC (rev 1050)
@@ -0,0 +1,13 @@
+purpose: Interior load file for Cirrus video driver
+
+" vga" device-name
+
+fload ${BP}/dev/video/common/defer.fth \ Defered words
+fload ${BP}/dev/video/controlr/pcimap.fth \ Generic PCI implementations
+fload ${BP}/dev/video/dacs/cirrus.fth
+fload ${BP}/dev/video/controlr/vga.fth \ Load generic VGA routines
+fload ${BP}/dev/video/controlr/cirrus.fth \ Load Cirrus routines
+fload ${BP}/dev/video/controlr/cirruspci.fth \ PCI routines
+fload ${BP}/dev/video/common/graphics.fth \ Graphics and color routines
+fload ${BP}/dev/video/common/init.fth \ Init code
+fload ${BP}/dev/video/common/display.fth \ High level interface code