v86 0.4.0 → 0.5.11

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