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.
Files changed (369) hide show
  1. package/Readme.md +17 -6
  2. package/bios/seabios/.config +113 -0
  3. package/bios/seabios/.config.old +114 -0
  4. package/bios/seabios/.gitignore +4 -0
  5. package/bios/seabios/COPYING +674 -0
  6. package/bios/seabios/COPYING.LESSER +165 -0
  7. package/bios/seabios/Makefile +286 -0
  8. package/bios/seabios/README +17 -0
  9. package/bios/seabios/docs/Build_overview.md +104 -0
  10. package/bios/seabios/docs/Contributing.md +20 -0
  11. package/bios/seabios/docs/Debugging.md +111 -0
  12. package/bios/seabios/docs/Developer_Documentation.md +25 -0
  13. package/bios/seabios/docs/Developer_links.md +86 -0
  14. package/bios/seabios/docs/Download.md +27 -0
  15. package/bios/seabios/docs/Execution_and_code_flow.md +178 -0
  16. package/bios/seabios/docs/Linking_overview.md +160 -0
  17. package/bios/seabios/docs/Mailinglist.md +8 -0
  18. package/bios/seabios/docs/Memory_Model.md +253 -0
  19. package/bios/seabios/docs/README +5 -0
  20. package/bios/seabios/docs/Releases.md +482 -0
  21. package/bios/seabios/docs/Runtime_config.md +193 -0
  22. package/bios/seabios/docs/SeaBIOS.md +17 -0
  23. package/bios/seabios/docs/SeaVGABIOS.md +39 -0
  24. package/bios/seabios/out/autoconf.h +117 -0
  25. package/bios/seabios/out/include/config/acpi/dsdt.h +0 -0
  26. package/bios/seabios/out/include/config/acpi.h +0 -0
  27. package/bios/seabios/out/include/config/ahci.h +0 -0
  28. package/bios/seabios/out/include/config/apmbios.h +0 -0
  29. package/bios/seabios/out/include/config/ata/dma.h +0 -0
  30. package/bios/seabios/out/include/config/ata/pio32.h +0 -0
  31. package/bios/seabios/out/include/config/ata.h +0 -0
  32. package/bios/seabios/out/include/config/auto.conf +69 -0
  33. package/bios/seabios/out/include/config/auto.conf.cmd +9 -0
  34. package/bios/seabios/out/include/config/boot.h +0 -0
  35. package/bios/seabios/out/include/config/bootorder.h +0 -0
  36. package/bios/seabios/out/include/config/build/vgabios.h +0 -0
  37. package/bios/seabios/out/include/config/call32/smm.h +0 -0
  38. package/bios/seabios/out/include/config/cdrom/boot.h +0 -0
  39. package/bios/seabios/out/include/config/cdrom/emu.h +0 -0
  40. package/bios/seabios/out/include/config/debug/level.h +0 -0
  41. package/bios/seabios/out/include/config/drives.h +0 -0
  42. package/bios/seabios/out/include/config/entry/extrastack.h +0 -0
  43. package/bios/seabios/out/include/config/esp/scsi.h +0 -0
  44. package/bios/seabios/out/include/config/flash/floppy.h +0 -0
  45. package/bios/seabios/out/include/config/floppy.h +0 -0
  46. package/bios/seabios/out/include/config/fw/romfile/load.h +0 -0
  47. package/bios/seabios/out/include/config/hardware/irq.h +0 -0
  48. package/bios/seabios/out/include/config/kbd/call/int15/4f.h +0 -0
  49. package/bios/seabios/out/include/config/keyboard.h +0 -0
  50. package/bios/seabios/out/include/config/lpt.h +0 -0
  51. package/bios/seabios/out/include/config/lsi/scsi.h +0 -0
  52. package/bios/seabios/out/include/config/malloc/uppermemory.h +0 -0
  53. package/bios/seabios/out/include/config/megasas.h +0 -0
  54. package/bios/seabios/out/include/config/mouse.h +0 -0
  55. package/bios/seabios/out/include/config/mpt/scsi.h +0 -0
  56. package/bios/seabios/out/include/config/mptable.h +0 -0
  57. package/bios/seabios/out/include/config/mtrr/init.h +0 -0
  58. package/bios/seabios/out/include/config/optionroms.h +0 -0
  59. package/bios/seabios/out/include/config/override/pci/id.h +0 -0
  60. package/bios/seabios/out/include/config/pcibios.h +0 -0
  61. package/bios/seabios/out/include/config/pirtable.h +0 -0
  62. package/bios/seabios/out/include/config/pmm.h +0 -0
  63. package/bios/seabios/out/include/config/pmtimer.h +0 -0
  64. package/bios/seabios/out/include/config/pnpbios.h +0 -0
  65. package/bios/seabios/out/include/config/ps2port.h +0 -0
  66. package/bios/seabios/out/include/config/pvscsi.h +0 -0
  67. package/bios/seabios/out/include/config/qemu/hardware.h +0 -0
  68. package/bios/seabios/out/include/config/qemu.h +0 -0
  69. package/bios/seabios/out/include/config/rom/size.h +0 -0
  70. package/bios/seabios/out/include/config/rtc/timer.h +0 -0
  71. package/bios/seabios/out/include/config/s3/resume.h +0 -0
  72. package/bios/seabios/out/include/config/sdcard.h +0 -0
  73. package/bios/seabios/out/include/config/serial.h +0 -0
  74. package/bios/seabios/out/include/config/tcgbios.h +0 -0
  75. package/bios/seabios/out/include/config/threads.h +0 -0
  76. package/bios/seabios/out/include/config/tristate.conf +4 -0
  77. package/bios/seabios/out/include/config/tsc/timer.h +0 -0
  78. package/bios/seabios/out/include/config/use/smm.h +0 -0
  79. package/bios/seabios/out/include/config/vga/allocate/extra/stack.h +0 -0
  80. package/bios/seabios/out/include/config/vga/bochs/stdvga.h +0 -0
  81. package/bios/seabios/out/include/config/vga/bochs.h +0 -0
  82. package/bios/seabios/out/include/config/vga/did.h +0 -0
  83. package/bios/seabios/out/include/config/vga/extra/stack/size.h +0 -0
  84. package/bios/seabios/out/include/config/vga/fixup/asm.h +0 -0
  85. package/bios/seabios/out/include/config/vga/pci.h +0 -0
  86. package/bios/seabios/out/include/config/vga/stdvga/ports.h +0 -0
  87. package/bios/seabios/out/include/config/vga/vbe.h +0 -0
  88. package/bios/seabios/out/include/config/vga/vid.h +0 -0
  89. package/bios/seabios/out/include/config/vgahooks.h +0 -0
  90. package/bios/seabios/out/include/config/virtio/blk.h +0 -0
  91. package/bios/seabios/out/include/config/virtio/scsi.h +0 -0
  92. package/bios/seabios/out/include/config/xen.h +0 -0
  93. package/bios/seabios/out/scripts/kconfig/conf +0 -0
  94. package/bios/seabios/out/scripts/kconfig/conf.o +0 -0
  95. package/bios/seabios/out/scripts/kconfig/zconf.hash.c +289 -0
  96. package/bios/seabios/out/scripts/kconfig/zconf.lex.c +2420 -0
  97. package/bios/seabios/out/scripts/kconfig/zconf.tab.c +2538 -0
  98. package/bios/seabios/out/scripts/kconfig/zconf.tab.o +0 -0
  99. package/bios/seabios/scripts/acpi_extract.py +366 -0
  100. package/bios/seabios/scripts/acpi_extract_preprocess.py +41 -0
  101. package/bios/seabios/scripts/buildrom.py +56 -0
  102. package/bios/seabios/scripts/buildversion.py +134 -0
  103. package/bios/seabios/scripts/checkrom.py +95 -0
  104. package/bios/seabios/scripts/checkstack.py +226 -0
  105. package/bios/seabios/scripts/checksum.py +16 -0
  106. package/bios/seabios/scripts/encodeint.py +21 -0
  107. package/bios/seabios/scripts/gen-offsets.sh +17 -0
  108. package/bios/seabios/scripts/kconfig/.gitignore +22 -0
  109. package/bios/seabios/scripts/kconfig/Makefile +331 -0
  110. package/bios/seabios/scripts/kconfig/POTFILES.in +12 -0
  111. package/bios/seabios/scripts/kconfig/check.sh +13 -0
  112. package/bios/seabios/scripts/kconfig/conf.c +718 -0
  113. package/bios/seabios/scripts/kconfig/confdata.c +1250 -0
  114. package/bios/seabios/scripts/kconfig/expr.c +1168 -0
  115. package/bios/seabios/scripts/kconfig/expr.h +241 -0
  116. package/bios/seabios/scripts/kconfig/gconf.c +1542 -0
  117. package/bios/seabios/scripts/kconfig/gconf.glade +661 -0
  118. package/bios/seabios/scripts/kconfig/images.c +326 -0
  119. package/bios/seabios/scripts/kconfig/kxgettext.c +235 -0
  120. package/bios/seabios/scripts/kconfig/lex.zconf.c +2430 -0
  121. package/bios/seabios/scripts/kconfig/list.h +131 -0
  122. package/bios/seabios/scripts/kconfig/lkc.h +200 -0
  123. package/bios/seabios/scripts/kconfig/lkc_proto.h +57 -0
  124. package/bios/seabios/scripts/kconfig/lxdialog/.gitignore +4 -0
  125. package/bios/seabios/scripts/kconfig/lxdialog/BIG.FAT.WARNING +4 -0
  126. package/bios/seabios/scripts/kconfig/lxdialog/check-lxdialog.sh +87 -0
  127. package/bios/seabios/scripts/kconfig/lxdialog/checklist.c +332 -0
  128. package/bios/seabios/scripts/kconfig/lxdialog/dialog.h +257 -0
  129. package/bios/seabios/scripts/kconfig/lxdialog/inputbox.c +301 -0
  130. package/bios/seabios/scripts/kconfig/lxdialog/menubox.c +437 -0
  131. package/bios/seabios/scripts/kconfig/lxdialog/textbox.c +408 -0
  132. package/bios/seabios/scripts/kconfig/lxdialog/util.c +713 -0
  133. package/bios/seabios/scripts/kconfig/lxdialog/yesno.c +114 -0
  134. package/bios/seabios/scripts/kconfig/mconf.c +1036 -0
  135. package/bios/seabios/scripts/kconfig/menu.c +697 -0
  136. package/bios/seabios/scripts/kconfig/merge_config.sh +150 -0
  137. package/bios/seabios/scripts/kconfig/nconf.c +1556 -0
  138. package/bios/seabios/scripts/kconfig/nconf.gui.c +656 -0
  139. package/bios/seabios/scripts/kconfig/nconf.h +96 -0
  140. package/bios/seabios/scripts/kconfig/qconf.cc +1795 -0
  141. package/bios/seabios/scripts/kconfig/qconf.h +338 -0
  142. package/bios/seabios/scripts/kconfig/streamline_config.pl +647 -0
  143. package/bios/seabios/scripts/kconfig/symbol.c +1373 -0
  144. package/bios/seabios/scripts/kconfig/util.c +157 -0
  145. package/bios/seabios/scripts/kconfig/zconf.gperf +48 -0
  146. package/bios/seabios/scripts/kconfig/zconf.hash.c_shipped +289 -0
  147. package/bios/seabios/scripts/kconfig/zconf.l +363 -0
  148. package/bios/seabios/scripts/kconfig/zconf.lex.c_shipped +2420 -0
  149. package/bios/seabios/scripts/kconfig/zconf.tab.c_shipped +2538 -0
  150. package/bios/seabios/scripts/kconfig/zconf.y +733 -0
  151. package/bios/seabios/scripts/layoutrom.py +705 -0
  152. package/bios/seabios/scripts/python23compat.py +14 -0
  153. package/bios/seabios/scripts/readserial.py +190 -0
  154. package/bios/seabios/scripts/tarball.sh +36 -0
  155. package/bios/seabios/scripts/test-build.sh +90 -0
  156. package/bios/seabios/scripts/transdump.py +53 -0
  157. package/bios/seabios/scripts/vgafixup.py +96 -0
  158. package/bios/seabios/src/Kconfig +579 -0
  159. package/bios/seabios/src/apm.c +215 -0
  160. package/bios/seabios/src/asm-offsets.c +23 -0
  161. package/bios/seabios/src/biosvar.h +130 -0
  162. package/bios/seabios/src/block.c +623 -0
  163. package/bios/seabios/src/block.h +121 -0
  164. package/bios/seabios/src/bmp.c +117 -0
  165. package/bios/seabios/src/boot.c +793 -0
  166. package/bios/seabios/src/bootsplash.c +255 -0
  167. package/bios/seabios/src/bregs.h +80 -0
  168. package/bios/seabios/src/byteorder.h +71 -0
  169. package/bios/seabios/src/cdrom.c +322 -0
  170. package/bios/seabios/src/clock.c +506 -0
  171. package/bios/seabios/src/code16gcc.s +1 -0
  172. package/bios/seabios/src/config.h +108 -0
  173. package/bios/seabios/src/cp437.c +275 -0
  174. package/bios/seabios/src/cp437.h +1 -0
  175. package/bios/seabios/src/disk.c +779 -0
  176. package/bios/seabios/src/e820map.c +152 -0
  177. package/bios/seabios/src/e820map.h +26 -0
  178. package/bios/seabios/src/entryfuncs.S +165 -0
  179. package/bios/seabios/src/farptr.h +208 -0
  180. package/bios/seabios/src/font.c +139 -0
  181. package/bios/seabios/src/fw/acpi-dsdt-cpu-hotplug.dsl +78 -0
  182. package/bios/seabios/src/fw/acpi-dsdt-dbug.dsl +26 -0
  183. package/bios/seabios/src/fw/acpi-dsdt-hpet.dsl +36 -0
  184. package/bios/seabios/src/fw/acpi-dsdt-isa.dsl +102 -0
  185. package/bios/seabios/src/fw/acpi-dsdt-pci-crs.dsl +90 -0
  186. package/bios/seabios/src/fw/acpi-dsdt.dsl +342 -0
  187. package/bios/seabios/src/fw/acpi-dsdt.hex +554 -0
  188. package/bios/seabios/src/fw/acpi.c +685 -0
  189. package/bios/seabios/src/fw/biostables.c +491 -0
  190. package/bios/seabios/src/fw/coreboot.c +569 -0
  191. package/bios/seabios/src/fw/csm.c +347 -0
  192. package/bios/seabios/src/fw/dev-pci.h +52 -0
  193. package/bios/seabios/src/fw/dev-piix.h +29 -0
  194. package/bios/seabios/src/fw/dev-q35.h +52 -0
  195. package/bios/seabios/src/fw/lzmadecode.c +398 -0
  196. package/bios/seabios/src/fw/lzmadecode.h +67 -0
  197. package/bios/seabios/src/fw/mptable.c +197 -0
  198. package/bios/seabios/src/fw/mtrr.c +105 -0
  199. package/bios/seabios/src/fw/multiboot.c +111 -0
  200. package/bios/seabios/src/fw/paravirt.c +624 -0
  201. package/bios/seabios/src/fw/paravirt.h +63 -0
  202. package/bios/seabios/src/fw/pciinit.c +1187 -0
  203. package/bios/seabios/src/fw/pirtable.c +103 -0
  204. package/bios/seabios/src/fw/q35-acpi-dsdt.dsl +450 -0
  205. package/bios/seabios/src/fw/romfile_loader.c +259 -0
  206. package/bios/seabios/src/fw/romfile_loader.h +91 -0
  207. package/bios/seabios/src/fw/shadow.c +208 -0
  208. package/bios/seabios/src/fw/smbios.c +585 -0
  209. package/bios/seabios/src/fw/smm.c +269 -0
  210. package/bios/seabios/src/fw/smp.c +194 -0
  211. package/bios/seabios/src/fw/ssdt-misc.dsl +104 -0
  212. package/bios/seabios/src/fw/ssdt-misc.hex +88 -0
  213. package/bios/seabios/src/fw/ssdt-pcihp.dsl +36 -0
  214. package/bios/seabios/src/fw/ssdt-pcihp.hex +38 -0
  215. package/bios/seabios/src/fw/ssdt-proc.dsl +48 -0
  216. package/bios/seabios/src/fw/ssdt-proc.hex +35 -0
  217. package/bios/seabios/src/fw/xen.c +149 -0
  218. package/bios/seabios/src/fw/xen.h +125 -0
  219. package/bios/seabios/src/gen-defs.h +19 -0
  220. package/bios/seabios/src/hw/ahci.c +697 -0
  221. package/bios/seabios/src/hw/ahci.h +201 -0
  222. package/bios/seabios/src/hw/ata.c +1046 -0
  223. package/bios/seabios/src/hw/ata.h +163 -0
  224. package/bios/seabios/src/hw/blockcmd.c +372 -0
  225. package/bios/seabios/src/hw/blockcmd.h +114 -0
  226. package/bios/seabios/src/hw/dma.c +67 -0
  227. package/bios/seabios/src/hw/esp-scsi.c +241 -0
  228. package/bios/seabios/src/hw/esp-scsi.h +8 -0
  229. package/bios/seabios/src/hw/floppy.c +741 -0
  230. package/bios/seabios/src/hw/lsi-scsi.c +221 -0
  231. package/bios/seabios/src/hw/lsi-scsi.h +8 -0
  232. package/bios/seabios/src/hw/megasas.c +405 -0
  233. package/bios/seabios/src/hw/megasas.h +8 -0
  234. package/bios/seabios/src/hw/mpt-scsi.c +319 -0
  235. package/bios/seabios/src/hw/mpt-scsi.h +8 -0
  236. package/bios/seabios/src/hw/nvme-int.h +199 -0
  237. package/bios/seabios/src/hw/nvme.c +708 -0
  238. package/bios/seabios/src/hw/nvme.h +17 -0
  239. package/bios/seabios/src/hw/pci.c +133 -0
  240. package/bios/seabios/src/hw/pci.h +47 -0
  241. package/bios/seabios/src/hw/pci_ids.h +2632 -0
  242. package/bios/seabios/src/hw/pci_regs.h +556 -0
  243. package/bios/seabios/src/hw/pcidevice.c +192 -0
  244. package/bios/seabios/src/hw/pcidevice.h +76 -0
  245. package/bios/seabios/src/hw/pic.c +115 -0
  246. package/bios/seabios/src/hw/pic.h +60 -0
  247. package/bios/seabios/src/hw/ps2port.c +543 -0
  248. package/bios/seabios/src/hw/ps2port.h +67 -0
  249. package/bios/seabios/src/hw/pvscsi.c +333 -0
  250. package/bios/seabios/src/hw/pvscsi.h +8 -0
  251. package/bios/seabios/src/hw/ramdisk.c +108 -0
  252. package/bios/seabios/src/hw/rtc.c +100 -0
  253. package/bios/seabios/src/hw/rtc.h +75 -0
  254. package/bios/seabios/src/hw/sdcard.c +572 -0
  255. package/bios/seabios/src/hw/serialio.c +113 -0
  256. package/bios/seabios/src/hw/serialio.h +29 -0
  257. package/bios/seabios/src/hw/timer.c +259 -0
  258. package/bios/seabios/src/hw/tpm_drivers.c +636 -0
  259. package/bios/seabios/src/hw/tpm_drivers.h +127 -0
  260. package/bios/seabios/src/hw/usb-ehci.c +650 -0
  261. package/bios/seabios/src/hw/usb-ehci.h +177 -0
  262. package/bios/seabios/src/hw/usb-hid.c +442 -0
  263. package/bios/seabios/src/hw/usb-hid.h +29 -0
  264. package/bios/seabios/src/hw/usb-hub.c +205 -0
  265. package/bios/seabios/src/hw/usb-hub.h +64 -0
  266. package/bios/seabios/src/hw/usb-msc.c +222 -0
  267. package/bios/seabios/src/hw/usb-msc.h +10 -0
  268. package/bios/seabios/src/hw/usb-ohci.c +568 -0
  269. package/bios/seabios/src/hw/usb-ohci.h +144 -0
  270. package/bios/seabios/src/hw/usb-uas.c +289 -0
  271. package/bios/seabios/src/hw/usb-uas.h +9 -0
  272. package/bios/seabios/src/hw/usb-uhci.c +571 -0
  273. package/bios/seabios/src/hw/usb-uhci.h +128 -0
  274. package/bios/seabios/src/hw/usb-xhci.c +1161 -0
  275. package/bios/seabios/src/hw/usb-xhci.h +133 -0
  276. package/bios/seabios/src/hw/usb.c +499 -0
  277. package/bios/seabios/src/hw/usb.h +254 -0
  278. package/bios/seabios/src/hw/virtio-blk.c +211 -0
  279. package/bios/seabios/src/hw/virtio-blk.h +43 -0
  280. package/bios/seabios/src/hw/virtio-pci.c +501 -0
  281. package/bios/seabios/src/hw/virtio-pci.h +151 -0
  282. package/bios/seabios/src/hw/virtio-ring.c +147 -0
  283. package/bios/seabios/src/hw/virtio-ring.h +121 -0
  284. package/bios/seabios/src/hw/virtio-scsi.c +220 -0
  285. package/bios/seabios/src/hw/virtio-scsi.h +47 -0
  286. package/bios/seabios/src/jpeg.c +1055 -0
  287. package/bios/seabios/src/kbd.c +599 -0
  288. package/bios/seabios/src/list.h +91 -0
  289. package/bios/seabios/src/malloc.c +561 -0
  290. package/bios/seabios/src/malloc.h +70 -0
  291. package/bios/seabios/src/memmap.h +21 -0
  292. package/bios/seabios/src/misc.c +195 -0
  293. package/bios/seabios/src/mouse.c +342 -0
  294. package/bios/seabios/src/optionroms.c +475 -0
  295. package/bios/seabios/src/output.c +584 -0
  296. package/bios/seabios/src/output.h +68 -0
  297. package/bios/seabios/src/pcibios.c +241 -0
  298. package/bios/seabios/src/pmm.c +176 -0
  299. package/bios/seabios/src/pnpbios.c +88 -0
  300. package/bios/seabios/src/post.c +337 -0
  301. package/bios/seabios/src/resume.c +157 -0
  302. package/bios/seabios/src/romfile.c +146 -0
  303. package/bios/seabios/src/romfile.h +21 -0
  304. package/bios/seabios/src/romlayout.S +698 -0
  305. package/bios/seabios/src/sercon.c +677 -0
  306. package/bios/seabios/src/serial.c +317 -0
  307. package/bios/seabios/src/sha1.c +147 -0
  308. package/bios/seabios/src/sha1.h +8 -0
  309. package/bios/seabios/src/stacks.c +771 -0
  310. package/bios/seabios/src/stacks.h +68 -0
  311. package/bios/seabios/src/std/LegacyBios.h +985 -0
  312. package/bios/seabios/src/std/acpi.h +323 -0
  313. package/bios/seabios/src/std/bda.h +174 -0
  314. package/bios/seabios/src/std/disk.h +175 -0
  315. package/bios/seabios/src/std/mptable.h +77 -0
  316. package/bios/seabios/src/std/multiboot.h +260 -0
  317. package/bios/seabios/src/std/optionrom.h +59 -0
  318. package/bios/seabios/src/std/pirtable.h +35 -0
  319. package/bios/seabios/src/std/pmm.h +19 -0
  320. package/bios/seabios/src/std/pnpbios.h +24 -0
  321. package/bios/seabios/src/std/smbios.h +167 -0
  322. package/bios/seabios/src/std/tcg.h +554 -0
  323. package/bios/seabios/src/std/vbe.h +156 -0
  324. package/bios/seabios/src/std/vga.h +63 -0
  325. package/bios/seabios/src/string.c +251 -0
  326. package/bios/seabios/src/string.h +31 -0
  327. package/bios/seabios/src/system.c +357 -0
  328. package/bios/seabios/src/tcgbios.c +2014 -0
  329. package/bios/seabios/src/tcgbios.h +19 -0
  330. package/bios/seabios/src/types.h +156 -0
  331. package/bios/seabios/src/util.h +251 -0
  332. package/bios/seabios/src/version.c +5 -0
  333. package/bios/seabios/src/vgahooks.c +355 -0
  334. package/bios/seabios/src/x86.c +23 -0
  335. package/bios/seabios/src/x86.h +277 -0
  336. package/bios/seabios/vgasrc/Kconfig +211 -0
  337. package/bios/seabios/vgasrc/bochsdisplay.c +59 -0
  338. package/bios/seabios/vgasrc/bochsvga.c +447 -0
  339. package/bios/seabios/vgasrc/bochsvga.h +57 -0
  340. package/bios/seabios/vgasrc/cbvga.c +337 -0
  341. package/bios/seabios/vgasrc/clext.c +627 -0
  342. package/bios/seabios/vgasrc/geodevga.c +434 -0
  343. package/bios/seabios/vgasrc/geodevga.h +89 -0
  344. package/bios/seabios/vgasrc/ramfb.c +163 -0
  345. package/bios/seabios/vgasrc/stdvga.c +485 -0
  346. package/bios/seabios/vgasrc/stdvga.h +81 -0
  347. package/bios/seabios/vgasrc/stdvgaio.c +186 -0
  348. package/bios/seabios/vgasrc/stdvgamodes.c +534 -0
  349. package/bios/seabios/vgasrc/swcursor.c +96 -0
  350. package/bios/seabios/vgasrc/vbe.c +432 -0
  351. package/bios/seabios/vgasrc/vgabios.c +1131 -0
  352. package/bios/seabios/vgasrc/vgabios.h +88 -0
  353. package/bios/seabios/vgasrc/vgaentry.S +161 -0
  354. package/bios/seabios/vgasrc/vgafb.c +661 -0
  355. package/bios/seabios/vgasrc/vgafb.h +42 -0
  356. package/bios/seabios/vgasrc/vgafonts.c +785 -0
  357. package/bios/seabios/vgasrc/vgahw.h +152 -0
  358. package/bios/seabios/vgasrc/vgainit.c +202 -0
  359. package/bios/seabios/vgasrc/vgalayout.lds.S +23 -0
  360. package/bios/seabios/vgasrc/vgautil.h +103 -0
  361. package/bios/seabios/vgasrc/vgaversion.c +6 -0
  362. package/build/binaries.js +1 -1
  363. package/build/index-debug.cjs +1 -1
  364. package/build/index-debug.js +1 -1
  365. package/build/index.cjs +1 -1
  366. package/build/index.js +1 -1
  367. package/build/v86-debug.wasm +0 -0
  368. package/build/v86.wasm +0 -0
  369. 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(&regs->bl, &regs->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
+ }