v86 0.3.4 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Readme.md +4 -4
- package/bios/seabios/.config +113 -0
- package/bios/seabios/.config.old +114 -0
- package/bios/seabios/.gitignore +4 -0
- package/bios/seabios/COPYING +674 -0
- package/bios/seabios/COPYING.LESSER +165 -0
- package/bios/seabios/Makefile +286 -0
- package/bios/seabios/README +17 -0
- package/bios/seabios/docs/Build_overview.md +104 -0
- package/bios/seabios/docs/Contributing.md +20 -0
- package/bios/seabios/docs/Debugging.md +111 -0
- package/bios/seabios/docs/Developer_Documentation.md +25 -0
- package/bios/seabios/docs/Developer_links.md +86 -0
- package/bios/seabios/docs/Download.md +27 -0
- package/bios/seabios/docs/Execution_and_code_flow.md +178 -0
- package/bios/seabios/docs/Linking_overview.md +160 -0
- package/bios/seabios/docs/Mailinglist.md +8 -0
- package/bios/seabios/docs/Memory_Model.md +253 -0
- package/bios/seabios/docs/README +5 -0
- package/bios/seabios/docs/Releases.md +482 -0
- package/bios/seabios/docs/Runtime_config.md +193 -0
- package/bios/seabios/docs/SeaBIOS.md +17 -0
- package/bios/seabios/docs/SeaVGABIOS.md +39 -0
- package/bios/seabios/out/autoconf.h +117 -0
- package/bios/seabios/out/include/config/acpi/dsdt.h +0 -0
- package/bios/seabios/out/include/config/acpi.h +0 -0
- package/bios/seabios/out/include/config/ahci.h +0 -0
- package/bios/seabios/out/include/config/apmbios.h +0 -0
- package/bios/seabios/out/include/config/ata/dma.h +0 -0
- package/bios/seabios/out/include/config/ata/pio32.h +0 -0
- package/bios/seabios/out/include/config/ata.h +0 -0
- package/bios/seabios/out/include/config/auto.conf +69 -0
- package/bios/seabios/out/include/config/auto.conf.cmd +9 -0
- package/bios/seabios/out/include/config/boot.h +0 -0
- package/bios/seabios/out/include/config/bootorder.h +0 -0
- package/bios/seabios/out/include/config/build/vgabios.h +0 -0
- package/bios/seabios/out/include/config/call32/smm.h +0 -0
- package/bios/seabios/out/include/config/cdrom/boot.h +0 -0
- package/bios/seabios/out/include/config/cdrom/emu.h +0 -0
- package/bios/seabios/out/include/config/debug/level.h +0 -0
- package/bios/seabios/out/include/config/drives.h +0 -0
- package/bios/seabios/out/include/config/entry/extrastack.h +0 -0
- package/bios/seabios/out/include/config/esp/scsi.h +0 -0
- package/bios/seabios/out/include/config/flash/floppy.h +0 -0
- package/bios/seabios/out/include/config/floppy.h +0 -0
- package/bios/seabios/out/include/config/fw/romfile/load.h +0 -0
- package/bios/seabios/out/include/config/hardware/irq.h +0 -0
- package/bios/seabios/out/include/config/kbd/call/int15/4f.h +0 -0
- package/bios/seabios/out/include/config/keyboard.h +0 -0
- package/bios/seabios/out/include/config/lpt.h +0 -0
- package/bios/seabios/out/include/config/lsi/scsi.h +0 -0
- package/bios/seabios/out/include/config/malloc/uppermemory.h +0 -0
- package/bios/seabios/out/include/config/megasas.h +0 -0
- package/bios/seabios/out/include/config/mouse.h +0 -0
- package/bios/seabios/out/include/config/mpt/scsi.h +0 -0
- package/bios/seabios/out/include/config/mptable.h +0 -0
- package/bios/seabios/out/include/config/mtrr/init.h +0 -0
- package/bios/seabios/out/include/config/optionroms.h +0 -0
- package/bios/seabios/out/include/config/override/pci/id.h +0 -0
- package/bios/seabios/out/include/config/pcibios.h +0 -0
- package/bios/seabios/out/include/config/pirtable.h +0 -0
- package/bios/seabios/out/include/config/pmm.h +0 -0
- package/bios/seabios/out/include/config/pmtimer.h +0 -0
- package/bios/seabios/out/include/config/pnpbios.h +0 -0
- package/bios/seabios/out/include/config/ps2port.h +0 -0
- package/bios/seabios/out/include/config/pvscsi.h +0 -0
- package/bios/seabios/out/include/config/qemu/hardware.h +0 -0
- package/bios/seabios/out/include/config/qemu.h +0 -0
- package/bios/seabios/out/include/config/rom/size.h +0 -0
- package/bios/seabios/out/include/config/rtc/timer.h +0 -0
- package/bios/seabios/out/include/config/s3/resume.h +0 -0
- package/bios/seabios/out/include/config/sdcard.h +0 -0
- package/bios/seabios/out/include/config/serial.h +0 -0
- package/bios/seabios/out/include/config/tcgbios.h +0 -0
- package/bios/seabios/out/include/config/threads.h +0 -0
- package/bios/seabios/out/include/config/tristate.conf +4 -0
- package/bios/seabios/out/include/config/tsc/timer.h +0 -0
- package/bios/seabios/out/include/config/use/smm.h +0 -0
- package/bios/seabios/out/include/config/vga/allocate/extra/stack.h +0 -0
- package/bios/seabios/out/include/config/vga/bochs/stdvga.h +0 -0
- package/bios/seabios/out/include/config/vga/bochs.h +0 -0
- package/bios/seabios/out/include/config/vga/did.h +0 -0
- package/bios/seabios/out/include/config/vga/extra/stack/size.h +0 -0
- package/bios/seabios/out/include/config/vga/fixup/asm.h +0 -0
- package/bios/seabios/out/include/config/vga/pci.h +0 -0
- package/bios/seabios/out/include/config/vga/stdvga/ports.h +0 -0
- package/bios/seabios/out/include/config/vga/vbe.h +0 -0
- package/bios/seabios/out/include/config/vga/vid.h +0 -0
- package/bios/seabios/out/include/config/vgahooks.h +0 -0
- package/bios/seabios/out/include/config/virtio/blk.h +0 -0
- package/bios/seabios/out/include/config/virtio/scsi.h +0 -0
- package/bios/seabios/out/include/config/xen.h +0 -0
- package/bios/seabios/out/scripts/kconfig/conf +0 -0
- package/bios/seabios/out/scripts/kconfig/conf.o +0 -0
- package/bios/seabios/out/scripts/kconfig/zconf.hash.c +289 -0
- package/bios/seabios/out/scripts/kconfig/zconf.lex.c +2420 -0
- package/bios/seabios/out/scripts/kconfig/zconf.tab.c +2538 -0
- package/bios/seabios/out/scripts/kconfig/zconf.tab.o +0 -0
- package/bios/seabios/scripts/acpi_extract.py +366 -0
- package/bios/seabios/scripts/acpi_extract_preprocess.py +41 -0
- package/bios/seabios/scripts/buildrom.py +56 -0
- package/bios/seabios/scripts/buildversion.py +134 -0
- package/bios/seabios/scripts/checkrom.py +95 -0
- package/bios/seabios/scripts/checkstack.py +226 -0
- package/bios/seabios/scripts/checksum.py +16 -0
- package/bios/seabios/scripts/encodeint.py +21 -0
- package/bios/seabios/scripts/gen-offsets.sh +17 -0
- package/bios/seabios/scripts/kconfig/.gitignore +22 -0
- package/bios/seabios/scripts/kconfig/Makefile +331 -0
- package/bios/seabios/scripts/kconfig/POTFILES.in +12 -0
- package/bios/seabios/scripts/kconfig/check.sh +13 -0
- package/bios/seabios/scripts/kconfig/conf.c +718 -0
- package/bios/seabios/scripts/kconfig/confdata.c +1250 -0
- package/bios/seabios/scripts/kconfig/expr.c +1168 -0
- package/bios/seabios/scripts/kconfig/expr.h +241 -0
- package/bios/seabios/scripts/kconfig/gconf.c +1542 -0
- package/bios/seabios/scripts/kconfig/gconf.glade +661 -0
- package/bios/seabios/scripts/kconfig/images.c +326 -0
- package/bios/seabios/scripts/kconfig/kxgettext.c +235 -0
- package/bios/seabios/scripts/kconfig/lex.zconf.c +2430 -0
- package/bios/seabios/scripts/kconfig/list.h +131 -0
- package/bios/seabios/scripts/kconfig/lkc.h +200 -0
- package/bios/seabios/scripts/kconfig/lkc_proto.h +57 -0
- package/bios/seabios/scripts/kconfig/lxdialog/.gitignore +4 -0
- package/bios/seabios/scripts/kconfig/lxdialog/BIG.FAT.WARNING +4 -0
- package/bios/seabios/scripts/kconfig/lxdialog/check-lxdialog.sh +87 -0
- package/bios/seabios/scripts/kconfig/lxdialog/checklist.c +332 -0
- package/bios/seabios/scripts/kconfig/lxdialog/dialog.h +257 -0
- package/bios/seabios/scripts/kconfig/lxdialog/inputbox.c +301 -0
- package/bios/seabios/scripts/kconfig/lxdialog/menubox.c +437 -0
- package/bios/seabios/scripts/kconfig/lxdialog/textbox.c +408 -0
- package/bios/seabios/scripts/kconfig/lxdialog/util.c +713 -0
- package/bios/seabios/scripts/kconfig/lxdialog/yesno.c +114 -0
- package/bios/seabios/scripts/kconfig/mconf.c +1036 -0
- package/bios/seabios/scripts/kconfig/menu.c +697 -0
- package/bios/seabios/scripts/kconfig/merge_config.sh +150 -0
- package/bios/seabios/scripts/kconfig/nconf.c +1556 -0
- package/bios/seabios/scripts/kconfig/nconf.gui.c +656 -0
- package/bios/seabios/scripts/kconfig/nconf.h +96 -0
- package/bios/seabios/scripts/kconfig/qconf.cc +1795 -0
- package/bios/seabios/scripts/kconfig/qconf.h +338 -0
- package/bios/seabios/scripts/kconfig/streamline_config.pl +647 -0
- package/bios/seabios/scripts/kconfig/symbol.c +1373 -0
- package/bios/seabios/scripts/kconfig/util.c +157 -0
- package/bios/seabios/scripts/kconfig/zconf.gperf +48 -0
- package/bios/seabios/scripts/kconfig/zconf.hash.c_shipped +289 -0
- package/bios/seabios/scripts/kconfig/zconf.l +363 -0
- package/bios/seabios/scripts/kconfig/zconf.lex.c_shipped +2420 -0
- package/bios/seabios/scripts/kconfig/zconf.tab.c_shipped +2538 -0
- package/bios/seabios/scripts/kconfig/zconf.y +733 -0
- package/bios/seabios/scripts/layoutrom.py +705 -0
- package/bios/seabios/scripts/python23compat.py +14 -0
- package/bios/seabios/scripts/readserial.py +190 -0
- package/bios/seabios/scripts/tarball.sh +36 -0
- package/bios/seabios/scripts/test-build.sh +90 -0
- package/bios/seabios/scripts/transdump.py +53 -0
- package/bios/seabios/scripts/vgafixup.py +96 -0
- package/bios/seabios/src/Kconfig +579 -0
- package/bios/seabios/src/apm.c +215 -0
- package/bios/seabios/src/asm-offsets.c +23 -0
- package/bios/seabios/src/biosvar.h +130 -0
- package/bios/seabios/src/block.c +623 -0
- package/bios/seabios/src/block.h +121 -0
- package/bios/seabios/src/bmp.c +117 -0
- package/bios/seabios/src/boot.c +793 -0
- package/bios/seabios/src/bootsplash.c +255 -0
- package/bios/seabios/src/bregs.h +80 -0
- package/bios/seabios/src/byteorder.h +71 -0
- package/bios/seabios/src/cdrom.c +322 -0
- package/bios/seabios/src/clock.c +506 -0
- package/bios/seabios/src/code16gcc.s +1 -0
- package/bios/seabios/src/config.h +108 -0
- package/bios/seabios/src/cp437.c +275 -0
- package/bios/seabios/src/cp437.h +1 -0
- package/bios/seabios/src/disk.c +779 -0
- package/bios/seabios/src/e820map.c +152 -0
- package/bios/seabios/src/e820map.h +26 -0
- package/bios/seabios/src/entryfuncs.S +165 -0
- package/bios/seabios/src/farptr.h +208 -0
- package/bios/seabios/src/font.c +139 -0
- package/bios/seabios/src/fw/acpi-dsdt-cpu-hotplug.dsl +78 -0
- package/bios/seabios/src/fw/acpi-dsdt-dbug.dsl +26 -0
- package/bios/seabios/src/fw/acpi-dsdt-hpet.dsl +36 -0
- package/bios/seabios/src/fw/acpi-dsdt-isa.dsl +102 -0
- package/bios/seabios/src/fw/acpi-dsdt-pci-crs.dsl +90 -0
- package/bios/seabios/src/fw/acpi-dsdt.dsl +342 -0
- package/bios/seabios/src/fw/acpi-dsdt.hex +554 -0
- package/bios/seabios/src/fw/acpi.c +685 -0
- package/bios/seabios/src/fw/biostables.c +491 -0
- package/bios/seabios/src/fw/coreboot.c +569 -0
- package/bios/seabios/src/fw/csm.c +347 -0
- package/bios/seabios/src/fw/dev-pci.h +52 -0
- package/bios/seabios/src/fw/dev-piix.h +29 -0
- package/bios/seabios/src/fw/dev-q35.h +52 -0
- package/bios/seabios/src/fw/lzmadecode.c +398 -0
- package/bios/seabios/src/fw/lzmadecode.h +67 -0
- package/bios/seabios/src/fw/mptable.c +197 -0
- package/bios/seabios/src/fw/mtrr.c +105 -0
- package/bios/seabios/src/fw/multiboot.c +111 -0
- package/bios/seabios/src/fw/paravirt.c +624 -0
- package/bios/seabios/src/fw/paravirt.h +63 -0
- package/bios/seabios/src/fw/pciinit.c +1187 -0
- package/bios/seabios/src/fw/pirtable.c +103 -0
- package/bios/seabios/src/fw/q35-acpi-dsdt.dsl +450 -0
- package/bios/seabios/src/fw/romfile_loader.c +259 -0
- package/bios/seabios/src/fw/romfile_loader.h +91 -0
- package/bios/seabios/src/fw/shadow.c +208 -0
- package/bios/seabios/src/fw/smbios.c +585 -0
- package/bios/seabios/src/fw/smm.c +269 -0
- package/bios/seabios/src/fw/smp.c +194 -0
- package/bios/seabios/src/fw/ssdt-misc.dsl +104 -0
- package/bios/seabios/src/fw/ssdt-misc.hex +88 -0
- package/bios/seabios/src/fw/ssdt-pcihp.dsl +36 -0
- package/bios/seabios/src/fw/ssdt-pcihp.hex +38 -0
- package/bios/seabios/src/fw/ssdt-proc.dsl +48 -0
- package/bios/seabios/src/fw/ssdt-proc.hex +35 -0
- package/bios/seabios/src/fw/xen.c +149 -0
- package/bios/seabios/src/fw/xen.h +125 -0
- package/bios/seabios/src/gen-defs.h +19 -0
- package/bios/seabios/src/hw/ahci.c +697 -0
- package/bios/seabios/src/hw/ahci.h +201 -0
- package/bios/seabios/src/hw/ata.c +1046 -0
- package/bios/seabios/src/hw/ata.h +163 -0
- package/bios/seabios/src/hw/blockcmd.c +372 -0
- package/bios/seabios/src/hw/blockcmd.h +114 -0
- package/bios/seabios/src/hw/dma.c +67 -0
- package/bios/seabios/src/hw/esp-scsi.c +241 -0
- package/bios/seabios/src/hw/esp-scsi.h +8 -0
- package/bios/seabios/src/hw/floppy.c +741 -0
- package/bios/seabios/src/hw/lsi-scsi.c +221 -0
- package/bios/seabios/src/hw/lsi-scsi.h +8 -0
- package/bios/seabios/src/hw/megasas.c +405 -0
- package/bios/seabios/src/hw/megasas.h +8 -0
- package/bios/seabios/src/hw/mpt-scsi.c +319 -0
- package/bios/seabios/src/hw/mpt-scsi.h +8 -0
- package/bios/seabios/src/hw/nvme-int.h +199 -0
- package/bios/seabios/src/hw/nvme.c +708 -0
- package/bios/seabios/src/hw/nvme.h +17 -0
- package/bios/seabios/src/hw/pci.c +133 -0
- package/bios/seabios/src/hw/pci.h +47 -0
- package/bios/seabios/src/hw/pci_ids.h +2632 -0
- package/bios/seabios/src/hw/pci_regs.h +556 -0
- package/bios/seabios/src/hw/pcidevice.c +192 -0
- package/bios/seabios/src/hw/pcidevice.h +76 -0
- package/bios/seabios/src/hw/pic.c +115 -0
- package/bios/seabios/src/hw/pic.h +60 -0
- package/bios/seabios/src/hw/ps2port.c +543 -0
- package/bios/seabios/src/hw/ps2port.h +67 -0
- package/bios/seabios/src/hw/pvscsi.c +333 -0
- package/bios/seabios/src/hw/pvscsi.h +8 -0
- package/bios/seabios/src/hw/ramdisk.c +108 -0
- package/bios/seabios/src/hw/rtc.c +100 -0
- package/bios/seabios/src/hw/rtc.h +75 -0
- package/bios/seabios/src/hw/sdcard.c +572 -0
- package/bios/seabios/src/hw/serialio.c +113 -0
- package/bios/seabios/src/hw/serialio.h +29 -0
- package/bios/seabios/src/hw/timer.c +259 -0
- package/bios/seabios/src/hw/tpm_drivers.c +636 -0
- package/bios/seabios/src/hw/tpm_drivers.h +127 -0
- package/bios/seabios/src/hw/usb-ehci.c +650 -0
- package/bios/seabios/src/hw/usb-ehci.h +177 -0
- package/bios/seabios/src/hw/usb-hid.c +442 -0
- package/bios/seabios/src/hw/usb-hid.h +29 -0
- package/bios/seabios/src/hw/usb-hub.c +205 -0
- package/bios/seabios/src/hw/usb-hub.h +64 -0
- package/bios/seabios/src/hw/usb-msc.c +222 -0
- package/bios/seabios/src/hw/usb-msc.h +10 -0
- package/bios/seabios/src/hw/usb-ohci.c +568 -0
- package/bios/seabios/src/hw/usb-ohci.h +144 -0
- package/bios/seabios/src/hw/usb-uas.c +289 -0
- package/bios/seabios/src/hw/usb-uas.h +9 -0
- package/bios/seabios/src/hw/usb-uhci.c +571 -0
- package/bios/seabios/src/hw/usb-uhci.h +128 -0
- package/bios/seabios/src/hw/usb-xhci.c +1161 -0
- package/bios/seabios/src/hw/usb-xhci.h +133 -0
- package/bios/seabios/src/hw/usb.c +499 -0
- package/bios/seabios/src/hw/usb.h +254 -0
- package/bios/seabios/src/hw/virtio-blk.c +211 -0
- package/bios/seabios/src/hw/virtio-blk.h +43 -0
- package/bios/seabios/src/hw/virtio-pci.c +501 -0
- package/bios/seabios/src/hw/virtio-pci.h +151 -0
- package/bios/seabios/src/hw/virtio-ring.c +147 -0
- package/bios/seabios/src/hw/virtio-ring.h +121 -0
- package/bios/seabios/src/hw/virtio-scsi.c +220 -0
- package/bios/seabios/src/hw/virtio-scsi.h +47 -0
- package/bios/seabios/src/jpeg.c +1055 -0
- package/bios/seabios/src/kbd.c +599 -0
- package/bios/seabios/src/list.h +91 -0
- package/bios/seabios/src/malloc.c +561 -0
- package/bios/seabios/src/malloc.h +70 -0
- package/bios/seabios/src/memmap.h +21 -0
- package/bios/seabios/src/misc.c +195 -0
- package/bios/seabios/src/mouse.c +342 -0
- package/bios/seabios/src/optionroms.c +475 -0
- package/bios/seabios/src/output.c +584 -0
- package/bios/seabios/src/output.h +68 -0
- package/bios/seabios/src/pcibios.c +241 -0
- package/bios/seabios/src/pmm.c +176 -0
- package/bios/seabios/src/pnpbios.c +88 -0
- package/bios/seabios/src/post.c +337 -0
- package/bios/seabios/src/resume.c +157 -0
- package/bios/seabios/src/romfile.c +146 -0
- package/bios/seabios/src/romfile.h +21 -0
- package/bios/seabios/src/romlayout.S +698 -0
- package/bios/seabios/src/sercon.c +677 -0
- package/bios/seabios/src/serial.c +317 -0
- package/bios/seabios/src/sha1.c +147 -0
- package/bios/seabios/src/sha1.h +8 -0
- package/bios/seabios/src/stacks.c +771 -0
- package/bios/seabios/src/stacks.h +68 -0
- package/bios/seabios/src/std/LegacyBios.h +985 -0
- package/bios/seabios/src/std/acpi.h +323 -0
- package/bios/seabios/src/std/bda.h +174 -0
- package/bios/seabios/src/std/disk.h +175 -0
- package/bios/seabios/src/std/mptable.h +77 -0
- package/bios/seabios/src/std/multiboot.h +260 -0
- package/bios/seabios/src/std/optionrom.h +59 -0
- package/bios/seabios/src/std/pirtable.h +35 -0
- package/bios/seabios/src/std/pmm.h +19 -0
- package/bios/seabios/src/std/pnpbios.h +24 -0
- package/bios/seabios/src/std/smbios.h +167 -0
- package/bios/seabios/src/std/tcg.h +554 -0
- package/bios/seabios/src/std/vbe.h +156 -0
- package/bios/seabios/src/std/vga.h +63 -0
- package/bios/seabios/src/string.c +251 -0
- package/bios/seabios/src/string.h +31 -0
- package/bios/seabios/src/system.c +357 -0
- package/bios/seabios/src/tcgbios.c +2014 -0
- package/bios/seabios/src/tcgbios.h +19 -0
- package/bios/seabios/src/types.h +156 -0
- package/bios/seabios/src/util.h +251 -0
- package/bios/seabios/src/version.c +5 -0
- package/bios/seabios/src/vgahooks.c +355 -0
- package/bios/seabios/src/x86.c +23 -0
- package/bios/seabios/src/x86.h +277 -0
- package/bios/seabios/vgasrc/Kconfig +211 -0
- package/bios/seabios/vgasrc/bochsdisplay.c +59 -0
- package/bios/seabios/vgasrc/bochsvga.c +447 -0
- package/bios/seabios/vgasrc/bochsvga.h +57 -0
- package/bios/seabios/vgasrc/cbvga.c +337 -0
- package/bios/seabios/vgasrc/clext.c +627 -0
- package/bios/seabios/vgasrc/geodevga.c +434 -0
- package/bios/seabios/vgasrc/geodevga.h +89 -0
- package/bios/seabios/vgasrc/ramfb.c +163 -0
- package/bios/seabios/vgasrc/stdvga.c +485 -0
- package/bios/seabios/vgasrc/stdvga.h +81 -0
- package/bios/seabios/vgasrc/stdvgaio.c +186 -0
- package/bios/seabios/vgasrc/stdvgamodes.c +534 -0
- package/bios/seabios/vgasrc/swcursor.c +96 -0
- package/bios/seabios/vgasrc/vbe.c +432 -0
- package/bios/seabios/vgasrc/vgabios.c +1131 -0
- package/bios/seabios/vgasrc/vgabios.h +88 -0
- package/bios/seabios/vgasrc/vgaentry.S +161 -0
- package/bios/seabios/vgasrc/vgafb.c +661 -0
- package/bios/seabios/vgasrc/vgafb.h +42 -0
- package/bios/seabios/vgasrc/vgafonts.c +785 -0
- package/bios/seabios/vgasrc/vgahw.h +152 -0
- package/bios/seabios/vgasrc/vgainit.c +202 -0
- package/bios/seabios/vgasrc/vgalayout.lds.S +23 -0
- package/bios/seabios/vgasrc/vgautil.h +103 -0
- package/bios/seabios/vgasrc/vgaversion.c +6 -0
- package/build/binaries.js +1 -1
- package/build/index-debug.cjs +1 -1
- package/build/index-debug.js +1 -1
- package/build/index.cjs +1 -1
- package/build/index.js +1 -1
- package/build/v86-debug.wasm +0 -0
- package/build/v86.wasm +0 -0
- package/package.json +1 -1
|
@@ -0,0 +1,741 @@
|
|
|
1
|
+
// 16bit code to access floppy drives.
|
|
2
|
+
//
|
|
3
|
+
// Copyright (C) 2008,2009 Kevin O'Connor <kevin@koconnor.net>
|
|
4
|
+
// Copyright (C) 2002 MandrakeSoft S.A.
|
|
5
|
+
//
|
|
6
|
+
// This file may be distributed under the terms of the GNU LGPLv3 license.
|
|
7
|
+
|
|
8
|
+
#include "biosvar.h" // SET_BDA
|
|
9
|
+
#include "block.h" // struct drive_s
|
|
10
|
+
#include "bregs.h" // struct bregs
|
|
11
|
+
#include "config.h" // CONFIG_FLOPPY
|
|
12
|
+
#include "malloc.h" // malloc_fseg
|
|
13
|
+
#include "output.h" // dprintf
|
|
14
|
+
#include "pcidevice.h" // pci_find_class
|
|
15
|
+
#include "pci_ids.h" // PCI_CLASS_BRIDGE_ISA
|
|
16
|
+
#include "pic.h" // pic_eoi1
|
|
17
|
+
#include "romfile.h" // romfile_loadint
|
|
18
|
+
#include "rtc.h" // rtc_read
|
|
19
|
+
#include "stacks.h" // yield
|
|
20
|
+
#include "std/disk.h" // DISK_RET_SUCCESS
|
|
21
|
+
#include "string.h" // memset
|
|
22
|
+
#include "util.h" // timer_calc
|
|
23
|
+
|
|
24
|
+
#define PORT_FD_BASE 0x03f0
|
|
25
|
+
#define PORT_FD_DOR 0x03f2
|
|
26
|
+
#define PORT_FD_STATUS 0x03f4
|
|
27
|
+
#define PORT_FD_DATA 0x03f5
|
|
28
|
+
#define PORT_FD_DIR 0x03f7
|
|
29
|
+
|
|
30
|
+
#define FLOPPY_SIZE_CODE 0x02 // 512 byte sectors
|
|
31
|
+
#define FLOPPY_DATALEN 0xff // Not used - because size code is 0x02
|
|
32
|
+
#define FLOPPY_MOTOR_TICKS 37 // ~2 seconds
|
|
33
|
+
#define FLOPPY_FILLBYTE 0xf6
|
|
34
|
+
#define FLOPPY_GAPLEN 0x1B
|
|
35
|
+
#define FLOPPY_FORMAT_GAPLEN 0x6c
|
|
36
|
+
#define FLOPPY_PIO_TIMEOUT 1000
|
|
37
|
+
#define FLOPPY_IRQ_TIMEOUT 5000
|
|
38
|
+
#define FLOPPY_SPECIFY1 0xAF // step rate 12ms, head unload 240ms
|
|
39
|
+
#define FLOPPY_SPECIFY2 0x02 // head load time 4ms, DMA used
|
|
40
|
+
#define FLOPPY_STARTUP_TIME 8 // 1 second
|
|
41
|
+
|
|
42
|
+
#define FLOPPY_DOR_MOTOR_D 0x80 // Set to turn drive 3's motor ON
|
|
43
|
+
#define FLOPPY_DOR_MOTOR_C 0x40 // Set to turn drive 2's motor ON
|
|
44
|
+
#define FLOPPY_DOR_MOTOR_B 0x20 // Set to turn drive 1's motor ON
|
|
45
|
+
#define FLOPPY_DOR_MOTOR_A 0x10 // Set to turn drive 0's motor ON
|
|
46
|
+
#define FLOPPY_DOR_MOTOR_MASK 0xf0
|
|
47
|
+
#define FLOPPY_DOR_IRQ 0x08 // Set to enable IRQs and DMA
|
|
48
|
+
#define FLOPPY_DOR_RESET 0x04 // Clear = enter reset mode, Set = normal operation
|
|
49
|
+
#define FLOPPY_DOR_DSEL_MASK 0x03 // "Select" drive number for next access
|
|
50
|
+
|
|
51
|
+
// New diskette parameter table adding 3 parameters from IBM
|
|
52
|
+
// Since no provisions are made for multiple drive types, most
|
|
53
|
+
// values in this table are ignored. I set parameters for 1.44M
|
|
54
|
+
// floppy here
|
|
55
|
+
struct floppy_ext_dbt_s diskette_param_table2 VARFSEG = {
|
|
56
|
+
.dbt = {
|
|
57
|
+
.specify1 = FLOPPY_SPECIFY1,
|
|
58
|
+
.specify2 = FLOPPY_SPECIFY2,
|
|
59
|
+
.shutoff_ticks = FLOPPY_MOTOR_TICKS, // ~2 seconds
|
|
60
|
+
.bps_code = FLOPPY_SIZE_CODE,
|
|
61
|
+
.sectors = 18,
|
|
62
|
+
.interblock_len = FLOPPY_GAPLEN,
|
|
63
|
+
.data_len = FLOPPY_DATALEN,
|
|
64
|
+
.gap_len = FLOPPY_FORMAT_GAPLEN,
|
|
65
|
+
.fill_byte = FLOPPY_FILLBYTE,
|
|
66
|
+
.settle_time = 0x0F, // 15ms
|
|
67
|
+
.startup_time = FLOPPY_STARTUP_TIME,
|
|
68
|
+
},
|
|
69
|
+
.max_track = 79, // maximum track
|
|
70
|
+
.data_rate = 0, // data transfer rate
|
|
71
|
+
.drive_type = 4, // drive type in cmos
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
struct floppyinfo_s {
|
|
75
|
+
struct chs_s chs;
|
|
76
|
+
u8 floppy_size;
|
|
77
|
+
u8 data_rate;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
#define FLOPPY_SIZE_525 0x01
|
|
81
|
+
#define FLOPPY_SIZE_350 0x02
|
|
82
|
+
|
|
83
|
+
#define FLOPPY_RATE_500K 0x00
|
|
84
|
+
#define FLOPPY_RATE_300K 0x01
|
|
85
|
+
#define FLOPPY_RATE_250K 0x02
|
|
86
|
+
#define FLOPPY_RATE_1M 0x03
|
|
87
|
+
|
|
88
|
+
struct floppyinfo_s FloppyInfo[] VARFSEG = {
|
|
89
|
+
// Unknown
|
|
90
|
+
{ {0, 0, 0}, 0x00, 0x00},
|
|
91
|
+
// 1 - 360KB, 5.25" - 2 heads, 40 tracks, 9 sectors
|
|
92
|
+
{ {2, 40, 9}, FLOPPY_SIZE_525, FLOPPY_RATE_300K},
|
|
93
|
+
// 2 - 1.2MB, 5.25" - 2 heads, 80 tracks, 15 sectors
|
|
94
|
+
{ {2, 80, 15}, FLOPPY_SIZE_525, FLOPPY_RATE_500K},
|
|
95
|
+
// 3 - 720KB, 3.5" - 2 heads, 80 tracks, 9 sectors
|
|
96
|
+
{ {2, 80, 9}, FLOPPY_SIZE_350, FLOPPY_RATE_250K},
|
|
97
|
+
// 4 - 1.44MB, 3.5" - 2 heads, 80 tracks, 18 sectors
|
|
98
|
+
{ {2, 80, 18}, FLOPPY_SIZE_350, FLOPPY_RATE_500K},
|
|
99
|
+
// 5 - 2.88MB, 3.5" - 2 heads, 80 tracks, 36 sectors
|
|
100
|
+
{ {2, 80, 36}, FLOPPY_SIZE_350, FLOPPY_RATE_1M},
|
|
101
|
+
// 6 - 160k, 5.25" - 1 heads, 40 tracks, 8 sectors
|
|
102
|
+
{ {1, 40, 8}, FLOPPY_SIZE_525, FLOPPY_RATE_250K},
|
|
103
|
+
// 7 - 180k, 5.25" - 1 heads, 40 tracks, 9 sectors
|
|
104
|
+
{ {1, 40, 9}, FLOPPY_SIZE_525, FLOPPY_RATE_300K},
|
|
105
|
+
// 8 - 320k, 5.25" - 2 heads, 40 tracks, 8 sectors
|
|
106
|
+
{ {2, 40, 8}, FLOPPY_SIZE_525, FLOPPY_RATE_250K},
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
struct drive_s *
|
|
110
|
+
init_floppy(int floppyid, int ftype)
|
|
111
|
+
{
|
|
112
|
+
if (ftype <= 0 || ftype >= ARRAY_SIZE(FloppyInfo)) {
|
|
113
|
+
dprintf(1, "Bad floppy type %d\n", ftype);
|
|
114
|
+
return NULL;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
struct drive_s *drive = malloc_fseg(sizeof(*drive));
|
|
118
|
+
if (!drive) {
|
|
119
|
+
warn_noalloc();
|
|
120
|
+
return NULL;
|
|
121
|
+
}
|
|
122
|
+
memset(drive, 0, sizeof(*drive));
|
|
123
|
+
drive->cntl_id = floppyid;
|
|
124
|
+
drive->type = DTYPE_FLOPPY;
|
|
125
|
+
drive->blksize = DISK_SECTOR_SIZE;
|
|
126
|
+
drive->floppy_type = ftype;
|
|
127
|
+
drive->sectors = (u64)-1;
|
|
128
|
+
|
|
129
|
+
memcpy(&drive->lchs, &FloppyInfo[ftype].chs
|
|
130
|
+
, sizeof(FloppyInfo[ftype].chs));
|
|
131
|
+
return drive;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
static void
|
|
135
|
+
addFloppy(int floppyid, int ftype)
|
|
136
|
+
{
|
|
137
|
+
struct drive_s *drive = init_floppy(floppyid, ftype);
|
|
138
|
+
if (!drive)
|
|
139
|
+
return;
|
|
140
|
+
char *desc = znprintf(MAXDESCSIZE, "Floppy [drive %c]", 'A' + floppyid);
|
|
141
|
+
struct pci_device *pci = pci_find_class(PCI_CLASS_BRIDGE_ISA); /* isa-to-pci bridge */
|
|
142
|
+
int prio = bootprio_find_fdc_device(pci, PORT_FD_BASE, floppyid);
|
|
143
|
+
boot_add_floppy(drive, desc, prio);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
void
|
|
147
|
+
floppy_setup(void)
|
|
148
|
+
{
|
|
149
|
+
memcpy(&diskette_param_table, &diskette_param_table2
|
|
150
|
+
, sizeof(diskette_param_table));
|
|
151
|
+
SET_IVT(0x1E, SEGOFF(SEG_BIOS
|
|
152
|
+
, (u32)&diskette_param_table2 - BUILD_BIOS_ADDR));
|
|
153
|
+
|
|
154
|
+
if (! CONFIG_FLOPPY)
|
|
155
|
+
return;
|
|
156
|
+
dprintf(3, "init floppy drives\n");
|
|
157
|
+
|
|
158
|
+
if (CONFIG_QEMU) {
|
|
159
|
+
u8 type = rtc_read(CMOS_FLOPPY_DRIVE_TYPE);
|
|
160
|
+
if (type & 0xf0)
|
|
161
|
+
addFloppy(0, type >> 4);
|
|
162
|
+
if (type & 0x0f)
|
|
163
|
+
addFloppy(1, type & 0x0f);
|
|
164
|
+
} else {
|
|
165
|
+
u8 type = romfile_loadint("etc/floppy0", 0);
|
|
166
|
+
if (type)
|
|
167
|
+
addFloppy(0, type);
|
|
168
|
+
type = romfile_loadint("etc/floppy1", 0);
|
|
169
|
+
if (type)
|
|
170
|
+
addFloppy(1, type);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
enable_hwirq(6, FUNC16(entry_0e));
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Find a floppy type that matches a given image size.
|
|
177
|
+
int
|
|
178
|
+
find_floppy_type(u32 size)
|
|
179
|
+
{
|
|
180
|
+
int i;
|
|
181
|
+
for (i=1; i<ARRAY_SIZE(FloppyInfo); i++) {
|
|
182
|
+
struct chs_s *c = &FloppyInfo[i].chs;
|
|
183
|
+
if (c->cylinder * c->head * c->sector * DISK_SECTOR_SIZE == size)
|
|
184
|
+
return i;
|
|
185
|
+
}
|
|
186
|
+
return -1;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
/****************************************************************
|
|
191
|
+
* Low-level floppy IO
|
|
192
|
+
****************************************************************/
|
|
193
|
+
|
|
194
|
+
u8 FloppyDOR VARLOW;
|
|
195
|
+
|
|
196
|
+
static inline u8
|
|
197
|
+
floppy_dor_read(void)
|
|
198
|
+
{
|
|
199
|
+
return GET_LOW(FloppyDOR);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
static inline void
|
|
203
|
+
floppy_dor_write(u8 val)
|
|
204
|
+
{
|
|
205
|
+
outb(val, PORT_FD_DOR);
|
|
206
|
+
SET_LOW(FloppyDOR, val);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
static inline void
|
|
210
|
+
floppy_dor_mask(u8 off, u8 on)
|
|
211
|
+
{
|
|
212
|
+
floppy_dor_write((floppy_dor_read() & ~off) | on);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
static void
|
|
216
|
+
floppy_disable_controller(void)
|
|
217
|
+
{
|
|
218
|
+
dprintf(2, "Floppy_disable_controller\n");
|
|
219
|
+
// Clear the reset bit (enter reset state) and clear 'enable IRQ and DMA'
|
|
220
|
+
floppy_dor_mask(FLOPPY_DOR_IRQ | FLOPPY_DOR_RESET, 0);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
static int
|
|
224
|
+
floppy_wait_irq(void)
|
|
225
|
+
{
|
|
226
|
+
u8 frs = GET_BDA(floppy_recalibration_status);
|
|
227
|
+
SET_BDA(floppy_recalibration_status, frs & ~FRS_IRQ);
|
|
228
|
+
u32 end = timer_calc(FLOPPY_IRQ_TIMEOUT);
|
|
229
|
+
for (;;) {
|
|
230
|
+
if (timer_check(end)) {
|
|
231
|
+
warn_timeout();
|
|
232
|
+
floppy_disable_controller();
|
|
233
|
+
return DISK_RET_ETIMEOUT;
|
|
234
|
+
}
|
|
235
|
+
frs = GET_BDA(floppy_recalibration_status);
|
|
236
|
+
if (frs & FRS_IRQ)
|
|
237
|
+
break;
|
|
238
|
+
// Could use yield_toirq() here, but that causes issues on
|
|
239
|
+
// bochs, so use yield() instead.
|
|
240
|
+
yield();
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
SET_BDA(floppy_recalibration_status, frs & ~FRS_IRQ);
|
|
244
|
+
return DISK_RET_SUCCESS;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Floppy commands
|
|
248
|
+
#define FCF_WAITIRQ 0x10000
|
|
249
|
+
#define FC_CHECKIRQ (0x08 | (0<<8) | (2<<12))
|
|
250
|
+
#define FC_SEEK (0x0f | (2<<8) | (0<<12) | FCF_WAITIRQ)
|
|
251
|
+
#define FC_RECALIBRATE (0x07 | (1<<8) | (0<<12) | FCF_WAITIRQ)
|
|
252
|
+
#define FC_READID (0x4a | (1<<8) | (7<<12) | FCF_WAITIRQ)
|
|
253
|
+
#define FC_READ (0xe6 | (8<<8) | (7<<12) | FCF_WAITIRQ)
|
|
254
|
+
#define FC_WRITE (0xc5 | (8<<8) | (7<<12) | FCF_WAITIRQ)
|
|
255
|
+
#define FC_FORMAT (0x4d | (5<<8) | (7<<12) | FCF_WAITIRQ)
|
|
256
|
+
#define FC_SPECIFY (0x03 | (2<<8) | (0<<12))
|
|
257
|
+
|
|
258
|
+
// Send the specified command and it's parameters to the floppy controller.
|
|
259
|
+
static int
|
|
260
|
+
floppy_pio(int command, u8 *param)
|
|
261
|
+
{
|
|
262
|
+
dprintf(9, "Floppy pio command %x\n", command);
|
|
263
|
+
// Send command and parameters to controller.
|
|
264
|
+
u32 end = timer_calc(FLOPPY_PIO_TIMEOUT);
|
|
265
|
+
int send = (command >> 8) & 0xf;
|
|
266
|
+
int i = 0;
|
|
267
|
+
for (;;) {
|
|
268
|
+
u8 sts = inb(PORT_FD_STATUS);
|
|
269
|
+
if (!(sts & 0x80)) {
|
|
270
|
+
if (timer_check(end)) {
|
|
271
|
+
warn_timeout();
|
|
272
|
+
floppy_disable_controller();
|
|
273
|
+
return DISK_RET_ETIMEOUT;
|
|
274
|
+
}
|
|
275
|
+
yield();
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
if (sts & 0x40) {
|
|
279
|
+
floppy_disable_controller();
|
|
280
|
+
return DISK_RET_ECONTROLLER;
|
|
281
|
+
}
|
|
282
|
+
if (i == 0)
|
|
283
|
+
outb(command & 0xff, PORT_FD_DATA);
|
|
284
|
+
else
|
|
285
|
+
outb(param[i-1], PORT_FD_DATA);
|
|
286
|
+
if (i++ >= send)
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Wait for command to complete.
|
|
291
|
+
if (command & FCF_WAITIRQ) {
|
|
292
|
+
int ret = floppy_wait_irq();
|
|
293
|
+
if (ret)
|
|
294
|
+
return ret;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Read response from controller.
|
|
298
|
+
end = timer_calc(FLOPPY_PIO_TIMEOUT);
|
|
299
|
+
int receive = (command >> 12) & 0xf;
|
|
300
|
+
i = 0;
|
|
301
|
+
for (;;) {
|
|
302
|
+
u8 sts = inb(PORT_FD_STATUS);
|
|
303
|
+
if (!(sts & 0x80)) {
|
|
304
|
+
if (timer_check(end)) {
|
|
305
|
+
warn_timeout();
|
|
306
|
+
floppy_disable_controller();
|
|
307
|
+
return DISK_RET_ETIMEOUT;
|
|
308
|
+
}
|
|
309
|
+
yield();
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
if (i >= receive) {
|
|
313
|
+
if (sts & 0x40) {
|
|
314
|
+
floppy_disable_controller();
|
|
315
|
+
return DISK_RET_ECONTROLLER;
|
|
316
|
+
}
|
|
317
|
+
break;
|
|
318
|
+
}
|
|
319
|
+
if (!(sts & 0x40)) {
|
|
320
|
+
floppy_disable_controller();
|
|
321
|
+
return DISK_RET_ECONTROLLER;
|
|
322
|
+
}
|
|
323
|
+
param[i++] = inb(PORT_FD_DATA);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
return DISK_RET_SUCCESS;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
static int
|
|
330
|
+
floppy_enable_controller(void)
|
|
331
|
+
{
|
|
332
|
+
dprintf(2, "Floppy_enable_controller\n");
|
|
333
|
+
// Clear the reset bit (enter reset state), but set 'enable IRQ and DMA'
|
|
334
|
+
floppy_dor_mask(FLOPPY_DOR_RESET, FLOPPY_DOR_IRQ);
|
|
335
|
+
// Real hardware needs a 4 microsecond delay
|
|
336
|
+
usleep(4);
|
|
337
|
+
// Set the reset bit (normal operation) and keep 'enable IRQ and DMA' on
|
|
338
|
+
floppy_dor_mask(0, FLOPPY_DOR_IRQ | FLOPPY_DOR_RESET);
|
|
339
|
+
int ret = floppy_wait_irq();
|
|
340
|
+
if (ret)
|
|
341
|
+
return ret;
|
|
342
|
+
|
|
343
|
+
// After the interrupt is received, send 4 SENSE INTERRUPT commands to
|
|
344
|
+
// clear the interrupt status for each of the four logical drives,
|
|
345
|
+
// supported by the controller.
|
|
346
|
+
// See section 7.4 - "Drive Polling" of the Intel 82077AA datasheet for
|
|
347
|
+
// a more detailed description of why this voodoo needs to be done.
|
|
348
|
+
// Without this, initialization fails on real controllers (but still works
|
|
349
|
+
// in QEMU)
|
|
350
|
+
u8 param[2];
|
|
351
|
+
int i;
|
|
352
|
+
for (i=0; i<4; i++) {
|
|
353
|
+
ret = floppy_pio(FC_CHECKIRQ, param);
|
|
354
|
+
if (ret)
|
|
355
|
+
return ret;
|
|
356
|
+
}
|
|
357
|
+
return DISK_RET_SUCCESS;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// Activate a drive and send a command to it.
|
|
361
|
+
static int
|
|
362
|
+
floppy_drive_pio(u8 floppyid, int command, u8 *param)
|
|
363
|
+
{
|
|
364
|
+
// Enable controller if it isn't running.
|
|
365
|
+
if (!(floppy_dor_read() & FLOPPY_DOR_RESET)) {
|
|
366
|
+
int ret = floppy_enable_controller();
|
|
367
|
+
if (ret)
|
|
368
|
+
return ret;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// set the disk motor timeout value of INT 08 to the highest value
|
|
372
|
+
SET_BDA(floppy_motor_counter, 255);
|
|
373
|
+
|
|
374
|
+
// Check if the motor is already running
|
|
375
|
+
u8 motor_mask = FLOPPY_DOR_MOTOR_A << floppyid;
|
|
376
|
+
int motor_already_running = floppy_dor_read() & motor_mask;
|
|
377
|
+
|
|
378
|
+
// Turn on motor of selected drive, DMA & int enabled, normal operation
|
|
379
|
+
floppy_dor_write(motor_mask | FLOPPY_DOR_IRQ | FLOPPY_DOR_RESET | floppyid);
|
|
380
|
+
|
|
381
|
+
// If the motor was just started, wait for it to get up to speed
|
|
382
|
+
if (!motor_already_running && !CONFIG_QEMU)
|
|
383
|
+
msleep(FLOPPY_STARTUP_TIME * 125);
|
|
384
|
+
|
|
385
|
+
// Send command.
|
|
386
|
+
int ret = floppy_pio(command, param);
|
|
387
|
+
SET_BDA(floppy_motor_counter, FLOPPY_MOTOR_TICKS); // reset motor timeout
|
|
388
|
+
if (ret)
|
|
389
|
+
return ret;
|
|
390
|
+
|
|
391
|
+
// Check IRQ command is needed after irq commands with no results
|
|
392
|
+
if ((command & FCF_WAITIRQ) && ((command >> 12) & 0xf) == 0)
|
|
393
|
+
return floppy_pio(FC_CHECKIRQ, param);
|
|
394
|
+
return DISK_RET_SUCCESS;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
/****************************************************************
|
|
399
|
+
* Floppy media sense and seeking
|
|
400
|
+
****************************************************************/
|
|
401
|
+
|
|
402
|
+
static int
|
|
403
|
+
floppy_drive_recal(u8 floppyid)
|
|
404
|
+
{
|
|
405
|
+
dprintf(2, "Floppy_drive_recal %d\n", floppyid);
|
|
406
|
+
// send Recalibrate command to controller
|
|
407
|
+
u8 param[2];
|
|
408
|
+
param[0] = floppyid;
|
|
409
|
+
int ret = floppy_drive_pio(floppyid, FC_RECALIBRATE, param);
|
|
410
|
+
if (ret)
|
|
411
|
+
return ret;
|
|
412
|
+
|
|
413
|
+
u8 frs = GET_BDA(floppy_recalibration_status);
|
|
414
|
+
SET_BDA(floppy_recalibration_status, frs | (1<<floppyid));
|
|
415
|
+
SET_BDA(floppy_track[floppyid], 0);
|
|
416
|
+
return DISK_RET_SUCCESS;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
static int
|
|
420
|
+
floppy_drive_specify(void)
|
|
421
|
+
{
|
|
422
|
+
u8 param[2];
|
|
423
|
+
param[0] = FLOPPY_SPECIFY1;
|
|
424
|
+
param[1] = FLOPPY_SPECIFY2;
|
|
425
|
+
return floppy_pio(FC_SPECIFY, param);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
static int
|
|
429
|
+
floppy_drive_readid(u8 floppyid, u8 data_rate, u8 head)
|
|
430
|
+
{
|
|
431
|
+
// Set data rate.
|
|
432
|
+
outb(data_rate, PORT_FD_DIR);
|
|
433
|
+
|
|
434
|
+
// send Read Sector Id command
|
|
435
|
+
u8 param[7];
|
|
436
|
+
param[0] = (head << 2) | floppyid; // HD DR1 DR2
|
|
437
|
+
int ret = floppy_drive_pio(floppyid, FC_READID, param);
|
|
438
|
+
if (ret)
|
|
439
|
+
return ret;
|
|
440
|
+
if (param[0] & 0xc0)
|
|
441
|
+
return -1;
|
|
442
|
+
return 0;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
static int
|
|
446
|
+
floppy_media_sense(struct drive_s *drive_gf)
|
|
447
|
+
{
|
|
448
|
+
u8 ftype = GET_GLOBALFLAT(drive_gf->floppy_type), stype = ftype;
|
|
449
|
+
u8 floppyid = GET_GLOBALFLAT(drive_gf->cntl_id);
|
|
450
|
+
|
|
451
|
+
u8 data_rate = GET_GLOBAL(FloppyInfo[stype].data_rate);
|
|
452
|
+
int ret = floppy_drive_readid(floppyid, data_rate, 0);
|
|
453
|
+
if (ret) {
|
|
454
|
+
// Attempt media sense.
|
|
455
|
+
for (stype=1; ; stype++) {
|
|
456
|
+
if (stype >= ARRAY_SIZE(FloppyInfo))
|
|
457
|
+
return DISK_RET_EMEDIA;
|
|
458
|
+
if (stype==ftype
|
|
459
|
+
|| (GET_GLOBAL(FloppyInfo[stype].floppy_size)
|
|
460
|
+
!= GET_GLOBAL(FloppyInfo[ftype].floppy_size))
|
|
461
|
+
|| (GET_GLOBAL(FloppyInfo[stype].chs.head)
|
|
462
|
+
> GET_GLOBAL(FloppyInfo[ftype].chs.head))
|
|
463
|
+
|| (GET_GLOBAL(FloppyInfo[stype].chs.cylinder)
|
|
464
|
+
> GET_GLOBAL(FloppyInfo[ftype].chs.cylinder))
|
|
465
|
+
|| (GET_GLOBAL(FloppyInfo[stype].chs.sector)
|
|
466
|
+
> GET_GLOBAL(FloppyInfo[ftype].chs.sector)))
|
|
467
|
+
continue;
|
|
468
|
+
data_rate = GET_GLOBAL(FloppyInfo[stype].data_rate);
|
|
469
|
+
ret = floppy_drive_readid(floppyid, data_rate, 0);
|
|
470
|
+
if (!ret)
|
|
471
|
+
break;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
dprintf(2, "Floppy_media_sense on drive %d found rate %d\n"
|
|
475
|
+
, floppyid, data_rate);
|
|
476
|
+
|
|
477
|
+
u8 old_data_rate = GET_BDA(floppy_media_state[floppyid]) >> 6;
|
|
478
|
+
SET_BDA(floppy_last_data_rate, (old_data_rate<<2) | (data_rate<<6));
|
|
479
|
+
u8 media = (stype == 1 ? 0x04 : (stype == 2 ? 0x05 : 0x07));
|
|
480
|
+
u8 fms = (data_rate<<6) | FMS_MEDIA_DRIVE_ESTABLISHED | media;
|
|
481
|
+
if (GET_GLOBAL(FloppyInfo[stype].chs.cylinder)
|
|
482
|
+
< GET_GLOBAL(FloppyInfo[ftype].chs.cylinder))
|
|
483
|
+
fms |= FMS_DOUBLE_STEPPING;
|
|
484
|
+
SET_BDA(floppy_media_state[floppyid], fms);
|
|
485
|
+
|
|
486
|
+
return DISK_RET_SUCCESS;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// Prepare a floppy for a data transfer.
|
|
490
|
+
static int
|
|
491
|
+
floppy_prep(struct drive_s *drive_gf, u8 cylinder)
|
|
492
|
+
{
|
|
493
|
+
u8 floppyid = GET_GLOBALFLAT(drive_gf->cntl_id);
|
|
494
|
+
if (!(GET_BDA(floppy_recalibration_status) & (1<<floppyid)) ||
|
|
495
|
+
!(GET_BDA(floppy_media_state[floppyid]) & FMS_MEDIA_DRIVE_ESTABLISHED)) {
|
|
496
|
+
// Recalibrate drive.
|
|
497
|
+
int ret = floppy_drive_recal(floppyid);
|
|
498
|
+
if (ret)
|
|
499
|
+
return ret;
|
|
500
|
+
|
|
501
|
+
// Sense media.
|
|
502
|
+
ret = floppy_media_sense(drive_gf);
|
|
503
|
+
if (ret)
|
|
504
|
+
return ret;
|
|
505
|
+
|
|
506
|
+
// Execute a SPECIFY command (sets the Step Rate Time,
|
|
507
|
+
// Head Load Time, Head Unload Time and the DMA enable/disable bit).
|
|
508
|
+
ret = floppy_drive_specify();
|
|
509
|
+
if (ret)
|
|
510
|
+
return ret;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
// Seek to cylinder if needed.
|
|
514
|
+
u8 lastcyl = GET_BDA(floppy_track[floppyid]);
|
|
515
|
+
if (cylinder != lastcyl) {
|
|
516
|
+
u8 param[2];
|
|
517
|
+
param[0] = floppyid;
|
|
518
|
+
param[1] = cylinder;
|
|
519
|
+
int ret = floppy_drive_pio(floppyid, FC_SEEK, param);
|
|
520
|
+
if (ret)
|
|
521
|
+
return ret;
|
|
522
|
+
SET_BDA(floppy_track[floppyid], cylinder);
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
return DISK_RET_SUCCESS;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
/****************************************************************
|
|
530
|
+
* Floppy DMA transfer
|
|
531
|
+
****************************************************************/
|
|
532
|
+
|
|
533
|
+
// Perform a floppy transfer command (setup DMA and issue PIO).
|
|
534
|
+
static int
|
|
535
|
+
floppy_dma_cmd(struct disk_op_s *op, int count, int command, u8 *param)
|
|
536
|
+
{
|
|
537
|
+
// Setup DMA controller
|
|
538
|
+
int isWrite = command != FC_READ;
|
|
539
|
+
int ret = dma_floppy((u32)op->buf_fl, count, isWrite);
|
|
540
|
+
if (ret)
|
|
541
|
+
return DISK_RET_EBOUNDARY;
|
|
542
|
+
|
|
543
|
+
// Invoke floppy controller
|
|
544
|
+
u8 floppyid = GET_GLOBALFLAT(op->drive_fl->cntl_id);
|
|
545
|
+
ret = floppy_drive_pio(floppyid, command, param);
|
|
546
|
+
if (ret)
|
|
547
|
+
return ret;
|
|
548
|
+
|
|
549
|
+
// Populate floppy_return_status in BDA
|
|
550
|
+
int i;
|
|
551
|
+
for (i=0; i<7; i++)
|
|
552
|
+
SET_BDA(floppy_return_status[i], param[i]);
|
|
553
|
+
|
|
554
|
+
if (param[0] & 0xc0) {
|
|
555
|
+
if (param[1] & 0x02)
|
|
556
|
+
return DISK_RET_EWRITEPROTECT;
|
|
557
|
+
dprintf(1, "floppy error: %02x %02x %02x %02x %02x %02x %02x\n"
|
|
558
|
+
, param[0], param[1], param[2], param[3]
|
|
559
|
+
, param[4], param[5], param[6]);
|
|
560
|
+
return DISK_RET_ECONTROLLER;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
return DISK_RET_SUCCESS;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
/****************************************************************
|
|
568
|
+
* Floppy handlers
|
|
569
|
+
****************************************************************/
|
|
570
|
+
|
|
571
|
+
static struct chs_s
|
|
572
|
+
lba2chs(struct disk_op_s *op)
|
|
573
|
+
{
|
|
574
|
+
struct chs_s res = { };
|
|
575
|
+
|
|
576
|
+
u32 tmp = op->lba;
|
|
577
|
+
u16 nls = GET_GLOBALFLAT(op->drive_fl->lchs.sector);
|
|
578
|
+
res.sector = (tmp % nls) + 1;
|
|
579
|
+
|
|
580
|
+
tmp /= nls;
|
|
581
|
+
u16 nlh = GET_GLOBALFLAT(op->drive_fl->lchs.head);
|
|
582
|
+
res.head = tmp % nlh;
|
|
583
|
+
|
|
584
|
+
tmp /= nlh;
|
|
585
|
+
res.cylinder = tmp;
|
|
586
|
+
|
|
587
|
+
return res;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
// diskette controller reset
|
|
591
|
+
static int
|
|
592
|
+
floppy_reset(struct disk_op_s *op)
|
|
593
|
+
{
|
|
594
|
+
SET_BDA(floppy_recalibration_status, 0);
|
|
595
|
+
SET_BDA(floppy_media_state[0], 0);
|
|
596
|
+
SET_BDA(floppy_media_state[1], 0);
|
|
597
|
+
SET_BDA(floppy_track[0], 0);
|
|
598
|
+
SET_BDA(floppy_track[1], 0);
|
|
599
|
+
SET_BDA(floppy_last_data_rate, 0);
|
|
600
|
+
floppy_disable_controller();
|
|
601
|
+
return floppy_enable_controller();
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
// Read Diskette Sectors
|
|
605
|
+
static int
|
|
606
|
+
floppy_read(struct disk_op_s *op)
|
|
607
|
+
{
|
|
608
|
+
struct chs_s chs = lba2chs(op);
|
|
609
|
+
int ret = floppy_prep(op->drive_fl, chs.cylinder);
|
|
610
|
+
if (ret)
|
|
611
|
+
return ret;
|
|
612
|
+
|
|
613
|
+
// send read-normal-data command to controller
|
|
614
|
+
u8 floppyid = GET_GLOBALFLAT(op->drive_fl->cntl_id);
|
|
615
|
+
u8 param[8];
|
|
616
|
+
param[0] = (chs.head << 2) | floppyid; // HD DR1 DR2
|
|
617
|
+
param[1] = chs.cylinder;
|
|
618
|
+
param[2] = chs.head;
|
|
619
|
+
param[3] = chs.sector;
|
|
620
|
+
param[4] = FLOPPY_SIZE_CODE;
|
|
621
|
+
param[5] = chs.sector + op->count - 1; // last sector to read on track
|
|
622
|
+
param[6] = FLOPPY_GAPLEN;
|
|
623
|
+
param[7] = FLOPPY_DATALEN;
|
|
624
|
+
return floppy_dma_cmd(op, op->count * DISK_SECTOR_SIZE, FC_READ, param);
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
// Write Diskette Sectors
|
|
628
|
+
static int
|
|
629
|
+
floppy_write(struct disk_op_s *op)
|
|
630
|
+
{
|
|
631
|
+
struct chs_s chs = lba2chs(op);
|
|
632
|
+
int ret = floppy_prep(op->drive_fl, chs.cylinder);
|
|
633
|
+
if (ret)
|
|
634
|
+
return ret;
|
|
635
|
+
|
|
636
|
+
// send write-normal-data command to controller
|
|
637
|
+
u8 floppyid = GET_GLOBALFLAT(op->drive_fl->cntl_id);
|
|
638
|
+
u8 param[8];
|
|
639
|
+
param[0] = (chs.head << 2) | floppyid; // HD DR1 DR2
|
|
640
|
+
param[1] = chs.cylinder;
|
|
641
|
+
param[2] = chs.head;
|
|
642
|
+
param[3] = chs.sector;
|
|
643
|
+
param[4] = FLOPPY_SIZE_CODE;
|
|
644
|
+
param[5] = chs.sector + op->count - 1; // last sector to write on track
|
|
645
|
+
param[6] = FLOPPY_GAPLEN;
|
|
646
|
+
param[7] = FLOPPY_DATALEN;
|
|
647
|
+
return floppy_dma_cmd(op, op->count * DISK_SECTOR_SIZE, FC_WRITE, param);
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
// Verify Diskette Sectors
|
|
651
|
+
static int
|
|
652
|
+
floppy_verify(struct disk_op_s *op)
|
|
653
|
+
{
|
|
654
|
+
struct chs_s chs = lba2chs(op);
|
|
655
|
+
int ret = floppy_prep(op->drive_fl, chs.cylinder);
|
|
656
|
+
if (ret)
|
|
657
|
+
return ret;
|
|
658
|
+
|
|
659
|
+
// This command isn't implemented - just return success.
|
|
660
|
+
return DISK_RET_SUCCESS;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
// format diskette track
|
|
664
|
+
static int
|
|
665
|
+
floppy_format(struct disk_op_s *op)
|
|
666
|
+
{
|
|
667
|
+
struct chs_s chs = lba2chs(op);
|
|
668
|
+
int ret = floppy_prep(op->drive_fl, chs.cylinder);
|
|
669
|
+
if (ret)
|
|
670
|
+
return ret;
|
|
671
|
+
|
|
672
|
+
// send format-track command to controller
|
|
673
|
+
u8 floppyid = GET_GLOBALFLAT(op->drive_fl->cntl_id);
|
|
674
|
+
u8 param[7];
|
|
675
|
+
param[0] = (chs.head << 2) | floppyid; // HD DR1 DR2
|
|
676
|
+
param[1] = FLOPPY_SIZE_CODE;
|
|
677
|
+
param[2] = op->count; // number of sectors per track
|
|
678
|
+
param[3] = FLOPPY_FORMAT_GAPLEN;
|
|
679
|
+
param[4] = FLOPPY_FILLBYTE;
|
|
680
|
+
return floppy_dma_cmd(op, op->count * 4, FC_FORMAT, param);
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
int
|
|
684
|
+
floppy_process_op(struct disk_op_s *op)
|
|
685
|
+
{
|
|
686
|
+
if (!CONFIG_FLOPPY)
|
|
687
|
+
return 0;
|
|
688
|
+
|
|
689
|
+
switch (op->command) {
|
|
690
|
+
case CMD_RESET:
|
|
691
|
+
return floppy_reset(op);
|
|
692
|
+
case CMD_READ:
|
|
693
|
+
return floppy_read(op);
|
|
694
|
+
case CMD_WRITE:
|
|
695
|
+
return floppy_write(op);
|
|
696
|
+
case CMD_VERIFY:
|
|
697
|
+
return floppy_verify(op);
|
|
698
|
+
case CMD_FORMAT:
|
|
699
|
+
return floppy_format(op);
|
|
700
|
+
default:
|
|
701
|
+
return DISK_RET_EPARAM;
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
|
|
706
|
+
/****************************************************************
|
|
707
|
+
* HW irqs
|
|
708
|
+
****************************************************************/
|
|
709
|
+
|
|
710
|
+
// INT 0Eh Diskette Hardware ISR Entry Point
|
|
711
|
+
void VISIBLE16
|
|
712
|
+
handle_0e(void)
|
|
713
|
+
{
|
|
714
|
+
if (! CONFIG_FLOPPY)
|
|
715
|
+
return;
|
|
716
|
+
debug_isr(DEBUG_ISR_0e);
|
|
717
|
+
|
|
718
|
+
// diskette interrupt has occurred
|
|
719
|
+
u8 frs = GET_BDA(floppy_recalibration_status);
|
|
720
|
+
SET_BDA(floppy_recalibration_status, frs | FRS_IRQ);
|
|
721
|
+
|
|
722
|
+
pic_eoi1();
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
// Called from int08 handler.
|
|
726
|
+
void
|
|
727
|
+
floppy_tick(void)
|
|
728
|
+
{
|
|
729
|
+
if (! CONFIG_FLOPPY)
|
|
730
|
+
return;
|
|
731
|
+
|
|
732
|
+
// time to turn off drive(s)?
|
|
733
|
+
u8 fcount = GET_BDA(floppy_motor_counter);
|
|
734
|
+
if (fcount) {
|
|
735
|
+
fcount--;
|
|
736
|
+
SET_BDA(floppy_motor_counter, fcount);
|
|
737
|
+
if (fcount == 0)
|
|
738
|
+
// turn motor(s) off
|
|
739
|
+
floppy_dor_mask(FLOPPY_DOR_MOTOR_MASK, 0);
|
|
740
|
+
}
|
|
741
|
+
}
|