v86 0.3.4 → 0.3.7

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