v86 0.3.6 → 0.4.0
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 +17 -6
- 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,1131 @@
|
|
|
1
|
+
// VGA bios implementation
|
|
2
|
+
//
|
|
3
|
+
// Copyright (C) 2009-2013 Kevin O'Connor <kevin@koconnor.net>
|
|
4
|
+
// Copyright (C) 2001-2008 the LGPL VGABios developers Team
|
|
5
|
+
//
|
|
6
|
+
// This file may be distributed under the terms of the GNU LGPLv3 license.
|
|
7
|
+
|
|
8
|
+
#include "biosvar.h" // GET_BDA
|
|
9
|
+
#include "bregs.h" // struct bregs
|
|
10
|
+
#include "config.h" // CONFIG_*
|
|
11
|
+
#include "output.h" // dprintf
|
|
12
|
+
#include "std/vbe.h" // VBE_RETURN_STATUS_FAILED
|
|
13
|
+
#include "std/vga.h" // struct video_func_static
|
|
14
|
+
#include "stdvga.h" // stdvga_set_cursor_shape
|
|
15
|
+
#include "string.h" // memset_far
|
|
16
|
+
#include "vgabios.h" // calc_page_size
|
|
17
|
+
#include "vgafb.h" // vgafb_write_char
|
|
18
|
+
#include "vgahw.h" // vgahw_set_mode
|
|
19
|
+
#include "vgautil.h" // swcursor_pre_handle10
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
/****************************************************************
|
|
23
|
+
* Helper functions
|
|
24
|
+
****************************************************************/
|
|
25
|
+
|
|
26
|
+
// Return the bits per pixel in system memory for a given mode.
|
|
27
|
+
int
|
|
28
|
+
vga_bpp(struct vgamode_s *vmode_g)
|
|
29
|
+
{
|
|
30
|
+
switch (GET_GLOBAL(vmode_g->memmodel)) {
|
|
31
|
+
case MM_TEXT:
|
|
32
|
+
return 16;
|
|
33
|
+
case MM_PLANAR:
|
|
34
|
+
return 1;
|
|
35
|
+
}
|
|
36
|
+
u8 depth = GET_GLOBAL(vmode_g->depth);
|
|
37
|
+
if (depth > 8)
|
|
38
|
+
return ALIGN(depth, 8);
|
|
39
|
+
return depth;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
u16
|
|
43
|
+
calc_page_size(u8 memmodel, u16 width, u16 height)
|
|
44
|
+
{
|
|
45
|
+
switch (memmodel) {
|
|
46
|
+
case MM_TEXT:
|
|
47
|
+
return ALIGN(width * height * 2, 2*1024);
|
|
48
|
+
case MM_CGA:
|
|
49
|
+
return 16*1024;
|
|
50
|
+
default:
|
|
51
|
+
return ALIGN(width * height / 8, 8*1024);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Determine cursor shape (taking into account possible cursor scaling)
|
|
56
|
+
u16
|
|
57
|
+
get_cursor_shape(void)
|
|
58
|
+
{
|
|
59
|
+
u16 cursor_type = GET_BDA(cursor_type);
|
|
60
|
+
u8 emulate_cursor = (GET_BDA(video_ctl) & 1) == 0;
|
|
61
|
+
if (!emulate_cursor)
|
|
62
|
+
return cursor_type;
|
|
63
|
+
u8 start = (cursor_type >> 8) & 0x3f;
|
|
64
|
+
u8 end = cursor_type & 0x1f;
|
|
65
|
+
u16 cheight = GET_BDA(char_height);
|
|
66
|
+
if (cheight <= 8 || end >= 8 || start >= 0x20)
|
|
67
|
+
return cursor_type;
|
|
68
|
+
if (end != (start + 1))
|
|
69
|
+
start = ((start + 1) * cheight / 8) - 1;
|
|
70
|
+
else
|
|
71
|
+
start = ((end + 1) * cheight / 8) - 2;
|
|
72
|
+
end = ((end + 1) * cheight / 8) - 1;
|
|
73
|
+
return (start << 8) | end;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
static void
|
|
77
|
+
set_cursor_shape(u16 cursor_type)
|
|
78
|
+
{
|
|
79
|
+
SET_BDA(cursor_type, cursor_type);
|
|
80
|
+
if (CONFIG_VGA_STDVGA_PORTS)
|
|
81
|
+
stdvga_set_cursor_shape(get_cursor_shape());
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
static void
|
|
85
|
+
set_cursor_pos(struct cursorpos cp)
|
|
86
|
+
{
|
|
87
|
+
if (cp.page > 7)
|
|
88
|
+
// Should not happen...
|
|
89
|
+
return;
|
|
90
|
+
|
|
91
|
+
if (cp.page == GET_BDA(video_page)) {
|
|
92
|
+
// Update cursor in hardware
|
|
93
|
+
if (CONFIG_VGA_STDVGA_PORTS)
|
|
94
|
+
stdvga_set_cursor_pos((int)text_address(cp));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Update BIOS cursor pos
|
|
98
|
+
SET_BDA(cursor_pos[cp.page], (cp.y << 8) | cp.x);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
struct cursorpos
|
|
102
|
+
get_cursor_pos(u8 page)
|
|
103
|
+
{
|
|
104
|
+
if (page > 7)
|
|
105
|
+
return (struct cursorpos) { 0, 0, 0 };
|
|
106
|
+
u16 xy = GET_BDA(cursor_pos[page]);
|
|
107
|
+
return (struct cursorpos) { xy, xy>>8, page };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
static void
|
|
111
|
+
set_active_page(u8 page)
|
|
112
|
+
{
|
|
113
|
+
if (page > 7)
|
|
114
|
+
return;
|
|
115
|
+
|
|
116
|
+
// Get the mode
|
|
117
|
+
struct vgamode_s *vmode_g = get_current_mode();
|
|
118
|
+
if (!vmode_g)
|
|
119
|
+
return;
|
|
120
|
+
|
|
121
|
+
// Calculate memory address of start of page
|
|
122
|
+
struct cursorpos cp = {0, 0, page};
|
|
123
|
+
int address = (int)text_address(cp);
|
|
124
|
+
vgahw_set_displaystart(vmode_g, address);
|
|
125
|
+
|
|
126
|
+
// And change the BIOS page
|
|
127
|
+
SET_BDA(video_pagestart, address);
|
|
128
|
+
SET_BDA(video_page, page);
|
|
129
|
+
|
|
130
|
+
dprintf(1, "Set active page %02x address %04x\n", page, address);
|
|
131
|
+
|
|
132
|
+
// Display the cursor, now the page is active
|
|
133
|
+
set_cursor_pos(get_cursor_pos(page));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
static void
|
|
137
|
+
set_scan_lines(u8 lines)
|
|
138
|
+
{
|
|
139
|
+
stdvga_set_scan_lines(lines);
|
|
140
|
+
SET_BDA(char_height, lines);
|
|
141
|
+
u16 vde = stdvga_get_vde();
|
|
142
|
+
u8 rows = vde / lines;
|
|
143
|
+
SET_BDA(video_rows, rows - 1);
|
|
144
|
+
u16 cols = GET_BDA(video_cols);
|
|
145
|
+
SET_BDA(video_pagesize, calc_page_size(MM_TEXT, cols, rows));
|
|
146
|
+
if (lines == 8)
|
|
147
|
+
set_cursor_shape(0x0607);
|
|
148
|
+
else
|
|
149
|
+
set_cursor_shape(((lines - 3) << 8) | (lines - 2));
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
/****************************************************************
|
|
154
|
+
* Character writing
|
|
155
|
+
****************************************************************/
|
|
156
|
+
|
|
157
|
+
// Write a character to the screen and calculate new cursor position.
|
|
158
|
+
static void
|
|
159
|
+
write_char(struct cursorpos *pcp, struct carattr ca)
|
|
160
|
+
{
|
|
161
|
+
vgafb_write_char(*pcp, ca);
|
|
162
|
+
pcp->x++;
|
|
163
|
+
// Do we need to wrap ?
|
|
164
|
+
if (pcp->x == GET_BDA(video_cols)) {
|
|
165
|
+
pcp->x = 0;
|
|
166
|
+
pcp->y++;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Write a character to the screen at a given position. Implement
|
|
171
|
+
// special characters and scroll the screen if necessary.
|
|
172
|
+
static void
|
|
173
|
+
write_teletype(struct cursorpos *pcp, struct carattr ca)
|
|
174
|
+
{
|
|
175
|
+
switch (ca.car) {
|
|
176
|
+
case 7:
|
|
177
|
+
//FIXME should beep
|
|
178
|
+
break;
|
|
179
|
+
case 8:
|
|
180
|
+
if (pcp->x > 0)
|
|
181
|
+
pcp->x--;
|
|
182
|
+
break;
|
|
183
|
+
case '\r':
|
|
184
|
+
pcp->x = 0;
|
|
185
|
+
break;
|
|
186
|
+
case '\n':
|
|
187
|
+
pcp->y++;
|
|
188
|
+
break;
|
|
189
|
+
default:
|
|
190
|
+
write_char(pcp, ca);
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Do we need to scroll ?
|
|
195
|
+
u16 nbrows = GET_BDA(video_rows);
|
|
196
|
+
if (pcp->y > nbrows) {
|
|
197
|
+
pcp->y--;
|
|
198
|
+
|
|
199
|
+
struct cursorpos win = {0, 0, pcp->page};
|
|
200
|
+
struct cursorpos winsize = {GET_BDA(video_cols), nbrows+1};
|
|
201
|
+
struct carattr attr = {' ', 0, 0};
|
|
202
|
+
vgafb_scroll(win, winsize, 1, attr);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
/****************************************************************
|
|
208
|
+
* Save and restore bda state
|
|
209
|
+
****************************************************************/
|
|
210
|
+
|
|
211
|
+
struct saveBDAstate {
|
|
212
|
+
u8 bda_0x49[28];
|
|
213
|
+
u8 bda_0x84[6];
|
|
214
|
+
u16 vbe_mode;
|
|
215
|
+
struct segoff_s font0;
|
|
216
|
+
struct segoff_s font1;
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
int
|
|
220
|
+
bda_save_restore(int cmd, u16 seg, void *data)
|
|
221
|
+
{
|
|
222
|
+
if (!(cmd & SR_BDA))
|
|
223
|
+
return 0;
|
|
224
|
+
struct saveBDAstate *info = data;
|
|
225
|
+
if (cmd & SR_SAVE) {
|
|
226
|
+
memcpy_far(seg, info->bda_0x49, SEG_BDA, (void*)0x49
|
|
227
|
+
, sizeof(info->bda_0x49));
|
|
228
|
+
memcpy_far(seg, info->bda_0x84, SEG_BDA, (void*)0x84
|
|
229
|
+
, sizeof(info->bda_0x84));
|
|
230
|
+
SET_FARVAR(seg, info->vbe_mode, GET_BDA_EXT(vbe_mode));
|
|
231
|
+
SET_FARVAR(seg, info->font0, GET_IVT(0x1f));
|
|
232
|
+
SET_FARVAR(seg, info->font1, GET_IVT(0x43));
|
|
233
|
+
}
|
|
234
|
+
if (cmd & SR_RESTORE) {
|
|
235
|
+
memcpy_far(SEG_BDA, (void*)0x49, seg, info->bda_0x49
|
|
236
|
+
, sizeof(info->bda_0x49));
|
|
237
|
+
memcpy_far(SEG_BDA, (void*)0x84, seg, info->bda_0x84
|
|
238
|
+
, sizeof(info->bda_0x84));
|
|
239
|
+
u16 vbe_mode = GET_FARVAR(seg, info->vbe_mode);
|
|
240
|
+
SET_BDA_EXT(vbe_mode, vbe_mode);
|
|
241
|
+
struct vgamode_s *vmode_g = vgahw_find_mode(vbe_mode & ~MF_VBEFLAGS);
|
|
242
|
+
SET_BDA_EXT(vgamode_offset, (u32)vmode_g);
|
|
243
|
+
SET_IVT(0x1f, GET_FARVAR(seg, info->font0));
|
|
244
|
+
SET_IVT(0x43, GET_FARVAR(seg, info->font1));
|
|
245
|
+
}
|
|
246
|
+
return sizeof(*info);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
/****************************************************************
|
|
251
|
+
* Mode setting
|
|
252
|
+
****************************************************************/
|
|
253
|
+
|
|
254
|
+
struct vgamode_s *
|
|
255
|
+
get_current_mode(void)
|
|
256
|
+
{
|
|
257
|
+
return (void*)(GET_BDA_EXT(vgamode_offset)+0);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// Setup BDA after a mode switch.
|
|
261
|
+
int
|
|
262
|
+
vga_set_mode(int mode, int flags)
|
|
263
|
+
{
|
|
264
|
+
dprintf(1, "set VGA mode %x\n", mode);
|
|
265
|
+
struct vgamode_s *vmode_g = vgahw_find_mode(mode);
|
|
266
|
+
if (!vmode_g)
|
|
267
|
+
return VBE_RETURN_STATUS_FAILED;
|
|
268
|
+
|
|
269
|
+
int ret = vgahw_set_mode(vmode_g, flags);
|
|
270
|
+
if (ret)
|
|
271
|
+
return ret;
|
|
272
|
+
|
|
273
|
+
// Set the BIOS mem
|
|
274
|
+
int width = GET_GLOBAL(vmode_g->width);
|
|
275
|
+
int height = GET_GLOBAL(vmode_g->height);
|
|
276
|
+
u8 memmodel = GET_GLOBAL(vmode_g->memmodel);
|
|
277
|
+
int cheight = GET_GLOBAL(vmode_g->cheight);
|
|
278
|
+
if (mode < 0x100)
|
|
279
|
+
SET_BDA(video_mode, mode);
|
|
280
|
+
else
|
|
281
|
+
SET_BDA(video_mode, 0xff);
|
|
282
|
+
SET_BDA_EXT(vbe_mode, mode | (flags & MF_VBEFLAGS));
|
|
283
|
+
SET_BDA_EXT(vgamode_offset, (u32)vmode_g);
|
|
284
|
+
if (CONFIG_VGA_ALLOCATE_EXTRA_STACK)
|
|
285
|
+
// Disable extra stack if it appears a modern OS is in use.
|
|
286
|
+
// This works around bugs in some versions of Windows (Vista
|
|
287
|
+
// and possibly later) when the stack is in the e-segment.
|
|
288
|
+
MASK_BDA_EXT(flags, BF_EXTRA_STACK
|
|
289
|
+
, (flags & MF_LEGACY) ? BF_EXTRA_STACK : 0);
|
|
290
|
+
if (memmodel == MM_TEXT) {
|
|
291
|
+
SET_BDA(video_cols, width);
|
|
292
|
+
SET_BDA(video_rows, height-1);
|
|
293
|
+
SET_BDA(cursor_type, 0x0607);
|
|
294
|
+
} else {
|
|
295
|
+
int cwidth = GET_GLOBAL(vmode_g->cwidth);
|
|
296
|
+
SET_BDA(video_cols, width / cwidth);
|
|
297
|
+
SET_BDA(video_rows, (height / cheight) - 1);
|
|
298
|
+
SET_BDA(cursor_type, vga_emulate_text() ? 0x0607 : 0x0000);
|
|
299
|
+
}
|
|
300
|
+
SET_BDA(video_pagesize, calc_page_size(memmodel, width, height));
|
|
301
|
+
SET_BDA(crtc_address, CONFIG_VGA_STDVGA_PORTS ? stdvga_get_crtc() : 0);
|
|
302
|
+
SET_BDA(char_height, cheight);
|
|
303
|
+
SET_BDA(video_ctl, 0x60 | (flags & MF_NOCLEARMEM ? 0x80 : 0x00));
|
|
304
|
+
SET_BDA(video_switches, 0xF9);
|
|
305
|
+
SET_BDA(modeset_ctl, GET_BDA(modeset_ctl) & 0x7f);
|
|
306
|
+
int i;
|
|
307
|
+
for (i=0; i<8; i++)
|
|
308
|
+
SET_BDA(cursor_pos[i], 0x0000);
|
|
309
|
+
SET_BDA(video_pagestart, 0x0000);
|
|
310
|
+
SET_BDA(video_page, 0x00);
|
|
311
|
+
|
|
312
|
+
// Set the ints 0x1F and 0x43
|
|
313
|
+
SET_IVT(0x1f, SEGOFF(get_global_seg(), (u32)&vgafont8[128 * 8]));
|
|
314
|
+
|
|
315
|
+
switch (cheight) {
|
|
316
|
+
case 8:
|
|
317
|
+
SET_IVT(0x43, SEGOFF(get_global_seg(), (u32)vgafont8));
|
|
318
|
+
break;
|
|
319
|
+
case 14:
|
|
320
|
+
SET_IVT(0x43, SEGOFF(get_global_seg(), (u32)vgafont14));
|
|
321
|
+
break;
|
|
322
|
+
case 16:
|
|
323
|
+
SET_IVT(0x43, SEGOFF(get_global_seg(), (u32)vgafont16));
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return 0;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
/****************************************************************
|
|
332
|
+
* VGA int 10 handler
|
|
333
|
+
****************************************************************/
|
|
334
|
+
|
|
335
|
+
static void
|
|
336
|
+
handle_1000(struct bregs *regs)
|
|
337
|
+
{
|
|
338
|
+
int mode = regs->al & 0x7f;
|
|
339
|
+
|
|
340
|
+
// Set regs->al
|
|
341
|
+
if (mode > 7)
|
|
342
|
+
regs->al = 0x20;
|
|
343
|
+
else if (mode == 6)
|
|
344
|
+
regs->al = 0x3f;
|
|
345
|
+
else
|
|
346
|
+
regs->al = 0x30;
|
|
347
|
+
|
|
348
|
+
int flags = MF_LEGACY | (GET_BDA(modeset_ctl) & (MF_NOPALETTE|MF_GRAYSUM));
|
|
349
|
+
if (regs->al & 0x80)
|
|
350
|
+
flags |= MF_NOCLEARMEM;
|
|
351
|
+
|
|
352
|
+
vga_set_mode(mode, flags);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
static void
|
|
356
|
+
handle_1001(struct bregs *regs)
|
|
357
|
+
{
|
|
358
|
+
set_cursor_shape(regs->cx);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
static void
|
|
362
|
+
handle_1002(struct bregs *regs)
|
|
363
|
+
{
|
|
364
|
+
struct cursorpos cp = {regs->dl, regs->dh, regs->bh};
|
|
365
|
+
set_cursor_pos(cp);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
static void
|
|
369
|
+
handle_1003(struct bregs *regs)
|
|
370
|
+
{
|
|
371
|
+
regs->cx = GET_BDA(cursor_type);
|
|
372
|
+
struct cursorpos cp = get_cursor_pos(regs->bh);
|
|
373
|
+
regs->dl = cp.x;
|
|
374
|
+
regs->dh = cp.y;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// Read light pen pos (unimplemented)
|
|
378
|
+
static void
|
|
379
|
+
handle_1004(struct bregs *regs)
|
|
380
|
+
{
|
|
381
|
+
debug_stub(regs);
|
|
382
|
+
regs->ax = regs->bx = regs->cx = regs->dx = 0;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
static void
|
|
386
|
+
handle_1005(struct bregs *regs)
|
|
387
|
+
{
|
|
388
|
+
set_active_page(regs->al);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
static void
|
|
392
|
+
verify_scroll(struct bregs *regs, int dir)
|
|
393
|
+
{
|
|
394
|
+
// Verify parameters
|
|
395
|
+
u8 ulx = regs->cl, uly = regs->ch, lrx = regs->dl, lry = regs->dh;
|
|
396
|
+
u16 nbrows = GET_BDA(video_rows) + 1;
|
|
397
|
+
if (lry >= nbrows)
|
|
398
|
+
lry = nbrows - 1;
|
|
399
|
+
u16 nbcols = GET_BDA(video_cols);
|
|
400
|
+
if (lrx >= nbcols)
|
|
401
|
+
lrx = nbcols - 1;
|
|
402
|
+
int wincols = lrx - ulx + 1, winrows = lry - uly + 1;
|
|
403
|
+
if (wincols <= 0 || winrows <= 0)
|
|
404
|
+
return;
|
|
405
|
+
int lines = regs->al;
|
|
406
|
+
if (lines >= winrows)
|
|
407
|
+
lines = 0;
|
|
408
|
+
lines *= dir;
|
|
409
|
+
|
|
410
|
+
// Scroll (or clear) window
|
|
411
|
+
struct cursorpos win = {ulx, uly, GET_BDA(video_page)};
|
|
412
|
+
struct cursorpos winsize = {wincols, winrows};
|
|
413
|
+
struct carattr attr = {' ', regs->bh, 1};
|
|
414
|
+
vgafb_scroll(win, winsize, lines, attr);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
static void
|
|
418
|
+
handle_1006(struct bregs *regs)
|
|
419
|
+
{
|
|
420
|
+
verify_scroll(regs, 1);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
static void
|
|
424
|
+
handle_1007(struct bregs *regs)
|
|
425
|
+
{
|
|
426
|
+
verify_scroll(regs, -1);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
static void
|
|
430
|
+
handle_1008(struct bregs *regs)
|
|
431
|
+
{
|
|
432
|
+
struct carattr ca = vgafb_read_char(get_cursor_pos(regs->bh));
|
|
433
|
+
regs->al = ca.car;
|
|
434
|
+
regs->ah = ca.attr;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
static void noinline
|
|
438
|
+
handle_1009(struct bregs *regs)
|
|
439
|
+
{
|
|
440
|
+
struct carattr ca = {regs->al, regs->bl, 1};
|
|
441
|
+
struct cursorpos cp = get_cursor_pos(regs->bh);
|
|
442
|
+
int count = regs->cx;
|
|
443
|
+
while (count--)
|
|
444
|
+
write_char(&cp, ca);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
static void noinline
|
|
448
|
+
handle_100a(struct bregs *regs)
|
|
449
|
+
{
|
|
450
|
+
struct carattr ca = {regs->al, regs->bl, 0};
|
|
451
|
+
struct cursorpos cp = get_cursor_pos(regs->bh);
|
|
452
|
+
int count = regs->cx;
|
|
453
|
+
while (count--)
|
|
454
|
+
write_char(&cp, ca);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
static void
|
|
459
|
+
handle_100b00(struct bregs *regs)
|
|
460
|
+
{
|
|
461
|
+
stdvga_set_border_color(regs->bl);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
static void
|
|
465
|
+
handle_100b01(struct bregs *regs)
|
|
466
|
+
{
|
|
467
|
+
stdvga_set_palette(regs->bl);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
static void
|
|
471
|
+
handle_100bXX(struct bregs *regs)
|
|
472
|
+
{
|
|
473
|
+
debug_stub(regs);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
static void
|
|
477
|
+
handle_100b(struct bregs *regs)
|
|
478
|
+
{
|
|
479
|
+
if (!CONFIG_VGA_STDVGA_PORTS) {
|
|
480
|
+
handle_100bXX(regs);
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
switch (regs->bh) {
|
|
484
|
+
case 0x00: handle_100b00(regs); break;
|
|
485
|
+
case 0x01: handle_100b01(regs); break;
|
|
486
|
+
default: handle_100bXX(regs); break;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
static void
|
|
492
|
+
handle_100c(struct bregs *regs)
|
|
493
|
+
{
|
|
494
|
+
// XXX - page (regs->bh) is unused
|
|
495
|
+
vgafb_write_pixel(regs->al, regs->cx, regs->dx);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
static void
|
|
499
|
+
handle_100d(struct bregs *regs)
|
|
500
|
+
{
|
|
501
|
+
// XXX - page (regs->bh) is unused
|
|
502
|
+
regs->al = vgafb_read_pixel(regs->cx, regs->dx);
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
static void noinline
|
|
506
|
+
handle_100e(struct bregs *regs)
|
|
507
|
+
{
|
|
508
|
+
// Ralf Brown Interrupt list is WRONG on bh(page)
|
|
509
|
+
// We do output only on the current page !
|
|
510
|
+
struct carattr ca = {regs->al, regs->bl, 0};
|
|
511
|
+
struct cursorpos cp = get_cursor_pos(GET_BDA(video_page));
|
|
512
|
+
write_teletype(&cp, ca);
|
|
513
|
+
set_cursor_pos(cp);
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
static void
|
|
517
|
+
handle_100f(struct bregs *regs)
|
|
518
|
+
{
|
|
519
|
+
regs->bh = GET_BDA(video_page);
|
|
520
|
+
regs->al = GET_BDA(video_mode) | (GET_BDA(video_ctl) & 0x80);
|
|
521
|
+
regs->ah = GET_BDA(video_cols);
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
static void
|
|
526
|
+
handle_101000(struct bregs *regs)
|
|
527
|
+
{
|
|
528
|
+
if (regs->bl > 0x14)
|
|
529
|
+
return;
|
|
530
|
+
stdvga_attr_write(regs->bl, regs->bh);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
static void
|
|
534
|
+
handle_101001(struct bregs *regs)
|
|
535
|
+
{
|
|
536
|
+
stdvga_set_overscan_border_color(regs->bh);
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
static void
|
|
540
|
+
handle_101002(struct bregs *regs)
|
|
541
|
+
{
|
|
542
|
+
stdvga_set_all_palette_reg(regs->es, (u8*)(regs->dx + 0));
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
static void
|
|
546
|
+
handle_101003(struct bregs *regs)
|
|
547
|
+
{
|
|
548
|
+
stdvga_toggle_intensity(regs->bl);
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
static void
|
|
552
|
+
handle_101007(struct bregs *regs)
|
|
553
|
+
{
|
|
554
|
+
if (regs->bl > 0x14)
|
|
555
|
+
return;
|
|
556
|
+
regs->bh = stdvga_attr_read(regs->bl);
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
static void
|
|
560
|
+
handle_101008(struct bregs *regs)
|
|
561
|
+
{
|
|
562
|
+
regs->bh = stdvga_get_overscan_border_color();
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
static void
|
|
566
|
+
handle_101009(struct bregs *regs)
|
|
567
|
+
{
|
|
568
|
+
stdvga_get_all_palette_reg(regs->es, (u8*)(regs->dx + 0));
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
static void noinline
|
|
572
|
+
handle_101010(struct bregs *regs)
|
|
573
|
+
{
|
|
574
|
+
u8 rgb[3] = {regs->dh, regs->ch, regs->cl};
|
|
575
|
+
stdvga_dac_write(GET_SEG(SS), rgb, regs->bx, 1);
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
static void
|
|
579
|
+
handle_101012(struct bregs *regs)
|
|
580
|
+
{
|
|
581
|
+
stdvga_dac_write(regs->es, (u8*)(regs->dx + 0), regs->bx, regs->cx);
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
static void
|
|
585
|
+
handle_101013(struct bregs *regs)
|
|
586
|
+
{
|
|
587
|
+
stdvga_select_video_dac_color_page(regs->bl, regs->bh);
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
static void noinline
|
|
591
|
+
handle_101015(struct bregs *regs)
|
|
592
|
+
{
|
|
593
|
+
u8 rgb[3];
|
|
594
|
+
stdvga_dac_read(GET_SEG(SS), rgb, regs->bx, 1);
|
|
595
|
+
regs->dh = rgb[0];
|
|
596
|
+
regs->ch = rgb[1];
|
|
597
|
+
regs->cl = rgb[2];
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
static void
|
|
601
|
+
handle_101017(struct bregs *regs)
|
|
602
|
+
{
|
|
603
|
+
stdvga_dac_read(regs->es, (u8*)(regs->dx + 0), regs->bx, regs->cx);
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
static void
|
|
607
|
+
handle_101018(struct bregs *regs)
|
|
608
|
+
{
|
|
609
|
+
stdvga_pelmask_write(regs->bl);
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
static void
|
|
613
|
+
handle_101019(struct bregs *regs)
|
|
614
|
+
{
|
|
615
|
+
regs->bl = stdvga_pelmask_read();
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
static void
|
|
619
|
+
handle_10101a(struct bregs *regs)
|
|
620
|
+
{
|
|
621
|
+
stdvga_read_video_dac_state(®s->bl, ®s->bh);
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
static void
|
|
625
|
+
handle_10101b(struct bregs *regs)
|
|
626
|
+
{
|
|
627
|
+
stdvga_perform_gray_scale_summing(regs->bx, regs->cx);
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
static void
|
|
631
|
+
handle_1010XX(struct bregs *regs)
|
|
632
|
+
{
|
|
633
|
+
debug_stub(regs);
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
static void
|
|
637
|
+
handle_1010(struct bregs *regs)
|
|
638
|
+
{
|
|
639
|
+
if (!CONFIG_VGA_STDVGA_PORTS) {
|
|
640
|
+
handle_1010XX(regs);
|
|
641
|
+
return;
|
|
642
|
+
}
|
|
643
|
+
switch (regs->al) {
|
|
644
|
+
case 0x00: handle_101000(regs); break;
|
|
645
|
+
case 0x01: handle_101001(regs); break;
|
|
646
|
+
case 0x02: handle_101002(regs); break;
|
|
647
|
+
case 0x03: handle_101003(regs); break;
|
|
648
|
+
case 0x07: handle_101007(regs); break;
|
|
649
|
+
case 0x08: handle_101008(regs); break;
|
|
650
|
+
case 0x09: handle_101009(regs); break;
|
|
651
|
+
case 0x10: handle_101010(regs); break;
|
|
652
|
+
case 0x12: handle_101012(regs); break;
|
|
653
|
+
case 0x13: handle_101013(regs); break;
|
|
654
|
+
case 0x15: handle_101015(regs); break;
|
|
655
|
+
case 0x17: handle_101017(regs); break;
|
|
656
|
+
case 0x18: handle_101018(regs); break;
|
|
657
|
+
case 0x19: handle_101019(regs); break;
|
|
658
|
+
case 0x1a: handle_10101a(regs); break;
|
|
659
|
+
case 0x1b: handle_10101b(regs); break;
|
|
660
|
+
default: handle_1010XX(regs); break;
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
|
|
665
|
+
static void
|
|
666
|
+
handle_101100(struct bregs *regs)
|
|
667
|
+
{
|
|
668
|
+
stdvga_load_font(regs->es, (void*)(regs->bp+0), regs->cx
|
|
669
|
+
, regs->dx, regs->bl, regs->bh);
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
static void
|
|
673
|
+
handle_101101(struct bregs *regs)
|
|
674
|
+
{
|
|
675
|
+
stdvga_load_font(get_global_seg(), vgafont14, 0x100, 0, regs->bl, 14);
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
static void
|
|
679
|
+
handle_101102(struct bregs *regs)
|
|
680
|
+
{
|
|
681
|
+
stdvga_load_font(get_global_seg(), vgafont8, 0x100, 0, regs->bl, 8);
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
static void
|
|
685
|
+
handle_101103(struct bregs *regs)
|
|
686
|
+
{
|
|
687
|
+
stdvga_set_text_block_specifier(regs->bl);
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
static void
|
|
691
|
+
handle_101104(struct bregs *regs)
|
|
692
|
+
{
|
|
693
|
+
stdvga_load_font(get_global_seg(), vgafont16, 0x100, 0, regs->bl, 16);
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
static void
|
|
697
|
+
handle_101110(struct bregs *regs)
|
|
698
|
+
{
|
|
699
|
+
stdvga_load_font(regs->es, (void*)(regs->bp+0), regs->cx
|
|
700
|
+
, regs->dx, regs->bl, regs->bh);
|
|
701
|
+
set_scan_lines(regs->bh);
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
static void
|
|
705
|
+
handle_101111(struct bregs *regs)
|
|
706
|
+
{
|
|
707
|
+
stdvga_load_font(get_global_seg(), vgafont14, 0x100, 0, regs->bl, 14);
|
|
708
|
+
set_scan_lines(14);
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
static void
|
|
712
|
+
handle_101112(struct bregs *regs)
|
|
713
|
+
{
|
|
714
|
+
stdvga_load_font(get_global_seg(), vgafont8, 0x100, 0, regs->bl, 8);
|
|
715
|
+
set_scan_lines(8);
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
static void
|
|
719
|
+
handle_101114(struct bregs *regs)
|
|
720
|
+
{
|
|
721
|
+
stdvga_load_font(get_global_seg(), vgafont16, 0x100, 0, regs->bl, 16);
|
|
722
|
+
set_scan_lines(16);
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
static void
|
|
726
|
+
handle_101120(struct bregs *regs)
|
|
727
|
+
{
|
|
728
|
+
SET_IVT(0x1f, SEGOFF(regs->es, regs->bp));
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
void
|
|
732
|
+
load_gfx_font(u16 seg, u16 off, u8 height, u8 bl, u8 dl)
|
|
733
|
+
{
|
|
734
|
+
u8 rows;
|
|
735
|
+
|
|
736
|
+
SET_IVT(0x43, SEGOFF(seg, off));
|
|
737
|
+
switch(bl) {
|
|
738
|
+
case 0:
|
|
739
|
+
rows = dl;
|
|
740
|
+
break;
|
|
741
|
+
case 1:
|
|
742
|
+
rows = 14;
|
|
743
|
+
break;
|
|
744
|
+
case 3:
|
|
745
|
+
rows = 43;
|
|
746
|
+
break;
|
|
747
|
+
case 2:
|
|
748
|
+
default:
|
|
749
|
+
rows = 25;
|
|
750
|
+
break;
|
|
751
|
+
}
|
|
752
|
+
SET_BDA(video_rows, rows - 1);
|
|
753
|
+
SET_BDA(char_height, height);
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
static void
|
|
757
|
+
handle_101121(struct bregs *regs)
|
|
758
|
+
{
|
|
759
|
+
load_gfx_font(regs->es, regs->bp, regs->cx, regs->bl, regs->dl);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
static void
|
|
763
|
+
handle_101122(struct bregs *regs)
|
|
764
|
+
{
|
|
765
|
+
load_gfx_font(get_global_seg(), (u32)vgafont14, 14, regs->bl, regs->dl);
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
static void
|
|
769
|
+
handle_101123(struct bregs *regs)
|
|
770
|
+
{
|
|
771
|
+
load_gfx_font(get_global_seg(), (u32)vgafont8, 8, regs->bl, regs->dl);
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
static void
|
|
775
|
+
handle_101124(struct bregs *regs)
|
|
776
|
+
{
|
|
777
|
+
load_gfx_font(get_global_seg(), (u32)vgafont16, 16, regs->bl, regs->dl);
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
static void
|
|
781
|
+
handle_101130(struct bregs *regs)
|
|
782
|
+
{
|
|
783
|
+
switch (regs->bh) {
|
|
784
|
+
case 0x00: {
|
|
785
|
+
struct segoff_s so = GET_IVT(0x1f);
|
|
786
|
+
regs->es = so.seg;
|
|
787
|
+
regs->bp = so.offset;
|
|
788
|
+
break;
|
|
789
|
+
}
|
|
790
|
+
case 0x01: {
|
|
791
|
+
struct segoff_s so = GET_IVT(0x43);
|
|
792
|
+
regs->es = so.seg;
|
|
793
|
+
regs->bp = so.offset;
|
|
794
|
+
break;
|
|
795
|
+
}
|
|
796
|
+
case 0x02:
|
|
797
|
+
regs->es = get_global_seg();
|
|
798
|
+
regs->bp = (u32)vgafont14;
|
|
799
|
+
break;
|
|
800
|
+
case 0x03:
|
|
801
|
+
regs->es = get_global_seg();
|
|
802
|
+
regs->bp = (u32)vgafont8;
|
|
803
|
+
break;
|
|
804
|
+
case 0x04:
|
|
805
|
+
regs->es = get_global_seg();
|
|
806
|
+
regs->bp = (u32)vgafont8 + 128 * 8;
|
|
807
|
+
break;
|
|
808
|
+
case 0x05:
|
|
809
|
+
regs->es = get_global_seg();
|
|
810
|
+
regs->bp = (u32)vgafont14alt;
|
|
811
|
+
break;
|
|
812
|
+
case 0x06:
|
|
813
|
+
regs->es = get_global_seg();
|
|
814
|
+
regs->bp = (u32)vgafont16;
|
|
815
|
+
break;
|
|
816
|
+
case 0x07:
|
|
817
|
+
regs->es = get_global_seg();
|
|
818
|
+
regs->bp = (u32)vgafont16alt;
|
|
819
|
+
break;
|
|
820
|
+
default:
|
|
821
|
+
dprintf(1, "Get font info BH(%02x) was discarded\n", regs->bh);
|
|
822
|
+
return;
|
|
823
|
+
}
|
|
824
|
+
// Set byte/char of on screen font
|
|
825
|
+
regs->cx = GET_BDA(char_height) & 0xff;
|
|
826
|
+
|
|
827
|
+
// Set Highest char row
|
|
828
|
+
regs->dl = GET_BDA(video_rows);
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
static void
|
|
832
|
+
handle_1011XX(struct bregs *regs)
|
|
833
|
+
{
|
|
834
|
+
debug_stub(regs);
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
static void
|
|
838
|
+
handle_1011(struct bregs *regs)
|
|
839
|
+
{
|
|
840
|
+
if (CONFIG_VGA_STDVGA_PORTS) {
|
|
841
|
+
switch (regs->al) {
|
|
842
|
+
case 0x00: handle_101100(regs); return;
|
|
843
|
+
case 0x01: handle_101101(regs); return;
|
|
844
|
+
case 0x02: handle_101102(regs); return;
|
|
845
|
+
case 0x03: handle_101103(regs); return;
|
|
846
|
+
case 0x04: handle_101104(regs); return;
|
|
847
|
+
case 0x10: handle_101110(regs); return;
|
|
848
|
+
case 0x11: handle_101111(regs); return;
|
|
849
|
+
case 0x12: handle_101112(regs); return;
|
|
850
|
+
case 0x14: handle_101114(regs); return;
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
switch (regs->al) {
|
|
854
|
+
case 0x30: handle_101130(regs); break;
|
|
855
|
+
case 0x20: handle_101120(regs); break;
|
|
856
|
+
case 0x21: handle_101121(regs); break;
|
|
857
|
+
case 0x22: handle_101122(regs); break;
|
|
858
|
+
case 0x23: handle_101123(regs); break;
|
|
859
|
+
case 0x24: handle_101124(regs); break;
|
|
860
|
+
default: handle_1011XX(regs); break;
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
|
|
865
|
+
static void
|
|
866
|
+
handle_101210(struct bregs *regs)
|
|
867
|
+
{
|
|
868
|
+
u16 crtc_addr = GET_BDA(crtc_address);
|
|
869
|
+
if (crtc_addr == VGAREG_MDA_CRTC_ADDRESS)
|
|
870
|
+
regs->bx = 0x0103;
|
|
871
|
+
else
|
|
872
|
+
regs->bx = 0x0003;
|
|
873
|
+
regs->cx = GET_BDA(video_switches) & 0x0f;
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
static void
|
|
877
|
+
handle_101230(struct bregs *regs)
|
|
878
|
+
{
|
|
879
|
+
u8 mctl = GET_BDA(modeset_ctl);
|
|
880
|
+
u8 vswt = GET_BDA(video_switches);
|
|
881
|
+
switch (regs->al) {
|
|
882
|
+
case 0x00:
|
|
883
|
+
// 200 lines
|
|
884
|
+
mctl = (mctl & ~0x10) | 0x80;
|
|
885
|
+
vswt = (vswt & ~0x0f) | 0x08;
|
|
886
|
+
break;
|
|
887
|
+
case 0x01:
|
|
888
|
+
// 350 lines
|
|
889
|
+
mctl &= ~0x90;
|
|
890
|
+
vswt = (vswt & ~0x0f) | 0x09;
|
|
891
|
+
break;
|
|
892
|
+
case 0x02:
|
|
893
|
+
// 400 lines
|
|
894
|
+
mctl = (mctl & ~0x80) | 0x10;
|
|
895
|
+
vswt = (vswt & ~0x0f) | 0x09;
|
|
896
|
+
break;
|
|
897
|
+
default:
|
|
898
|
+
dprintf(1, "Select vert res (%02x) was discarded\n", regs->al);
|
|
899
|
+
break;
|
|
900
|
+
}
|
|
901
|
+
SET_BDA(modeset_ctl, mctl);
|
|
902
|
+
SET_BDA(video_switches, vswt);
|
|
903
|
+
regs->al = 0x12;
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
static void
|
|
907
|
+
handle_101231(struct bregs *regs)
|
|
908
|
+
{
|
|
909
|
+
u8 v = (regs->al & 0x01) << 3;
|
|
910
|
+
u8 mctl = GET_BDA(video_ctl) & ~0x08;
|
|
911
|
+
SET_BDA(video_ctl, mctl | v);
|
|
912
|
+
regs->al = 0x12;
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
static void
|
|
916
|
+
handle_101232(struct bregs *regs)
|
|
917
|
+
{
|
|
918
|
+
if (CONFIG_VGA_STDVGA_PORTS) {
|
|
919
|
+
stdvga_enable_video_addressing(regs->al);
|
|
920
|
+
regs->al = 0x12;
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
static void
|
|
925
|
+
handle_101233(struct bregs *regs)
|
|
926
|
+
{
|
|
927
|
+
u8 v = ((regs->al << 1) & 0x02) ^ 0x02;
|
|
928
|
+
u8 v2 = GET_BDA(modeset_ctl) & ~0x02;
|
|
929
|
+
SET_BDA(modeset_ctl, v | v2);
|
|
930
|
+
regs->al = 0x12;
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
static void
|
|
934
|
+
handle_101234(struct bregs *regs)
|
|
935
|
+
{
|
|
936
|
+
SET_BDA(video_ctl, (GET_BDA(video_ctl) & ~0x01) | (regs->al & 0x01));
|
|
937
|
+
regs->al = 0x12;
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
static void
|
|
941
|
+
handle_101235(struct bregs *regs)
|
|
942
|
+
{
|
|
943
|
+
debug_stub(regs);
|
|
944
|
+
regs->al = 0x12;
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
static void
|
|
948
|
+
handle_101236(struct bregs *regs)
|
|
949
|
+
{
|
|
950
|
+
debug_stub(regs);
|
|
951
|
+
regs->al = 0x12;
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
static void
|
|
955
|
+
handle_1012XX(struct bregs *regs)
|
|
956
|
+
{
|
|
957
|
+
debug_stub(regs);
|
|
958
|
+
}
|
|
959
|
+
|
|
960
|
+
static void
|
|
961
|
+
handle_1012(struct bregs *regs)
|
|
962
|
+
{
|
|
963
|
+
if (CONFIG_VGA_CIRRUS && regs->bl >= 0x80) {
|
|
964
|
+
clext_1012(regs);
|
|
965
|
+
return;
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
switch (regs->bl) {
|
|
969
|
+
case 0x10: handle_101210(regs); break;
|
|
970
|
+
case 0x30: handle_101230(regs); break;
|
|
971
|
+
case 0x31: handle_101231(regs); break;
|
|
972
|
+
case 0x32: handle_101232(regs); break;
|
|
973
|
+
case 0x33: handle_101233(regs); break;
|
|
974
|
+
case 0x34: handle_101234(regs); break;
|
|
975
|
+
case 0x35: handle_101235(regs); break;
|
|
976
|
+
case 0x36: handle_101236(regs); break;
|
|
977
|
+
default: handle_1012XX(regs); break;
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
|
|
982
|
+
// Write string
|
|
983
|
+
static void noinline
|
|
984
|
+
handle_1013(struct bregs *regs)
|
|
985
|
+
{
|
|
986
|
+
struct cursorpos cp = {regs->dl, regs->dh, regs->bh};
|
|
987
|
+
u16 count = regs->cx;
|
|
988
|
+
u8 *offset_far = (void*)(regs->bp + 0);
|
|
989
|
+
u8 attr = regs->bl;
|
|
990
|
+
while (count--) {
|
|
991
|
+
u8 car = GET_FARVAR(regs->es, *offset_far);
|
|
992
|
+
offset_far++;
|
|
993
|
+
if (regs->al & 2) {
|
|
994
|
+
attr = GET_FARVAR(regs->es, *offset_far);
|
|
995
|
+
offset_far++;
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
struct carattr ca = {car, attr, 1};
|
|
999
|
+
write_teletype(&cp, ca);
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
if (regs->al & 1)
|
|
1003
|
+
set_cursor_pos(cp);
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
|
|
1007
|
+
static void
|
|
1008
|
+
handle_101a00(struct bregs *regs)
|
|
1009
|
+
{
|
|
1010
|
+
regs->bx = GET_BDA(dcc_index);
|
|
1011
|
+
regs->al = 0x1a;
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
static void
|
|
1015
|
+
handle_101a01(struct bregs *regs)
|
|
1016
|
+
{
|
|
1017
|
+
SET_BDA(dcc_index, regs->bl);
|
|
1018
|
+
dprintf(1, "Alternate Display code (%02x) was discarded\n", regs->bh);
|
|
1019
|
+
regs->al = 0x1a;
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
static void
|
|
1023
|
+
handle_101aXX(struct bregs *regs)
|
|
1024
|
+
{
|
|
1025
|
+
debug_stub(regs);
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
static void
|
|
1029
|
+
handle_101a(struct bregs *regs)
|
|
1030
|
+
{
|
|
1031
|
+
switch (regs->al) {
|
|
1032
|
+
case 0x00: handle_101a00(regs); break;
|
|
1033
|
+
case 0x01: handle_101a01(regs); break;
|
|
1034
|
+
default: handle_101aXX(regs); break;
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
|
|
1039
|
+
struct video_func_static static_functionality VAR16 = {
|
|
1040
|
+
.modes = 0x00, // Filled in by stdvga_build_video_param()
|
|
1041
|
+
.scanlines = 0x07, // 200, 350, 400 scan lines
|
|
1042
|
+
.cblocks = 0x02, // mamimum number of visible charsets in text mode
|
|
1043
|
+
.active_cblocks = 0x08, // total number of charset blocks in text mode
|
|
1044
|
+
.misc_flags = 0x0ce7,
|
|
1045
|
+
};
|
|
1046
|
+
|
|
1047
|
+
static void
|
|
1048
|
+
handle_101b(struct bregs *regs)
|
|
1049
|
+
{
|
|
1050
|
+
u16 seg = regs->es;
|
|
1051
|
+
struct video_func_info *info = (void*)(regs->di+0);
|
|
1052
|
+
memset_far(seg, info, 0, sizeof(*info));
|
|
1053
|
+
// Address of static functionality table
|
|
1054
|
+
SET_FARVAR(seg, info->static_functionality
|
|
1055
|
+
, SEGOFF(get_global_seg(), (u32)&static_functionality));
|
|
1056
|
+
|
|
1057
|
+
// Hard coded copy from BIOS area. Should it be cleaner ?
|
|
1058
|
+
memcpy_far(seg, info->bda_0x49, SEG_BDA, (void*)0x49
|
|
1059
|
+
, sizeof(info->bda_0x49));
|
|
1060
|
+
memcpy_far(seg, info->bda_0x84, SEG_BDA, (void*)0x84
|
|
1061
|
+
, sizeof(info->bda_0x84));
|
|
1062
|
+
|
|
1063
|
+
SET_FARVAR(seg, info->dcc_index, GET_BDA(dcc_index));
|
|
1064
|
+
SET_FARVAR(seg, info->colors, 16);
|
|
1065
|
+
SET_FARVAR(seg, info->pages, 8);
|
|
1066
|
+
SET_FARVAR(seg, info->scan_lines, 2);
|
|
1067
|
+
SET_FARVAR(seg, info->video_mem, 3);
|
|
1068
|
+
regs->al = 0x1B;
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
|
|
1072
|
+
static void
|
|
1073
|
+
handle_101c(struct bregs *regs)
|
|
1074
|
+
{
|
|
1075
|
+
u16 seg = regs->es;
|
|
1076
|
+
void *data = (void*)(regs->bx+0);
|
|
1077
|
+
u16 states = regs->cx;
|
|
1078
|
+
u8 cmd = regs->al;
|
|
1079
|
+
if (states & ~0x07 || cmd > 2)
|
|
1080
|
+
goto fail;
|
|
1081
|
+
int ret = vgahw_save_restore(states | (cmd<<8), seg, data);
|
|
1082
|
+
if (ret < 0)
|
|
1083
|
+
goto fail;
|
|
1084
|
+
if (cmd == 0)
|
|
1085
|
+
regs->bx = ret / 64;
|
|
1086
|
+
regs->al = 0x1c;
|
|
1087
|
+
fail:
|
|
1088
|
+
return;
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
static void
|
|
1092
|
+
handle_10XX(struct bregs *regs)
|
|
1093
|
+
{
|
|
1094
|
+
debug_stub(regs);
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
// INT 10h Video Support Service Entry Point
|
|
1098
|
+
void VISIBLE16
|
|
1099
|
+
handle_10(struct bregs *regs)
|
|
1100
|
+
{
|
|
1101
|
+
debug_enter(regs, DEBUG_VGA_10);
|
|
1102
|
+
swcursor_pre_handle10(regs);
|
|
1103
|
+
|
|
1104
|
+
switch (regs->ah) {
|
|
1105
|
+
case 0x00: handle_1000(regs); break;
|
|
1106
|
+
case 0x01: handle_1001(regs); break;
|
|
1107
|
+
case 0x02: handle_1002(regs); break;
|
|
1108
|
+
case 0x03: handle_1003(regs); break;
|
|
1109
|
+
case 0x04: handle_1004(regs); break;
|
|
1110
|
+
case 0x05: handle_1005(regs); break;
|
|
1111
|
+
case 0x06: handle_1006(regs); break;
|
|
1112
|
+
case 0x07: handle_1007(regs); break;
|
|
1113
|
+
case 0x08: handle_1008(regs); break;
|
|
1114
|
+
case 0x09: handle_1009(regs); break;
|
|
1115
|
+
case 0x0a: handle_100a(regs); break;
|
|
1116
|
+
case 0x0b: handle_100b(regs); break;
|
|
1117
|
+
case 0x0c: handle_100c(regs); break;
|
|
1118
|
+
case 0x0d: handle_100d(regs); break;
|
|
1119
|
+
case 0x0e: handle_100e(regs); break;
|
|
1120
|
+
case 0x0f: handle_100f(regs); break;
|
|
1121
|
+
case 0x10: handle_1010(regs); break;
|
|
1122
|
+
case 0x11: handle_1011(regs); break;
|
|
1123
|
+
case 0x12: handle_1012(regs); break;
|
|
1124
|
+
case 0x13: handle_1013(regs); break;
|
|
1125
|
+
case 0x1a: handle_101a(regs); break;
|
|
1126
|
+
case 0x1b: handle_101b(regs); break;
|
|
1127
|
+
case 0x1c: handle_101c(regs); break;
|
|
1128
|
+
case 0x4f: handle_104f(regs); break;
|
|
1129
|
+
default: handle_10XX(regs); break;
|
|
1130
|
+
}
|
|
1131
|
+
}
|