Compare commits

...

2123 Commits

Author SHA1 Message Date
David Given
7456fd0c90 Make the MS2000 stuff work again. Write documentation. 2023-08-19 23:29:55 +02:00
David Given
44160e66ac Merge branch 'master' into ms2000 2023-08-19 22:59:31 +02:00
David Given
9bd969a57b Merge pull request #688 from davidgiven/lif
Add HP9122 support; fix HP9121 support.
2023-08-19 22:55:39 +02:00
David Given
0b585078d8 Merge pull request #704 from ejona86/micropolis-ecc
Micropolis: Add Vector ECC support
2023-08-19 21:54:22 +02:00
David Given
0d495ed934 Merge pull request #710 from davidgiven/usb
Make work on FreeBSD
2023-08-19 21:23:54 +02:00
David Given
95b703b1ea Tidy reporting of USB errors. 2023-08-19 20:46:41 +02:00
David Given
688061397b Adjust error messages. 2023-08-19 20:39:55 +02:00
Poul-Henning Kamp
1f00176455 Make the non-gui executable build on FreeBSD 2023-08-14 19:51:21 +00:00
David Given
90da6b1e72 Merge pull request #706 from ejona86/pkg-config-protobuf
Makefile: Eagerly run pkg-config for protobuf
2023-08-06 01:12:49 +02:00
Eric Anderson
4deb45dc3f Makefile: Eagerly run pkg-config for protobuf
Protobuf added a dependency on absl and now pkg-config is incredibly
slow. `pkg-config --libs protobuf` and `--cflags` each take around 1.5
seconds on my laptop. Running pkg-config only once reduces a 100%
incremental build for 'make all' from 90 seconds to 3.2 seconds.

Unfortunately we will pay the 3 seconds every time we execute make, even
for something that doesn't need protobuf.
2023-08-05 13:02:50 -07:00
David Given
eeec5d106a Update missing file. 2023-08-02 14:08:38 +02:00
David Given
4e42d1d197 Release and ccpp workflows now run in different environments. 2023-08-02 14:08:19 +02:00
David Given
495d08c447 Merge pull request #705 from davidgiven/d20
Update D20 documentation.
2023-08-02 13:46:10 +02:00
David Given
1b859015ae Update documentation. 2023-08-02 13:42:23 +02:00
David Given
3db2109e01 Merge pull request #700 from davidgiven/d20
Add support for the Roland-D20 filesystem.
2023-07-31 23:01:49 +01:00
David Given
294ac87503 Update documentation for the Roland D20 format. 2023-07-31 23:36:45 +02:00
David Given
c297adb0c7 Try to fix Mac builds. 2023-07-31 22:30:52 +02:00
David Given
446b965794 Handle Roland extents properly if the directory entries are in the wrong order.
Deal with block numbers >39 (they go in the bottom of the disk).
2023-07-31 22:20:08 +02:00
Eric Anderson
96d4df296d Micropolis: Add Vector ECC support 2023-07-29 14:03:08 -07:00
David Given
a149aac0e9 Merge pull request #702 from ejona86/micropolis-encodedecode
Micropolis: Fix encoder and decoder to support encodedecodetest
2023-07-29 17:20:58 +01:00
David Given
aacc7be9f3 Merge pull request #703 from ejona86/vgi-hcs
Micropolis: Add missing HCS order for VGI
2023-07-29 17:17:44 +01:00
Eric Anderson
7409955701 Micropolis: Add missing HCS order for VGI 2023-07-29 07:12:35 -07:00
Eric Anderson
c623d95a80 Micropolis: Fix encoder and decoder to support encodedecodetest
These changes should not impact reading/writing from real disks. This
includes a bug fix to Fluxmap where it might miss a trailing interval
when adding bits, as mentioned in #333.

With the Fluxmap bug fixed, the encoder now includes index pulses in its
output. The decoder was relaxed to allow reading precisely one track.

We don't actually add an encodedecodetest for micropolis, though,
because the SCP encoder is unhappy with so many revolutions.
2023-07-29 07:08:23 -07:00
David Given
1927cc7fe1 Fix issue where trying to rename files by clicking on the tree wasn't working. 2023-07-27 23:44:33 +02:00
David Given
4eca254daf Add support for renaming files. 2023-07-27 23:44:04 +02:00
David Given
c7d4fee3f6 Add support for deleting files. 2023-07-27 23:19:50 +02:00
David Given
a6f798ae5b Mangle and demangle filenames. Remember to write the correct extent numbers in
multiextent files.
2023-07-27 23:09:57 +02:00
David Given
c9ae836e52 Add very brittle write support. 2023-07-27 22:49:10 +02:00
David Given
e3ffa63f7f Make sure that the rotational speed is measured even if reads are done through
Browse Disk.
2023-07-27 22:14:48 +02:00
David Given
4ffc2cc1dc Add support for, hopefully, multi-extent files. 2023-07-27 00:30:44 +02:00
David Given
7f9ba14687 Correct erroneous index. 2023-07-26 22:37:56 +02:00
David Given
a24933e272 Merge from master. 2023-07-26 22:33:40 +02:00
David Given
20bdacbecf Add initial support for the Roland-D20 filesystem. 2023-07-26 22:31:20 +02:00
David Given
ab9d6cf5ed Merge pull request #699 from davidgiven/wx
UI improvements
2023-07-25 23:03:02 +01:00
David Given
1f5903a9a0 Don't use std::filesystem; it makes life harder on Windows with its wide
strings.
2023-07-25 23:35:01 +02:00
David Given
bb073b6bb3 Apparently Mingw can't automatically convert from path to string. 2023-07-25 23:23:04 +02:00
David Given
516241f8f5 Replace the image read file picker with a simple one. 2023-07-25 23:11:52 +02:00
David Given
977b6831a0 When reading Kryoflux streams, you can specify any file in the directory and it
will work (as the GUI now forces you to do this).
2023-07-25 22:48:17 +02:00
David Given
c61effb54f Add a file type box to the flux source selection page. 2023-07-25 22:27:09 +02:00
David Given
346d989944 When reading Kryoflux streams, allow the user to specify any file within the
directory and have it work (as that's what the GUI does now).
2023-07-25 22:51:34 +02:00
David Given
60a73c8d1e Add a file type box to the flux source selection page. 2023-07-25 22:27:09 +02:00
dg
e52db4a837 Typo fix. 2023-07-24 20:56:37 +00:00
dg
4e317643bc Try and install compatible versions of protobuf. 2023-07-24 20:53:51 +00:00
David Given
5f520bf375 Merge pull request #698 from davidgiven/zilogmcz
Add support for the ZDOS filesystem for the Zilog MCZ.
2023-07-24 22:16:33 +02:00
David Given
2efe521b3a Update documentation. 2023-07-24 21:48:37 +02:00
David Given
5c21103646 Get the ZDOS filesystem driver working. 2023-07-24 21:46:49 +02:00
David Given
9444696f37 Merge pull request #697 from davidgiven/ro
Allow read-only flux and image in the GUI.
2023-07-24 08:20:39 +02:00
David Given
082fe4e787 Hack in boilerplate for a ZDos filesystem. 2023-07-24 08:18:18 +02:00
David Given
5e13cf23f9 Allow read-only image reader/writers in the GUI. 2023-07-24 07:53:47 +02:00
David Given
8f98a1f557 Consolidate the image constructors in the same way that's been done for the
flux constructors.
2023-07-24 07:50:16 +02:00
David Given
5b21e8798b Allow read-only flux sources in the GUI. 2023-07-24 07:39:59 +02:00
David Given
b9ef5b7db8 Rename all the flux and image types to prefix the enums, due to them being in
the global namespace now.
2023-07-24 02:18:53 +02:00
David Given
9867f8c302 Combine enums for flux source/sink types. config.cc now knows whether they're
read-only, write-only, and read-write.
2023-07-24 00:50:54 +02:00
David Given
315889faf6 Warning fix. 2023-07-23 22:49:23 +02:00
David Given
798e8fee89 Merge pull request #692 from davidgiven/protobuf
Rename the `requires` config field to `prerequisite`
2023-07-08 00:43:15 +02:00
dg
e1c49db329 Use brew --prefix to detect the installation path when copying licenses from
packages.
2023-07-07 22:10:52 +00:00
dg
dae9537472 Warning fixes. 2023-07-07 21:51:24 +00:00
dg
1330d56cdd Fix a bunch of errors caused by changes to libfmt. 2023-07-07 21:32:21 +00:00
David Given
6ce3ce20d0 Remove stray debugging code. 2023-07-07 01:03:31 +02:00
David Given
362c5ee9b0 Rename the requires config field to prerequisite, as requires is about to
become a C++ keyword.
2023-07-07 00:34:03 +02:00
David Given
0f34ce0278 Merge pull request #690 from Deledrius/nsi-fix
Fix incorrect product name in installer.
2023-06-26 14:27:39 +02:00
Joseph Davies
0c27c7c4c8 Fix incorrect product name in installer. 2023-06-25 16:18:03 -07:00
David Given
37595bf73c Update the HP formats to not use the reserved tracks at the end of the disk. 2023-06-15 00:13:28 +02:00
David Given
952aea46ba The HP9122 format appears to be double-sided. 2023-06-13 23:00:00 +02:00
David Given
6a6536cf27 Discover that the HP9121 format is actually 70 track. Add support for the
HP9122 format.
2023-06-13 20:16:41 +02:00
David Given
696368c92a Read LIF volume size information correctly. 2023-06-13 20:08:47 +02:00
David Given
e3edc9327e Don't crash if there is no disk usage data. 2023-06-13 20:08:31 +02:00
David Given
8d2e6a664d Adjust the 264 format to have sector numbers in, hopefully, the right place. 2023-06-13 19:54:46 +02:00
David Given
9db6efe7a2 Merge pull request #686 from davidgiven/docs
Update documentation.
2023-06-03 00:30:34 +02:00
David Given
8b8a22d7fb Add the PCB schematic. 2023-06-03 00:05:51 +02:00
David Given
0a70344bc1 Add Fedora package list. 2023-06-02 23:38:09 +02:00
David Given
e77d01911c Merge pull request #683 from davidgiven/gw
Reset the Greaseweazle data stream when connecting
2023-05-25 22:43:49 +02:00
David Given
d4c0853e1f Reset the Greaseweazle data stream when connecting. 2023-05-25 22:23:28 +02:00
David Given
363a4e959c Finally fix that format error when measuring disk speed. 2023-05-25 22:23:17 +02:00
David Given
9336a04681 Merge pull request #682 from davidgiven/docs
More documentation tweaking.
2023-05-25 22:10:10 +02:00
David Given
214ff38749 Tweak documentation layout. 2023-05-25 22:08:28 +02:00
David Given
a8f3c01d8b Add basic documentation for the extension formats. 2023-05-25 22:06:23 +02:00
David Given
4da6585ef9 Merge pull request #681 from davidgiven/bb679
Allow writing to Greaseweazle disks again by not setting hardSectorThresholdNs to inf.
2023-05-25 21:58:59 +02:00
David Given
df40100feb Merge pull request #680 from davidgiven/docs
Overhaul docs.
2023-05-25 21:40:32 +02:00
David Given
f2d92e93fb Format. 2023-05-25 21:27:49 +02:00
David Given
b4d8d569d2 Allow writing to Greaseweazle disks again by not setting hardSectorThresholdNs
to inf...
2023-05-25 21:26:44 +02:00
David Given
854b3e9c59 Better autogenerated documentation. 2023-05-25 21:14:41 +02:00
David Given
28ca2b72f1 Polishing. 2023-05-25 21:14:32 +02:00
David Given
7781c8179f Typo fix. 2023-05-25 20:20:02 +02:00
David Given
69ece3ffa0 Polish documentation. 2023-05-25 20:07:33 +02:00
David Given
53adcd92ed Spell (and capitalise) Greaseweazle correctly. 2023-05-25 19:50:05 +02:00
David Given
2bef6ca646 Merge pull request #678 from davidgiven/requirements
Overhaul config system and lots of other stuff
2023-05-16 01:29:58 +02:00
dg
bab350d771 Update Ubuntu build version. 2023-05-15 23:09:52 +00:00
dg
048dac223f Enable workflow cancelling when a new one is pushed. 2023-05-15 22:59:59 +00:00
dg
b7634da310 Work around Apple dev kit stupidity (definiting BYTE_SIZE in a standard
header...)
2023-05-15 22:51:16 +00:00
dg
882c92c64a Merge. 2023-05-15 22:49:52 +00:00
dg
4592dbe28b Add drive types for the Micropolis drives. 2023-05-15 22:49:15 +00:00
dg
edc0f21ae7 Remove all the requires TPI constraints --- I'm not sure this is a good idea. 2023-05-15 22:48:33 +00:00
dg
8715b7f6c1 Don't crash if no format is selected. 2023-05-15 22:14:06 +00:00
dg
99511910dd If an incoming FL2 file has no TPI, use the default rather than 0 (the default
will probably be zero, but anyway).
2023-05-15 22:00:03 +00:00
dg
a03478b011 Don't store the actual DriveProto in FL2 files, because it makes the proto tags
significant.
2023-05-15 21:59:24 +00:00
dg
5c428e1f07 Don't require the user to specify the drive TPI if they don't want to. 2023-05-15 21:51:05 +00:00
dg
ee57615735 Deal with invalid options in the GUI. 2023-05-15 20:55:33 +00:00
dg
67300e5769 Add the ability to validate the configuration, at least in the CLI; this may
require some refactoring for the GUI to apply cleanly.
2023-05-14 23:18:48 +00:00
dg
873e05051c Massive rework of the config system to be clearer, more robust, and more
flexible. (But it doesn't check options any more.)
2023-05-14 22:04:51 +00:00
dg
4daaec46a7 Greying out of the option buttons now works; but the whole way configs are
handled is pretty unsatisfactory and needs work.
2023-05-13 23:29:34 +00:00
dg
dd8cc7bfd4 Attempt to move the configuration setup logic into Config, so it's centralised. 2023-05-13 12:42:31 +00:00
dg
5568ac382f Eliminate Environment --- we don't use it and Config contains this
functionality.
2023-05-13 00:04:42 +00:00
dg
dcdb3e4455 Encoders and decoders are routed through Config. 2023-05-12 23:58:44 +00:00
dg
17b29b1626 Flux sinks and image writers are routed through Config. 2023-05-12 23:47:09 +00:00
dg
dcfcc6271c Sort out a whole bunch of other things, including cleaning up the way the
verification source is handled.
2023-05-12 23:28:25 +00:00
dg
1d77ba6429 ImageReaders can now contribute config. 2023-05-12 22:20:13 +00:00
dg
ff5f019ac1 Fetching the image reader is now done through Config. 2023-05-12 21:52:53 +00:00
dg
e61eeb8c6f Fetching the flux source is now done through Config. 2023-05-12 21:25:54 +00:00
dg
68d22e7f54 Fix build error. 2023-05-11 23:31:38 +00:00
dg
790f0a42e3 Move setting the image writer into Config. 2023-05-11 23:06:24 +00:00
dg
08e9e508cc Move setting the image reader into Config. 2023-05-11 23:02:05 +00:00
dg
ad1a8d608f Migrate setting the flux sink to Config. 2023-05-11 22:54:32 +00:00
dg
d74ed71023 Move setting the flux source into Config. 2023-05-11 22:47:00 +00:00
dg
0c7f9e0888 Enforce option requirements --- but the config stuff is still kinda broken and
will need rethinking, especially if flux files can carry configs with them.
2023-05-11 21:58:10 +00:00
dg
ba5f6528a8 Move option handling into Config. 2023-05-11 20:37:54 +00:00
dg
65cf552ec2 Some cleanup. 2023-05-11 20:03:25 +00:00
dg
715c0a0c42 Move config file loading into config.cc. 2023-05-11 19:58:16 +00:00
dg
9e383575d1 Any drive settings in the global config will override loaded settings from an
fl2 file.
2023-05-11 19:21:59 +00:00
dg
d84c366480 You can now fetch config fields by path. 2023-05-11 19:03:36 +00:00
dg
42e6c11081 Migrate to a new global config object. 2023-05-10 23:13:33 +00:00
dg
9ba3f90f1e Change the global config variable to a globalConfig() function. 2023-05-10 22:07:17 +00:00
dg
24ff51274b Fix formatting. 2023-05-10 21:14:30 +00:00
dg
4c4c752827 Add missing file. 2023-05-10 21:11:10 +00:00
dg
5022b67e4a Drive information is stored in FL2 files. 2023-05-10 20:47:55 +00:00
dg
6b990a9f51 Overhaul the TPI stuff; now both the drive and the layout have a TPI setting,
which must be set.
2023-05-10 19:58:44 +00:00
dg
e69ce3b8df Merge. 2023-05-10 18:31:42 +00:00
dg
cf537b6222 Add the proto part of option requirements. 2023-05-10 18:29:46 +00:00
David Given
9d1160faff Merge pull request #677 from davidgiven/errors
Clean up error handling.
2023-05-10 01:13:49 +02:00
noreply@github.com
ed4067f194 Merge pull request #677 from davidgiven/errors
Clean up error handling.
2023-05-09 23:13:49 +00:00
dg
d4b55cd8f5 Switch from Logger() to log(). 2023-05-09 22:47:36 +00:00
dg
baaeb0bca7 Fix mangled formatting caused by clang-format. 2023-05-09 21:39:35 +00:00
dg
466c3c34e5 Replace the Error() object with an error() function which takes fmt
formatspecs, making for much cleaner code. Reformatted everything.

This actually happened in multiple steps but then I corrupted my local
repository and I had to recover from the working tree.
2023-05-09 20:59:44 +00:00
dg
099d7969ca Add the drive types dropdown, plus config fragments. Change the TPI settings to
floats (because 40-track 3.5" uses a TPI of 67.5...).
2023-05-08 23:04:52 +00:00
dg
5adfa95a85 Add a preliminary format for the 8050. 2023-05-08 23:03:37 +00:00
David Given
bfa0846ad0 Merge pull request #676 from davidgiven/doc
Correct index table rendering.
2023-05-08 20:38:53 +02:00
dg
7099264334 Correct index table rendering. 2023-05-08 18:37:16 +00:00
David Given
69b44e7968 Merge pull request #674 from davidgiven/doc
Overhaul documentation.
2023-05-08 01:13:57 +01:00
dg
fe39977ff7 Remember to add links to each profile's documentation. 2023-05-07 23:51:55 +00:00
dg
b9fc8de5b5 OSX compatibility. 2023-05-07 23:33:36 +00:00
dg
f7b8022d3a Switch to the traditional unicorn/dinosaur support categorisation. 2023-05-07 23:06:56 +00:00
dg
a62346c515 Add short names to each profile. 2023-05-07 21:49:14 +00:00
dg
e372d757ad Some tidying. 2023-05-07 21:32:36 +00:00
dg
ab1b10f935 Typo fix. 2023-05-07 21:30:09 +00:00
dg
8e918706dc First draft at autogenerating the table in the README. 2023-05-07 21:28:42 +00:00
dg
76450d00bf Tidy. 2023-05-07 19:53:57 +00:00
dg
ee53542e18 Eliminate config includes, as nothing uses them any more and it just makes
things like documentation generation hard.
2023-05-07 19:35:55 +00:00
dg
db004bc787 Preparse ConfigProto objects. 2023-05-07 19:28:29 +00:00
dg
71a7f3554e Remember to actually add the documentation files... 2023-05-07 18:40:24 +00:00
dg
5c3f422a53 First pass at automatic document generation. 2023-05-07 18:36:30 +00:00
dg
2fe0cec04a Copy documentation into the config definitions. 2023-05-07 16:48:17 +00:00
David Given
de59e781b5 Merge pull request #673 from davidgiven/options
Do more options overhauling.
2023-05-07 13:21:28 +01:00
dg
8c77af651b Run corpus tests on other platforms. 2023-05-07 11:56:32 +00:00
dg
638f6928cf Fix checkouts, maybe? 2023-05-07 11:53:56 +00:00
dg
ccc8e597a7 Don't use vformat, as apparently it's problematic. 2023-05-07 11:49:08 +00:00
dg
585f19d884 More fix. 2023-05-07 11:46:30 +00:00
dg
bb2b7d7df6 Typo fix. 2023-05-07 11:45:07 +00:00
dg
e75d218438 Attempt to run the corpus tests on github for Linux. 2023-05-07 11:44:14 +00:00
dg
7f81b554fd Try to decode the test corpus and make sure there were no decode regressions. 2023-05-07 11:37:50 +00:00
dg
2490f19a1a Add a preliminary option linter. Fix the format errors which showed up. 2023-05-07 00:29:21 +00:00
David Given
30f382bf22 Merge pull request #670 from davidgiven/dmf
Support DMF.
2023-05-07 00:15:13 +01:00
dg
ad03c187cf Merge from master. 2023-05-06 22:45:46 +00:00
David Given
06560b5a5a Merge pull request #672 from davidgiven/usb
Upgrade libusbp.
2023-05-06 23:43:37 +01:00
dg
7c40093698 Try to work around weird test failure on Windows. 2023-05-06 22:30:50 +00:00
dg
d37c75d703 Made test failures log to stdout. 2023-05-06 22:15:01 +00:00
dg
82bfb9a303 Upgrade libusbp. 2023-05-06 21:19:07 +00:00
dg
01682101a6 Update documentation. 2023-05-06 19:59:45 +00:00
dg
3c46f787b1 Always do an update when the state changes, because otherwise certain events
get lost.
2023-05-06 19:21:31 +00:00
dg
591d200283 Adjust DMF gaps. 2023-05-06 19:20:32 +00:00
dg
195534c21e Configure the 1680kB DMF format file system. 2023-05-06 18:11:24 +00:00
dg
0f9d851a29 Adjust the DMF format timings to match that of the Microsoft disk image. 2023-05-06 17:26:56 +00:00
dg
18a03baf99 Display object lengths in the flux viewer. 2023-05-06 15:34:44 +00:00
dg
5e06db4a52 Add preliminary DMF support. 2023-05-06 11:02:09 +00:00
David Given
bf78508ef7 Merge pull request #669 from davidgiven/hplif
Do some LIF enhancement.
2023-05-06 11:38:17 +01:00
dg
137c0340fb Fix month, which was off-by-one. Add custom attributes for the other LIF dirent
properties.
2023-05-06 10:20:10 +00:00
dg
e6d9de2d80 Decode timestamps into a custom property. 2023-05-06 10:16:12 +00:00
dg
d9b319eaed Add textual file types (where known) for LIF files. 2023-05-06 10:00:12 +00:00
dg
ba1f8b8ed8 Add missing file. Reformat. 2023-05-06 00:28:13 +00:00
dg
10605b3908 Add a read-only MS2000 file system, and a format (with no encoder or decoder). 2023-05-06 00:21:10 +00:00
dg
e31e547322 Add a routine to count the number of bits in a word. 2023-05-06 00:20:48 +00:00
dg
f2e713bde3 Stop trying to build for OSX 10.15, because it looks like the github runners
have been turned off.
2023-05-05 23:19:44 +00:00
David Given
94e2e494c9 Merge pull request #667 from davidgiven/options
Overhaul the options system.
2023-05-06 00:18:41 +01:00
dg
5af408e1d1 Add missing file. 2023-05-05 23:07:57 +00:00
dg
77bdc727ab Properly handle default options in the CLI. 2023-05-05 22:57:49 +00:00
dg
eb26426424 Consolidate the Victor formats into each other. 2023-05-05 22:29:26 +00:00
dg
f624bb6e5b Consolidate the Mac formats into each other. 2023-05-05 22:24:28 +00:00
dg
4a8fb9288c Remove obsolete file. 2023-05-05 22:16:11 +00:00
dg
f8f5873973 Consolidate (and typo fix) the ampro format. 2023-05-05 22:15:37 +00:00
dg
5f4903f2d1 Rename the commodore1541 options to be a bit more standard. 2023-05-05 22:07:13 +00:00
dg
b02a894663 Consolidate the Brother formats. 2023-05-05 22:03:49 +00:00
dg
510b530551 Consolidate all the IBM formats together. 2023-05-05 21:37:49 +00:00
dg
c36662205b Typo fix. 2023-05-05 21:18:27 +00:00
dg
a2ffe06792 Consolidate the MX formats into each other. 2023-05-05 21:16:26 +00:00
dg
0f56108bf5 Consolidate the Apple II formats together. 2023-05-05 21:11:06 +00:00
dg
199cefdb71 Fix radiobuttons for multiple option groups. 2023-05-05 21:06:57 +00:00
dg
1bdeaa326c Consolidate some Hewlett-Packard LIF disks together. 2023-05-05 20:46:49 +00:00
dg
cce8cfe88d Consolidate the Tiki 100 formats. 2023-05-05 20:36:39 +00:00
dg
bcfc0217dc Consolidate the Northstar formats into each other. 2023-05-05 20:29:45 +00:00
dg
7cfa080220 Merge from master. 2023-05-05 20:23:17 +00:00
dg
45ebc0f40f Consolidate the Micropolis formats into one. 2023-05-05 20:22:55 +00:00
dg
38d575eda7 Remember to set a default format. 2023-05-05 20:18:53 +00:00
dg
9cb284583b Consolidate all the Atari ST formats together. 2023-05-05 20:15:47 +00:00
dg
137b921e8d Consolidate all the Acorn formats together. 2023-05-05 20:07:44 +00:00
dg
8c876f555d Move from option exclusivity groups to option groups, which are better. 2023-05-05 19:55:56 +00:00
David Given
0988dd524b Merge 2dc649ef09 into 51fa3c5293 2023-05-04 21:10:25 +00:00
dg
2dc649ef09 Add read-only support for LIF filesystems. 2023-05-04 21:04:55 +00:00
dg
baf02cb849 Add support for the HPLIF 616kB format (contributed by Eric Rechlin). 2023-05-04 19:12:51 +00:00
David Given
51fa3c5293 Merge pull request #664 from bdwheele/ibmpc-8-sector-formats
Adding IBM PC 8-sector formats
2023-05-02 12:27:15 +01:00
Brian Wheeler
134dd6c37d Adding IBM PC 8-sector formats 2023-05-01 08:24:24 -04:00
David Given
d766e1f9a9 Merge pull request #663 from ejona86/micropolis-200ms
Micropolis: disk rotate period is 200 ms
2023-04-24 13:12:18 +02:00
Eric Anderson
d298f5b16e Micropolis: disk rotate period is 200 ms
The disks are expected to contain 100,000 bitcells, so clock_period_us
and rotational_period_ms need to align.
2023-04-23 13:54:50 -07:00
dg
ed634fbbf6 Fix build failure. 2023-04-07 16:20:32 +00:00
dg
4c776d584b Add read support for A2R v2 files. 2023-04-07 15:00:20 +00:00
David Given
c2c04862a2 Merge pull request #662 from davidgiven/scp
Adjust the SCP write logic so an unspecified TPI is treated as 96.
2023-04-07 11:25:00 +02:00
dg
ccd9539015 Adjust the SCP write logic so an unspecified TPI is treated as 96 (the usual). 2023-04-07 09:02:46 +00:00
David Given
624c597735 Merge pull request #661 from davidgiven/scp
Fix reading 48tpi SCP files.
2023-04-06 23:51:30 +02:00
dg
9300aa79c3 Read 48tpi SCP files correctly. 2023-04-06 21:49:06 +00:00
David Given
9e522c7da2 Merge ef60bfff6b into df6e47fa50 2023-04-06 18:20:31 +00:00
dg
ef60bfff6b Looks like the Roland D-20 format is the same as Brother240??? 2023-04-06 17:07:00 +00:00
dg
635c6c7bfe Add an explorer option to show raw bits. 2023-04-06 16:07:18 +00:00
David Given
df6e47fa50 Merge pull request #659 from davidgiven/n88
Add a histogram viewer to the imager. Because it's there.
2023-04-06 11:20:36 +02:00
dg
654cdcd3d1 Add a histogram viewer to the imager. Because it's there. 2023-04-06 08:59:05 +00:00
dg
a633b73e12 Add boilerplate for Roland D20 decoder. 2023-04-05 22:36:54 +00:00
David Given
ba93dae240 Merge pull request #657 from davidgiven/d20
Improve the explorer.
2023-04-05 23:11:49 +02:00
dg
8e0ca85d1e Add the histogram viewer and clock guess button. 2023-04-05 20:43:49 +00:00
dg
56a4926bd3 Factor out the clock guess code so it can be used elsewhere. 2023-04-05 19:17:37 +00:00
dg
6a2aae4ef2 Create new branch named "d20" 2023-04-05 17:47:31 +00:00
dg
ec68ce3bfa Try to fix dev release. 2023-04-04 22:43:06 +00:00
dg
a777a5be30 Typo fix. 2023-04-04 21:48:45 +00:00
David Given
b553a8b1fb Merge pull request #654 from davidgiven/search
Overhaul the GUI, to make it... gooier.
2023-04-04 22:37:37 +01:00
dg
b119e1f72d Tidying. 2023-04-04 21:02:03 +00:00
dg
7345d3e6c1 Fix merge conflict. 2023-04-04 20:23:05 +00:00
dg
e9b7a7bb52 Fix the icon background colour on Windows. 2023-04-04 20:20:32 +00:00
dg
2022732dd9 Some final tidying. 2023-04-04 20:12:21 +00:00
dg
63544647b6 Add a custom IconButton class. Rework the source icon list. Again. 2023-04-04 19:42:24 +00:00
dg
6b62585ad5 Be more intelligent about resizing the main window. 2023-04-03 22:45:25 +00:00
dg
14027210f7 Even more GUI tweaking. 2023-04-03 21:53:36 +00:00
dg
3df17b23b8 Turns out you can't unselect exclusive options in the GUI, so add an 'off' for
the Apple filesystem selection.
2023-04-03 21:53:26 +00:00
dg
cbf3f56562 The xxd binary is in the vim package. For some reason. 2023-04-02 22:59:20 +00:00
dg
1f74d9189f Make the new GUI actually work, to a certain extent. 2023-04-02 22:54:09 +00:00
dg
137658d1d6 Flesh out the source list a bit. 2023-04-02 21:34:02 +00:00
dg
5b627bd2b1 wxImageList tweak. 2023-04-02 19:54:08 +00:00
dg
38ff08885a Experiment with wxImageList. 2023-04-02 19:42:55 +00:00
dg
a89993aabb Fix the UI. 2023-04-02 19:19:16 +00:00
dg
d6353403e2 Set the icon again. 2023-04-02 17:14:59 +00:00
dg
bc62ee04c0 Some random tweaks to improve state machine look and feel. 2023-04-02 17:11:46 +00:00
dg
d3ff836b63 Put the headers in the right order to keep Windows happy. 2023-04-02 16:54:37 +00:00
dg
a7aac5578e Remove the explorer search button for now. 2023-04-02 16:41:56 +00:00
dg
add5a141d3 Actually make the new GUI model work. Mostly? 2023-04-02 12:38:12 +00:00
dg
330410ec61 Rework the GUI so that each panel is a different class. It doesn't work yet,
but the bulk of the restructuring is done.
2023-04-02 12:37:27 +00:00
dg
d0f49dcfa6 Add (but don't implement) the explorer search box. 2023-04-01 18:27:01 +00:00
David Given
124f6ab7cb Merge 471f63592e into e4204196cd 2023-04-01 13:05:59 +00:00
dg
471f63592e Typo fix. 2023-04-01 12:56:17 +00:00
dg
50e210c72f It seems the build artifact needs to be renamed for 10.15. 2023-04-01 12:40:05 +00:00
dg
d3396aa535 Use two threads for building --- seems we can do this on github. 2023-04-01 12:32:47 +00:00
dg
5ed8b838bc Another typo fix. 2023-04-01 12:15:04 +00:00
dg
d1757eacc2 Typo fix. 2023-04-01 12:14:37 +00:00
dg
0692e5f5d5 Try building for OSX 10.15 and see what happens. 2023-04-01 12:13:34 +00:00
David Given
e4204196cd Merge pull request #650 from davidgiven/flags
Allow options to be set in the GUI.
2023-03-31 23:37:17 +01:00
dg
241d4342e4 Make exclusivity groups work in the GUI. 2023-03-31 22:11:40 +00:00
dg
c04cbc631c Option name tidy. 2023-03-31 22:11:19 +00:00
dg
29b273ad7b Correctly set the path of files. 2023-03-31 22:10:47 +00:00
dg
9720dab2f6 Optimise the option radiobuttons a bit. 2023-03-31 22:10:13 +00:00
dg
bddc64a324 Merge from master. 2023-03-31 22:09:11 +00:00
David Given
eb324f14de Merge pull request #648 from davidgiven/basis
Add support for the Basis-108 Apple II clone.
2023-03-31 22:34:32 +01:00
David Given
b78a057c81 Merge branch 'master' into basis 2023-03-31 22:10:47 +01:00
dg
5751725213 Allow options to be selected in the GUI. 2023-03-31 21:09:40 +00:00
dg
f194392f99 Fix the broken AppleDOS double-sided disks. Allow access to side 1 on AppleDOS
volumes.
2023-03-31 18:24:03 +00:00
dg
fea62178af Apply what might be the right translation to the CP/M boot tracks. 2023-03-31 18:06:21 +00:00
David Given
33ef4ce8de Merge pull request #649 from davidgiven/pme
Rename the PME format to psos800.
2023-03-31 18:56:34 +01:00
dg
3728120f95 Add support for CP/M disks and filesystems. 2023-03-31 17:56:18 +00:00
dg
2944b9b3f6 Rename the PME format to psos800. 2023-03-31 17:23:33 +00:00
David Given
3430574364 Merge pull request #646 from davidgiven/pme
Add a format for the PME-68-12 SBC.
2023-03-31 11:59:00 +01:00
dg
fc5a5212c0 Merge. 2023-03-30 22:21:30 +00:00
dg
20f724ed13 Update README. 2023-03-30 22:21:00 +00:00
dg
94c1d21938 Rename the pme profile to pme68_800. 2023-03-30 22:20:29 +00:00
David Given
a1a9666b6f Fix the AppleDOS sector translation. 2023-03-30 12:26:13 +02:00
dg
0551ddc276 Add write support for Apple II 640kB disks. 2023-03-28 20:36:43 +00:00
dg
049ffd3b04 Add a profile for the Basis Apple II format. 2023-03-28 19:40:58 +00:00
dg
c28f757c5c Add a very prototype AppleDOS VFS plugin. 2023-03-28 19:29:02 +00:00
dg
91dbb86e64 Add missing files. Rename the Apple II formats. 2023-03-28 16:29:59 +00:00
dg
27a04ee22b Add initial support for the Basis-108. 2023-03-27 23:07:59 +00:00
dg@cowlark.com
5cefce9922 Fix the thread termination errors every time the directory browser is used. 2023-03-27 21:06:59 +00:00
dg
8fb4c90bed Remove the retry limit when reading from virtual flux sources, to allow flux
files with very large numbers of reads to be processed.
2023-03-27 20:14:49 +00:00
dg
81753669cc Add the 'fluxengine merge' command. 2023-03-27 20:12:46 +00:00
dg
0a0a72bcf3 Add configurable head jiggle on error, just to see if the head needs settling. 2023-03-27 18:40:35 +00:00
dg
c4a6e3e063 Fix the Windows development build artifact. 2023-03-26 23:15:20 +00:00
dg
1138e6b77f Try a different way to fetch the filedes length. 2023-03-26 21:22:11 +00:00
dg
030f9218d6 Hopefully fix the layout this time? 2023-03-26 21:17:07 +00:00
dg
2fff32e8f2 Don't return bad data which makes the GUI crash. 2023-03-26 18:52:29 +00:00
dg
5b2aa9926f Robustness and warning fixes. 2023-03-26 18:50:14 +00:00
dg
921e178e83 Tone down the bad-sector-size warning a bit. 2023-03-26 18:23:25 +00:00
dg
25ffd900c8 Realise that the PME format is HCS. Add a really basic and probably broken
PHILE filesystem reader.
2023-03-26 18:21:51 +00:00
dg
7ea4e116cc Add a warning if the configured sector size doesn't match the one on disk. 2023-03-26 16:25:40 +00:00
dg
a9daec36f5 Add prototype PME-68-12 format. 2023-03-24 21:07:48 +00:00
David Given
cebc7c6cd2 Merge 3f85c9f006 into 909f0d628b 2023-01-06 21:30:18 +00:00
dg
3f85c9f006 Adjust timings to be more correct. 2023-01-06 21:28:51 +00:00
dg
ed5efd7b87 Reenable optimisation. Again. 2023-01-06 21:28:35 +00:00
dg
4984a53bfd First hypothetically working version of the agat encoder. 2023-01-05 18:36:01 +00:00
dg
b0c77653a2 Add the boilerplate for the Agat encoder. 2023-01-05 12:04:36 +00:00
David Given
909f0d628b Merge pull request #637 from davidgiven/cpm
Fix an issue with extent handling in the CP/M file system.
2022-12-18 23:21:45 +01:00
dg
e27e3ada92 Fix an issue with extent handling in the CP/M file system; actually add a CP/M
test.
2022-12-18 22:00:52 +00:00
dg
339ea3b5a4 Move the * and + Bytes methods onto Bytes itself. 2022-12-18 22:00:16 +00:00
dg
9bd8b8915e Update format file. 2022-12-18 21:59:14 +00:00
dg
35008656a9 Remove stray logging. 2022-12-17 17:54:33 +00:00
David Given
825089458f Merge pull request #636 from davidgiven/tiki
Add support for the Tiki 100 formats.
2022-12-17 12:20:18 +01:00
dg
4a086d94b7 Add best-guess CP/M filesystem definitions for the Tiki 90kB and 800kB formats. 2022-12-17 11:01:46 +00:00
dg
0aeddf7e98 Add support for the Tiki 100 formats. 2022-12-17 10:59:30 +00:00
David Given
4922d1deb4 Merge pull request #634 from davidgiven/mac2
Fix sector skew, again.
2022-12-05 21:57:45 +01:00
dg
86d0893261 Adjust mac encoder clock to be more like the real thing. 2022-12-05 20:27:52 +00:00
dg
e4c67f18bd Fix the sector skew stuff, again. Modify the mac400 format to emit sectors in
the right order.
2022-12-05 20:22:01 +00:00
David Given
d07c5a94e1 Merge pull request #632 from davidgiven/layout
Rework the layout stuff to be more correct.
2022-12-04 21:32:17 +01:00
dg
a91dee27e7 Rework the layout stuff to be more correct. Physical skew no longer affects the
order in the resulting images.
2022-12-04 19:19:37 +00:00
David Given
e3219087c9 Merge pull request #630 from davidgiven/brother
Fix some nasty Brother bugs.
2022-12-02 22:20:32 +01:00
dg
cc9ec84aec Physical skew turns out to be horribly broken, so turn it off for the Brother
formats (the only ones which use it) until we can sort it out.
2022-12-02 20:17:42 +00:00
dg
a33cc5710c Be more rigorous about checking for invalid brother120fs filesystems --- even
though the filesystem is so simple that positively identifying it is quite
hard.
2022-12-02 19:54:58 +00:00
David Given
c2b148288a Merge pull request #628 from davidgiven/osx
Fix a bunch of OSX things.
2022-12-01 22:24:47 +01:00
David Given
a483567564 Fix the explorer to work on OSX. Lots of other vaguely OSX-related changes. 2022-12-01 21:37:59 +01:00
David Given
bd99bc6d94 Don't trust isprint() to return ascii characters, because Unicode. 2022-12-01 21:28:49 +01:00
David Given
8f79071aad Turn optimisation back on! 2022-12-01 21:28:31 +01:00
David Given
ef9071049b Merge pull request #627 from davidgiven/osx
Produce more correct OSX app bundles.
2022-12-01 20:53:58 +01:00
David Given
60e1ab8cca Dependency fix? 2022-12-01 20:21:33 +01:00
David Given
d3dbfd3154 Use dylibbundler to create possibly-working OSX app bundles. 2022-12-01 19:49:50 +01:00
David Given
ee2dffb498 Try and generate correct OSX app bundles. 2022-12-01 19:45:51 +01:00
David Given
6d9510cc65 Merge pull request #626 from elosha/macosxfixes
Library fallback path fixed & MacPorts compatible
2022-12-01 17:17:36 +01:00
Eliza Winterborn
49f0f5d000 Library fallback path fixed & MacPorts compatible
Use correct variable. Also look for libs in MacPorts' default lib path /opt/local/lib, not just HomeBrew's
2022-12-01 17:03:36 +01:00
dg
d8528d889a Add another missing file. 2022-11-29 20:55:45 +00:00
dg
ec439a5f2a Add file which has been missing since forever... 2022-11-29 20:55:07 +00:00
David Given
d88110488e Merge pull request #624 from davidgiven/flx
Add support for reading FLUXCOPY .flx files.
2022-11-29 21:53:13 +01:00
dg
2f4b15293a Adjust the FLX tick rate to something more resembling normality. 2022-11-29 20:26:58 +00:00
dg
3d71f32587 Update documentation. 2022-11-29 20:18:21 +00:00
dg
5136dda598 Made the FLX reader work. 2022-11-29 20:17:24 +00:00
dg
d26940304b Boilerplate for a FLX file reader. 2022-11-29 19:33:47 +00:00
David Given
f9f11b4966 Merge pull request #623 from davidgiven/smaky
Improve the flux viewer.
2022-11-28 21:42:23 +01:00
dg
1297b568ba Display the raw flux view in bytes as well as bits. 2022-11-28 20:22:34 +00:00
dg
fd10840cc0 Display raw bits in the flux viewer. 2022-11-28 20:15:57 +00:00
David Given
7e86be979d Merge pull request #622 from davidgiven/smaky
Add basic filesystem support for the Smaky 6.
2022-11-28 00:00:48 +01:00
dg
731d1efcc4 Add missing file. 2022-11-27 22:38:44 +00:00
dg
dfda8be30c Support tabs in the file viewer text view. 2022-11-27 22:24:30 +00:00
dg
7dd1b6d8e9 Add Smaky 6 filesystem documentation. 2022-11-27 22:23:55 +00:00
dg
ec1bcdb9e5 Add a simple Smaky 6 filesystem backend. 2022-11-27 22:22:59 +00:00
dg
c0f46d2bd4 Create new branch named "smaky" 2022-11-27 22:21:41 +00:00
David Given
615dca3130 Merge pull request #621 from davidgiven/osx
Add a proper OSX GUI application.
2022-11-27 17:27:04 +01:00
David Given
9cf9597c54 Try and make an OSX release. 2022-11-27 17:26:43 +01:00
David Given
e24ee648e7 Add license texts for the included libraries. 2022-11-27 17:06:28 +01:00
David Given
e3518dc389 Upload the OSX package. 2022-11-27 16:59:45 +01:00
David Given
693ba20606 Add rules to build the OSX package. 2022-11-27 16:58:50 +01:00
dg
b947c6c186 Add the skeleton of an OSX application. 2022-11-27 15:00:31 +00:00
David Given
7f8ecb8514 Fix broken conditional due to typo. 2022-11-27 15:18:07 +01:00
David Given
4df6afa9c1 Merge pull request #620 from davidgiven/b593
Correct generation of SCP files.
2022-11-27 13:28:02 +01:00
dg
d0620f8efe Fix readTracks to use locations. 2022-11-27 11:55:25 +00:00
dg
2b1a6dbb03 Make the scp flux sink use the layout to determine which tracks and sectors are
being written rather than the range flags directly.
2022-11-27 11:52:16 +00:00
David Given
c6ef667c3f Merge pull request #619 from davidgiven/b602
Fix weird error when trying to create fatfs filesystems.
2022-11-27 12:33:33 +01:00
dg
8c1d1bec93 Create new branch named "b593" 2022-11-27 11:20:30 +00:00
dg
8be174e65a Fix incorrect types when calling fatfs which was leading to really weird
behaviour when optimisation was enabled.
2022-11-27 11:11:26 +00:00
dg
6d37fafb02 Add a helper function for checking if a file exists. 2022-11-27 11:10:58 +00:00
dg
46ce882daa Allow implicit creation of disk images when writing. 2022-11-27 11:09:46 +00:00
David Given
6d14cbdb9b Merge pull request #618 from davidgiven/b609
Fix --doc to not hang.
2022-11-27 11:57:38 +01:00
dg
4bf6b433ae Create new branch named "b602" 2022-11-27 10:26:11 +00:00
dg
87a1b2e6f8 Don't hang when calling findAllProtoFields on recursive protos. 2022-11-27 10:24:40 +00:00
dg
c6ee48ec85 Create new branch named "b609" 2022-11-27 10:04:42 +00:00
David Given
b58a6b1649 Merge pull request #617 from davidgiven/smaky
Add support for the Smaky 6.
2022-11-27 01:00:21 +01:00
dg
bd9736df93 Typo fix. 2022-11-26 23:59:50 +00:00
dg
3b9c966e3d Add Smaky documentation. 2022-11-26 23:34:20 +00:00
dg
96c9a89171 Typo fixes. 2022-11-26 23:28:23 +00:00
dg
c374ffd15e Increase the smaky disk signature to 32 bits. 2022-11-26 22:56:45 +00:00
dg
c53109e1a1 Add the disk explorer. 2022-11-26 22:56:24 +00:00
dg
4598b3a7a6 Fix line endings. 2022-11-26 11:19:05 +00:00
dg
cf975b74bf Rename smaky to smaky6. 2022-11-26 11:18:38 +00:00
dg
5d65dcf3c8 Even better Smaky reads, and maybe with sector 0 in the right place. 2022-11-25 21:28:59 +00:00
dg
f299ec1f8d More Smaky improvements. 2022-11-25 20:23:24 +00:00
dg
6677034774 Improved record view. 2022-11-25 20:22:52 +00:00
dg
3c7c4639a9 Massively improved the quality of Smaky reads. 2022-11-25 19:33:29 +00:00
dg
7e9a1268a5 Add an extremely prototype version of the Smaky decoder. 2022-11-23 21:44:40 +00:00
dg
a60b8e68ca Add a Bytes method for reversing each bit. 2022-11-23 21:44:10 +00:00
dg
b2161aa67e Create new branch named "smaky" 2022-11-22 19:09:54 +00:00
David Given
d1fffb1d08 Merge pull request #616 from davidgiven/gui
Fix a crash when using the GUI.
2022-11-21 20:37:52 +01:00
dg
52d66d9555 Only iterate the environment if the set has been created. 2022-11-21 19:10:37 +00:00
David Given
66f2d359e2 Merge pull request #615 from davidgiven/vfs
Don't define a global structure called Entry
2022-11-21 20:07:51 +01:00
dg
8327f33ee6 Create new branch named "gui" 2022-11-21 18:37:47 +00:00
dg
d4a94551d9 Don't define a global structure called Entry because it conflicts with
something in adflib.
2022-11-21 18:31:59 +00:00
dg
d2a545d83e Merge from master. 2022-11-21 17:39:39 +00:00
David Given
aee4eac271 Merge pull request #613 from davidgiven/proto
Do some long needed proto cleanup
2022-11-21 00:13:32 +01:00
David Given
cbeddb11bc Fix one last use of has_ to identify a flux writer type. 2022-11-20 23:37:04 +01:00
David Given
4c51cf8316 Update documentation. 2022-11-20 23:36:47 +01:00
David Given
345cd6bd92 Convert the VFS protos to use enums rather than oneofs. 2022-11-20 10:37:45 +01:00
David Given
48540245b5 Convert the imagereader/writer to use proto enums rather than oneofs. 2022-11-20 10:25:19 +01:00
David Given
088bd9434d Switch from using a oneof to an explicit enum for the flux source/sink
configurations, as this allows default options for multiple source/sink types.
2022-11-19 22:52:52 +01:00
David Given
8ba8c58377 Add a config for the ICL Model 30. 2022-11-19 20:10:39 +01:00
David Given
4ae43d0503 Merge pull request #607 from tdaede/fix_layout_cache
Remove the layout cache and rename layout -> trackInfo.
2022-10-13 23:01:44 +02:00
David Given
00fdb90adf Merge pull request #556 from tdaede/fix_d88_data_length
D88: Use the data length field to seek past any extra data.
2022-10-03 18:25:42 +02:00
Thomas Daede
f8257e697a D88: Use the data length field to seek past any extra data.
This will effectively ignore the field length if it is shorter
than the sector size (or 0).
2022-10-02 16:45:51 -07:00
David Given
0ddfd3bead Merge pull request #605 from tdaede/fix_physical_sector_ordering
D88/NFD: Add physical layout before adding sector.
2022-10-02 20:46:38 +02:00
David Given
4797d1ea10 Merge pull request #604 from tdaede/density_fix_2
Force density setting for D88/NFD.
2022-10-02 20:45:28 +02:00
Thomas Daede
d20ce3dde7 Remove the layout cache and rename layout -> trackInfo.
The layout cache is busted and seems not worth the effort.

Fixes #603.
2022-10-02 09:43:48 -07:00
Thomas Daede
ef5f7ec9c3 D88/NFD: Add physical layout before adding sector.
Partially fixes #603, it is still busted if the number of
tracks is specified larger than what is in the image, which
used to work.
2022-10-01 19:43:17 -07:00
Thomas Daede
69c60c4026 Force density setting for D88/NFD.
This fixes #560 (partially).

I do not understand how the protobuf parsing stuff works enough
to make it detect optional fields.
2022-10-01 18:48:12 -07:00
David Given
2f4f2083ba Merge pull request #600 from wybren1971/IMDwriter
bug fix in data rates
2022-09-21 16:00:02 +02:00
wybren1971
77ada0471b bug fix in data rates 2022-09-21 15:20:58 +02:00
David Given
00cab46a0d Merge pull request #596 from davidgiven/c64
Minor C64 changes.
2022-09-16 19:46:11 +02:00
David Given
7f7460f3f3 Update C64 documentation. 2022-09-16 19:16:30 +02:00
David Given
c225eef9ad Add a format for the CMD FD2000. 2022-09-16 19:13:14 +02:00
David Given
460f920502 Use options for the 1541 35-track/40-track switch. 2022-09-16 18:52:39 +02:00
David Given
c7677e5514 Merge pull request #592 from davidgiven/cleanup
Do lots of cleanup.
2022-09-16 12:58:56 +02:00
David Given
12fb39baa9 More variable renaming. 2022-09-16 00:31:19 +02:00
David Given
201fd22861 Roll requiredSectors into readerwriter.cc. 2022-09-16 00:26:02 +02:00
David Given
d0fb85e712 Rename all the remaining layout and location variables to trackInfo (where
appropriate).
2022-09-16 00:20:54 +02:00
David Given
81cbd00cc8 Rename Track to TrackInfo, which better describes what it is. 2022-09-16 00:09:39 +02:00
David Given
4a565b5ea0 Split the Layout class. 2022-09-16 00:07:22 +02:00
David Given
82f61eee12 Eliminate Location in favour of Layout. 2022-09-15 23:52:07 +02:00
David Given
88fc7ff9c3 Begin cleaning up the Layout stuff. 2022-09-15 21:45:12 +02:00
David Given
8eb17bf104 Merge pull request #591 from davidgiven/c64
Rework the entire layout stuff.
2022-09-15 21:07:16 +02:00
David Given
9a8fc80220 Massive overhaul of how the physical/logical layout mapping is done, to make it
more consistent and bidirectional everywhere and just generally better.
Hopefully this fixes that pesky 1581 problem.
2022-09-15 20:23:33 +02:00
David Given
e5e652fad2 Merge pull request #590 from davidgiven/options
Add a feature where configs can add simple command line options.
2022-09-14 00:53:14 +02:00
David Given
924d077315 Don't allow includes inside options. 2022-09-14 00:20:16 +02:00
David Given
44a7505295 Clean up the Atari formats. 2022-09-14 00:18:44 +02:00
David Given
b1a6fa4084 Make the AppleDOS and ProDOS settings options. 2022-09-14 00:16:42 +02:00
David Given
0665fc0a6f Add an option for, er, options defined in config files. 2022-09-14 00:04:29 +02:00
David Given
4bf5fd49d6 Merge pull request #589 from davidgiven/osx
Error out if you're not using GNU Make 4.
2022-09-13 22:50:35 +02:00
David Given
0a6bc99ecd Error out if you're not using GNU Make 4. 2022-09-13 22:48:03 +02:00
David Given
45cc617fc5 Merge pull request #588 from davidgiven/c64
One more attempt to fix the 1581 format...
2022-09-13 21:41:24 +02:00
David Given
6dc5eabdf0 Oops. I got the sides swapped on the 1581 format. 2022-09-13 21:35:26 +02:00
David Given
48d3bc55bf Merge pull request #586 from davidgiven/cleanup
Lots of cleanup stuff I've been putting off
2022-09-13 00:58:31 +02:00
David Given
6b7e81d7fb Move requiredSectors() to the base class. 2022-09-13 00:32:04 +02:00
David Given
dce6248193 Victor9k no longer uses collectSectors(). 2022-09-13 00:22:46 +02:00
David Given
0e349ede4c TIDS990 no longer uses collectSectors. 2022-09-13 00:19:45 +02:00
David Given
60117471a7 No more collectSectors in Brother. 2022-09-13 00:06:55 +02:00
David Given
3c23e7b047 Merge. 2022-09-12 23:58:03 +02:00
David Given
b48e1ba9e0 Remove the trivial collectSectors() methods which have been replaced by the
base class.
2022-09-12 23:55:52 +02:00
David Given
1267191e8e Abstract is for Java. 2022-09-12 23:52:24 +02:00
David Given
65a43b64ae Merge pull request #585 from davidgiven/doc
Update documentation.
2022-09-12 23:37:16 +02:00
David Given
09e446a26e Adjust screenshot sizes to be less overwhelming. 2022-09-12 23:34:51 +02:00
David Given
2ecb3059e5 Typo fix. 2022-09-12 23:33:10 +02:00
David Given
237cb42695 Update documentation. 2022-09-12 23:32:20 +02:00
David Given
49b6bbff37 Add sector skew support to SectorListProto; add a partial definition for the
Victor 9000.
2022-09-12 23:10:24 +02:00
David Given
5e05083008 Merge pull request #584 from davidgiven/c64
Another attempt at fixing the C64 1581 bug.
2022-09-12 22:20:39 +02:00
David Given
339e9cca10 Hopefully actually fix the C64 side issue, this time, by rethinking how the IBM
encoder/decoder handles side swapping. We want to be able to swap everything,
or just the side bytes.
2022-09-12 22:04:58 +02:00
David Given
d441ad8875 Remember to mark the Brother filesystem as R/W. 2022-09-12 17:48:08 +02:00
David Given
72fc6bf913 Merge pull request #583 from davidgiven/windows
Add a Windows installer.
2022-09-12 17:42:18 +02:00
David Given
fcf278c61c Yaml syntax fix. 2022-09-12 16:59:58 +02:00
David Given
890404ded5 Fix the installer to work. 2022-09-12 16:44:07 +02:00
David Given
6fd9b47c45 Attempt to add a Windows installer. 2022-09-12 16:19:05 +02:00
David Given
003651ec68 Merge pull request #582 from davidgiven/c64
Fix the 1581 encoder/decoder configuration.
2022-09-12 16:00:19 +02:00
David Given
c63a761ca4 Actually fix the c64 1581 side issue. Turns out the data's not flipped between
the two sides, only the bit in the sector header...
2022-09-12 15:34:21 +02:00
David Given
32dcd1551b Apparently the 1581 doesn't want sides swapped after all? 2022-09-12 15:09:32 +02:00
David Given
90fbdd5fab Merge pull request #581 from davidgiven/brother2
Add put and delete support for the Brother120 filesystem.
2022-09-12 01:18:59 +02:00
David Given
1fea200582 Implement delete. Fix a pile of bugs. 2022-09-12 00:56:34 +02:00
David Given
55b8a62f64 Add Brother120 support for putting files. 2022-09-12 00:33:13 +02:00
David Given
a8906bf58f Merge pull request #576 from davidgiven/mapper
Fix the mapper, by removing most of it.
2022-09-11 22:35:59 +02:00
David Given
0d6b9263d4 Merge from master. 2022-09-11 21:05:31 +02:00
David Given
f091a54ca6 Merge pull request #580 from davidgiven/gui
Remember to clear the config before loading a new one.
2022-09-11 21:04:50 +02:00
David Given
5262929c16 Remember to clear the config before loading a new one. 2022-09-11 21:03:47 +02:00
David Given
c1ca8a3ae6 Merge pull request #578 from davidgiven/gui
Make includes work in the GUI.
2022-09-11 20:37:42 +02:00
David Given
a7e36472d5 Make includes work in the GUI. 2022-09-11 20:08:47 +02:00
David Given
538a22e2f7 Another attempt at making filesystem sector ordering work again. 2022-09-11 19:53:18 +02:00
David Given
0c40a3e79c File system mapping now sort of works in the filesystem, but there are
problems. These are potentially due to an incorrect Prodos mapping but I'm not
sure.
2022-09-11 19:01:25 +02:00
David Given
3cb098f9ba Rip out the old approach to soft sector remapping as it wasn't working. 2022-09-11 17:05:40 +02:00
David Given
ea1ab029f3 Add a very untested ProDOS filesystem module. 2022-09-11 13:19:15 +02:00
David Given
92a76a6d39 Reset the environment in the right place. 2022-09-11 13:08:46 +02:00
David Given
c451950dbf Fix the 40-track option to actually work! 2022-09-10 23:56:59 +02:00
David Given
644adc43ed Add UI for setting 40-track mode (because it's important). 2022-09-10 23:51:18 +02:00
David Given
63a7340c21 Realise that I was actually applying sector mappings _twice_, resulting in them
all cancelling out...
2022-09-10 23:29:00 +02:00
David Given
6824f00867 Add the remaining ADFS formats. 2022-09-10 22:51:37 +02:00
David Given
3cb48b40aa Add missing file. 2022-09-10 22:48:03 +02:00
David Given
dda713a6be Remove the rest of the mapper. 2022-09-10 22:47:35 +02:00
David Given
415aa82a6f The top-level tracks and heads fields are now inferred automatically from the
layout if not set, so we don't have to set them everywhere.
2022-09-10 22:29:27 +02:00
David Given
4ae664fd93 Sanitise the layout structure somewhat. Fix ADFS and Apple II formats. 2022-09-10 22:08:23 +02:00
David Given
5d1e304642 Apple II disks actually have 35 sectors. 2022-09-10 22:00:13 +02:00
David Given
6b228d7a0a Add functionality for clearing the cache between runs. 2022-09-10 21:27:14 +02:00
David Given
085ad5f2a4 Actually start using the new physical sector stuff. 2022-09-10 20:43:24 +02:00
David Given
e40e6bd07f Remove the remapper part of the mapper. 2022-09-10 20:13:38 +02:00
David Given
a6db36e7b3 Convert from LayoutData to Layout. 2022-09-10 19:53:05 +02:00
David Given
1a4caccd07 Rename Sector.logicalSector to Sector.physicalSector. 2022-09-10 18:59:06 +02:00
David Given
7f1017ebd9 Remove some obsolete mapper code. 2022-09-10 18:47:55 +02:00
David Given
f792cd2677 Merge pull request #575 from davidgiven/vfs
Fix some late GUI bugs and add an icon.
2022-09-10 13:51:49 +02:00
David Given
1361cab603 Once again put the optimisation level back to O3. 2022-09-10 13:42:16 +02:00
David Given
05b784d203 Make the icon marginally less awful. 2022-09-10 13:29:56 +02:00
David Given
542c3e38f5 Add a terrible icon. 2022-09-10 13:07:09 +02:00
David Given
bcdead1eca Don't use the DnD workaround on non-gtk platforms. 2022-09-10 11:28:50 +02:00
David Given
a79a927a13 Merge pull request #574 from davidgiven/vfs
Dramatic GUI overhaul and addition of the new file browser.
2022-09-10 01:18:43 +02:00
David Given
5bcc9071f6 Remember to make dialogues resizable. 2022-09-10 00:44:37 +02:00
David Given
88869ff6d4 Fix a _whole_ pile of bugs in the HFS plugin, and get it to produce meaningful
error messages.
2022-09-10 00:22:02 +02:00
David Given
1655505b95 Add in some missing file commands. 2022-09-09 23:33:16 +02:00
David Given
9abfa3726e Add documentation. 2022-09-09 23:11:05 +02:00
David Given
89a4abf9cf FatFS _can_ delete files. 2022-09-09 22:39:15 +02:00
David Given
854afc6de3 Don't show _ profiles in the extensions list. 2022-09-09 22:36:17 +02:00
David Given
03048797c5 Atari formats do _not_ use normal fatfs, so disable it. 2022-09-09 22:33:15 +02:00
David Given
2478ccd8ef Apply a hack to make sure that systems with mixed-case filenames on FAT disks
(which is illegal, but happens) work sensibly.
2022-09-09 22:29:04 +02:00
David Given
827cfd818e The browser write progress bar works. 2022-09-09 20:03:09 +02:00
David Given
b0e0cd6a1f Fix the mapper issue; writes work again. 2022-09-09 19:23:45 +02:00
David Given
003e919bd5 Formatting now works rather better, but this has revealed a problem with the
mapper --- which needs to switch to using Layout anyway.
2022-09-09 00:34:44 +02:00
David Given
56dadfc228 Remember to reformat... 2022-09-08 20:37:03 +02:00
David Given
b70603e92b Fix a bunch of minor dialog focus glitches. 2022-09-08 19:57:55 +02:00
David Given
6294bc4505 Drag-and-drop for moving one file at a time works... badly. 2022-09-08 00:08:31 +02:00
David Given
326bc931ad You can write back disk images from the browser now. 2022-09-07 20:49:16 +02:00
David Given
734913f638 Read only media is now supported. Fix some threading race conditions where I
was calling the filesystem from the UI thread.
2022-09-07 20:08:28 +02:00
David Given
157a525ec1 Bugfixes and tidying. 2022-09-07 00:37:26 +02:00
David Given
352abe07d8 Creating directories works, more or less. 2022-09-07 00:32:01 +02:00
David Given
0111ed37ba UI tidying. 2022-09-07 00:18:24 +02:00
David Given
079c4c955c Moving files works (via the clumsy dialog). 2022-09-07 00:14:47 +02:00
David Given
922715480e Allow moving a file without changing the actual name. 2022-09-07 00:14:19 +02:00
David Given
99ca175e9a Renaming files sort of works. 2022-09-07 00:02:23 +02:00
David Given
c1fefb7e13 Merge. 2022-09-06 22:31:24 +02:00
David Given
31495d484d Rewrite the browser model to be a custom and much, much more robust job. 2022-09-06 22:29:07 +02:00
David Given
1c6ae0bd88 Remove a spurious ItemChanged which was making OSX unhappy. 2022-09-06 00:55:58 +02:00
David Given
177aadbb45 Finally make that blasted 'more' button work. 2022-09-06 00:48:51 +02:00
David Given
a6868acfa0 Add a disk space gauge. 2022-09-06 00:09:00 +02:00
David Given
907d46a28b Various pieces of better error checking. 2022-09-06 00:08:50 +02:00
David Given
87dda265f4 Formatting now works a lot better (i.e. works). 2022-09-05 23:54:30 +02:00
David Given
7106882212 Files can be deleted (probably). 2022-09-05 23:11:39 +02:00
David Given
59e5f3d27e Replace the browser job queue with a much cleaner one using lambda abuse. 2022-09-05 22:52:19 +02:00
David Given
b2eba66bff You can format disks now. 2022-09-05 22:13:41 +02:00
David Given
b8b5509d49 Remember to add capabilities to the Brother filesystem. 2022-09-05 22:08:33 +02:00
David Given
e667e302dc You can now put files, with a conflict dialogue. But you can't flush them to
disk yet.
2022-09-05 21:26:07 +02:00
David Given
ba68a13712 Properly throw FileNotFoundException if a file is not found (not BadPath). 2022-09-05 21:25:39 +02:00
David Given
c562c6f23a Don't crash on adflib errors. 2022-09-05 19:04:49 +02:00
David Given
fad79e51ac You can save files off disk now. 2022-09-05 18:43:32 +02:00
David Given
9438d68dae Redesign the toolbars to fit more stuff on (and look better). 2022-09-05 01:22:16 +02:00
David Given
39b761ea16 Add an (unimplemented) rename operation. 2022-09-04 22:47:25 +02:00
David Given
64689cf59d Add some disk flushing machinery. 2022-09-04 22:28:38 +02:00
David Given
17f80e4e53 Add a proper file viewer. 2022-09-04 22:15:49 +02:00
David Given
4117e233b3 Simple hex file viewing. 2022-09-04 20:47:44 +02:00
David Given
6c0bb3781a Allow probing of the filesystem capabilities. 2022-09-04 20:42:51 +02:00
David Given
eb55fe1fe3 Browser getfileinfo works. Handle restarts and errors much more gracefully
(i.e. don't crash as often).
2022-09-04 20:26:22 +02:00
David Given
dc396d5cf7 Typo fix. 2022-09-04 20:25:40 +02:00
David Given
80ec4407bc Attributes are now returned as part of the dirent. 2022-09-04 19:30:12 +02:00
David Given
1e45374d41 Filesystem job queue works. 2022-09-04 18:58:03 +02:00
David Given
92ae233f39 First draft of the filesystem browser works. 2022-09-04 17:59:56 +02:00
David Given
d3f8eb09d0 Merge pull request #573 from davidgiven/vfs
Overhaul the GUI.
2022-09-03 22:21:34 +02:00
David Given
058ef8495b Tidy. 2022-09-03 21:50:57 +02:00
David Given
e2ac8eb43c Update file picker settings? 2022-09-03 21:40:54 +02:00
David Given
56121e39e2 Adjust file picker flags. 2022-09-03 20:53:24 +02:00
David Given
57bc2c459b Don't pop up a jillion menus when right clicking. 2022-09-03 20:10:11 +02:00
David Given
311beacfff Try to make OSX happy. 2022-09-03 19:48:32 +02:00
David Given
67e9c65313 Warning fix. 2022-09-03 19:32:59 +02:00
David Given
9a0257caaa Fix a bunch of issues that was confusing Windows. 2022-09-03 19:32:44 +02:00
David Given
a121fb8c6e Disable the browser for merge. 2022-09-03 17:54:23 +02:00
David Given
a044f9a4a4 Custom configuration settings now work. 2022-09-03 17:52:11 +02:00
David Given
0b7a2d7b34 Turn the various viewer windows into dialogues. 2022-09-03 17:01:44 +02:00
David Given
07ba160119 More eventing cleanup. 2022-09-03 16:50:08 +02:00
David Given
d887c86cd4 Overhaul event handling. Get rid of the top-level notebook in favour of menu
items.
2022-09-03 16:42:10 +02:00
David Given
372af03d9e You can now quit the application while an operation is in progress without
rashing.
2022-09-03 15:33:09 +02:00
David Given
aed6a6f142 Emergency stop works. 2022-09-03 13:42:52 +02:00
David Given
f5fa89bafe Some tweaks to progress information. 2022-09-03 13:34:00 +02:00
David Given
6a1d181a34 Add progress information. 2022-09-03 13:24:51 +02:00
David Given
dbcd8c27c5 Implement the bulk of the custom status bar. 2022-09-03 12:59:45 +02:00
David Given
2764be5d32 Add a basic about dialogue. 2022-09-03 00:24:59 +02:00
David Given
d69c534614 Fiddle with some state stuff. 2022-09-03 00:00:18 +02:00
David Given
f436d6e48c Fix state machine when errors are reported from the worker thread. 2022-09-02 23:54:45 +02:00
David Given
e49fcd12fa Better selection cursor rendering. 2022-09-02 23:42:25 +02:00
David Given
f2699c4f1e The reader and writer now work again. 2022-09-02 23:11:21 +02:00
David Given
2319243444 Get state loading and saving working with the new UI. 2022-09-02 20:17:20 +02:00
David Given
8e44e6625a Refactor MainWindow so it doesn't need a header file. 2022-09-02 00:36:04 +02:00
David Given
4cd87ab08a More UI overhaul. 2022-09-02 00:11:34 +02:00
David Given
98a125eb06 First draft of the new UI. 2022-09-01 00:31:45 +02:00
David Given
7c690695b9 Merge pull request #572 from davidgiven/vfs
Add filesystem metadata.
2022-08-31 23:37:52 +02:00
David Given
066a12edaa CBMFS now supports filesystem metadata. 2022-08-31 22:46:04 +02:00
David Given
4c0971800d File metadata for CPMFS works. 2022-08-31 21:58:11 +02:00
David Given
c375b73db9 Dirents need to be shared. 2022-08-31 21:41:11 +02:00
David Given
a392b84d9b Filesystem metadata works on Brother 120. 2022-08-31 21:33:51 +02:00
David Given
34f034c6c4 Return volume names correctly. 2022-08-31 20:56:38 +02:00
David Given
f5640b970b Acorn DFS volume metadata. 2022-08-31 20:46:41 +02:00
David Given
b7028f20e6 Volume metadata for HFS. 2022-08-31 20:28:49 +02:00
David Given
0cb059e59f Volume metadata for FFS. 2022-08-31 20:23:06 +02:00
David Given
8d90a974c6 Start work on volume metadata. 2022-08-31 20:17:50 +02:00
David Given
d44b83e60d Some API tidying. 2022-08-31 20:01:58 +02:00
David Given
ac7493fdc0 Merge pull request #571 from davidgiven/vfs
Allow formatting disks.
2022-08-31 13:08:02 +02:00
David Given
c6c2553b42 Merge from master. 2022-08-31 00:59:06 +02:00
David Given
7d5460f8d1 Formatting FATFS filesystems works, more or less. 2022-08-31 00:58:28 +02:00
David Given
f9fa8a3616 Merge pull request #570 from davidgiven/vfs
Add VFS write support.
2022-08-31 00:32:38 +02:00
David Given
6c117df0a3 Allow quick formatting. 2022-08-31 00:32:31 +02:00
David Given
b8bf08eace Formatting disks on FFS works. 2022-08-31 00:27:01 +02:00
David Given
027af76d5d Formatting HFS disks works. 2022-08-30 23:47:03 +02:00
David Given
b7eee599f4 Mac HFS writing works. 2022-08-30 23:30:23 +02:00
David Given
42a350156a Amiga FFS writes work. 2022-08-30 23:13:59 +02:00
David Given
f382b70cdf Fix verification bug with multiple sector sizes. 2022-08-30 23:13:30 +02:00
David Given
f753929e87 Writing files works in fatfs. 2022-08-30 22:51:31 +02:00
David Given
b3c5ab0b4e Merge pull request #569 from davidgiven/vfs
Add read-only CBMFS support.
2022-08-30 20:55:40 +02:00
David Given
9d8adcc511 Update documentation. 2022-08-30 20:27:13 +02:00
David Given
1afa9ce697 Allow reading files from cbmfs disks (not .REL, though). 2022-08-30 20:21:30 +02:00
David Given
b91edac0ba Refactor the C64 formats into 35 and 40 track variants. Start work on the C64
filesystem.
2022-08-30 00:49:24 +02:00
David Given
5d6f031973 Merge pull request #568 from davidgiven/vfs
Add Macintosh HFS VFS support.
2022-08-29 23:16:40 +02:00
David Given
72c56ee337 Don't use fmt::format to format chrono times, as apparently that's too new for
Ubuntu.
2022-08-29 22:56:41 +02:00
David Given
72498a200a Fetching HFS files now gives you a AppleSingle file with both data and resource
forks.
2022-08-29 22:23:36 +02:00
David Given
1e9e95754c Add a helper routine for ISO-8601 formatting. 2022-08-29 22:22:49 +02:00
David Given
eb99cd895c HFS now works, inasmuch as you can fetch data forks. 2022-08-29 20:24:29 +02:00
dtrg
5625cf5254 More hfs boilerplate. 2022-08-29 13:41:53 +00:00
dtrg
9c6dc0a2f8 Make hfsutils build. 2022-08-29 13:31:08 +00:00
David Given
3458874a68 Raw import of hfsutils. 2022-08-29 01:22:24 +02:00
David Given
4e93b43d8d Merge pull request #567 from davidgiven/vfs
Add basic read-only Amiga FFS support, via adflib.
2022-08-29 01:04:38 +02:00
David Given
b895545ec3 Merge from master. 2022-08-29 00:33:27 +02:00
David Given
92316c4d83 Add read-only Amiga FFS support, via adflib. 2022-08-29 00:33:01 +02:00
David Given
af71409cab Merge pull request #566 from davidgiven/vfs
Add read-only support for CP/M file systems.
2022-08-28 19:50:05 +02:00
David Given
df5a60d946 Make adflib build. 2022-08-28 18:28:13 +02:00
David Given
0181ab1c03 Raw import of adflib. 2022-08-28 18:18:51 +02:00
David Given
1a5ccca67a Add pretty dubious support for logical/physical extents; we can, at least, read
files from my only PF-10 test disk.
2022-08-28 18:01:59 +02:00
David Given
99e1a90729 Implement basic CP/M filesystem support. 2022-08-28 16:37:21 +02:00
David Given
54e11e96e9 Merge pull request #565 from davidgiven/mapper
Remove the sector info from the IBM trackdata in favour of the new layout{} structure.
2022-08-28 00:40:27 +02:00
David Given
b339a776fc Add the new logical sector mappings. 2022-08-28 00:24:13 +02:00
David Given
db1a84b490 Copy the sector mapping stuff into Layout. 2022-08-28 00:15:46 +02:00
David Given
3256b4f627 Eliminate the IBM trackdata sector layout stuff in favour of the layout{}
clause.
2022-08-27 23:23:28 +02:00
David Given
c16ab349b1 Refactor a pile of stuff to allow the physical and logical sector mappings to
be put in the layout{} config section, where they belong.
2022-08-27 19:58:48 +02:00
David Given
a981cb72d0 Merge pull request #564 from davidgiven/vfs
Add filesystem support, allowing direct access to files on disk.
2022-08-27 18:31:07 +02:00
David Given
5251a5f195 Add a couple of missing entrypoints. 2022-08-27 18:10:10 +02:00
David Given
917d5d2dd2 Enable FatFS on a bunch of formats; better error reporting (i.e., some). 2022-08-27 18:07:04 +02:00
David Given
983f6caf46 FatFS works (read-only, lightly tested). 2022-08-27 17:43:46 +02:00
David Given
c9a58e9d57 Allow pulling files off disk. 2022-08-27 16:06:33 +02:00
David Given
c5fd24496f Zero-pad files which don't line up with sector boundaries. 2022-08-27 16:04:46 +02:00
David Given
0d502933ae Refactor a bunch of file stuff to be shorter and cleaner. 2022-08-27 13:21:03 +02:00
David Given
cc4bb3a5ec Undo accidental change. 2022-08-27 13:03:49 +02:00
David Given
b42f82ecb1 Real disk access works, at least for ls. 2022-08-27 12:57:57 +02:00
David Given
b6beaae7da Try and make Acorn DFS writable. 2022-08-27 12:57:41 +02:00
David Given
e698900497 Merge from master. 2022-08-27 01:09:48 +02:00
David Given
bbad2fc1ba Merge pull request #563 from davidgiven/includes
Allow including config files from other config files.
2022-08-27 01:09:04 +02:00
David Given
e9f5087eb6 Don't show the _micropolis include config in the profiles list. 2022-08-27 00:55:51 +02:00
David Given
c1caa22524 Support simple includes in config files, useful for organisation. 2022-08-27 00:52:06 +02:00
David Given
5303903f89 Merge pull request #562 from davidgiven/layout
Refactor disk layout information.
2022-08-27 00:51:44 +02:00
David Given
27d520e42a Merge from master. 2022-08-27 00:16:49 +02:00
David Given
8607f4af57 Add a mode field to the dirent structure. 2022-08-27 00:06:16 +02:00
David Given
f0ec8bd5b9 More SectorInterface refactoring. 2022-08-26 00:43:01 +02:00
David Given
9007e264cf Configure and make fatfs build. 2022-08-26 00:33:38 +02:00
David Given
529bd6fa33 Raw import of fatfs. 2022-08-26 00:21:48 +02:00
David Given
eb8827bdf2 Merge from master. 2022-08-26 00:10:28 +02:00
David Given
be78d91a07 Merge pull request #561 from davidgiven/truncate
Fix CI builds on OSX.
2022-08-26 00:10:08 +02:00
David Given
20b7008994 Move sectorinterface into vfs. 2022-08-26 00:05:58 +02:00
David Given
84d7b1d4ba Or maybe it is. 2022-08-25 23:56:49 +02:00
David Given
0154ed46e8 Looks like truncate is already there? 2022-08-25 23:40:24 +02:00
David Given
5a11fa4704 Try to use coreutils truncate rather than Homebrew truncate, which has gone. 2022-08-25 23:38:17 +02:00
David Given
8b9e153ac4 Use the new layout information for VFS access. 2022-08-25 23:23:07 +02:00
David Given
badc7366c2 Fixup after merge. 2022-08-25 23:21:33 +02:00
David Given
24ef479913 Merge layout stuff. 2022-08-25 22:53:25 +02:00
David Given
1dd94a7d82 Refactor disk layout information out of ImgReaderWriterProto into a new
top-level config paragraph.
2022-08-25 22:51:26 +02:00
David Given
40d5d92dbc More API overhauling. 2022-08-25 21:40:21 +02:00
David Given
0cc3433d6d API cleanup; you can now view file metadata. 2022-08-25 19:37:41 +02:00
David Given
0e157af8d9 DFS and Brother120 can now list files (more or less). 2022-08-24 23:31:17 +02:00
David Given
0e719c2b86 More VFS boilerplate. 2022-08-24 20:21:55 +02:00
David Given
82fd336792 Prototype VFS API. 2022-08-24 00:32:36 +02:00
David Given
e733dc90d8 Merge pull request #550 from tdaede/d88_fix_sector_id
D88: Fix sector ID conditions when writing.
2022-08-10 11:35:04 +02:00
David Given
9985d80432 Merge pull request #549 from tdaede/d88_dd_sector_gaps
Add n88basic sector gaps to d88 reader for PC-88 DD disks.
2022-08-10 11:34:16 +02:00
Thomas Daede
7177a781dc D88: Fix sector ID conditions when writing.
This was failing to write the last sector in the image.
2022-08-09 22:46:43 -07:00
Thomas Daede
498558c2b1 Add n88basic sector gaps to d88 reader for PC-88 DD disks.
The values used for 1.2MB HD disks are too narrow for the
PC-88's disk controller.
2022-08-09 21:47:34 -07:00
David Given
c8e6795a90 Merge pull request #546 from wybren1971/IMDwriter
Im dwriter
2022-08-07 20:45:36 +02:00
David Given
1edc51c067 Merge pull request #547 from davidgiven/driveselect
Add a flux visualiser to the GUI.
2022-08-07 18:36:48 +02:00
David Given
6f7054c4b2 Set useful titles to all the windows. Also fix a nasty spurious drag caused by creating a
window with the left mouse button held down.
2022-08-07 18:12:57 +02:00
David Given
03d2a3a685 Windows are properly stacked and destructed in the right order. 2022-08-07 17:26:17 +02:00
David Given
1d4dccf454 Dataless sectors don't confuse the visualiser any more. 2022-08-07 17:17:24 +02:00
David Given
cb93890d13 Hex viewer windows are sized properly on Windows. 2022-08-07 17:13:35 +02:00
David Given
f39b2801b8 Make sure that drags are processed only when the left button is pressed. 2022-08-07 17:04:43 +02:00
David Given
073a8f5fbd Force a redraw when the control is resized. 2022-08-07 17:01:56 +02:00
David Given
669c19882a Update firmware image. 2022-08-07 14:22:43 +02:00
David Given
43ca6437ab Add a maximum zoom to avoid overflow embarrassments. 2022-08-07 14:12:46 +02:00
David Given
e61a1ea582 Remove the flux viewer status bar as it's not used. 2022-08-07 14:09:48 +02:00
David Given
a477655270 Make the hex viewer work. 2022-08-07 14:07:51 +02:00
David Given
88e1acfdff Change the colour of records. 2022-08-07 00:40:00 +02:00
David Given
39e1dcb900 Add sector labels. 2022-08-07 00:37:57 +02:00
David Given
2489b93de8 Fix a bunch of issues that for some reason were only showing up on Windows. 2022-08-06 23:30:23 +02:00
David Given
8eb25a911d Allow dragging the flux viewer. 2022-08-06 21:37:46 +02:00
David Given
2d5e91b853 Flux viewer control performance improvements. 2022-08-06 21:29:05 +02:00
David Given
4f8c68c40d The flux visualiser now uses a density map for better displaying when zoomed
out.
2022-08-06 18:41:08 +02:00
David Given
9a5c66a311 Add the boilerplate for the hex viewer. 2022-08-06 12:58:15 +02:00
David Given
69bb6a74b8 Split sectors and records. Draw the horizontal scale. 2022-08-06 12:48:52 +02:00
David Given
7aa5fc91cf The flux source/sink value is now persistent. 2022-08-06 01:03:51 +02:00
David Given
de0b53de62 Initial version of the flux visualiser. 2022-08-06 00:57:54 +02:00
David Given
a1df18e3ca Rename class to make sense. 2022-08-05 23:32:20 +02:00
David Given
6a4c85245d The format setting is now persistent. 2022-08-05 23:15:39 +02:00
David Given
52a121c9ed Open the flux visualiser window when a track is clicked on (which contains
flux).
2022-08-05 23:02:15 +02:00
David Given
2acda695ba Add a cursor for selecting tracks in the visualiser. 2022-08-05 21:40:31 +02:00
David Given
89953d9e84 Allow specifying which track in a group to write (rather than the lowest). 2022-08-04 23:10:02 +02:00
David Given
7054a0eded Scan the drives on every USB reset, not just on power on. 2022-08-04 00:08:07 +02:00
David Given
6105e16b28 Don't invoke the vbs patch script (as it's gone). 2022-08-04 00:07:41 +02:00
wybren1971
eb9d0dbbd4 Added real time and not the compiletime of fluxengine 2022-07-29 03:09:29 +02:00
David Given
567b074792 Merge pull request #543 from tdaede/fix_d88_regression
Fix D88 writer regression caused by 4ba30fcf.
2022-07-07 13:42:02 +02:00
Thomas Daede
416c70f5e5 Fix D88 writer regression caused by 4ba30fcf. 2022-07-07 01:47:52 -07:00
wybren1971
30681dfa2c Corrected spelling error 2022-07-02 16:04:54 +02:00
David Given
c5b78ffa99 Merge pull request #541 from wybren1971/IMDwriter
add Imd writer option
2022-06-27 14:19:32 +02:00
wybren1971
cb5e859c34 Add imd to core concepts 2022-06-26 20:04:24 +02:00
wybren1971
4470fb4312 add breaks to the switch statements 2022-06-26 18:26:03 +02:00
David Given
da11fad696 Merge pull request #542 from VorpalBlade/features/install
Add install rule and fix some build system issues
2022-06-21 20:55:45 +02:00
Arvid Norlander
72ae4b2b53 Add missing ignore entry for upgrade-flux-file. Also sort the ignore file. 2022-06-21 20:51:37 +02:00
Arvid Norlander
b8e72039b9 Allow overriding the compiler to build with clang for example 2022-06-21 20:50:22 +02:00
Arvid Norlander
878ccd5128 Add install rule.
The support configuration variables are based on common conventions.
2022-06-21 20:50:22 +02:00
wybren1971
45e0946b6b remove debuglines 2022-06-20 15:47:20 +02:00
wybren1971
b57af55b8a Updating the documentation. cleanup code 2022-06-20 13:10:14 +02:00
wybren1971
677ee5da91 update to IMD writer to accept PROTO input for comment and encoding 2022-06-19 23:45:42 +02:00
wybren1971
a6526ccc13 adding comment in IMD file 2022-06-19 17:28:04 +02:00
wybren1971
8323593720 Set ibm as default format 2022-06-19 16:51:39 +02:00
wybren1971
dd00a69018 enable writing for hplif profile 2022-06-19 16:50:41 +02:00
wybren1971
4d7ddf3d9e add writing IMD images functionality 2022-06-19 16:49:31 +02:00
wybren1971
fbc39a41f8 Add writing IMD images functionality 2022-06-19 16:45:03 +02:00
David Given
3e934a8527 Merge pull request #539 from davidgiven/ubuntu20
Make the build work on Ubuntu 20 again.
2022-06-18 00:45:04 +02:00
David Given
bc474724c6 Don't need the enum conversion warning suppression any more, I think. 2022-06-18 00:19:47 +02:00
David Given
553eccf029 Try an alternative way of finding wx-config. 2022-06-18 00:03:43 +02:00
David Given
63e344d6cf Try and work around the weirdness on Ubuntu 20? 2022-06-17 20:47:50 +02:00
David Given
0dc992561e Don't override the -std=c++17 line on CI. 2022-06-17 19:56:23 +02:00
David Given
77006d5736 Try and make work on Ubuntu 20 again. 2022-06-17 19:30:29 +02:00
David Given
359f5583a6 Merge pull request #537 from davidgiven/bounds
Fix some bounds checking issues.
2022-06-16 20:02:32 +02:00
David Given
58dbb1c7ef Add a 'binaries' pseudotarget so that just the binaries can be built without
the tests.
2022-06-16 19:41:57 +02:00
David Given
47ac8238f7 Enable glibc bounds checking on the CI build. 2022-06-16 19:40:52 +02:00
David Given
fa760b702c Fix C automatic dependencies to actually work. 2022-06-16 19:39:47 +02:00
David Given
2a6ebe2c04 Avoid overzealous bounds check assertions. 2022-06-16 19:37:19 +02:00
David Given
3e97faa704 Fix bounds checking assertion failure caused by overzealous glibc. 2022-06-16 19:30:43 +02:00
David Given
a9e82676c7 Merge in the new AppleSauce flux writer. 2022-06-15 23:40:14 +02:00
David Given
d755fd9c08 Maybe this will work this time. 2022-06-15 23:40:00 +02:00
David Given
c4f1d7bccb Update documentation. 2022-06-15 23:39:11 +02:00
David Given
b55ebe95d9 Reformat. 2022-06-15 23:37:50 +02:00
David Given
cb5c0d5ebe Make the a2r flux sink build. Tracks are now always in the native numbering. 2022-06-15 23:33:00 +02:00
David Given
404f583dc2 Merge from master. 2022-06-15 23:27:33 +02:00
David Given
19cd5638ba Another latest-tag change. 2022-06-15 22:48:06 +02:00
David Given
b917552ca5 Typo fix. 2022-06-15 22:31:32 +02:00
David Given
71deb14c85 Switch back to the old version of latest-tag. 2022-06-15 22:19:28 +02:00
David Given
e9c1041d9b Merge pull request #535 from davidgiven/make
Use the correct extensions for the output binaries.
2022-06-15 22:03:42 +02:00
David Given
ffece005c5 Use the correct extensions for the output binaries. 2022-06-15 21:46:50 +02:00
David Given
ff5d22adbe Another attempt at fixing the CI script. 2022-06-14 23:17:09 +02:00
David Given
aaffe1b208 Merge. 2022-06-14 22:34:00 +02:00
David Given
b86d2466d2 Looks like the autorelease script got broken? 2022-06-14 22:32:44 +02:00
David Given
c2230d0462 Merge pull request #533 from davidgiven/upstreams
Update missing UPSTREAMs and the README.
2022-06-14 22:16:02 +02:00
David Given
dc4e4aa9c7 Update missing UPSTREAMs and the README. 2022-06-14 22:14:53 +02:00
David Given
56e5b4e529 Merge pull request #532 from davidgiven/make
Port the build system to... make!
2022-06-14 22:08:09 +02:00
David Given
3577812dd1 Update documentation. 2022-06-14 21:54:01 +02:00
David Given
256c42833a Rememeber to run the proto test. 2022-06-14 21:36:55 +02:00
David Given
372a9075d7 Remove obsolete files. 2022-06-14 21:22:43 +02:00
David Given
9a5d0db3d4 Oops! | doesn't do the same thing in make as it does in ninja, resulting on
broken rebuilds. These should now work.
2022-06-14 21:07:45 +02:00
David Given
82fe952d7f Merge from master. 2022-06-14 20:50:57 +02:00
David Given
da8382236f Final CI change, I hope. 2022-06-14 20:50:42 +02:00
David Given
4d2d03b8fc Update docs and CI setup now we don't need ninja or lua. 2022-06-14 20:37:13 +02:00
David Given
b025e6bb88 Remove dep/fmt completely. 2022-06-14 20:12:55 +02:00
David Given
521bbd4ea5 Make build on Windows (again). 2022-06-14 19:59:49 +02:00
David Given
95d5d42608 Run the encode/decode tests. 2022-06-14 19:33:20 +02:00
David Given
90884d8877 Actually, let's do single-threaded CI builds. 2022-06-14 01:18:34 +02:00
David Given
62258be400 Add missing file. 2022-06-14 01:07:20 +02:00
David Given
8cbdce1d5b Run simple tests. 2022-06-14 01:05:18 +02:00
David Given
9099d59c08 Cleanup. 2022-06-14 00:37:31 +02:00
David Given
f6bcc37168 Remove ackbuilder. Sob. 2022-06-14 00:24:31 +02:00
David Given
0db1ddc788 Make work on Windows. 2022-06-14 00:15:23 +02:00
David Given
93821c8991 Adjust CI parallelism. 2022-06-13 23:52:24 +02:00
David Given
195c4ca3e5 Add missing file. 2022-06-13 23:49:55 +02:00
David Given
f6023ebbd0 Build the GUI. 2022-06-13 23:49:22 +02:00
David Given
41dde0e516 Build on OSX. 2022-06-13 23:38:33 +02:00
David Given
07b1719b17 Let's try an actual vanilla Makefile. 2022-06-13 23:21:06 +02:00
David Given
d31399702b Merge pull request #529 from wybren1971/IMDwriter
Imd reader
2022-06-13 15:46:54 +02:00
David Given
601e220b18 Update documentation. 2022-06-12 22:15:28 +02:00
David Given
246e580bb5 Update release script. 2022-06-12 22:09:10 +02:00
David Given
e141267cfb Fix github artifact upload. 2022-06-12 22:08:08 +02:00
David Given
eb21f33f99 Windows needs pkg-config. 2022-06-12 21:59:13 +02:00
David Given
f91ddaeec7 Change OSX lua version. 2022-06-12 21:44:52 +02:00
David Given
afc432078c Try to make work on OSX. 2022-06-12 21:41:47 +02:00
David Given
4ba30fcfec Don't require C++20 as it's still too new. 2022-06-12 21:35:13 +02:00
David Given
d7fd99cad6 Don't try to create empty ar archives (OSX doesn't like it). Properly declare
headers as outputs of clibrary.
2022-06-12 20:59:57 +02:00
David Given
eaab2a3ec4 Don't use install to install files. 2022-06-12 20:06:12 +02:00
David Given
1f938457db OSX doesn't want luaposix. 2022-06-12 19:43:42 +02:00
David Given
855a9d5224 Require Ubuntu 22.04. 2022-06-12 18:50:56 +02:00
David Given
d1a9531175 Don't need dep/fmt any more --- it's available on all platforms we care about. 2022-06-12 12:42:31 +02:00
David Given
58aacd3f28 Finally make build on Windows again. 2022-06-12 12:29:53 +02:00
David Given
4aee2732bc Use the system libstb where possible. 2022-06-12 01:14:04 +02:00
David Given
24a3468928 Run the simple tests. 2022-06-12 01:10:24 +02:00
David Given
dff7502a92 Build the tools. 2022-06-11 23:57:05 +02:00
David Given
c34f4bff08 Libraries carry dependencies recursively. 2022-06-11 23:53:26 +02:00
David Given
5753cd4877 Remove globbing to avoid the luaposix dependency. Start work on Windows stuff. 2022-06-11 20:52:19 +02:00
David Given
0949cf254f Add another missing file. 2022-06-11 17:19:34 +02:00
David Given
935a68d871 Add missing file. 2022-06-11 15:05:33 +02:00
David Given
7592556e4d Build the GUI. 2022-06-11 12:22:29 +02:00
David Given
e3f06cbdd4 We need luaposix. 2022-06-11 12:22:22 +02:00
David Given
5397482ca3 Add missing files. 2022-06-11 11:54:48 +02:00
David Given
eafb5d9f7f First attempt at make working on github CI. 2022-06-11 11:41:33 +02:00
David Given
5efbb38270 Initial port to ackbuilder. The fluxengine binary builds on Linux. 2022-06-11 01:00:31 +02:00
wybren1971
c4603e1230 Clean up code IMD imagereader 2022-06-10 09:02:20 +02:00
wybren1971
c6fd31564d update in skewsettings 2022-06-09 23:26:28 +02:00
wybren1971
c4d72d3c11 Write IMD file to floppy 2022-06-09 07:57:11 +02:00
David Given
d7ce10001b Merge pull request #510 from davidgiven/groups
Allow an option to force the reader to read all tracks in a group.
2022-06-03 22:15:32 +02:00
David Given
4220a3fedd Merge pull request #522 from tdaede/fix_fluxop_space_rpm
Add D88 image writer.
2022-06-03 22:14:58 +02:00
Thomas Daede
65100a18d2 Add D88 image writer.
This is currently a very minimal implementation and does not
support deleted sectors, CRC errors, etc.
2022-06-01 20:46:37 -07:00
David Given
d913b0910b Merge pull request #517 from tdaede/fix_fluxop_space_rpm
Greaseweazle: Fix RPM measurement in some circumstances.
2022-05-30 12:18:34 +02:00
Thomas Daede
968184fa7a Greaseweazle: Fix RPM measurement in some circumstances.
Accumulate number of ticks returned in FLUXOP_SPACE so that they
count towards the total track time.
2022-05-29 23:17:35 -07:00
David Given
7e2d300017 Allow an option to force the reader to read all tracks in a group. 2022-04-23 12:37:52 +02:00
Jeff Epler
6cf86a4797 fix some whitespace 2022-04-22 11:03:51 -05:00
Jeff Epler
feb5eac02e Never write via structures, always write via a ByteWriter 2022-04-22 11:03:46 -05:00
David Given
a107d4f17f Merge pull request #492 from jepler/applediskii
Add support for the interfacing to an Apple Disk ][
2022-04-19 21:02:18 +02:00
Jeff Epler
5e4c7719ff Add support for the interfacing to an Apple Disk ][
Some folks may want to use interfaces besides PC/Shugart ones.
Together with https://github.com/adafruit/Adafruit_Floppy/pull/15
and a hand wired board I'm able to read flux from an Apple Disk ][
2022-04-19 08:51:16 -05:00
Jeff Epler
00d30fe26b fix several missing override declarations 2022-04-12 11:20:46 -05:00
Jeff Epler
f2083ed5e9 fix macos-only build error (narrowing diagnostic) 2022-04-12 11:20:40 -05:00
Jeff Epler
6ac98d02a7 Merge remote-tracking branch 'origin/master' into applea2r 2022-04-12 10:53:17 -05:00
David Given
8baf4ffd2f Merge pull request #459 from davidgiven/bk0010formats
Add formats for the BK.
2022-04-06 18:26:40 +02:00
David Given
632357ff9d Add BK documentation. 2022-04-06 18:12:23 +02:00
David Given
074714180b Merge from master. 2022-04-05 01:07:46 +02:00
David Given
bd62b7a9bf Merge pull request #508 from davidgiven/diskspeed
Automatically compensate for the drive speed
2022-03-29 22:21:19 +01:00
David Given
49723d05cf Update documentation with lots more stuff about disk densities. 2022-03-29 23:08:07 +02:00
David Given
f75422a412 We don't need the _525 variants of the profiles any more. 2022-03-29 19:44:03 +02:00
Jeff Epler
5e8f35c94e Fix review items, try again on applesauce compatibility
After these changes, applesauce accepts the image but produces a
non-working result.  passport.py still likes the files just fine, if
they're of the limited sorts that it can handle.

(applesauce wants just one STRM chunk with all the flux from all the
tracks; the whole STRM ends with an extra FF, which is not counted in the
size of any of the TIMING blocks. passport.py / a2archery is considerably
more forgiving)
2022-03-29 10:54:15 -05:00
David Given
15eb88e922 Convert, hopefully, the remaining encoders to do automatic disk sizing. Ther e
may be bugs.
2022-03-29 01:23:35 +02:00
David Given
9a299b758a Correctly set the format byte. 2022-03-29 00:03:59 +02:00
David Given
21afc26b68 Fix sigsegv on non-standard sector sizes. 2022-03-28 22:41:27 +02:00
David Given
5c68b47a29 Add missing file. 2022-03-28 00:19:02 +02:00
David Given
adff739a5d Partial conversion to do automatic scaling of flux based on the disk rotation
speed. Although, something seems to have broken for 5.25" disks.
2022-03-27 23:50:32 +02:00
David Given
0da3d8b231 Merge pull request #497 from davidgiven/inspect
Increase the generated pulse width in the firmware.
2022-03-26 22:30:10 +00:00
David Given
3c17e74f6d Bump the protocol version to ensure people upgrade. 2022-03-26 21:54:29 +00:00
David Given
bf35983ebb Merge from master. 2022-03-26 21:39:32 +00:00
David Given
cc31b325ea Merge pull request #506 from davidgiven/logical
Rework to use logical track numbers throughout.
2022-03-26 21:24:43 +00:00
David Given
7c0eb464c1 Remove the obsolete news paragraph. 2022-03-26 20:31:41 +01:00
David Given
8884ca09fa Add documentation on drive configuration. 2022-03-26 20:30:53 +01:00
David Given
287f0d8909 Adjust the TPI for an Apple 2 drive. 2022-03-26 13:08:06 +01:00
David Given
26c20e2262 Rename the drive extensions to be more distinct. 2022-03-26 13:00:37 +01:00
David Given
b062582d15 Multiple reads from flux files now work again. 2022-03-26 00:35:35 +01:00
David Given
fb66e49a1f Correct number of cylinders (now that empty tracks aren't ignored any more). 2022-03-26 00:35:20 +01:00
David Given
79e37f2c18 Format. 2022-03-26 00:19:22 +01:00
David Given
9ab1dae553 Correctly support retrying on hardware. 2022-03-26 00:19:07 +01:00
David Given
c5ad0b4bec Fix track display in the visualiser when reading and writing. 2022-03-25 23:01:34 +01:00
David Given
606d1012d3 Don't use <=>. Sigh. 2022-03-25 22:10:27 +01:00
David Given
45f2d98f3c Typo fix? 2022-03-25 21:57:02 +01:00
David Given
5cf15a9b11 Try to work around the issue with <compare>. 2022-03-25 21:37:39 +01:00
David Given
178aa9d32f Remove the obsolete reader.* and rename writer.* to readerwriter.*. 2022-03-25 20:57:42 +01:00
David Given
29f181f9bf Change the readers to correctly set the physical track for each sector using
the mapper (where appropriate).
2022-03-25 20:50:57 +01:00
David Given
86c5cccb08 Rename cylinder to track throughout (mostly). 2022-03-25 20:16:12 +01:00
David Given
ea8af83d61 Add missing header. 2022-03-25 00:45:25 +01:00
David Given
d303067deb Massive refactor to work in logical cylinders everywhere. The logical/physical
mapping is now done at the last stage and should, ideally, be automatic. I'm
sure there are bugs everywhere.
2022-03-25 00:22:28 +01:00
Jeff Epler
6e817e2d7c Add a2r as a flux sink
a2r is preferred for apple2 disk archiving and should have a pathway
to emulation via passport.py (woz and dsk conversion)
2022-03-23 14:06:01 -05:00
Jeff Epler
16277f803c Allow directly building fluxengine, skipping other targets 2022-03-23 14:05:47 -05:00
Jeff Epler
ef55e10ff2 fe-write: Only enable the flux source if verifying
Otherwise, a command like
```
./fluxengine-debug write apple2 prodos -i prodos-log.img -d prodos.a2r --no-verify
```
fails saying "Error: no devices found (is one plugged in? Do you have the appropriate permissions?"

This only occurs when the output flux format can't be used as a source.
It probably affects types like .au as well.
2022-03-23 14:05:47 -05:00
David Given
aaccd648b3 Merge pull request #502 from davidgiven/windows
Don't build the Windows CLI as a GUI program.
2022-03-21 19:48:30 +00:00
David Given
9596cbd85a Don't use the wxwidgets settings for the console fluxengine binary, because it
ends up building a windows-mode binary and not a console-mode binary.
2022-03-21 19:25:38 +00:00
David Given
5b6320b61a Merge pull request #457 from davidgiven/agat
Add support for the Agat 340kB disk format.
2022-03-19 19:04:15 +00:00
David Given
4de4fdc0d1 Add documentation. 2022-03-19 19:13:04 +01:00
David Given
77a0c9f341 Typo fix. 2022-03-19 18:43:20 +01:00
David Given
fc7859dc27 Update comment about the generation of the desync sequence. 2022-03-19 18:41:03 +01:00
David Given
39d6b0525f Fix incredibly stupid bug. 2022-03-19 18:07:10 +01:00
David Given
51e091ded6 Better documentation of the missing clock bit. 2022-03-19 14:00:35 +01:00
David Given
52407848c1 Do more sanity checks for bad sectors, improving the reads by a lot. 2022-03-19 13:55:22 +01:00
David Given
a6e2511e6b Don't test SCP files --- it's taking too long. 2022-03-19 13:55:00 +01:00
David Given
422f3ba8c8 Sort the records and sectors dumps. 2022-03-19 13:54:48 +01:00
David Given
276282e847 Merge from master. 2022-03-19 00:51:59 +01:00
David Given
7782e27cc5 Merge pull request #500 from davidgiven/retry
Retries got broken in a recent change. Fix them.
2022-03-18 19:02:07 +00:00
David Given
4f0a178984 Fix retries to work. 2022-03-18 19:19:08 +01:00
David Given
28ddda4635 Merge pull request #483 from davidgiven/mapper
Add support for soft sector skew
2022-03-16 15:31:26 +00:00
David Given
36e20ec396 Merge from master. 2022-03-16 16:01:24 +01:00
David Given
22e65227fb Increase the generated pulse width to try and generate a stronger signal. This
does seem to make Amiga disks read more reliably.
2022-03-15 23:56:49 +00:00
David Given
9ea68b66f7 Allow viewing the raw bitstream as bytes. 2022-03-16 00:17:29 +01:00
David Given
7d93692468 Merge pull request #496 from davidgiven/fixes1
Fix regression with verification on writes.
2022-03-15 20:13:24 +00:00
David Given
93121275ae Verification on writes now works by default. 2022-03-15 20:49:37 +01:00
David Given
07b48b2e0d Merge pull request #493 from davidgiven/drive
Move drive configuration settings out of flux_source/flux_sink into a common config area.
2022-03-14 19:39:40 +00:00
David Given
294672d946 Update documentation. 2022-03-13 21:15:18 +01:00
David Given
ba3f806616 Move a lot of drive parameters into a toplevel drive{} config rather than
leaving them in the source/sink configs (which means they have to be set
twice).
2022-03-13 21:13:56 +01:00
David Given
9e4d99faca Merge pull request #489 from jepler/further-apple-fixes
Further apple fixes - have now booted a DOS 3.3 written with FE + GW
2022-03-08 16:01:15 +00:00
David Given
e89648200b Merge pull request #490 from jepler/mapper
Upgrade Apple II writing to 'unicorn', fix & explain remapping
2022-03-08 15:13:06 +00:00
Jeff Epler
3c305e8a37 Fix & Document Apple II sector mapping
* Update documentation (note apple flux writing is a unicorn now even though this isn't quite true until #489)
 * Fix DOS 3.3 mapping
 * Add ProDOS (all versions) mapping
2022-03-08 08:44:14 -06:00
Jeff Epler
6cfe69634c Merge remote-tracking branch 'origin/master' into further-apple-fixes 2022-03-08 07:45:20 -06:00
Jeff Epler
61be3714a5 apple2: encoder: Fix writing of "FF40"
I was writing "FF40" as "FF48": 1111 1111 0000 instead of 1111 1111 00.
This sequence of four zeros will not allow the real hardware to synchronize
to the bitstream.

With this change, I was able to boot a DOS 3.3 disk I rearranged into
"physical" order; some 'there's a disk error' raspberries occur (probably
indicating a data error within a sector) during the boot process, so
something is still obviously marginal, but this is a huge step forward.
2022-03-08 07:44:03 -06:00
Jeff Epler
0aed615ee5 Fix crash when reading disks written on real apple2
`readRaw8` throws an exception if you run out of data. This did not
turn up during my testing, because I was reading back a disk written by
fluxengine, so everything was aligned to the index pulse and no sector
ever straddled a revolution. On a "real" apple2-written disk, this was
not the case.

Incidentally, the "extra 0" problem exists on a real apple2-written
floppy as well.
2022-03-07 22:40:33 -06:00
David Given
6797037bdb Merge pull request #488 from davidgiven/multiread
Refactor to deprecate F_DESYNC.
2022-03-07 23:14:07 +00:00
David Given
39f8b25fd8 Tidy. 2022-03-07 00:28:19 +01:00
David Given
96214bf3fd Refactor for better multi-read support. Each read is now held separately, with
F_DESYNC being deprecated, and FluxSource returns an iterator which can be used
to retry reads.
2022-03-07 00:07:42 +01:00
David Given
400cd87802 Update documentation with new dependencies.
Fixes: #487
2022-03-06 12:07:55 +01:00
David Given
00c458db1e Merge pull request #486 from davidgiven/brother
Add support for creating bootable Brother 120kB disks.
2022-03-06 01:00:45 +00:00
David Given
1454e200db Create bootable Brother disks. 2022-03-06 01:32:19 +01:00
David Given
752875061c Format. 2022-03-06 00:47:11 +01:00
David Given
78186d8a45 Archive. 2022-03-06 00:46:53 +01:00
David Given
a4ef434f11 Merge pull request #485 from davidgiven/brother
Add support for writing 120kB Brother disk images.
2022-03-04 23:49:09 +00:00
David Given
9842c9945d Typo fix. 2022-03-05 00:33:10 +01:00
David Given
6dcd97dedf Create executable files (although possibly not correctly). 2022-03-05 00:15:11 +01:00
David Given
549a984eab Add support for writing 120kB Brother disk images. Also add some utils tests,
because they needed it.
2022-03-04 23:42:29 +01:00
David Given
aa805f81e0 Simplify. 2022-03-04 20:28:09 +01:00
David Given
93a67dadf6 Merge from master. 2022-03-04 20:19:42 +01:00
David Given
e9286f6ae9 Merge. 2022-03-04 20:19:14 +01:00
David Given
a31fcdb753 Merge pull request #484 from davidgiven/brother
Fix the Brother 120kB format.
2022-03-02 23:36:02 +00:00
David Given
0edca836f0 Let the image reader do the physical/logical track mapping. 2022-03-03 00:18:49 +01:00
David Given
8537f291b7 Update README. 2022-03-02 23:57:22 +01:00
David Given
46611ec720 Fix writing to 120kB Brother disks. 2022-03-02 23:56:02 +01:00
David Given
cbc3db8100 Display erased tracks a bit more gracefully. 2022-03-02 23:55:53 +01:00
David Given
7d5b07bf37 Merge from master. 2022-03-02 23:26:18 +01:00
David Given
5bd633d5bb Merge pull request #481 from jepler/apple2decoder
apple2: Comment decoder, add fix/workaround for stray 0 at start of sector data
2022-03-02 22:26:00 +00:00
David Given
17fdad1d6e Add a hopefully correct AppleDOS sector mapping table. 2022-03-02 23:21:41 +01:00
David Given
1ad26671b0 Merge from master. 2022-03-02 23:15:56 +01:00
David Given
2dc5064409 Add support for remapping sectors. 2022-03-02 23:00:20 +01:00
Jeff Epler
79eec41bcd Revamp how extra zeros are handled
It's not OK to call seek() here. Instead, add a function which can read
an apple 8-bit flux value in terms of readRaw8 and readRawBits. Apply
this function to all the data bytes, rather than just the first one.
2022-03-02 07:45:24 -06:00
Jeff Epler
386d22a45e Makefile: give a clear error at build time if wx is not available 2022-03-02 07:44:09 -06:00
Jeff Epler
d90fcbf7ad Handle extra 0-bits at the start of a sector 2022-03-02 07:43:45 -06:00
Jeff Epler
c4e4520058 apple2 decoder: explain the progression of sector status values 2022-03-02 07:43:43 -06:00
David Given
dd49f01499 Merge pull request #480 from jepler/apple2encoder
Add apple2 encoder
2022-03-02 10:24:05 +00:00
Jeff Epler
2c698cee71 Mark apple2 image writing as dinosaur, add note about writing, not ro anymore 2022-03-01 19:05:53 -06:00
Jeff Epler
87cb4b6d18 Add apple2 encoder
This is tested with encodedecodetest.sh but is not tested on HW yet.
It's likely that the sector order (interleave) doesn't match real systems.
2022-02-28 16:22:53 -06:00
David Given
2b7c747209 Merge pull request #471 from jepler/rx50-pdp11-format
Add support for PDP-11 RX-50 disks
2022-02-27 18:59:10 +00:00
Jeff Epler
707308b490 Fix alphetization of format list 2022-02-27 10:47:33 -06:00
Jeff Epler
ed1012bf07 Fix rx50 format description & test it
gap3 follows f10f52ded8/src/image/img.c (L135)
2022-02-27 10:47:22 -06:00
David Given
cc5b2bc27b Merge pull request #479 from davidgiven/wxw
Add a GUI.
2022-02-27 12:24:38 +00:00
David Given
a1a7cfa735 We don't need the rich text wxwidgets addon. 2022-02-27 13:12:29 +01:00
David Given
4624ff92df Remember to set the high density bit. 2022-02-27 13:11:11 +01:00
David Given
47dde98728 Include the GUI exe in release artifacts. 2022-02-27 13:05:39 +01:00
David Given
6f1031e95b Writing flux now works. 2022-02-27 12:54:57 +01:00
David Given
d5245e3784 Don't capture parameters in static blocks. That never ends well... 2022-02-27 12:51:51 +01:00
David Given
d97e72edb6 The image writers now log to the logger. 2022-02-27 00:27:44 +01:00
David Given
23b9e9ef5f The image readers now log to the logger. 2022-02-27 00:20:20 +01:00
David Given
02c7b86f85 You can write images now. 2022-02-27 00:07:59 +01:00
Paul Devine
f796b6b40d works in physical victor 9000 machine 2022-02-26 14:59:09 -08:00
David Given
528454c361 You can now load images into memory. 2022-02-26 23:32:24 +01:00
Jeff Epler
9ae3f7e61d Correct description of media type 2022-02-26 15:41:14 -06:00
David Given
dd33922810 Errors are now caught. 2022-02-26 19:52:07 +01:00
David Given
b52fdb3155 Additional settings pane now works. 2022-02-26 19:33:20 +01:00
Jeff Epler
edf9f9e714 Implement review suggestions 2022-02-26 12:06:08 -06:00
David Given
38eda6ed3c Add log and settings panels. The log panel is populated during a read (or
write).
2022-02-26 18:36:21 +01:00
David Given
32f0c5dc09 Update buttons as the application state changes. 2022-02-26 18:10:00 +01:00
David Given
b45b45b1b3 Enable double buffering for the visualiser in Windows. 2022-02-26 13:36:28 +00:00
David Given
f1c60b7177 Adjust header order so that things build on Windows. 2022-02-26 13:33:00 +00:00
David Given
2d8ff826f3 Merge pull request #475 from hharte/improve-hard-sector-decode
Improve hard sector decode
2022-02-26 12:37:48 +00:00
Howard M. Harte
d028db1ba3 northstar: Improve decode a little more.
seekToPattern() can skip the index hole if it doesn't find the
SYNC pattern.  If this happens too close to the end of the flux
stream, it can result in a conflicted sector.  In this case,
discard the sector.
2022-02-25 22:08:57 -08:00
Howard M. Harte
2d4e2b87bc micropolis: Improve decode a little more.
seekToPattern() can skip the index hole if it doesn't find the
SYNC pattern.  If this happens too close to the end of the flux
stream, it can result in a conflicted sector.  In this case,
discard the sector.
2022-02-25 21:59:18 -08:00
David Given
1d7a75c7b3 Okay, the visualiser looks pretty much done. 2022-02-26 00:23:17 +01:00
David Given
65584a953d Merge pull request #473 from hharte/fix-fluxmap-split
fluxmap: Don't push_back() if Fluxmap begins with F_DESYNC.
2022-02-25 11:15:31 +00:00
Howard M. Harte
4cbd19d2e5 fluxmap: Don't push_back() if Fluxmap begins with F_DESYNC.
Fluxmap::split() creates a 0-length Fluxmap if the Fluxmap
begins with F_DESYNC.  Fix this by not doing push_back()
if a F_DESYNC is encountered at the start of the Fluxmap.
2022-02-24 19:07:09 -08:00
David Given
a59b59fea4 First sector visualisation! Doesn't look bad. 2022-02-25 01:31:10 +01:00
David Given
5c063a9de3 Replumb the visualiser data flow... again. I think I might have it right this
time.
2022-02-25 00:36:12 +01:00
David Given
3666a7d7bd Merge. 2022-02-24 23:52:18 +01:00
David Given
8250112c7f Merge pull request #468 from JohnVeness/JohnVeness-fix-docs
Fix various doc typos
2022-02-24 22:16:48 +00:00
David Given
30957f4105 Merge pull request #472 from davidgiven/proto
Make the internal disk data structures all const.
2022-02-24 22:15:58 +00:00
David Given
eade2e279e Make the internal disk data structures all const, to allow us to pass them to
the GUI UI thread safely.
2022-02-24 22:46:10 +01:00
Jeff Epler
b4489b9402 Add support for PDP-11 RX-50 disks
According to my source [https://www.cbmstuff.com/forum/showthread.php?tid=634] the format of RX-50 is

 * single sided
 * 80 tracks
 * 10 sectors per track
 * 96 tpi (tracks per inch)
 * 300 rpm (revolutions per minute)
 * 250 KHz data rate

I have a disk labeled
```
BL-T540E-MC
CZUFDE0 MICRO PDP-11
USER TESTS
© 1983, 1894
DIGITAL EQUIPMENT CORP.
```
and stamped 14131.

The image read all sectors and the content looks plausible.  `strings` on it says things like
```
$ strings rx50.img  | grep -i pdp
; This file implements the USER FRIENDLY Diagnostic for the MICRO PDP11 & 11/73
```
however, I don't have an emulator or other system to use the disk image with so
I can't 100% vouch for the image being complete and correct.
2022-02-23 17:24:05 -06:00
David Given
a67b7c80c1 Rework the visualiser to look better, maybe? Also fiddle with the logger
somewhat. There's a pending problem where it's not safe to send mutable objects
through the logger to the visualiser, which will need work.
2022-02-23 23:50:29 +01:00
David Given
dfc0cdd0fa Merge from master. 2022-02-23 20:43:19 +01:00
John Veness
d6faf5b074 Change to consistent "-sided" 2022-02-23 11:05:57 +00:00
John Veness
44ffa6a3b0 Change to consistent "-sided" 2022-02-23 10:58:13 +00:00
John Veness
168b78d9d7 Change to consistent "-sided" 2022-02-23 10:57:17 +00:00
John Veness
bd8f313ccb Change to consistent "-sided" 2022-02-23 10:56:36 +00:00
David Given
4a0fc3d566 Merge pull request #469 from hharte/fix-warnings
Fix override warnings in decoders.
2022-02-23 10:53:15 +00:00
Howard M. Harte
8d04d17e39 Fix override warnings in decoders. 2022-02-22 22:45:39 -08:00
John Veness
9f44b1e783 Add space between sentences 2022-02-23 00:08:15 +00:00
John Veness
1b15271fe2 Fix "seperated" typo 2022-02-22 23:45:51 +00:00
John Veness
f451d3203c Made case consistent on "Read only" 2022-02-22 23:44:19 +00:00
John Veness
c713d38c19 Fix representing typo 2022-02-22 23:39:34 +00:00
John Veness
4d51f9d097 Fix GreaseWeazel internal link and bracket 2022-02-22 23:36:25 +00:00
John Veness
8750341862 Fix grammar in building.md 2022-02-22 23:31:56 +00:00
John Veness
3a4fe086ea Fix resale/rescale typo 2022-02-22 23:06:55 +00:00
John Veness
212e457c4c Fixed grammar in README 2022-02-22 23:06:06 +00:00
John Veness
790e2b534f Fixed end bracket in README 2022-02-22 22:54:16 +00:00
David Given
48414f0ce9 Merge pull request #467 from davidgiven/logging
Miscellaneous minor fixes
2022-02-22 22:53:19 +00:00
David Given
b5c3e75f10 Fix the new logger output. 2022-02-22 23:39:08 +01:00
David Given
548e07ce17 Fix off-by-one error in the MX decoder. 2022-02-22 22:51:14 +01:00
David Given
0aa0c6866c Do a very basic read/write visualisation. It looks like suck. 2022-02-22 22:35:13 +01:00
David Given
3d4cf7df26 Merge from master. 2022-02-22 18:12:33 +01:00
David Given
c4ba180a0c Merge pull request #462 from davidgiven/logging
Overhaul the logging system
2022-02-22 13:11:28 +00:00
David Given
bd392b91b7 Make the C++ old enough for Ubuntu. 2022-02-22 13:56:50 +01:00
David Given
042f7b0502 Log messages are now forwarded to the UI thread. 2022-02-22 00:50:58 +01:00
David Given
0fc5f0ee7d Merge pull request #465 from hharte/fix-northstar-decoder
northstar: Fix after decoder change.
2022-02-21 21:42:13 +00:00
Howard M. Harte
8cbef669b1 northstar: Fix after decoder change.
Recent changes to the decoders broke North Star.
2022-02-21 13:34:34 -08:00
David Given
f9004fb14c Merge. 2022-02-21 22:22:10 +01:00
David Given
40a42c65c1 The rotational speed message is now done via the logger. 2022-02-21 22:21:46 +01:00
David Given
e14030e369 Actually start using bits of the decoder framework. 2022-02-21 22:02:28 +01:00
David Given
c6cef191a7 Start work on setting the controls in the main window. 2022-02-21 00:57:39 +01:00
David Given
6ca9f83bfe Add the main threading stuff. 2022-02-21 00:14:27 +01:00
David Given
b3fcdc5f40 Come up with a UI design I'm happy with. Start work on the disk visualiser. 2022-02-20 22:41:47 +01:00
David Given
c6591cc11a Start using wxformbuilder for GUI design. 2022-02-20 00:07:47 +01:00
David Given
e31ba479b2 Merge from master. 2022-02-19 23:38:51 +01:00
David Given
659b668012 Merge pull request #463 from hharte/improve_micropolis_decoder
Improve micropolis decoder
2022-02-19 22:34:14 +00:00
Howard M. Harte
d69944dd8c Micropolis: Add support for MZOS checksum.
Vector MZOS uses a different sector checksum than the standard
Micropolis checksum used by MDOS, CP/M and OASIS.  Automatically
detect the checksum on the disk by default, but allow the user
to force the use of a specific checksum using the
--decoder.micropolis.checksum_type parameter.
2022-02-19 14:10:56 -08:00
Howard M. Harte
a25111e411 Micropolis: Improve decode.
* Discard a partial sector at the end of the track.
    * Do not seek to the index mark for the first sector.
    * Use a 64-bit pattern to match the SYNC.
    * If SYNC is found too early, search for a subsequent SYNC.
    * While decoding the sector record, enforce the SYNC pattern
      and track ID.
2022-02-19 14:10:44 -08:00
Howard M. Harte
6866d5d3fa Require 16 sectors for Micropolis disks. 2022-02-19 14:10:35 -08:00
David Given
21b3d1c521 Remove stuff which is too modern for Ubuntu. 2022-02-19 22:56:13 +01:00
David Given
f2bdd1cc49 More work on the logger overhaul: the reader should be done now. 2022-02-19 22:48:44 +01:00
David Given
9f09794ae6 Merge pull request #461 from hharte/fix_upgrade_windows
upgrade-flux-file: Fix for Windows
2022-02-19 21:29:54 +00:00
Howard M. Harte
6a1fb3d829 upgrade-flux-file: Fix for Windows
Close the database and remove the input file prior to renaming.
2022-02-19 13:14:25 -08:00
David Given
631b9768af Attempt to fix the BK formats. 2022-02-17 23:57:23 +01:00
Eugene Bolshakoff
a2d9db85cb adjust some numbers 2022-02-17 19:20:50 +01:00
David Given
4cb9d0b50a Merge pull request #458 from davidgiven/atarist
Fix the Atari ST profiles
2022-02-16 22:24:48 +01:00
David Given
73f37ef289 Update Atari ST documentation. 2022-02-16 22:06:26 +01:00
David Given
dbda19a209 Make sure that Atari ST disks ignore any spurious sector 66, because of
FastCopy.
2022-02-16 22:03:15 +01:00
David Given
0d7de7bbc0 Add support for ignoring certain sectors (needed for FastCopy disks on the
Atari ST).
2022-02-16 22:02:50 +01:00
David Given
649b78611c Work-in-progress logging overhaul. 2022-02-16 21:24:17 +01:00
Eugene Bolshakoff
22a21d76a4 trying to set clock_mhz the same as for ibm 2022-02-15 15:31:39 +01:00
David Given
5668a74aef Forgot to check in the build script. 2022-02-13 21:21:10 +01:00
David Given
482638601a Add missing files. 2022-02-13 21:07:01 +01:00
David Given
1bfe518f74 First draft (very bad) agat340 decoder. 2022-02-13 20:53:23 +01:00
David Given
eeb5ba40fb Merge pull request #455 from jepler/serial-behavior-improvements
Some quality of life improvements for Adafruit generic GW-compatibles
2022-02-13 12:43:18 +01:00
Jeff Epler
33bd912476 Some quality of life improvements for Adafruit generic GW-compatibles
The addition of the new tcsetattr call fixes a problem where interrupting
fluxengine during a flux read will leave data in the device and/or Linux's
serial buffers, so that the next invocation of fluxengine will fail similar
to
```
Error: command returned garbage (0x27 != 0x0 with status 0x31)
```
(the specific value differs because it's actually flux data)

Merely changing the existing tcsetattr call to specify TCSAFLUSH was not
enough; moving it after the 200ms pause seems to be enough.

Note that it doesn't seem feasible in our USB stack to make DTR reset
the device, since that would take down the USB stack and require a fresh
USB connection.

The addition of the special case for `rlen == 0` in read is for when the
GW-compatible board is reset or crashes and usb-disconnects during a
reading operation. Without this change, fluxengine spins forever at 100%
of a CPU, repeating a read().  After the change, this will cause
the host computer to print messages like:
```
  2.1: 200 ms in 68928 bytes
  3.0: Error: serial read returned no data (device removed?)
```
and exit.

I only tested these changes on Linux (Debian with kernel 5.10) and in
particular I don't know if/how it will work on a Mac.
2022-02-12 22:04:18 -06:00
David Given
33f1084f0a Merge from master. 2022-02-13 00:20:12 +01:00
David Given
e8a9b7cae3 Merge pull request #454 from davidgiven/mx
Fix a regression in the MX decoder.
2022-02-13 00:05:24 +01:00
David Given
f6b1d9c493 Fix a regression in the MX decoder. 2022-02-12 23:37:20 +01:00
David Given
624c34b378 Merge pull request #453 from davidgiven/mx
Fix regressions caused by the decoder change.
2022-02-12 22:56:57 +01:00
David Given
bc6753e5bf Correctly record sector positions. 2022-02-12 22:42:40 +01:00
David Given
c539debc84 Fix the Amiga decoder, which got broken with the decoder change. Also fix the
encoder which was always broken (but Amigas apparently didn't care).
2022-02-12 22:42:15 +01:00
David Given
830f4cec0f Merge pull request #452 from davidgiven/mx
Prevent bad reads on gapless formats.
2022-02-12 15:32:36 +01:00
David Given
03dd9e6e83 Add back support for capturing raw records. 2022-02-12 15:16:25 +01:00
David Given
e8d1c90182 Fix, hopefully, the rest of the decoders. 2022-02-12 15:02:42 +01:00
David Given
0933dc1afa Partially complete rework of all the decoders to avoid seeking inside the
fluxmap. This requires resetting the FluxDecoder, which loses any pending
state, resulting in bad reads for (some) formats which don't have gaps between
sectors --- the DVK MX is the main victim.
2022-02-12 00:55:09 +01:00
David Given
610b7fe95c Merge pull request #451 from jepler/scp-84track
Support 84-track SCP files
2022-02-11 16:25:35 +01:00
Jeff Epler
a6bf6f901f Error gracefully when requested to write a too-large scp image
This prevents a crash when more tracks were recorded than fit in an
scp image. When I first encountered a problem doing an 84-track operation,
this led to a segfault later on since memory was written past the end
of _fileheader, and (I think) stomped on a pointer.
2022-02-11 09:10:20 -06:00
Jeff Epler
ca2e37e852 Include 168 track data headers
According to version 2.2 of the SCP image specification
<https://www.cbmstuff.com/downloads/scp/scp_image_specs.txt>
the number of Track Data Entries for a floppy can be up to 168,
so that up to 84 tracks can be recorded (e.g., fluxengine -c 0-83).

> BYTES 0x10-0x2AF (for floppy image files) are a table of longwords with each entry being
> an offset to a Track Data Header (TDH) for each track that is stored in the image.  The table
> is always sequential.  There is an entry for every track, with up to 168 entries supported for
> floppy disks.  This means that floppy disk images of up to 84 tracks with sides 0/1 are possible.
2022-02-11 09:08:59 -06:00
David Given
d1ffaaa327 Merge pull request #449 from davidgiven/macdsk
Change the mac profiles to produce simple sector images rather the DiskCopy files.
2022-02-08 22:04:48 +01:00
David Given
8b7f551505 Change the mac profiles to produce simple sector images rather the DiskCopy
files (as that seems to be what most people typically use).
2022-02-08 21:21:22 +01:00
David Given
759b3f8fcd Merge pull request #447 from adafruit/master
fix 2 byte pack for revolution count
2022-02-08 20:04:57 +01:00
lady ada
9ec56f1dfa fix 2 byte pack for revolution count 2022-02-08 11:43:20 -05:00
David Given
84e997949f Merge. 2022-02-06 22:14:11 +01:00
David Given
f82bd45fec Pull out extension profiles into their own section of the documentation list. 2022-02-06 22:13:26 +01:00
David Given
3863724007 Merge pull request #443 from davidgiven/upgrade
Rework flux file upgrading and remove the Sqlite dependency.
2022-02-04 22:16:31 +01:00
David Given
7e0ed9fe93 Try to fix the build on Windows and OSX. 2022-02-04 22:00:44 +01:00
David Given
945e3f3c5f Typo fix. 2022-02-04 21:29:56 +01:00
David Given
6f100219f7 Include the upgrade-flux-file binaries in the releases. 2022-02-04 21:29:04 +01:00
David Given
89688394f8 Replace the upgradefluxfile builtin with a seperate upgrade-flux-file tool.
This allows us to remove all the SQL stuff from the main program, and restores
the ability to upgrade from version 2 SQL files.
2022-02-04 21:27:24 +01:00
David Given
091ef6d972 Merge pull request #439 from tdaede/d88_doublestep
D88: Add 2D (40 track double density) support.
2022-02-03 00:27:55 +01:00
Eric Anderson
e501c44985 Merge branch 'master' into micropolis-275 2022-01-29 10:09:35 -07:00
Eric Anderson
bc9b761903 Prefer IMG for Micropolis, and use a vgi profile to swap format 2022-01-29 10:05:54 -07:00
Thomas Daede
dfb461b05c D88: Add 2D (40 track double density) support.
This assumes a 360rpm drive, and double stepping.

If fluxengine supports the concept of 40 vs 80 track drives in the
future, it might make sense for this to assume a 300rpm drive
instead.
2022-01-28 10:50:36 -08:00
David Given
86f6a2f722 Merge pull request #437 from davidgiven/verify
Fix --no-verify.
2022-01-27 22:05:23 +01:00
David Given
77d6d0d5be Fix --no-verify. 2022-01-27 20:49:38 +01:00
David Given
4946909c6d Merge pull request #436 from davidgiven/dim
Fix some autoconfigure issues.
2022-01-27 00:07:23 +01:00
David Given
2439736cb4 When autoconfiguring, set up the decoder to allow disk verification. 2022-01-26 23:53:44 +01:00
David Given
8fb2ad1986 Automatically set the number of heads and cylinders where appropriate. 2022-01-26 23:53:16 +01:00
David Given
1d7bbcec66 Merge pull request #435 from davidgiven/brother
Don't use signed values for track/sector/side values
2022-01-26 23:29:51 +01:00
David Given
6ac9d34aac Don't rely on the geometry autodetector for Brother formats. 2022-01-26 23:13:40 +01:00
David Given
3369029e9a Don't use signed ints for the track/side/sector values. 2022-01-26 23:13:22 +01:00
David Given
11f411b745 Merge pull request #433 from davidgiven/rawread
Don't crash when trying to read flux from a fl2 file where there isn't any.
2022-01-26 23:09:48 +01:00
David Given
9bb6e15900 Don't crash when trying to read flux from a fl2 file where there isn't any
flux.
2022-01-26 22:09:50 +01:00
David Given
d2a6b37f5f Merge pull request #430 from tdaede/greaseweazle_time_read
Support time-based reads for Greaseweazle V24+.
2022-01-26 21:17:44 +01:00
David Given
0c1f6163f7 Merge pull request #432 from tdaede/no_verify
Add flag to skip verification during write.
2022-01-26 21:16:21 +01:00
Thomas Daede
6860317a58 Add flag to skip verification during write.
Fixes #425
2022-01-26 11:45:28 -08:00
Thomas Daede
77257b0989 Support time-based reads for Greaseweazle V24+.
This substantially speeds up read and verify operations, allowing
only 1.2 revs rather than 2 revs to be read.

Fixes #426
2022-01-26 08:02:30 -08:00
David Given
8f35da5163 Merge pull request #428 from tdaede/doc_pc98
Add documentation for PC-98, X68000, etc.
2022-01-26 17:00:40 +01:00
Thomas Daede
82d8c40b5f Add documentation for PC-98, X68000, etc. 2022-01-25 09:53:56 -08:00
David Given
dbfc0f98c3 Merge pull request #422 from tdaede/nfdr0
Add NFD r0 image reader.
2022-01-22 23:28:55 +01:00
David Given
ca15bf4a92 Merge pull request #417 from tdaede/fluxsink_ratio
Add option to rescale flux source pulses.
2022-01-22 23:27:53 +01:00
David Given
3e4d4cc002 Hotfix for Windows build. 2022-01-22 22:29:34 +01:00
David Given
4257544402 Merge. 2022-01-22 21:20:48 +01:00
David Given
83d44bd03e Update documentation. 2022-01-22 20:46:40 +01:00
David Given
745e0685a4 Allow specifying the GreaseWeazle serial port directly (for devices which don't
have the GreaseWeazle VID/PID).
2022-01-22 20:41:27 +01:00
David Given
d6db2128df Toggle DTR on Unixes as well as on Windows. 2022-01-22 20:39:20 +01:00
David Given
6e83ed5654 Update clang-format file. 2022-01-22 20:37:58 +01:00
Thomas Daede
a4f44933ec Add NFD r0 image reader.
This format is very similar to D88, but used mostly for PC-98
rather than PC-88.
2022-01-22 08:33:43 -08:00
David Given
fe080e1d90 Merge from master. 2022-01-21 19:36:18 +01:00
David Given
dd462873d2 Merge pull request #410 from pauldevine/victor9k
Victor9k Double Sided Support
2022-01-20 23:51:24 +01:00
Paul Devine
628fec2c92 Merge branch 'victor9k' of github.com:pauldevine/fluxengine into victor9k 2022-01-20 13:57:25 -08:00
Paul Devine
c4700f3cb8 updated documentation for double-sided, made note about documentaiton bug for track format 2022-01-20 13:56:35 -08:00
Paul Devine
fac606c475 adding Victor9k double sided src format 2022-01-20 13:56:35 -08:00
Paul Devine
5a0aadabc1 adding support for double-sided Victor9k disks 2022-01-20 13:56:35 -08:00
Paul Devine
283b9871cb correct media size in README 2022-01-20 13:56:35 -08:00
David Given
f9d88cc2a0 Merge pull request #420 from davidgiven/contains
Don't use string::contains as it's not sufficiently widespread yet.
2022-01-20 20:40:19 +01:00
David Given
c751810b84 Don't use string::contains. 2022-01-20 20:24:10 +01:00
David Given
2dbc9c39b1 Merge pull request #419 from davidgiven/clang
Add initial clang-format file.
2022-01-20 19:54:07 +01:00
Paul Devine
a9933c7764 updated documentation for double-sided, made note about documentaiton bug for track format 2022-01-19 16:21:40 -08:00
David Given
ffcac3a12d Add initial clang-format file. 2022-01-20 00:08:26 +01:00
David Given
a4130e5f78 Merge pull request #418 from tdaede/auto_fdi
FDI: Add support for automatically setting format.
2022-01-19 23:12:41 +01:00
Thomas Daede
de8f8b7d91 FDI: Add support for automatically setting format. 2022-01-17 17:02:26 -08:00
Thomas Daede
b8c58b12fd Add option to rescale flux source pulses.
This actually scales by the reciprotal of the flux sink, to
allow the same value to be set for both options.
2022-01-17 16:53:50 -08:00
David Given
4af355e1f9 Merge pull request #416 from jepler/patch-1
Fix a little markup error
2022-01-17 15:36:43 +01:00
Jeff Epler
0e7e9d5643 Line columns up again 2022-01-16 20:08:01 -06:00
Jeff Epler
fafadc3333 Fix a markup typo 2022-01-16 20:07:08 -06:00
Limor "Ladyada" Fried
752c92bb21 Merge pull request #1 from adafruit/floppzy
PR check!
2022-01-16 13:38:23 -05:00
lady ada
45d7b284e3 1) update CI to add zip on commit for quick testing
2) fix gw readflux command (should be 8 bytes long but was packed as 10)
3) add support for non-gw VID/PID (generic serial port that is gw compatible)
4) manually set/clear DTR on serial port devices - this seems to be essential for tinyusb/arduino CDC

not tested with a gw but ought not to have broken anything!
2022-01-16 12:43:47 -05:00
Paul Devine
085fca7e31 adding Victor9k double sided src format 2022-01-10 15:34:37 -08:00
Paul Devine
8744114790 adding support for double-sided Victor9k disks 2022-01-10 15:33:29 -08:00
Paul Devine
c658a764d0 correct media size in README 2022-01-10 15:06:29 -08:00
David Given
6a07ba850c Merge pull request #409 from davidgiven/hcs
Support HCS as well as CHS format in the image reader/writer.
2022-01-11 00:03:04 +01:00
David Given
c4e29e74b2 Support HCS as well as CHS format in the image reader/writer. 2022-01-10 23:49:25 +01:00
David Given
40bca8b38c Merge pull request #370 from tdaede/rescale 2022-01-10 23:02:18 +01:00
David Given
18af881fe5 Attach the underlying raw records to Sector structures; add a .raw exporter for
getting the MFM/FM/GCR stream.
2022-01-04 23:49:39 +01:00
David Given
dfd97d9fc5 Merge pull request #359 from tdaede/compdb
Add Make target to build compdb.
2022-01-03 00:15:18 +01:00
David Given
ebd2c329ff Merge pull request #397 from hharte/master
reader: Fix conflicting sector error message.
2022-01-02 17:38:11 +01:00
David Given
265b169d43 Merge from master. 2022-01-02 15:07:38 +01:00
David Given
d154b1464f Merge pull request #404 from davidgiven/shugart
Add support for selecting the Shugart or IBMPC GreaseWeazle bus types.
2022-01-01 23:05:26 +01:00
David Given
a32ea6e5f8 Add support for selecting the Shugart or IBMPC GreaseWeazle bus types. 2022-01-01 22:45:27 +01:00
David Given
d7b21bf07e Merge pull request #400 from davidgiven/update
Update firmware to version 16.
2021-12-31 21:41:05 +01:00
David Given
d120790da7 Update firmware to version 16. 2021-12-31 20:24:51 +00:00
Eric Anderson
bd854d29a4 Merge branch 'master' into micropolis-275 2021-12-29 12:39:07 -06:00
Eric Anderson
d06e3db90b Support .vgi for image writing
vgi was already added to imagereader, but was missing from imagewriter.
2021-12-29 12:23:04 -06:00
Howard M. Harte
5ada533b06 reader: Fix conflicting sector error message.
The conflicting sector error message incorrectly displays the track instead
of the sector in conflict.
2021-12-25 09:10:53 -08:00
David Given
6f5e648751 Merge pull request #394 from hharte/fixserial
Windows: Support serial ports > COM9
2021-12-17 23:06:41 +00:00
Howard M. Harte
9ee5b3eaf3 Windows: Support serial ports > COM9
Windows requires the use of the DOS UNC path name for COM ports
greater than COM9.  Prefix the port name with \\.\
2021-12-17 14:21:19 -08:00
David Given
0560da246b Add wxwidgets to the build dependencies. 2021-12-17 20:24:50 +00:00
David Given
8b6b3ee3b8 Fix wxwidgets building on Windows. We now have it working on all three
platforms.
2021-12-17 20:10:11 +00:00
David Given
45fe83951a Merge pull request #392 from davidgiven/warnings
Fix some minor build glitches and warnings.
2021-12-16 13:54:26 +00:00
David Given
57e5d8911d Fix missing build dependency causing sporadic build failures. 2021-12-16 14:27:45 +01:00
David Given
5768a766b8 Silence stray warnings. 2021-12-16 14:27:18 +01:00
David Given
051e9e38f3 Add a boilerplate wxwidgets example. 2021-12-15 22:55:57 +01:00
David Given
63a5954dfa Merge pull request #390 from davidgiven/victor9k
Victor 9000 fixes
2021-12-15 15:08:41 +00:00
David Given
897931f273 Merge pull request #386 from davidgiven/pulsefix
Various firmware fixes
2021-12-14 21:07:06 +00:00
David Given
03e80b2f1c Fix the format so it no longer discards sector 0. 2021-12-14 21:10:38 +01:00
David Given
53c8ec864c Clean up the GreaseWeazle bandwidth tester. Sometimes it doesn't read the right
amount of data from the device?
2021-12-14 18:01:53 +00:00
David Given
5d3002f118 Announce the device serial number on connection again. 2021-12-13 23:24:02 +01:00
David Given
5eeb52660c Update documentation for the USB autodetection. 2021-12-13 23:19:16 +01:00
David Given
3dfafaa278 GreaseWeazle autodetection now works (at least on Linux). 2021-12-13 23:09:33 +01:00
David Given
462bd9ae5e Rewrite the sampler pulse detection... again. 2021-12-12 23:13:23 +00:00
David Given
dab0fcc7c0 Hopefully fix Linux build. 2021-12-12 21:15:30 +01:00
David Given
b8a3e8085e Fix after merge. 2021-12-12 19:58:19 +00:00
David Given
c9d1d72ba3 Merge in the libusbp changes. 2021-12-12 19:50:33 +00:00
David Given
ccf5d513d2 Merge from master. 2021-12-12 19:49:32 +00:00
David Given
d157b7b05d Make libusbp work on Windows; rework the Microsoft-specific bits of the
firmware to match. This does at least allow us to get rid of the patcher.
2021-12-12 17:25:24 +00:00
dg
05981ac46c Make work on OSX. 2021-12-12 15:40:12 +00:00
David Given
08615a5954 Make libusbp build, at least on Linux; port fluxengineusb to use it. 2021-12-12 16:29:51 +01:00
David Given
b6dbe26c7e Raw import of libusbp. 2021-12-11 18:59:44 +01:00
David Given
4f0d61b379 Merge pull request #388 from davidgiven/supercardpro
Tell the various IBM decoders which sectors to expect, for more reliable retries.
2021-12-11 11:26:51 +00:00
David Given
9e5e494f88 Merge from master. 2021-12-11 12:18:06 +01:00
David Given
b15fd05e8d Add support in the IBM decoder for trackdata protos, and then configure the IBM
profiles to know about which sectors it should see in the result image to allow
retries if sectors aren't found.
2021-12-11 12:17:32 +01:00
David Given
faabc28d1b Merge pull request #387 from davidgiven/supercardpro
Refactor the serial port code.
2021-12-10 23:45:49 +00:00
David Given
4b815846ee ...and fix for OSX. 2021-12-10 23:35:58 +00:00
David Given
fe8be18c4c Fix the serial port code on Windows. 2021-12-10 23:29:20 +00:00
David Given
519c30321d Split the serial port code off into its own file so we can use it for the SCP
driver.
2021-12-11 00:06:14 +01:00
David Given
77be88a5bb Add a package that the tests need. 2021-12-10 21:25:00 +01:00
David Given
8d04931f9f Turns out the high density pin is asserted when _double_ density. Set it
correctly.
2021-12-10 20:07:02 +00:00
David Given
3d1ee7a43e Don't spin in an infinite loop if the decoder tries to find a data record and
the matcher fails to find anything, leaving the seek point unchanged.
2021-12-10 19:56:00 +00:00
David Given
2584a25527 Update components and binary. 2021-12-10 19:55:06 +00:00
David Given
0647a82d38 The tests will run on Windows now. 2021-12-10 19:54:31 +00:00
David Given
c56459c98c Add back the pulse converter, as a 12MHz sample clock only allows pulses which
are 83ns long, which I think is too big. We now sample the index signal at
64MHz which allows pulses down to 16ns.
2021-12-10 17:40:58 +00:00
David Given
7b0a4a057d Merge pull request #376 from tdaede/scpfix2
Fix SCP writer to always write complete revolutions.
2021-12-09 22:26:36 +00:00
David Given
3c3e520594 Merge pull request #378 from tdaede/ibm_n88basic
Add ibm_n88basic format.
2021-12-08 19:56:35 +00:00
Thomas Daede
ce1daf6a2b Add option to rescale flux sink pulses.
Note that this does not affect the decoder used for verify,
but at least for tame rescaling the decoders are still able to
lock.

This is a precursor to automatic scaling via the disk speed
measurement.
2021-12-07 14:45:32 -08:00
Thomas Daede
68314cd44d Add n88basic format.
This isn't really intended to be used directly (bare images are
normally .d88 etc) but is useful for testing the FM encoder.
2021-12-07 14:39:31 -08:00
David Given
17787b97d4 Merge pull request #371 from tdaede/d88hd
Set media density automatically for D88 format.
2021-12-07 21:54:58 +00:00
David Given
da84297b2c Merge pull request #380 from tdaede/last_fluxmap
SCP: Only write the last continuous fluxmap.
2021-12-07 21:47:54 +00:00
David Given
e3e3bb770d Merge pull request #379 from tdaede/no_disk_sector_check
Remove per-track sector check from D88.
2021-12-07 21:45:47 +00:00
David Given
9d4f180741 Merge pull request #381 from hharte/fixnorthstar
Fix North Star after decoder update
2021-12-07 21:44:26 +00:00
David Given
316836d9f6 Merge pull request #382 from darkstar/protofix
Fix a small typo in proto.cc
2021-12-07 17:24:24 +00:00
Michael D
aa3b0a117a Fix a small typo in proto.cc
Also add long-forms "yes" and "no" as valid options
2021-12-07 18:10:53 +01:00
Howard M. Harte
0f7df3281f NorthStar: Fix nsiimagewriter image size in informational message. 2021-12-06 17:57:08 -10:00
Howard M. Harte
4a91a35799 Fix the North Star decoder after the PLL upgrade. 2021-12-06 17:55:54 -10:00
dg
36c2263675 Fix the Micropolis decoder after the PLL upgrade. 2021-12-06 22:20:18 +00:00
David Given
28068d8d31 Merge pull request #375 from davidgiven/fl2
Make the new FL2 format the default.
2021-12-06 22:14:33 +00:00
Thomas Daede
0c3c08db36 SCP: Only write the last continuous fluxmap. 2021-12-06 11:47:42 -08:00
Thomas Daede
bb5d62fe69 Remove per-track sector check from D88.
It's no longer needed to be this strict.
2021-12-06 10:13:30 -08:00
David Given
376270dd53 Merge pull request #377 from tdaede/d88trackfill
Set FM gap fill byte in D88.
2021-12-06 16:21:13 +00:00
Thomas Daede
9056b23eaa Set FM gap fill byte in D88. 2021-12-06 08:10:02 -08:00
Thomas Daede
634be4ae51 Fix SCP writer to always write complete revolutions.
There were a couple of problems that needed to be fixed:

- Fluxmaps can be produced with zero index pulses by encoders.
This is somewhat ambiguous but it's assumed that this means there
is exactly one revolution.

- The SCP unindexed mode wasn't properly supported, as it should
create equal-length revolutions not aligned to indexes. However,
fluxmaps don't contain any information on rotation speed. Therefore,
drop the ability to create unindexed SCPs and slightly change the
meaning of the option to not include pre-index data.

- Real flux reads can potentially produce duplicate index pulses.
Avoid creating zero-length revs.

- Fix off-by-one error for rev count.
2021-12-06 07:41:16 -08:00
David Given
422620f4fe Merge pull request #374 from davidgiven/ibm
Make the gap fill byte configurable.
2021-12-05 22:27:45 +00:00
dg
194b9b1193 Modify the flux upgrader to convert from sqlite flux files to fl2 flux files. 2021-12-05 17:46:23 +00:00
dg
27fceb3f41 Make the new FL2 flux format the default. 2021-12-05 17:09:02 +00:00
dg
930e0bcd67 Let the tests run on OSX. 2021-12-05 17:04:35 +00:00
dg
d81e0a3ed4 Merge from master. 2021-12-05 16:44:15 +00:00
dg
ebb5c17be4 Make the IBM format gap fill byte configurable. 2021-12-05 16:43:45 +00:00
dg
1e99fe5b04 Merge from master. 2021-12-05 16:37:04 +00:00
David Given
5f5f22c82b Merge pull request #373 from davidgiven/fl2
Add a new much simpler file format.
2021-12-05 16:29:21 +00:00
David Given
709e300960 More typo fixing. 2021-12-05 17:17:03 +01:00
David Given
d2f677d84e Typo fix. 2021-12-05 17:00:28 +01:00
dg
18d90c44dd Rework the flux decoders to add a desync opcode for separating multiple reads
in a flux stream. Finally add a unit test for the flux decoder.
2021-12-05 14:42:57 +00:00
dg
298f77f52e Add the FL2 reader. 2021-12-05 11:33:19 +00:00
David Given
70b2f7efb4 Merge pull request #372 from davidgiven/osx
Add a warning if you use a /dev/tty file on OSX
2021-12-04 21:14:46 +00:00
dg
78a070bd99 Add a simple warning if you're using OSX with a GreaseWeazle and select a
/dev/tty file rather than a /dev/cu one (the /dev/tty files usually don't work).
2021-12-04 20:57:53 +00:00
dg
c88ff973b1 Merge from master. 2021-12-04 19:23:41 +00:00
Thomas Daede
66f82f764d Set media density automatically for D88 format. 2021-12-04 10:31:17 -08:00
dg
d36a18c17a Add the experimental FL2 encoder. 2021-12-04 12:39:36 +00:00
David Given
8efd95346a Merge pull request #369 from tdaede/d88plus
Use per-track encoding specified in D88 files.
2021-12-04 11:44:28 +00:00
Thomas Daede
04b91377c9 Use per-track encoding specified in D88 files.
This supports varying sector sizes, counts, and modulation on
a per-track basis. It also supports writing sectors in the
original order.
2021-12-04 03:36:06 -08:00
David Given
f5d04d989c Merge pull request #366 from davidgiven/victor9k
Add a Victor 9000 encoder.
2021-12-03 23:03:46 +00:00
David Given
06a497f346 As the victor9k profile is single-sided only, rename it. 2021-12-03 23:43:29 +01:00
David Given
b1cf706a8f Update Victor9K documentation. 2021-12-03 23:41:53 +01:00
David Given
91f04e36e9 Bash the Victor9K encoder into producing images that look almost plausible. 2021-12-03 23:39:06 +01:00
David Given
5d76eec0f6 Merge pull request #361 from tdaede/autodim
Automatically configure format for DIM when no format is specified.
2021-12-03 21:38:47 +00:00
Thomas Daede
7822325866 Automatically configure format for DIM when no format is specified. 2021-12-03 13:34:35 -08:00
David Given
521123f139 Merge from master. 2021-12-03 22:34:31 +01:00
David Given
b3f511b025 Merge pull request #364 from davidgiven/scp
Improve SCP handling.
2021-12-03 21:28:43 +00:00
David Given
ff63840beb Run the encodedecode tests with scp as well as flux. 2021-12-03 22:12:33 +01:00
David Given
1fbcf4aa5f More Victor9K encoder. 2021-12-03 22:04:25 +01:00
dtrg
8d6a811204 Correctly write the number of revolutions in SCP files. 2021-12-03 18:13:17 +00:00
dtrg
08fe2a9e27 Merge from master. 2021-12-03 13:59:03 +00:00
David Given
d8465f4374 Merge pull request #357 from tdaede/d88
Add minimal D88 image format reader.
2021-12-03 11:59:28 +00:00
Thomas Daede
8a3cd14723 Add minimal D88 image format reader.
This implements a subset of D88, only supporting the first floppy
in an image. It only supports images with equal sector sizes,
equal numbers of sectors per track, and no bad sectors.
2021-12-03 02:18:29 -08:00
Thomas Daede
08c1671f21 Add Make target to build compdb. 2021-12-03 02:13:01 -08:00
David Given
91e794add1 Merge pull request #358 from davidgiven/imageformats
Refactor to allow image readers to specify the encoder/decoder formats, if desired.
2021-12-02 22:55:23 +00:00
dg
9c98caf21d Remove the prototype IMD automatic encoder code, because it needs a lot more
work.
2021-12-02 22:44:33 +00:00
dg
f97c42017f Instead of preloading the image, just explicitly load it in fe-write and change
the writeDiskCommand interface to take an Image rather than an ImageReader.
2021-12-01 19:58:24 +00:00
dg
3033a2cb95 Add semi-functioning prototype code to set the encoder and decoder
automatically with IMD files. Also make the IMD reader work properly again.
2021-12-01 18:18:48 +00:00
dg
bcf6f48d46 In fe-read, load the image before constructing the encoder, decoder etc so as
to allow the image reader to modify the config if necessary.
2021-12-01 17:55:05 +00:00
David Given
4c97f15a65 Merge pull request #355 from tdaede/lowercase
Make filename endings case insensitive.
2021-12-01 17:23:08 +01:00
David Given
5dc6349818 Merge pull request #356 from tdaede/fix_sizes
Fix reported size of DIM and FDI images.
2021-12-01 17:22:08 +01:00
Thomas Daede
6ab5c4012a Make filename endings case insensitive. 2021-12-01 06:35:15 -08:00
Thomas Daede
1d50e45777 Fix reported size of DIM and FDI images.
The computation for size accidentally included header size.
2021-12-01 06:32:18 -08:00
David Given
3cbf420acd Merge pull request #354 from tdaede/fdi
Add FDI format reader.
2021-12-01 13:00:41 +01:00
Thomas Daede
ea407b2182 Add FDI format reader.
This format is common for NEC PC-98 disk images.
2021-12-01 03:44:18 -08:00
David Given
5228885760 Merge pull request #348 from tdaede/dim
Add DIM format reader.
2021-12-01 12:01:33 +01:00
Thomas Daede
676845aaf3 Add DIM format reader.
This format is common for Japanese PC floppy images.
2021-12-01 00:07:02 -08:00
David Given
61af9b3810 Merge pull request #351 from tdaede/xdf
Add alias for XDF image files.
2021-11-30 12:42:33 +01:00
Thomas Daede
406a433c3f Add alias for XDF image files.
This is a common extension for Sharp X68000 bare disk images.
2021-11-30 00:40:54 -08:00
David Given
2abd413c08 Merge pull request #350 from tdaede/gw_density
Fix inverted density select in Greaseweazle driver.
2021-11-29 13:25:03 +01:00
Thomas Daede
ad96c9bb9f Fix inverted density select in Greaseweazle driver.
Pin 2 should be set high when high density is selected.
2021-11-28 19:31:26 -08:00
David Given
b412d54998 Do the framework and hopefully a lot of the maths of the Victor 9K encoder. 2021-11-27 23:38:57 +01:00
David Given
6247d3c5e6 Don't print lots of digits after the decimal point in the amount of read data. 2021-11-27 23:38:25 +01:00
David Given
b7ee513dfd Set up the config for the Victor 9000 format. 2021-11-27 20:49:36 +01:00
David Given
3795abc19e Add the Victor9k boilerplate. 2021-11-27 19:44:53 +01:00
David Given
1d32a4d984 Merge pull request #346 from davidgiven/victor9k
Rewrite the flux decoder to use a PLL-driven algorithm.
2021-11-26 22:43:58 +01:00
David Given
a20a78cd64 Merge from trunk. 2021-11-26 21:37:25 +01:00
David Given
a2f51b36ec Check in missing file... 2021-11-26 21:36:22 +01:00
David Given
910ccb273a Added the PLL phase adjustment stuff to the decoder. Much better decodes. 2021-11-26 21:27:58 +01:00
David Given
2cbe39e553 Fix bugs to make the IBM decoder work again. 2021-11-26 21:17:58 +01:00
David Given
994c8fc02d Merge pull request #347 from tdaede/jpc
Add Japanese PC 1.2MB format.
2021-11-26 12:56:47 +01:00
Thomas Daede
57dcd6d520 Add Japanese PC 1.2MB format.
This format is used by the PC-98 and Sharp X68000 series.

3.5" disks are spun at 360rpm to match the clock rate of 5.25".
2021-11-26 03:50:44 -08:00
David Given
20ade1de7b Replace the flux decoder with a PLL-based one stolen from samdisk. It almost
works.
2021-11-25 00:00:51 +01:00
David Given
28aff78469 Make victor9k disk images triangular. 2021-11-21 21:41:14 +01:00
Eric Anderson
3b95e56418 Support Micropolis variations and prefer VGI extension 2021-11-07 21:54:00 -08:00
David Given
056055bf0b Merge pull request #341 from davidgiven/ibm
Minor fixes to do the the imgwriter and Acorn formats.
2021-11-04 20:17:50 +01:00
David Given
368d329459 Set enable_side_byte for Acorn formats, because the machines don't always write
it.
2021-11-03 14:16:26 +01:00
David Given
2fe1ffeaf1 Add an ignore_track_byte setting. 2021-11-03 14:15:51 +01:00
David Given
e252e8eb1d If no sector_count is specified in a sector_range, autodetect it. 2021-11-03 14:15:25 +01:00
David Given
e160bcc7d5 Merge pull request #333 from ejona86/micropolis-write
Add Micropolis encoder
2021-10-31 10:33:24 +01:00
David Given
41bd035690 Merge pull request #312 from davidgiven/teledisk
Add read support for Teledisk images, plus add a format for the HP 9121 disk drive
2021-10-30 23:58:20 +02:00
David Given
b0003fc7e5 Merge from master. 2021-10-30 22:19:37 +02:00
David Given
8e1be97589 Merge pull request #335 from ejona86/scp-revs-crash
scpfluxsource: Support more than 5 revolutions
2021-10-30 20:39:45 +02:00
Eric Anderson
181f2f38d8 s/ScpTrackStart/ScpTrackHeader/ and use in ScpTrack 2021-10-30 10:29:17 -07:00
David Given
661940114e Merge pull request #338 from davidgiven/atari
Switch the Atari ST formats to use 1-based sector IDs.
2021-10-30 13:30:57 +02:00
David Given
9874d4bec5 Update compiler flags to make newer compilers happy. 2021-10-30 13:22:00 +02:00
David Given
7d5fedf35f Switch the Atari ST formats to use 1-based sector IDs. 2021-10-28 19:40:16 +02:00
Eric Anderson
69ad36a9ae scpfluxsource: Support more than 5 revolutions
This prevents uninitialized memory reads for files with many
revolutions. See #322.
2021-10-08 20:40:23 -07:00
Eric Anderson
ce5fcaf172 Micropolis raw 275 byte sectors
These are used by formats like VGI since the ECC varied per machine and
the 10 extra bytes of user data may contain useful information.
2021-10-02 22:59:14 -07:00
Eric Anderson
a00137d742 Remove unused fe-writemicropolis.cc 2021-10-02 17:37:33 -07:00
Eric Anderson
e002842640 Add Micropolis writing documentation snippet 2021-10-02 17:26:46 -07:00
Eric Anderson
41e9c46cba Port Micropolis encoder to protobuf-based config 2021-10-02 16:24:38 -07:00
David Given
bc2d58bee3 Merge pull request #332 from ejona86/redir-typo
Redirect dd to stdout instead of file '1'
2021-10-02 20:28:00 +00:00
Eric Anderson
c54de27503 Merge branch 'master' into micropolis-write
Let's not act like this actually compiles.
2021-10-02 12:45:56 -07:00
Eric Anderson
d9bfd77fba Redirect dd to stdout instead of file '1'
Looks like a typo, that would have had mostly the intended effect.
2021-10-02 11:41:06 -07:00
David Given
336cc0077c Merge pull request #331 from davidgiven/proto
Assorted minor fixes.
2021-09-25 21:06:40 +00:00
David Given
0be673b210 Clarify documentation in the building doc. 2021-09-25 22:43:19 +02:00
David Given
028e2498fb Update references to --input.flux and --output.flux. 2021-09-25 22:35:02 +02:00
David Given
249f1dea9d Merge from master. 2021-09-25 22:24:14 +02:00
David Given
07c7b22669 Allow setting enum proto values from the command line. 2021-09-19 22:59:47 +02:00
David Given
6623058a18 Merge pull request #321 from wybren1971/patch-3
Update commodore1541.textpb
2021-08-19 13:22:10 +02:00
Wybren van Duinen
68e4d569d0 Update commodore1541.textpb
Changed to default .d64 for use with emulators
2021-08-17 15:00:56 +02:00
David Given
7186b25a69 Merge pull request #317 from davidgiven/tests
Fix a bunch of C++ incompatibilities.
2021-08-04 20:39:06 +02:00
David Given
42cacb18bd Lots of warning fixes. Can we switch to C++ 2A? 2021-08-04 20:29:04 +02:00
David Given
d09c03f4d2 Update fmt::format to version 7.1.3 (the last before module support is needed). 2021-08-04 20:14:53 +02:00
David Given
ad240b150e Merge pull request #316 from davidgiven/sectorids
Switch to using sector IDs rather than zero-index sector numbers.
2021-08-03 22:45:02 +02:00
David Given
1177ef6f8d Allow the LDBS data rate and recording mode to be specified, or (crudely)
guessed if not.
2021-08-03 22:31:33 +02:00
David Given
2ff50c0c56 Fix merge issues. 2021-08-01 20:46:48 +02:00
David Given
4f4ed1307f Merge from master. 2021-08-01 19:42:04 +02:00
David Given
6d5b7cb64e Merge pull request #315 from davidgiven/tests
Overhaul the tests.
2021-08-01 19:37:15 +02:00
David Given
00fc4e3890 Merge from master. 2021-08-01 19:26:39 +02:00
David Given
7344ee4402 Fix binary extension on Windows. 2021-08-01 19:12:16 +02:00
David Given
740eacc7ac real_*_oneof() is too new for GI's proto library. 2021-08-01 15:29:34 +02:00
David Given
8b1bcf21ee Don't run the encodedecode tests on non-Linux platforms. 2021-08-01 15:29:15 +02:00
David Given
b0a5174c0a Wire up the (available) tests. 2021-08-01 14:58:46 +02:00
David Given
b7cca1b95b Add up_to_track in the image reader/writer trackdata proto. Abstract out the
routine which fetches the trackdata for more consistent (and correct) results.
2021-08-01 13:57:35 +02:00
David Given
44c51f1246 Don't crash when given a missing sector. 2021-08-01 13:56:51 +02:00
David Given
516d43d7a8 Correctly parse extra config textpbs as textpbs, not binarypbs. 2021-08-01 13:56:31 +02:00
David Given
86d49d563e Write the correct values to the sector headers! 2021-08-01 13:30:26 +02:00
David Given
a2911a9585 Allow setting oneof message fields to the default value. 2021-07-31 14:24:49 +02:00
David Given
9a12b651f9 Remember to wire up the tids990 encoder. 2021-07-31 00:44:07 +02:00
David Given
9fa631acca Fix the Brother encoder. 2021-07-31 00:42:25 +02:00
David Given
8df7998a83 Don't use ninja -v. 2021-07-31 00:41:46 +02:00
David Given
c81c1926c0 Wire up the encode/decode tests. Hey, look, failures! 2021-07-31 00:38:13 +02:00
David Given
7ab1288424 Pretty sure the Atari formats don't need swap_sides at all. 2021-07-31 00:37:55 +02:00
David Given
3ee88adfa9 Add a simple tool for doing round-trip encode/decode tests. 2021-07-30 00:10:54 +02:00
David Given
29e8c99b4f Hopefully get the imagereader/imagewriter and IBM encoder/decoders using sector
IDs.
2021-07-29 00:02:46 +02:00
David Given
8b115f8156 Convert the IBM encoder/decoder to use lists of sector IDs rather than
sector_skew strings.
2021-07-28 21:51:12 +02:00
David Given
11c546f113 Merge pull request #313 from davidgiven/ibm
swap_sides isn't symmetrical for the encoder and the decoder
2021-07-28 20:47:46 +02:00
David Given
c087539eb7 swap_sides isn't symmetrical for the encoder and the decoder. On the encoder,
it affects which logical side is being written to which physical side. On the
decoder, it modifies the logical side bit in the sector header itself.
2021-07-28 20:33:07 +02:00
David Given
27f7cbb892 Allow .TD0 and well as .td0 extensions. 2021-07-24 00:09:56 +02:00
David Given
11ffb09b66 Attempt to fix build error on OSX. 2021-07-24 00:03:22 +02:00
David Given
114f9f522d Add a completely guessed-at HP 9121 format. Tidy up the Teledisk reader
somewhat.
2021-07-23 23:52:30 +02:00
David Given
91dc51d59a Just skip missing sectors rather than wiping the entire track. 2021-07-23 23:51:59 +02:00
David Given
11b3922b02 Remember to calculate the disk geometry! 2021-07-23 23:22:12 +02:00
David Given
05552cc3e5 Add a basic and largely untested TD0 reader. 2021-07-23 23:21:30 +02:00
David Given
3db7964509 Fix a horrifying Bytes.slice bug which was causing memory corruption. 2021-07-23 23:17:19 +02:00
David Given
2a06adcabb Merge pull request #310 from davidgiven/ibm
The 1581 format doesn't need swap_sides.
2021-07-22 00:20:42 +02:00
David Given
8cec3354ea The 1581 format doesn't need swap_sides. 2021-07-22 00:01:07 +02:00
David Given
f9df728f45 Merge pull request #309 from davidgiven/ibm
Fix swap_sides on the IBM encoder/decoder.
2021-07-21 21:12:36 +02:00
David Given
46eead34c4 Warning fix. 2021-07-21 21:00:57 +02:00
David Given
786b35fee2 Fix swap_sides on the ibm encoder/decoder to work; remember to specify it for
both the encoder and decoder.
2021-07-21 20:57:43 +02:00
David Given
5c6c609991 Merge pull request #308 from davidgiven/protobuf
Properly merge in the default settings.
2021-07-20 21:15:49 +02:00
David Given
0be8fedf26 MergeFromString() is apparently too new for the version of protobuf on GI's
Linux distro.
2021-07-20 20:42:33 +02:00
David Given
1f9aaf1ac0 Properly merge in the default settings. 2021-07-20 20:24:18 +02:00
David Given
3926de3fa1 Merge pull request #306 from davidgiven/verifier
Verify disks when writing them
2021-07-19 22:48:05 +02:00
David Given
9086f18413 Update documentation. 2021-07-19 22:39:14 +02:00
David Given
ad2576bc76 Hopefully, add support for 400kB Mac disks. 2021-07-19 22:39:07 +02:00
David Given
4523407d9d Fix the C64 encoder to work again. 2021-07-19 22:38:49 +02:00
David Given
53162ac934 Ensure that the 1200kB 5.25" IBM format uses high_density: true. 2021-07-19 22:12:50 +02:00
David Given
1dac51d4ba Don't try to verify when writing to files. 2021-07-19 21:52:16 +02:00
David Given
13deef3416 Plumb the verifier stuff through the rest of the encoders; fix it to actually
work and not crash, god I hate C++.
2021-07-19 21:46:48 +02:00
David Given
b887bebb26 First largely untested draft of a working verifier. 2021-07-19 00:13:06 +02:00
David Given
d51160babb Convert all the readables to formats. 2021-07-16 23:41:22 +02:00
David Given
44b9e7a398 Convert all the writables into formats. 2021-07-16 22:46:45 +02:00
David Given
065cd113c1 Rework to support combined format definitions, although with only the Amiga
format enabled.
2021-07-16 22:39:38 +02:00
David Given
a5f618b7e4 Merge pull request #304 from davidgiven/verifier
Massive refactor to simplify the logic.
2021-07-16 19:04:55 +01:00
David Given
a06e4e862d Remove junk files. 2021-07-16 19:56:07 +02:00
David Given
084c858446 Fix seg fault when writing non-existent sectors. 2021-07-16 19:55:55 +02:00
David Given
5d889d4d95 Remove Track, which is now obsolete. 2021-07-16 00:00:11 +02:00
David Given
f589e094b2 Remove RawRecord, which is now obsolete. 2021-07-15 23:55:29 +02:00
David Given
2eff798d74 Remove SectorSet, which is now obsolete. 2021-07-15 23:51:02 +02:00
David Given
239cecff9e Convert all the encoders and imagereaders to the new scheme. 2021-07-15 23:43:07 +02:00
David Given
fa36af454e The encoders and decoders all build now. 2021-07-15 23:13:59 +02:00
David Given
458d0f7a1b Another mahoosive refactor: move away from using protos for the disk output in
favour of pod objects, which allows STL contains. Lots of shared_ptrs
everywhere. Much simpler and more effective code. The reader works with one of
the decoders; still have to do the rest of them and the encoders.
2021-07-15 22:50:29 +02:00
David Given
f1f27ffd33 The protoified reader now builds and runs, although doesn't work properly. 2021-07-11 23:53:50 +02:00
David Given
4a2e09e8eb Merge from master. 2021-07-11 17:38:09 +02:00
David Given
4b3fada646 Archival checkin (WIP). 2021-07-11 17:36:42 +02:00
David Given
690befc98b Merge pull request #302 from davidgiven/cleanup
More refactoring and cleanup, this time of the encoders.
2021-07-11 16:34:56 +01:00
David Given
c6b3c0f9eb Remove stray flags from the Macintosh encoder. 2021-07-11 17:03:34 +02:00
David Given
b423a71b38 Refactor the encoders the same way that's been done for the decoders. 2021-07-11 16:55:18 +02:00
David Given
e226773066 Merge pull request #301 from davidgiven/cleanup
Refactor the decoders
2021-07-11 15:19:14 +01:00
David Given
98918d160a Convert the ZilogMcz decoder. 2021-07-11 16:12:34 +02:00
David Given
969298fb58 Convert the Victor9k decoder. 2021-07-11 16:10:26 +02:00
David Given
bc60f3b45a Convert the Northstar decoder. 2021-07-11 16:08:16 +02:00
David Given
f7a4785d22 Convert the Tids990 decoder. 2021-07-11 16:04:44 +02:00
David Given
1bf41cbfd7 Convert the MX decoder. 2021-07-11 16:02:41 +02:00
David Given
e9d80423ae Convert the Micropolis decoder. 2021-07-11 16:00:46 +02:00
David Given
928ffbd7af Convert the Macintosh decoder. 2021-07-11 15:58:40 +02:00
David Given
25ebad2448 Convert the IBM decoder. 2021-07-11 15:56:20 +02:00
David Given
dd951dc0ed Convert the Fb100 decoder (which I think got lost in the last big refactor). 2021-07-11 15:54:04 +02:00
David Given
aed9e44b6b Convert the Durango F85 decoder. 2021-07-11 15:50:35 +02:00
David Given
1fa2547aff Convert the C64 decoder. 2021-07-11 13:04:07 +02:00
David Given
164ceb845e Convert the Brother decoder. 2021-07-11 13:01:56 +02:00
David Given
ce463686dc Convert the Apple2 decoder. 2021-07-11 12:57:41 +02:00
David Given
92aa28cac2 Convert the AES Lanier decoder. 2021-07-11 12:55:05 +02:00
David Given
f8674230ed Add prototypes for all the decoders because it's easier to do them in one go... 2021-07-11 12:52:34 +02:00
David Given
326969e488 Clean up the Amiga decoder. 2021-07-11 12:34:40 +02:00
David Given
155e8c2a4b Merge pull request #296 from hharte/northstar_mixed_density
Northstar: Handle mixed-density disks
2021-07-09 22:47:55 +01:00
David Given
7f95f6b43f Merge pull request #299 from davidgiven/greaseweazle
Support GreaseWeazle versions above 24.
2021-07-08 10:08:59 +01:00
David Given
b2d7ba1a65 Treat all GreaseWeazle versions from 24 or above the same, as the USB protocol
has been frozen.
2021-07-08 10:50:31 +02:00
David Given
b550bbbd08 Don't link against libudev any more. 2021-07-08 10:49:57 +02:00
Howard M. Harte
cc79977ac0 Northstar: Handle mixed-density disks
North Star DOS provided an upgrade path for disks formatted as
single-density to hold double-density data without reformatting.  In
this case, the four directory blocks will be single-density but other
areas of the disk are double-density.  This cannot be accurately
represented using a .nsi file, so in these cases, we pad the sector to
512-bytes, filling with spaces.
2021-07-06 17:34:53 -07:00
David Given
4cbb75df60 Merge pull request #273 from davidgiven/amiga
Fix the Amiga encoder after the protobuf rewrite.
2021-07-06 23:05:45 +01:00
David Given
7d8926659e Merge pull request #292 from wybren1971/patch-2
Fix distorted picture
2021-07-06 14:34:18 +01:00
David Given
37ca3f74c7 Make the Amiga encoder a unicorn. 2021-07-05 23:16:37 +02:00
David Given
56cbf39d59 Finally make the Amiga encoder work properly. Do some FM/MFM/bits refactoring. 2021-07-05 23:16:03 +02:00
Wybren van Duinen
a783e7f500 fix typo 2021-07-05 17:41:37 +02:00
Wybren van Duinen
2f4ac42684 Fix distorted picture
modify available space (width and height) with subtraction of two times the border (up en down, and left and right)
2021-07-05 16:56:57 +02:00
David Given
ec689e100e Merge from trunk. 2021-07-04 23:04:02 +02:00
David Given
6f0909d992 Merge pull request #289 from davidgiven/c64
Fix writing C64 disks
2021-07-04 11:21:20 +01:00
David Given
0092dec49e Hopefully make writing C64 disks work again by fixing the logical:physical
track mapping.
2021-07-03 12:09:10 +02:00
David Given
3447689c19 Don't crash when trying to encode tracks with no data. 2021-07-03 11:38:45 +02:00
David Given
d4563fd842 Merge pull request #282 from davidgiven/osx
Fix some OSX build inelegancies.
2021-06-19 13:28:44 +02:00
David Given
d2ecec6009 Typo fixes. 2021-06-19 12:54:06 +02:00
David Given
26f26aec50 Try to fix ranlib on Linux and Windows. 2021-06-19 12:35:18 +02:00
David Given
34dfc2767f Fix some OSX build inelegancies. 2021-06-19 12:24:47 +02:00
David Given
bc3d3cabce Merge pull request #276 from davidgiven/greaseweazle
Fix GreaseWeazle support.
2021-06-04 23:53:45 +02:00
David Given
23d80b93ae Update GreaseWeazle documentation for the new version. 2021-06-04 23:42:23 +02:00
David Given
0d59d3d195 Typo fix on the Linux/OSX side of things. 2021-06-04 23:36:25 +02:00
David Given
192427cf80 Finally figure out why Windows wasn't working --- the Win32 ReadFile / ::read
call waits until _all_ bytes are read, rather than returning as soon as any
bytes are read. Fixed.
2021-06-04 22:03:44 +01:00
David Given
98e4094d70 Set up the GreaseWeazle termios properly. 2021-06-02 22:51:57 +02:00
David Given
e88b939866 Allow multiple fallback parameters using =. 2021-06-02 22:51:41 +02:00
David Given
aed5a02ee1 Remove flag references from the Amiga encoder. 2021-05-28 16:58:28 +02:00
David Given
9f1e1bb2b6 Merge pull request #271 from hharte/rpm-retry
Perform retries when calculating drive RPM.
2021-05-27 11:29:51 +02:00
David Given
15e9383d0b Merge pull request #269 from hharte/fix-doc
Add mingw-w64-i686-protobuf to list of packages
2021-05-27 11:21:43 +02:00
David Given
4ec056900c Merge pull request #270 from hharte/track-ruler
Add ruler for track numbers.
2021-05-27 11:21:24 +02:00
David Given
983feb59b0 Merge pull request #272 from hharte/fix-typo
Fix typo.
2021-05-27 11:21:00 +02:00
Howard M. Harte
8b2ce33f83 Fix typo. 2021-05-26 23:12:09 -07:00
Howard M. Harte
44b452b30b Perform retries when calculating drive RPM.
The drive RPM measurement fails about 3% of the time.  Retry up to
five times until it succeeds, and exit with an error if it doesn't.
2021-05-26 23:02:34 -07:00
Howard M. Harte
f60c9981b8 Add mingw-w64-i686-protobuf to list of packages
When building under Windows, the mingw-w64-i686-protobuf support
package is required.
2021-05-26 22:54:20 -07:00
Howard M. Harte
7c3df93580 Add ruler for track numbers. 2021-05-26 22:50:13 -07:00
David Given
601d7dfcf8 Merge pull request #268 from davidgiven/windows
Make the Windows build static again.
2021-05-26 20:37:25 +02:00
David Given
41cb53a550 We neeed update:true to get the version of the protobuf package with the static
library in it.
2021-05-26 20:23:59 +02:00
David Given
87c13ae20c Make the Windows binary static again. 2021-05-26 18:51:33 +01:00
David Given
c30482af66 Merge pull request #266 from davidgiven/hharte-northstar
Merge in hharte's Northstar changes
2021-05-25 20:25:27 +02:00
David Given
5f4f2f10d7 Update FluxEngine components and rebuild firmware. 2021-05-25 19:11:32 +01:00
David Given
ae630a0e18 Merge pull request #267 from hharte/hharte-northstar
Northstar: Fix configurations.
2021-05-25 18:55:29 +02:00
Howard M. Harte
c66931cb12 Northstar: Fix configurations.
Tested read/write with 350K, 175K, and 87K disks.
2021-05-24 20:40:17 -07:00
David Given
fb2dbe25cd Add missing file. 2021-05-24 23:33:40 +02:00
David Given
bf4831be9f Migrate the Northstar code to the new framework. 2021-05-24 23:20:59 +02:00
David Given
0f83082cf0 Merge branch 'northstar' of https://github.com/hharte/fluxengine into hharte-northstar 2021-05-24 21:39:51 +02:00
David Given
fbfde604e7 Merge pull request #264 from davidgiven/salfter-local
Overhaul profiles and merge in salfter's IBM formats
2021-05-24 12:24:21 +02:00
David Given
5e2dfbed73 Add the 9-sector IBM formats. 2021-05-24 12:10:21 +02:00
David Given
571602d3de Go back to only having a single Atari ST read profile. 2021-05-24 12:10:01 +02:00
David Given
85693f2577 Show the profile comment in the help. 2021-05-24 11:15:21 +02:00
David Given
60bc8ad888 Add comment fields to all the configs; fix some documentation. 2021-05-23 23:57:38 +02:00
David Given
9bf309eb5c Add physical mapping options. 2021-05-23 23:57:22 +02:00
David Given
eeddfa87b6 Merge branch 'local' of https://github.com/salfter/fluxengine into salfter-local 2021-05-23 21:18:58 +02:00
David Given
861fe2466c Merge pull request #263 from davidgiven/hpingel-greaseweazle_v024_compat
Update the GreaseWeazle and USB support.
2021-05-23 21:12:03 +02:00
David Given
3a2cce78ca Update incorrect reference to usb.device. 2021-05-23 20:49:34 +02:00
David Given
4e01f1de0d Update GreaseWeazle documentation. 2021-05-23 20:41:10 +02:00
David Given
4f0a5e854c Attempt to rework the USB handling to make the GreaseWeazle work on Windows and
Mac --- we abandon autodetection for anything other that FluxEngines as libusb
is painfully inconsistent with serial devices.
2021-05-23 18:53:25 +01:00
David Given
c669a9c808 Add libudev autodetect for GreaseWeazle devices. 2021-05-23 17:44:01 +02:00
David Given
e4d827256f Add test code for platform detection. 2021-05-23 12:42:49 +02:00
David Given
1c1ad2725e Port the Greaseweazle driver to use the serial port rather than raw libusb. 2021-05-23 12:39:41 +02:00
David Given
d18e54c5a3 Add Greaseweazle support for firmwares 22 and 24. 2021-05-23 12:01:29 +02:00
David Given
7a885e23d3 Merge branch 'greaseweazle_v024_compat' of https://github.com/hpingel/fluxengine into hpingel-greaseweazle_v024_compat 2021-05-23 10:50:35 +02:00
David Given
33dde3a465 Merge pull request #262 from davidgiven/wybren1971-Commodore-64-encoder
Merge in wybren1971's 1541 encoder and D64 reader.
2021-05-22 23:42:52 +02:00
David Given
8d4ac59f03 Try and fix that intermittent dependency problem with the test protos. 2021-05-22 23:22:24 +02:00
David Given
4fbfc492ce Mark the C64 format as a unicorn. 2021-05-22 20:59:54 +02:00
David Given
ac1fb71bc5 Note the limitation when writing 1541 disks. 2021-05-22 20:58:28 +02:00
David Given
01d6b37b83 Try to update the dev build with the current date. 2021-05-22 10:36:23 +02:00
David Given
2284b4dce1 Upgrade to checkout@v2. 2021-05-22 10:21:43 +02:00
David Given
b92f80e6be And try to fix it again. 2021-05-22 00:01:00 +02:00
David Given
bd5596fa30 Fix the autorelease script. 2021-05-21 23:57:39 +02:00
David Given
4614b63c30 Convert wybren1971's D64 reader and 1541 encoder to work with the new
architecture.
2021-05-21 23:34:28 +02:00
David Given
cf41b6cbb2 Merge branch 'Commodore-64-encoder' of https://github.com/wybren1971/fluxengine into wybren1971-Commodore-64-encoder 2021-05-21 23:02:04 +02:00
David Given
87f3e0e291 Merge pull request #253 from davidgiven/protobuf
Rework the configuration system to use protobufs.
2021-05-21 22:36:58 +02:00
David Given
1997abcde6 Warning fix pass. 2021-05-21 22:12:14 +02:00
David Given
8b761298ee Using a tool which wants a profile with no parameters now lists the available
profiles.
2021-05-21 21:39:00 +02:00
David Given
df0356b841 Update documentation. 2021-05-21 21:27:42 +02:00
David Given
dc158ebff4 Add a documentation page for the Eco1. 2021-05-21 21:15:51 +02:00
David Given
f8192b90f4 Add README banner about the command line change. 2021-05-21 20:42:50 +02:00
David Given
5237049e2c Fix fe-inspect to work. 2021-05-21 20:40:52 +02:00
David Given
9d70fb261e Remove some obsolete tools. 2021-05-21 20:40:42 +02:00
David Given
8370b8a743 Adjust documentation formatting. 2021-05-20 23:00:28 +02:00
David Given
25656d81a1 Update documentation for the new version. 2021-05-20 22:41:03 +02:00
David Given
be97791428 Set sane defaults for rpm and seek. Adjust the aeslanier cylinder range. 2021-05-20 22:40:51 +02:00
David Given
18b683d22e Add drive:N as a valid flux source and sink specifier; remove the --drive
option. Also, a bunch of option cleanup.
2021-05-20 22:14:22 +02:00
David Given
34e9742f71 Use .st for the default Atari ST image filenames. 2021-05-20 19:07:15 +02:00
David Given
087eb7777e Bizarrely, we need to install vim to get xxd. 2021-05-19 23:03:16 +01:00
David Given
c469c5e3a1 Set the right msystem? 2021-05-19 22:56:34 +01:00
David Given
485c29bb49 Install maybe the right packages? 2021-05-19 22:53:53 +01:00
David Given
aa0cf150bd Apparently I've been using the wrong compiler all along. 2021-05-19 22:50:29 +01:00
David Given
91c52e91cd Merge. 2021-05-19 23:02:08 +02:00
David Given
a1f4014738 Rework the ibm encoder to allow per-track configurations. Rename everything for
consistency.
2021-05-19 23:01:32 +02:00
David Given
8a136ac4f6 Allow imgimagewriter to write mixed-format disks; add an eco1 disk format for the VDS Eco1. 2021-05-19 22:12:23 +02:00
David Given
ea43b3dc6a Apply Windows compatability hack. 2021-05-18 22:46:57 +01:00
David Given
57fc787819 You can load config files now. 2021-05-18 22:44:41 +02:00
David Given
a0164b8de3 Rip out dataspecs everywhere. 2021-05-18 22:22:06 +02:00
David Given
9df35c1814 Fix a bunch of documentation strings. 2021-05-18 21:10:59 +02:00
David Given
9d2a5fee86 Range ends default to range start. 2021-05-18 21:09:31 +02:00
David Given
a6b2e932fa copy-flux-to works. 2021-05-18 20:13:03 +02:00
David Given
05aaa2634b Don't hard-code references to the global config in the
updateConfigForFilename() methods.
2021-05-18 19:57:23 +02:00
David Given
2c98f5c542 Convert cwftoflux to a proper flux source. 2021-05-18 19:37:43 +02:00
David Given
d246fca9df Convert scptoflux to a proper flux source. 2021-05-18 01:09:55 +02:00
David Given
c79feb405c Switch to resource path type thingies for specifying flux file types, where
appropriate. Much better.
2021-05-18 00:40:16 +02:00
David Given
b1145f8da3 Flux sink type is now detected from file extension. 2021-05-18 00:23:38 +02:00
David Given
3588d681a2 Convert fluxscp to a proper flux sink. 2021-05-17 23:28:30 +02:00
David Given
55d894ae1f Convert fluxtovcd to a proper flux sink. 2021-05-17 22:12:44 +02:00
David Given
0509caf432 Allow the .au writer to write multiple tracks. 2021-05-17 21:53:15 +02:00
David Given
5d1d807e78 Convert fluxtoau to a real flux sink. 2021-05-17 21:42:25 +02:00
David Given
22ba38b2e0 Add rawread. 2021-05-17 01:06:09 +02:00
Howard M. Harte
42f858267c Hard Sectors: Fix index_irq assertion.
The index_irq could trigger one sector too late, in the case where
index_irq was reset just before the sector pulse was received.

Check the duration of the time between pulses before propagating the
hardsec_index_irq_primed to index_irq.

While this change is required for reading and writing North Star
floppies (due to lack of positioning information in the sector header)
it is also helpful for reading Micropolis disks, as currently,
occasionally the first sector will be missed, and will be found on the
next rotation of the disk.  This change is required for reliably writing
Micropolis disks though, when that functionality becomes available.
2021-05-16 15:41:55 -07:00
Howard M. Harte
5b1a3173f8 Add support for North Star hard-sectored floppies.
North Star Floppy disks use 10-sector hard sectored disks with either FM
or MFM encoding.  They may be single- or double-sided.  Each of the 10
sectors contains 256 (FM) or 512 (MFM) bytes of data.  The disk has 35
cylinders, with tracks 0-34 on side 0, and tracks 35-69 on side 1.
Tracks on side 1 are numbered "backwards" in that track 35 corresponds
to cylinder 34, side 1, and track 69 corresponds to cylinder 0, side 1.

The North Star sector format does not include any head positioning
information.  As such, reads from North Star floppies need to be
synchronized with the index pulse, in order to properly identify the
sector being read.  While there is a command line option:
--sync-with-index, that does this, the North Star reader forces this
behavior by default.

MFM sectors have 32 bytes of 00's followed by two sync characters,
specified in the North Star MDS manual as 0xFBFB.

This is true for most disks; however, I found a few disks, including an
original North Star DOS/BASIC v2.2.1 DQ disk, that uses 0xFBnn, where
nn is an incrementing pattern.

While searching for the start of a sector header, seekToPattern()
ignores the sector pulses.  If a sector header cannot be decoded for any
reason, seekToPattern() will advance past one or more sector pulses.
For this reason, the _hardSectorId is calulated after the sector header
is found.

Due to the nature of the track ordering on side 1, an .nsi image reader
and writer are provided for double-sided disks.  The .nsi image format
supports both single- and double-sided disks; however, single-sided .nsi
images are equivalent to .img images.
2021-05-16 15:41:55 -07:00
David Given
97822bd9a8 analysedriveresponse works. 2021-05-16 23:01:03 +02:00
David Given
b926f5a692 Setting boolean config fields works. 2021-05-16 23:00:34 +02:00
David Given
191dfdf13f Make seek work. 2021-05-16 20:13:02 +02:00
David Given
a100f1fe1e Merge. 2021-05-16 18:23:30 +02:00
David Given
471ccf281c Allow setting cylinder and head ranges. 2021-05-16 18:11:40 +02:00
David Given
6c959be188 Remove reference to dead code. 2021-05-16 00:13:17 +01:00
David Given
010887f18f Try and make build on Windows again. 2021-05-16 00:36:32 +02:00
David Given
e4b5e4c502 Make Kryoflux streams again. 2021-05-16 00:25:41 +02:00
David Given
2de3b4f92e Make rawwrite work (which replaces erase and writeflux). 2021-05-15 23:30:58 +02:00
David Given
225a93330d Rename more config stuff. 2021-05-15 22:37:29 +02:00
David Given
41b36649a9 Rename a bunch of config fields for clarity. 2021-05-15 22:23:42 +02:00
David Given
55c26ab1c4 Make rpm work. 2021-05-15 21:48:42 +02:00
David Given
8b1e60a1fd Remove unused dataspecs. 2021-05-15 21:35:38 +02:00
David Given
ed0f38748b Add helper flags to fe-read and fe-write for setting common parameters. 2021-05-15 21:28:02 +02:00
David Given
7d75a720ca Remove dependent FlagGroups, to make sure that we can't use them by mistake. 2021-05-15 19:00:45 +02:00
David Given
5a38db166f Remove reader flags. 2021-05-15 18:56:30 +02:00
David Given
3c9fb79263 The -Wl,--no-as-needed option isn't needed any more and doesn't work on OSX. 2021-05-15 18:30:49 +02:00
David Given
98d5a2dad9 Add missing file. 2021-05-15 18:07:05 +02:00
David Given
4ab8b4984d Rename all InputProto and OutputProtos for clarity. 2021-05-15 18:05:53 +02:00
David Given
f741ad058e Convert the ZilogMcz decoder. 2021-05-15 17:40:20 +02:00
David Given
2512a4fc32 Convert the Victor9k decoder. 2021-05-15 17:29:59 +02:00
David Given
5554d5e608 Convert the TIDS990 encoder and decoder. 2021-05-15 17:24:20 +02:00
David Given
48d5ed2ff9 Convert the MX decoder. 2021-05-15 17:06:28 +02:00
David Given
2632668d0e Convert (hopefully correctly) the IBM writables. 2021-05-15 14:26:06 +02:00
David Given
f46e444aa2 Convert the Micropolis decoder. 2021-05-15 14:10:08 +02:00
David Given
1149ad86a2 Convert the Apple2 decoder. 2021-05-15 14:04:44 +02:00
David Given
e1398d98b0 Remove some stray files. 2021-05-15 13:50:13 +02:00
David Given
8133e2b7aa Convert the Atari ST configuration. 2021-05-15 13:49:31 +02:00
David Given
ebe678b18b Fix IBM sector base default; convert the ampro configuration. 2021-05-15 13:47:34 +02:00
David Given
509217606c Remove sqlite flux sink flags. 2021-05-15 13:42:30 +02:00
David Given
6fb694669c Remove the fluxmapreader flags. 2021-05-15 13:34:26 +02:00
David Given
5a63172a86 Remove the hardware source/sink flags. 2021-05-15 13:06:53 +02:00
David Given
93dcc7e242 Convert the image readers and Mac encoder and decoder. 2021-05-15 12:33:22 +02:00
David Given
243eea33e9 Convert the FB100 decoder. 2021-05-15 12:11:11 +02:00
David Given
38a8367f62 Convert the F85 decoder. 2021-05-15 12:05:31 +02:00
David Given
a02953cccc Fix the last fix. 2021-05-15 11:56:50 +02:00
David Given
f13f96967e Try to fix the dependency issue with protobufs. 2021-05-15 11:09:31 +02:00
David Given
f7c31281e0 Convert the C64 decoder to the new configuration scheme. Also convert all the
imagewriters.
2021-05-15 00:25:32 +02:00
David Given
ac34a43d9b Add the missing Brother 120kB format. 2021-05-15 00:08:49 +02:00
David Given
c8d0950979 Convert the Amiga encoder and decoder to the new system. 2021-05-15 00:06:39 +02:00
David Given
a4ff59eccb Remember to actually hook the aeslanier decoder up. 2021-05-14 23:42:01 +02:00
David Given
c3a50f9442 Add missing file... 2021-05-14 23:39:47 +02:00
David Given
57e81ee72e Convert the AES Lanier decoder to the new configuration system. 2021-05-14 23:39:07 +02:00
David Given
05df0a37b1 Add (pretty basic) config dumping and documentation help. 2021-05-14 23:29:16 +02:00
David Given
25f2c3a8c1 Move the USB flags into the config file. 2021-05-13 23:35:05 +02:00
David Given
c3aa12db78 Add support for filename flags to the flags parser. Allow setting config values
from the command line.
2021-05-13 23:16:52 +02:00
David Given
a3bd7cc644 Programmatically create the readables and writables mappings. 2021-05-13 19:39:45 +02:00
David Given
5a186b6960 Rename all protos to end with 'Proto' to avoid name conflicts. 2021-05-13 18:05:08 +02:00
David Given
639588fa68 Hardware flux sources are configurable. 2021-05-13 17:39:49 +02:00
David Given
f9510c54b2 Split the encoder/decoder configuration away from inputs and outputs. Make the
test pattern creator a flux source.
2021-05-13 17:23:06 +02:00
David Given
3a8ddf8025 The writer now works with the new config system. 2021-05-13 15:55:05 +02:00
a2801ea88c add write support for various 5.25" formats 2021-05-12 17:28:59 -07:00
David Given
c2aae7ee18 fe-read now supports multiple readable formats. 2021-05-13 00:02:54 +02:00
David Given
9d0804eff4 Convert the IBM decoder to use the new config system. 2021-05-12 23:42:38 +02:00
David Given
6ff84b3693 Bash the imagewriter stuff into working with the new config system. 2021-05-12 23:08:17 +02:00
wybren1971
b641e0282b Update disk-c64.md
wrong quotes
2021-05-12 15:32:37 +02:00
wybren1971
37a467cabc updated the Doc 2021-05-12 15:24:35 +02:00
wybren1971
e01a7110ac Added format bytes (disk ID) to header from BAM 2021-05-12 14:55:32 +02:00
wybren1971
5dad5de548 removed a testmessage 2021-05-12 10:14:12 +02:00
wybren1971
295325a20b Added some checks on sector status 2021-05-12 10:11:51 +02:00
David Given
df0a9bac96 More config machinery: the reader now reads (but can't put the resulting image
anywhere).
2021-05-12 00:26:42 +02:00
David Given
cf9cef6f87 Added the machinery for including literal protobufs in the code. 2021-05-11 22:13:10 +02:00
wybren1971
f92814b24b Added option to write d64 images back to disk 2021-05-11 19:54:50 +02:00
David Given
331b59cd1e Merge pull request #256 from davidgiven/writeflux
Fix writeflux to actually work.
2021-05-11 00:04:10 +01:00
David Given
ed6d211aff Fix writeflux to actually work. 2021-05-11 00:22:19 +02:00
David Given
a8f1469d36 Flesh out the proto config stuff some more. 2021-05-10 22:38:04 +02:00
David Given
74cb332706 The dotted path setter should now work properly. 2021-05-08 23:56:45 +02:00
David Given
89165369b1 Import Snowhouse. 2021-05-08 23:01:40 +02:00
David Given
a54e3d33a6 Add a first draft of the dotted config file setter. 2021-05-08 22:58:29 +02:00
David Given
0f17984f41 Merge pull request #227 from hharte/ibm-presets
Add presets for 5.25" IBM PC floppies.
2021-05-08 15:41:45 +01:00
wybren1971
6527ceb913 Added comment 2021-05-08 12:41:11 +02:00
wybren1971
64a57ba837 Change sectorskew IMD starts numbering with 1 2021-05-08 12:39:28 +02:00
wybren1971
74da9330f8 IMD file expect sectornum to start with 1 not 0 2021-05-08 12:23:58 +02:00
David Given
4fa1dd6860 There aren't any static protobuf libraries, so we're going to have to build
dynamic Windows executables now.
2021-05-08 10:56:15 +01:00
Howard M. Harte
e55effc9ca Add presets for 5.25" IBM PC floppies.
For reading:
    --ibm-preset-360 - Read a 5.25" 360kB disk in a 48tpi drive.
    --ibm-preset-360-96tpi - Read a 5.25" 360kB disk in a 96tpi
        drive.
    --ibm-preset-1200 - Read a 5.25" 1.2MB disk.

For writing:
    --ibm-preset-360 - Write a 5.25" 360kB disk in a 48tpi drive.
    --ibm-preset-1200 - Write a 5.25" 1.2MB disk in a 96tpi drive.

Test:
    Test reading and writing using a Teac FD-55GFR-571 96tpi drive.
    Test reading and writing using an Alps DFC222B05A 48tpi drive.

Fixes davidgiven/fluxengine#189
2021-05-07 23:20:58 -07:00
David Given
924b862f7c Adjust protobuf configuration. 2021-05-07 23:58:41 +02:00
David Given
5f077762d5 Hopefully set the right protoc compiler? 2021-05-07 23:45:43 +02:00
David Given
1b0ec50711 Add lots more protobuf machinery. 2021-05-07 23:38:31 +02:00
David Given
22f320f1c4 Merge from master. 2021-05-07 22:27:45 +02:00
David Given
9949476584 Merge pull request #252 from davidgiven/40track
Add support for possibly writing 40-track disks on an 80-track drive.
2021-05-07 22:21:02 +02:00
David Given
1b5b170557 Add support for possibly writing 40-track disks on an 80-track drive. 2021-05-07 22:01:20 +02:00
David Given
925a3a4bdb Merge pull request #251 from davidgiven/40track
Better 40-track support.
2021-05-07 21:16:19 +02:00
David Given
720fe9f95f Make sure that places which use usbSeek() honour --40-track. 2021-05-07 20:45:46 +02:00
David Given
7c4f8e1443 Added documentation on 40-track disks and drives. 2021-05-07 20:40:22 +02:00
David Given
79d24dff46 Add boilerplate for a protobuf definition. 2021-05-07 20:05:50 +02:00
wybren1971
928435a31d Added error catching to exit gracely on an error 2021-05-07 15:59:03 +02:00
wybren1971
26ac92eaa3 Standardized messages in classes 2021-05-07 13:25:25 +02:00
wybren1971
2974c08b08 Fix bug in printing sectorskew to screen 2021-05-07 13:11:43 +02:00
wybren1971
5a7b0b3050 Warning was commented out. Fixed 2021-05-07 13:03:41 +02:00
wybren1971
cc2d9bbdd1 Bugfix wrong sectorsize used 2021-05-07 12:54:54 +02:00
David Given
e912152784 Common out the high-density flag too. 2021-05-07 00:27:10 +02:00
David Given
d00681f623 Make the new 40-track flag common between source and sink. 2021-05-07 00:21:13 +02:00
wybren1971
52942c3d2a Fixed a bug with sectorskew for 1.44 diskettes 2021-05-06 17:40:57 +02:00
wybren1971
dedabdd8d8 Added possibility to write IMD images 2021-05-06 14:26:21 +02:00
wybren1971
3061499860 Small bugfixes and added a check on the sectorskew 2021-05-06 14:18:40 +02:00
wybren1971
20f18755ed added an example in the comment 2021-05-06 14:17:37 +02:00
wybren1971
333f2aba54 added a bool for FM or MFM coding 2021-05-06 14:17:05 +02:00
wybren1971
1cb673ed80 Added a bool for knowing FM or MFM use 2021-05-06 14:16:32 +02:00
wybren1971
57e0bc784a Fix bug in startsectorID 2021-05-01 09:12:38 +02:00
wybren1971
425afa93da Better Comment reading with string 2021-04-30 21:45:22 +02:00
wybren1971
259b2cebc7 Added optional cylindermap and sector head map 2021-04-30 20:33:39 +02:00
wybren1971
06589826c8 Small Tweak in gap3 value 2021-04-30 19:43:57 +02:00
wybren1971
2245cd982a Leave destination as is 2021-04-30 19:38:02 +02:00
wybren1971
065b50769f Update IMD writing based on geometry in image 2021-04-30 15:26:06 +02:00
wybren1971
d1e99852bc Merge pull request #2 from davidgiven/master
Update fork with master commits
2021-04-21 08:29:54 +02:00
David Given
bf8f6ae687 Add imagereader offset and step modes, and hardware forty-track modes. Not sure
this is the right way to do it.
2021-04-21 00:41:36 +02:00
David Given
4ad6805ea1 Change to house style. 2021-04-19 20:29:55 +02:00
David Given
4f4e3f0b89 Qualify LIF options, to allow multiple LIF formats. 2021-04-19 20:29:48 +02:00
David Given
b51f2c1ec8 Fix C++ standard issue. 2021-04-19 20:27:44 +02:00
David Given
1bec06fd75 Merge branch 'master' of https://github.com/wybren1971/fluxengine into wybren1971-master 2021-04-19 19:28:53 +02:00
David Given
451d2e2d1d Merge pull request #244 from davidgiven/visualiser
Update the visualiser to use AGG.
2021-04-19 16:56:47 +02:00
David Given
9cee12f9f4 Add index mark and sector alignment. 2021-04-19 15:31:24 +02:00
David Given
f5d6011a77 Merge from trunk. 2021-04-19 13:25:27 +02:00
David Given
64b2ff19ea Mark the new releases as not being prereleases. 2021-04-19 13:25:10 +02:00
David Given
9c17a64773 Don't fail the deletion if no assets exist. 2021-04-19 13:15:38 +02:00
David Given
69c877ff66 Adjust wording. 2021-04-19 12:58:21 +02:00
David Given
ac557ffedc Update git checkout action. 2021-04-19 12:24:04 +02:00
David Given
b1e41bc583 I think that the git tag command doesn't like newlines in the message. Fix. 2021-04-19 12:12:24 +02:00
David Given
a144395ec9 Syntax fix. 2021-04-19 11:49:07 +02:00
David Given
0cf9d05489 Try a different tag action. 2021-04-19 11:47:39 +02:00
David Given
0e6c0a41d0 Merge pull request #245 from davidgiven/github
Switch to github CI for Windows rather than Appveyor.
2021-04-19 11:30:46 +02:00
David Given
8a83652d08 Add the github autorelease script. 2021-04-19 11:24:06 +02:00
David Given
91ee72a8d6 Need to use the C++ compiler. 2021-04-19 01:29:06 +02:00
David Given
91b1c8c13c Getting there. Configure ar. 2021-04-19 01:17:20 +02:00
David Given
26effeabe6 More path tweaking. 2021-04-19 01:13:55 +02:00
David Given
611c9740ed Getting there. More path adjustment. 2021-04-19 01:08:26 +02:00
David Given
2a048c3228 Add diagnostics. 2021-04-19 01:04:19 +02:00
David Given
f4fd83d999 Adjust package list again. 2021-04-19 00:55:42 +02:00
David Given
cf68585808 Remove the appveyor script. 2021-04-19 00:52:12 +02:00
David Given
9f9e926cff Try explicitly building with the mingw compiler. 2021-04-19 00:51:49 +02:00
wybren1971
9dc0dd75fd Fix bug in ibm-preset-720 2021-04-18 22:51:10 +02:00
David Given
9f285710f8 Update msys version. 2021-04-18 22:08:35 +02:00
David Given
ee1c448327 Try to set up build correctly. 2021-04-18 22:00:14 +02:00
David Given
e85bf1713e Enable github CI for Windows. 2021-04-18 21:55:55 +02:00
David Given
7341c71277 Cleanup. 2021-04-18 21:42:10 +02:00
David Given
d579863311 Try and make build on Windows. 2021-04-18 21:41:32 +02:00
David Given
c79cfc19aa Update the visualiser documentation. 2021-04-18 21:05:22 +02:00
David Given
997a6be267 Update the visualiser to use the new bitmap library instead of emitting SVG. 2021-04-18 21:01:21 +02:00
David Given
762bb3006d Move the visualiser code into fe-analyselayout. 2021-04-18 13:09:49 +02:00
wybren1971
07f2bd8cab small fix in tracks info 2021-04-18 09:49:06 +02:00
David Given
daf83db9b3 The standalone visualiser functions. 2021-04-18 01:21:52 +02:00
wybren1971
55c6e19af4 add IMD file reader 2021-04-17 19:32:03 +02:00
wybren1971
9cadc94c5a add IMD file reader 2021-04-17 19:12:52 +02:00
wybren1971
cacdf9ef56 add IMD file reader 2021-04-17 19:06:56 +02:00
wybren1971
a3042fc6c0 typo fix 2021-04-17 18:53:11 +02:00
wybren1971
3efd492525 add IMD file reader 2021-04-17 18:52:41 +02:00
wybren1971
55a5cbc356 Merge pull request #1 from davidgiven/master
update fork
2021-04-17 17:49:52 +02:00
wybren1971
2887b024ab add HP-LIF preset 2021-04-17 17:01:49 +02:00
wybren1971
917303edb9 add IMD file reader 2021-04-17 16:55:42 +02:00
wybren1971
c712c15a30 add IMD file reader 2021-04-17 16:55:25 +02:00
wybren1971
0c541db8e0 add IMD file reader 2021-04-17 16:55:07 +02:00
wybren1971
603b1520d7 add IMD file reader 2021-04-17 16:49:41 +02:00
David Given
c7eb8ad5c8 Add CSV reader and skeleton layout analyser. 2021-04-17 00:08:06 +02:00
David Given
0b285aa7f4 Remove the visualiser integration from the reader. 2021-04-16 21:38:26 +02:00
David Given
e8665bd00c Build a cscope cross-reference (if cscope is installed). 2021-04-16 21:38:08 +02:00
David Given
fb4eaa4332 Merge pull request #241 from wybren1971/patch-1
Update fe-writeibm.cc
2021-04-13 01:14:49 +02:00
wybren1971
874a9eae76 Update fe-writeibm.cc 2021-04-12 21:39:40 +02:00
wybren1971
8230520956 Update fe-writeibm.cc 2021-04-12 20:40:23 +02:00
wybren1971
66da9675f1 Update fe-writeibm.cc
Added a HP-LIF preset to write HP-LIF floppy disks for old HP analyzers in need of LIF formatted disks with 76 tracks and sectors of 1024 bytes.
2021-04-12 20:37:19 +02:00
David Given
61ff48c005 Merge pull request #236 from erichelgeson/eric/typo
Fix minor typo
2021-02-20 22:02:46 +01:00
Eric Helgeson
5fc8a1e52a Fix minor typo 2021-02-20 14:42:02 -06:00
David Given
df1ac74069 Merge pull request #233 from davidgiven/ibm
Refactor the IBM readers and writers.
2021-02-16 23:47:50 +01:00
David Given
91f718bf38 Fold the Atari ST writer into write ibm. Update documentation. 2021-02-16 23:24:41 +01:00
David Given
46e987e393 Refactor the IBM readers so they just set flags and readibm.cc is doing all the
work.
2021-02-16 23:07:25 +01:00
David Given
a59b4f7be7 Document writing 1581 disks. 2021-02-16 21:04:40 +01:00
David Given
ca66e3c35c Merge pull request #218 from hpingel/ibm_enc_swapsides_preset_1581
Adding preset for Commodore 1581 (cbm1581) to IBM writer frontend
2021-02-16 21:01:19 +01:00
hpingel
31e2ad8cba Enforce usage of Greaseweazle firmware v0.24 after adapting CMD_READ_FLUX and CMD_WRITE_FLUX 2021-01-21 23:44:13 +01:00
hpingel
320f32895a adding preset cbm1581 to ibm writer frontend 2021-01-18 23:08:33 +01:00
David Given
d4db131d3c Merge pull request #217 from davidgiven/writes
Update sequencer to not lose one tick from every non-zero interval.
2021-01-18 11:22:02 +01:00
David Given
27c2c9045e Update sequencer to not lose one tick from every non-zero interval. 2021-01-18 00:27:00 +01:00
David Given
f97b7c7d62 Merge pull request #215 from davidgiven/ibm
Fix the timing when writing IBM 1440kB disks.
2021-01-17 19:39:30 +01:00
David Given
9eb33d31ac Merge from master. 2021-01-17 18:57:49 +01:00
David Given
6dd84d6fc2 Add swapSides parameter to the Atari ST writer. 2021-01-17 18:53:43 +01:00
David Given
daddd60581 Merge branch 'ibm_enc_swapsides' of https://github.com/hpingel/fluxengine into hpingel-ibm_enc_swapsides 2021-01-17 18:43:31 +01:00
David Given
e832723ee4 Merge pull request #203 from keithclark/atari-st-format
Write Atari ST formats
2021-01-17 18:34:40 +01:00
Keith Clark
35f4a63c0e Fix type in IBM disk documentation 2021-01-17 14:02:37 +00:00
Keith Clark
28478ea4ac Add Atari ST disk documentation 2021-01-17 14:02:37 +00:00
Keith Clark
0f93a68694 Add Atari ST disk reader front-end 2021-01-17 14:02:37 +00:00
Keith Clark
1a2d5d13b3 Add .st to list of supported extensions 2021-01-17 14:02:37 +00:00
Keith Clark
5f2894fc5b Add support for writing Atari ST floppy formats 2021-01-17 14:02:37 +00:00
hpingel
66cb39dce2 added parameter swapSides to IBM encoder 2021-01-17 12:54:14 +01:00
David Given
d44c871c54 Remove stray debug tracing. 2021-01-16 22:26:54 +01:00
David Given
dff0378ba8 Fix timings for 1440kB disks. 2021-01-16 22:26:45 +01:00
David Given
4f7b1b7140 Merge pull request #212 from davidgiven/analysis
Rework the disk response analyser to draw its own graphs
2021-01-15 10:52:44 +01:00
David Given
662514304b Merge from master. 2021-01-14 01:24:19 +01:00
David Given
0913e9e0c0 Allow saving the other image formats supported by libstb. 2021-01-13 20:34:21 +01:00
David Given
d403733627 Update graphs and documentation. 2021-01-13 20:05:13 +01:00
David Given
fae5b439d0 Fix buffer overrun bug. 2021-01-13 20:01:36 +01:00
David Given
bc66de6d85 Can't initialise variable-sized objects. 2021-01-13 10:43:16 +01:00
David Given
57e598156c Add support to analyse driveresponse for drawing its own graphs via AGG. 2021-01-13 01:46:48 +01:00
David Given
b570e44ee4 Merge pull request #211 from davidgiven/patch-1
Add missing zlib dependency.
2021-01-11 11:59:22 +01:00
David Given
b115d0b55b Add missing zlib dependency.
Fixes: #190
2021-01-11 11:57:59 +01:00
David Given
03fc1419de Archival checkin of partial work towards drawing my own graphs. 2021-01-11 00:56:09 +01:00
Eric Anderson
8b71c0d737 Add Micropolis encoder
Has not been tested on a Micropolis machine.
2021-01-10 15:18:00 -08:00
David Given
a833aa0a00 Import STB's image writer library and hook it up to AGG. 2021-01-10 16:38:49 +01:00
David Given
52332b04ac Import the AGG graphics library. 2021-01-10 14:45:32 +01:00
David Given
529488cab0 Typo fix. 2021-01-10 13:55:55 +01:00
David Given
b2429a7ca3 Typo fixes. 2021-01-10 12:34:55 +01:00
David Given
0bce12d3b4 Merge pull request #210 from davidgiven/analysis
Add the drive response documentation page.
2021-01-10 12:26:09 +01:00
David Given
75f557cb18 Add the drive response documentation page. 2021-01-10 12:15:37 +01:00
David Given
035dd1fad1 Merge pull request #209 from davidgiven/analyse
Add an analysis tool for checking drive response.
2021-01-10 02:01:33 +01:00
David Given
d2df79a665 Remember to get rid of the junk comments! 2021-01-10 01:09:35 +01:00
David Given
103e0a13bb Typo fix. 2021-01-10 01:06:13 +01:00
David Given
d1b5eec84a Add the analysis tool and Python script for drawing the results. 2021-01-10 00:51:43 +01:00
David Given
6b1e6b31ed Add initial version of the response analysis tool. 2021-01-09 13:42:37 +01:00
David Given
f6f6db913e Merge pull request #208 from davidgiven/greaseweazel
Add client support for the GreaseWeazle.
2021-01-09 01:12:10 +01:00
David Given
ec0a6416fd Update documentation. 2021-01-09 00:52:16 +01:00
David Given
1787402be9 ...and again. 2021-01-09 00:45:27 +01:00
David Given
5f6d99f138 Attempt that fix again. 2021-01-09 00:37:37 +01:00
David Given
d1e2b0d1f8 Fix an issue with old C++ compilers and designated initialisers. 2021-01-09 00:29:46 +01:00
David Given
c2c51bbe33 Fix after merge. 2021-01-09 00:02:14 +01:00
David Given
bb806e3853 Merge from master. 2021-01-08 23:23:50 +01:00
David Given
a11d0e75c8 Merge pull request #200 from ejona86/hard-sectors
Add firmware support for hard sectors
2021-01-08 23:20:40 +01:00
David Given
5406ff0ea3 Typo fix. 2021-01-08 23:14:51 +01:00
David Given
c88317b44a Document how to make things work on Windows. 2021-01-08 23:13:27 +01:00
David Given
6898062d66 Document Windows horror. 2021-01-08 21:37:44 +01:00
David Given
6e1f264e6a Make --sync-with-index and --revolutions work properly on the GreaseWeazle. 2021-01-08 21:36:50 +01:00
David Given
082be14232 Add GreaseWeazle support for --high-density. 2021-01-08 21:20:33 +01:00
David Given
231aa44d03 The clock compensation factor for Mac doesn't seem to be needed? 2021-01-08 01:14:39 +01:00
David Given
cdb12f35d4 Update documentation to mention the GreaseWeazle. 2021-01-07 23:03:34 +01:00
David Given
e831ee8b44 Add erase support. 2021-01-07 22:46:11 +01:00
David Given
40e9a6082f Remove that 'packed' thing. 2021-01-07 22:17:19 +01:00
David Given
53cec292d0 Refactor the GreaseWeazle converter to allow it to be tested. 2021-01-07 22:06:45 +01:00
David Given
3f85309ee5 Commit non-functioning GreaseWeazle write support. 2021-01-07 20:42:06 +01:00
David Given
70944f8521 Reading flux now correctly handles index markers. 2021-01-07 20:02:51 +01:00
David Given
2ab00c42ff Handle index pulses on read. 2021-01-07 01:05:23 +01:00
David Given
a572742caa I read my first disk using the GreaseWeazel! 2021-01-07 00:58:19 +01:00
David Given
400e5f8580 The bandwidth tester works. 2021-01-06 23:24:28 +01:00
David Given
74f0fd89b6 We can successfully seek on the GreaseWeazle. 2021-01-06 22:52:52 +01:00
David Given
09f9bea7a2 Add boilerplate for the GreaseWeazle driver. 2021-01-06 20:39:13 +01:00
David Given
8bffb38117 Fix bad merge. 2021-01-05 02:16:55 +01:00
David Given
eb5d545c35 Remember to unicornify the Mac formats. 2021-01-05 02:09:47 +01:00
David Given
a79a545730 Merge pull request #205 from davidgiven/writemac
Add Macintosh write support.
2021-01-05 02:08:52 +01:00
David Given
3863dab944 Try to fix an AppVeyor issue. 2021-01-05 01:56:49 +01:00
David Given
e53b7ecd8b Rebuild firmware. 2021-01-05 01:51:29 +01:00
David Given
7d88673ed5 Merge from trunk. 2021-01-05 01:36:54 +01:00
David Given
41f2da71e4 Merge. 2021-01-05 01:36:10 +01:00
David Given
cb4ee0fd74 Comment typo fix. 2021-01-05 01:36:00 +01:00
David Given
088381a5a6 Add a DiskCopy 4.2 image reader. We can now write files to floppy, and they
almost work.
2021-01-05 00:36:06 +01:00
David Given
629af2a697 You can now create Bytes from strings and vice versa. 2021-01-04 23:31:54 +01:00
David Given
884edfd497 Tweak the Mac encoder parameters to work. 2021-01-04 23:06:15 +01:00
David Given
83dd9e462e Fix sequencer bug where intervals of 0 would go horribly wrong. 2021-01-04 22:06:19 +01:00
David Given
70a6dfd98a Warning fix. 2021-01-04 20:16:36 +01:00
David Given
7f5d96382b Update PSoC components. 2021-01-04 20:16:15 +01:00
David Given
fd4d1c4bb7 Writing Mac disks now looks like it's about half working, but some of the
tracks are ending up mangled on disk --- maybe it's a firmware bug?
2021-01-04 19:16:09 +01:00
David Given
7eaf3de572 Mac encoder is code-complete. 2021-01-04 17:48:59 +01:00
David Given
4b608de3fb Merge pull request #186 from davidgiven/8inch
Add some utility features for 8" drives
2021-01-04 01:50:59 +01:00
David Given
b47e6e852b Merge pull request #188 from davidgiven/jv3
Add support for reading TRS-80 JV3 images.
2021-01-04 01:50:38 +01:00
David Given
a8a8ce4a36 Do the basic skeleton of the writer. 2021-01-04 01:49:15 +01:00
David Given
c61376d5a1 Add skeleton of Mac encoder. 2021-01-04 00:50:12 +01:00
Eric Anderson
d3a5bb08d3 Set drive before checking rotation speed for writing 2020-12-24 23:11:34 -08:00
Eric Anderson
f1506d0dbd Add firmware support for hard sectors 2020-12-24 17:39:52 -08:00
David Given
15e6d4959e Adjust Micropolis documentation. 2020-10-11 18:49:00 +02:00
David Given
41216fd1cd Merge pull request #191 from ejona86/micropolis
Add Micropolis decoder
2020-10-11 18:52:31 +02:00
Eric Anderson
b8786866db Fix carry handling in Micropolis checksum
Two bugs make a right, mostly. The very last carry should be ignored and
when adding the low and high bytes they commonly would commonly produce
a carry which was being ignored. On the test disks these two bugs
cancelled themselves out, except only for track 1, side 1, sector 0. I
had noticed it was suspicously off-by-one earlier for both test disks,
but the cause wasn't obvious.

On some old 1980s disks, with real data, it changed number of bad
sectors from 224 (out of 2464) to 5 for one disk and 81 to 3 for
another.
2020-10-04 19:55:25 -05:00
Eric Anderson
82bd1bead4 Add Micropolis decoder
Resolves #187
2020-10-03 13:05:06 -05:00
David Given
6e2bdcad79 Document the JV3 format. 2020-09-18 00:56:02 +02:00
David Given
ef3c9f3d03 Add the fe-image command and the TRS-80 JV3 file reader. 2020-09-18 00:53:39 +02:00
David Given
5427f24df2 Merge from master. 2020-09-13 19:35:47 +02:00
David Given
b374340303 Try multiplexing SIDE1 onto DIR. 2020-09-10 22:07:47 +02:00
David Given
c78ed2c6ad Add the TK43 pin, which goes low when seeking to track 43 or above. 2020-09-10 21:48:30 +02:00
David Given
3b02bc8cf1 Merge pull request #183 from davidgiven/ds990
Add support for TI DS990 disks.
2020-09-10 21:19:10 +02:00
David Given
c7e48a7e76 Unicorn the DS990 format. 2020-09-10 20:10:54 +02:00
David Given
77d125c03d Typo fix. 2020-08-22 12:38:10 +02:00
David Given
8aa52aeefd Add documentation for the DS990. 2020-08-22 12:37:11 +02:00
David Given
0bab038454 Make the DS990 encoder work, maybe? 2020-08-22 00:36:48 +02:00
David Given
6c3b49f4d0 Add the DS990 encoder skeleton. 2020-08-21 23:07:35 +02:00
David Given
03dd689f17 Make the DS990 decoder work. 2020-08-21 00:32:36 +02:00
David Given
c375c948c0 Add boilerplate for the TI DS990 decoder. 2020-08-20 22:41:14 +02:00
David Given
cbcf457ce3 Merge pull request #182 from davidgiven/usb
Add support for multiple simultaneously connected FluxEngines.
2020-08-10 23:32:16 +02:00
David Given
4855f825e2 Show serial number on device connection, and improve the device listing a bit. 2020-08-10 23:16:04 +02:00
David Given
85bc1637f2 Document the use of multiple FluxEngines. 2020-08-10 23:12:33 +02:00
David Given
73398b83a9 Add support for specifying which FluxEngine you want to use with the --devices
parameter.
2020-08-10 22:36:47 +02:00
David Given
2727e66d40 Allow multiple USB implementations. 2020-08-09 22:33:54 +02:00
David Given
8b6be5a501 Move usb.{cc,h} into its own directory. 2020-08-09 21:14:09 +02:00
David Given
4fee29307c Refactor the USB stuff to allow for multiple USB implementations. 2020-08-08 14:52:11 +01:00
David Given
35f8249c67 Merge pull request #178 from davidgiven/mac
Add support for exporting to DiskCopy 4.2 Mac disk image
2020-08-02 17:42:48 +01:00
David Given
d1467a14b8 Merge. 2020-08-02 18:24:15 +02:00
David Given
3e6b9eb74d Document the .diskcopy file format. 2020-08-02 18:22:30 +02:00
David Given
ce2e8fb4b5 First draft of the DiskCopy 4.2 image writer. 2020-07-30 20:21:49 +01:00
David Given
7eaa75c05d Merge pull request #177 from davidgiven/mac
Make Mac double-sided disks work.
2020-07-29 00:38:28 +02:00
David Given
e86de4483a Fix stupid bug where the mac decoder was looking at the wrong bit for the side
data.
2020-07-28 01:25:50 +02:00
David Given
203a74713f Merge pull request #175 from davidgiven/scp
Make SCP import and export properly handle single-sided images.
2020-06-30 11:19:48 +02:00
David Given
59ed2a6793 Make SCP import and export properly handle single-sided images. 2020-06-26 20:25:56 +02:00
David Given
a03283ce64 Merge pull request #174 from davidgiven/scp
Fix the SCP exporter.
2020-06-26 15:40:41 +02:00
David Given
984cdaeb03 Make nanoseconds_t a double to prevent overflow on very large numbers of
revolutions (I've just seen a flux file with 50).
2020-06-26 14:47:25 +02:00
David Given
a1ed4a9171 Fill out the SCP checksum correctly, and add a --indexed mode which causes data
prior to the first index mark to be discarded and sets the INDEX bit in the
header.
2020-06-26 12:20:49 +02:00
David Given
93caf8e549 Merge pull request #172 from davidgiven/b169
Fix a crash when decoding MX disks if advanceToNextRecord finds no records in a track.
2020-06-25 22:15:00 +02:00
David Given
3841942153 Fix a crash when decoding MX disks if advanceToNextRecord finds no records in a
track.
2020-06-25 21:56:33 +02:00
David Given
5706877b67 Merge pull request #171 from davidgiven/newsampler
Manually merge in jboone's new sampler from #164
2020-06-25 21:16:11 +02:00
David Given
d60900262b Remove the pulse converters from the sampler (the new sampler doesn't require
them). Update firmware.
2020-06-25 21:07:58 +02:00
David Given
54ea34400b Merge in jboone's updated sampler branch. 2020-06-25 21:01:35 +02:00
Jared Boone
db2ab8841a Update Sampler.v, moving clock domain crossing to FIFO interface.
Hopefully, I unscrewed the tab/space and line ending mismatches to minimize the diff.
2020-05-30 21:31:17 -07:00
David Given
adba93ae0a Merge pull request #163 from davidgiven/brother120
Untested Brother 120kB write support.
2020-05-24 01:32:28 +02:00
David Given
98587d04a7 Merge from trunk. 2020-05-24 00:56:17 +02:00
David Given
0051b64648 Merge pull request #167 from vanbogaertetienne/trs80fix
Typo fix in FM_TRS80DAM2_PATTERN
2020-05-24 00:47:12 +02:00
vanbogaertetienne
603009ba15 Typo fix in FM_TRS80DAM2_PATTERN 2020-05-22 20:46:48 +02:00
Jared Boone
adb9809692 Simplify Sampler. 2020-05-20 11:34:29 -07:00
David Given
06eb10d2a0 Merge. 2020-05-16 10:38:17 +02:00
David Given
2244299bd9 Add a bias parameter to allow the entire Brother format to be moved around on
the disk.
2020-05-16 10:37:48 +02:00
David Given
6ca06ecafb Fix several embarassingly stupid bugs in the brother 120kB encoder code path. 2020-05-14 10:41:25 +02:00
David Given
9a5958f80b Prevent OOB when appending no bytes to a fluxmap. 2020-05-14 10:40:49 +02:00
David Given
2b53ac057c Fix some bugs which allow erasing tracks with F_FRAME_WRITE_CMD to work again.
(F_FRAME_ERASE_CMD always worked.)
2020-05-13 23:45:58 +02:00
David Given
5deba8af41 Untested Brother 120kB write support. 2020-05-13 14:49:06 +02:00
David Given
3c54a663b8 Merge pull request #157 from davidgiven/amigacorruption
Fix some issues causing corruption when reading Amiga disks
2020-04-09 00:16:38 +02:00
David Given
1fd65452c4 Typo fix. 2020-04-08 23:37:08 +02:00
David Given
30646ccb07 Fix an Amiga decoder bug where truncated sectors would be considered valid (the
Amiga checksum algorithm is weak and zero bytes don't contribute to the
checksum).
2020-04-08 23:35:55 +02:00
David Given
5be7249a30 Merge pull request #155 from davidgiven/amigawriter
Fix stray bytes at the end of images
2020-04-07 23:13:23 +02:00
David Given
067af18103 When writing images, use the sector size in the spec rather than the actual
data size, to avoid problems with multipart formats like the Amiga.
2020-04-07 23:02:47 +02:00
David Given
8dbd2a72a7 Merge pull request #150 from davidgiven/sixbit
Fix the new sampler and sequencer
2020-04-03 23:54:29 +02:00
David Given
c29e131a3b Convert the IBM format back into a unicorn now I've fixed it. 2020-04-03 23:49:01 +02:00
David Given
a9e30c1e49 Fix an off-by-one error in the sequencer that should have it generating correct
sequences.
2020-04-03 22:58:51 +02:00
David Given
972c8c6b61 Fix off-by-one sampler error, so now the clock rates are right again. 2020-04-03 22:27:33 +02:00
David Given
2007ff7546 Fix merge wibble. 2020-04-03 21:49:26 +02:00
David Given
64694580cd Remember to bump the protocol number after the bytecode change. 2020-04-03 21:46:51 +02:00
David Given
deaab94494 Merge pull request #146 from davidgiven/sixbit
Switch to a simplified encoding with a six-bit timer.
2020-04-03 00:45:21 +02:00
David Given
1509e1f89d Document the new bytecode format. 2020-04-03 00:38:20 +02:00
David Given
29e1ddc2ff Bytecode upgrades always produce the latest version; we don't want to upgrade
1->2->3 (although that specific case is harmless, by accident).
2020-04-03 00:36:55 +02:00
David Given
1fe6434563 Something is wrong with the IBM PC writer, I don't know what. Mark it as a
dinosaur again.
2020-04-03 00:27:12 +02:00
David Given
0367b7e77d Merge from trunk. 2020-04-01 00:06:35 +02:00
David Given
e6da85bf64 Merge pull request #145 from davidgiven/writereport
Add a machine readable read report.
2020-04-01 00:04:54 +02:00
David Given
cd19fcdadd The CSV report now writes records for every sector in the output map, even the
missing ones.
2020-03-31 00:14:23 +02:00
David Given
1954f02cfb Don't reset the device on startup because it confuses Linux. 2020-03-30 22:23:18 +01:00
David Given
39b23200b0 Fix missing flag dependency. 2020-03-29 23:12:12 +02:00
David Given
0644d6d965 Remove some stray tracing (which was causing problems). Fix a potential problem
where sampleclock posedges could be lost in the sequencer.
2020-03-29 23:11:53 +02:00
David Given
a075694d8e Rewrite the sequencer to work with the new six bit bytecode. Fiddle with the
USB stuff a lot in an attempt to resolve the weird packet loss issue.
2020-03-29 15:10:35 +02:00
David Given
b1ea5a9a35 Rework the writer to use a fluxsink rather than just writing stuff directly. 2020-03-29 15:08:45 +02:00
David Given
00087cbb6b Fix a catastrophic DMA setup bug which was causing (probably) every other byte
of data to be mixed up with every other byte... but as every other byte was a
0x80 we never noticed up until now.
2020-03-20 00:06:58 +01:00
David Given
1b48ea20c4 Remove the cruncher. 2020-03-20 00:06:07 +01:00
David Given
3d0f019fc4 Replace the sampler with one using the new simplified bytecode. 2020-03-19 23:39:23 +01:00
David Given
a08bfc183f Display the tick value along with each interval in the histogram. 2020-03-19 22:16:07 +01:00
David Given
c5aef9b051 Annotate inspect to display USB bandwidth. 2020-03-15 13:47:17 +00:00
David Given
fc2655ecd6 Rework the bytecode format to use a much simplified setup: a six-bit timer with
the top two bits reserved for pulse and index state. This is actually smaller,
bandwidth-wise, than the old version, and may be smaller than the crunched
version.
2020-03-14 18:58:43 +00:00
David Given
a737c723d3 Make sure to update before installing packages. 2020-03-14 14:47:04 +00:00
David Given
37aa8b62b0 Add a --write-csv=X option to the reader to dump the sector status map as a
machine-readable file.
2020-03-14 14:35:19 +00:00
David Given
a401173f6d Teach the Amiga decoder how many sectors to expect on each track. 2020-03-09 12:54:29 +00:00
David Given
ce76dc4279 Merge pull request #140 from davidgiven/sectors
Fix a couple of annoying but minor issues
2020-02-28 00:08:11 +01:00
David Given
1025bd857b Don't crashloop if the USB's not connected, as it causes the drives to be
constantly reprobed (which runs the motor).
2020-02-27 22:32:27 +01:00
David Given
025802b2d0 Count required sectors correctly on mac disks. 2020-02-27 22:30:05 +01:00
David Given
adbcb2cd31 Merge pull request #139 from davidgiven/sectors
Add support for required sectors, drive autodetection and fix homing on 8" drives.
2020-02-24 21:55:27 +01:00
David Given
c47a563790 Don't seek to track -1 on homing (it appears to upset 8" drives). Detect which
drives are present, so that if only a single drive is attached then it's always
track 0, regardless of which connector it's on.
2020-02-24 21:47:40 +01:00
David Given
04c09d1a5b Hopefully, fix the problem where ^Cing a job gets the board in a confused
state.
2020-02-21 22:16:20 +01:00
David Given
323da8272a Hopefully add support for giving the reader a set of required sectors, so if
one is missing then we can tell and the track can be reread.
2020-02-21 22:14:44 +01:00
David Given
38700c79fc Merge pull request #137 from davidgiven/docs
Update documentation.
2020-02-20 00:32:19 +01:00
David Given
d504d1890a Remember to document that you need a FDD cable. 2020-02-20 00:30:17 +01:00
David Given
d53e757cfb Rework some of the Brother documentation. 2020-02-20 00:25:55 +01:00
David Given
4983239458 Rework the hardware and software documentation. 2020-02-20 00:17:16 +01:00
David Given
376985828a Add the ditaa pinout table. 2020-02-19 23:49:43 +01:00
David Given
dce0a26820 Merge pull request #136 from davidgiven/ibm
Finally add write support for IBM disks.
2020-02-18 23:20:57 +01:00
David Given
14e0a67e7d IBM write support gets the much vaunted unicorn. 2020-02-18 23:10:09 +01:00
David Given
1656947764 Disable write precompensation, as it actually seems to make things worse. 2020-02-18 22:49:12 +01:00
David Given
647862cdbd Update the firmware for the new cruncher. 2020-02-18 22:13:41 +01:00
David Given
4a8d83838c Add IBM write support documentation. 2020-02-18 22:12:56 +01:00
David Given
8acf8e181d Rework the crunch encoding to be, hopefully, smaller and use less bandwidth for
HD disks.
2020-02-18 21:37:32 +01:00
David Given
2df9920209 Rename test bulktransport to test bandwidth; avoid watchdog failures while the
bandwidth test is running.
2020-02-18 19:12:52 +01:00
David Given
1a6c6b5420 The bandwidth tester now tests bandwidth in both directions. It looks like my
default USB port only gets about 500kB/s write bandwidth. However, when plugged
into a port with 850kB/s, I still get underrun errors...
2020-02-17 23:58:40 +01:00
David Given
edc56d44d6 Non-functioning archive checkin: You can only have 120-odd DMA buffers, so my
last 'fix' was in fact non-functional.
2020-02-17 23:28:40 +01:00
David Given
ef4eff0195 So writing now works, but only if USB DMA is enabled. But that breaks reading.
I've worked round this in a simple but brute force manner and it now looks as
if reading *and* writing work, more or less. There does still seem to be the
odd bad sector when writing 1440kB disks.
2020-02-17 21:41:01 +01:00
David Given
df8d45bf66 Rework the output fifo to be a bit more correct about the sync signals, which
in turn allows the sequencer to lose less time --- this gets the effective
clock rate down to about 1.01us. However we still seem to lose the last sector
on 18-sector disks and there are some disk reads so something is still wrong.
2020-02-17 00:13:13 +01:00
David Given
89a27619ff Correctly propagate MFM encoding state. 2020-02-15 21:47:01 +01:00
David Given
387a86969a Some verilog optimisations which shave off a few p-terms. 2020-02-15 12:15:51 +01:00
David Given
acb5059d17 Rewrite the sampler *again* to, hopefully, be more stable and not lose ticks.
Luckily, we have just enough space in the FPGA to use an actual logic counter,
which simplifies things hugely.
2020-02-15 12:09:19 +01:00
David Given
a4002d2617 Fix a few encoder issues; but while 720kB disks work fine in a real machine,
1440kB disks don't.
2020-02-14 22:47:15 +01:00
David Given
a63a90bbd0 Only attempt to remove the old file on overwrite if it actually exists. 2020-02-14 22:30:46 +01:00
David Given
d25f96dd24 The IBM encoder now works well enough that my USB floppy drive thinks the disk
is formatted... but has trouble reading sectors above about 1000. Also remember
that encoding MFM needs to keep one bit of state at all times.
2020-02-14 00:06:51 +01:00
David Given
e8febe6508 Allow converting Bytes to bits, and slicing until the end of an object. 2020-02-14 00:04:31 +01:00
David Given
ad3a930c6a Do the boilerplate of the IBM encoder. 2020-02-09 23:56:20 +01:00
David Given
be41c1de76 You now need to explicitly specify whether flux files get merged or
overwritten, because the old behaviour was weird. Reader uses SqliteFluxSink to
write flux files, rather than raw database accesses.
2020-02-08 12:41:50 +01:00
David Given
d528978667 Merge pull request #135 from davidgiven/docs
Update docs.
2020-02-08 11:53:31 +01:00
David Given
827fcf69d2 Another typo fix. 2020-02-08 11:52:39 +01:00
David Given
711ff545e0 Typo fix. 2020-02-08 11:51:19 +01:00
David Given
5befa31050 Document the GreaseWeazle. 2020-02-08 11:50:09 +01:00
David Given
8e5c2d0ebb Merge from trunk. 2020-02-08 11:35:31 +01:00
David Given
f95fceeb3d Finally document IBM disks. 2020-02-08 11:34:57 +01:00
David Given
003b20dbf0 Merge pull request #133 from davidgiven/fixing
Display RPM values correctly
2020-01-29 00:52:04 +01:00
David Given
cd9bbaa4b6 Merge from trunk. 2020-01-29 00:42:06 +01:00
David Given
71e622bf72 Fix the fe-rpm RPM display, which didn't get updated when we switched to
nanoseconds internally.

Fixes #132
2020-01-29 00:41:58 +01:00
David Given
2a065a08df Remember to ship brother240tool with Windows. 2020-01-28 00:45:04 +01:00
David Given
6087228378 Merge pull request #131 from davidgiven/fixing
Debug builds are now debuggable.
2020-01-28 00:40:39 +01:00
David Given
efd74e0d7b Stop trying to make Github CI on Windows work. It just doesn't seem to be
running mingw via ninja.
2020-01-28 00:33:30 +01:00
David Given
b68a9dcc4f Looks like there is no pacman.exe in the image, so we have to go with the
additional download.
2020-01-28 00:30:48 +01:00
David Given
008855daa9 ...more... 2020-01-28 00:27:21 +01:00
David Given
7a9d36de2a ... 2020-01-28 00:23:59 +01:00
David Given
c56e982c9a ... 2020-01-28 00:22:18 +01:00
David Given
002cc171a2 More sigh. 2020-01-28 00:19:39 +01:00
David Given
32e721b47a Sigh. 2020-01-28 00:15:31 +01:00
David Given
1e82f697a9 Temporarily disable AppVeyor to prevent spurious builds. 2020-01-28 00:14:45 +01:00
David Given
fa09631e32 More exploration. 2020-01-28 00:13:38 +01:00
David Given
e06436ce1e Okay, that's not working. What's available? 2020-01-28 00:05:23 +01:00
David Given
b2f443e1ad Let's try this, but with the right path. 2020-01-27 23:57:48 +01:00
David Given
2e07be0cf7 Let's try this instead. 2020-01-27 23:56:55 +01:00
David Given
bf0b14d094 Okay, changing the path didn't help. 2020-01-27 23:51:22 +01:00
David Given
c9f5803194 The system is installing, but it's not finding mingw32. 2020-01-27 23:47:30 +01:00
David Given
5293560c02 Try enabling the windows CI build again. 2020-01-27 23:41:03 +01:00
David Given
c49823aa9d Now the optimised binaries are optimised and the debug binaries aren't. 2020-01-27 23:36:33 +01:00
David Given
c4ef4882ae Merge pull request #130 from davidgiven/fixing
Fix a nasty firmware memory corruption bug
2020-01-27 23:15:20 +01:00
David Given
a8eca06cf0 Don't hang if we hit the end of stream while waiting for a data record. 2020-01-27 23:09:29 +01:00
David Given
065257b5aa Remove stray tracing. 2020-01-27 23:09:07 +01:00
David Given
29bdfc043a Allow fractional revolutions and non-synced reading. Find more things which
need fixing in the firmware sampler.
2020-01-27 22:52:25 +01:00
David Given
933ffe7ab4 Find and attempt to fix a memory corruption error when sampling --- if the next
fragment arrives from the sampler before usbbuffer has finished being
transmitted via USB, it'll get overwritten. I've disabled DMA USB to make the
code easier to understand and made sure that we flush things more rigorously.
This may help the weird pipe errors, too.
2020-01-27 21:40:27 +01:00
David Given
e517f28563 Merge pull request #129 from davidgiven/fixing
Make decoding more robust
2020-01-27 01:21:40 +01:00
David Given
91ffcf59c3 When reading data records, retry if we get an UNKNOWN record to work the
occasional false positive (which happens now and again with MFM).
2020-01-27 01:15:14 +01:00
David Given
51c618f325 Merge from trunk. 2020-01-26 23:53:29 +01:00
David Given
9dc1067032 Add --dump-sectors. Sector positions are recorded correctly. 2020-01-26 18:30:35 +01:00
David Given
9e75dc3af1 Merge pull request #127 from davidgiven/fixing
Fix an issue where HD IBM disks can't be read
2020-01-26 18:06:15 +01:00
David Given
efa4c933b3 Made the MFM marker byte detection a lot more robust --- prevents false
positives; it looks like the new sampler is producing a little bit of wobble
which randomly spoofs a marker byte now and again. This prevents this from
happening (so far).
2020-01-26 17:58:08 +01:00
David Given
6af80d1e5e Improve some messaging. A data record is always pushed, even if it's empty (to
help debugging).
2020-01-26 17:49:12 +01:00
David Given
0c48897814 Add a minimum clock threshold. 2020-01-26 17:48:33 +01:00
David Given
60e5e35947 Merge pull request #124 from davidgiven/tweaks
Several index pulse fixes
2020-01-12 01:42:39 +01:00
David Given
86c4e959ca Mac error fix. 2020-01-12 01:38:19 +01:00
David Given
b0c675c589 Improved error messages when using fe-rpm and it doesn't work. 2020-01-12 01:34:12 +01:00
David Given
d77841c3b7 Add the ability to fake the index pulse source, allowing old drives to be used
with FluxEngine.
2020-01-12 01:23:47 +01:00
David Given
4ed1fb6bac Document the extra index pulses. 2020-01-10 21:23:33 +01:00
David Given
bcc9e9d9a5 Bump the protocol number (I forgot last time I changed the protocol). 2020-01-10 21:04:33 +01:00
David Given
ec327e25a4 Merge pull request #121 from davidgiven/amiga
Add support for writing Amiga disks.
2019-12-14 21:55:00 +01:00
David Given
d0ed5b32f7 Add support for 528-byte sectors. Adjust the post-index gap to (try?) and fit
all the data in one revolution. I think my write clock is a bit slow.
2019-12-14 21:49:31 +01:00
David Given
7c66e1b0d4 Don't recalibrate after drive errors --- it's really annoying and I don't think it helps. 2019-12-14 21:43:48 +01:00
David Given
4475e9f085 Increase the default bit-error-threshold to 0.4, because that's the value I
almost always end up using.
2019-12-14 21:33:39 +01:00
David Given
5c9639ec5a Document the Amiga write support. 2019-12-14 21:15:47 +01:00
David Given
792cc88192 The Amiga writer now generates valid flux files --- but it looks like the
writer's broken (both the Amiga and the Brother have failed).
2019-12-14 20:44:48 +01:00
David Given
21fe586724 Update OSX build instructions. 2019-12-14 11:37:43 +01:00
David Given
5a0fb2761a Update OSX build instructions. 2019-12-14 11:37:43 +01:00
David Given
ef4581ed39 Merge from trunk. 2019-12-13 23:59:03 +01:00
David Given
73419704c2 Merge pull request #118 from davidgiven/fixing
Fix a few minor build tweaks.
2019-12-13 23:56:12 +01:00
David Given
a8b92d4780 This works; final tweaking. 2019-12-13 23:53:42 +01:00
David Given
98140b0646 More testing. 2019-12-13 23:50:33 +01:00
David Given
4429ce1f84 More build tweaks. 2019-12-13 23:48:17 +01:00
David Given
1f50941a2c Merge from trunk. 2019-12-13 23:45:17 +01:00
David Given
a7de04848c Merge pull request #117 from davidgiven/githubci
Convert to Github CI instead of Travis.
2019-12-13 23:43:03 +01:00
David Given
c264fec6e9 The Windows stuff doesn't work, so let's shelve it for now. 2019-12-13 23:38:49 +01:00
David Given
4488b2542f Update MSYS build environment. 2019-12-13 23:24:23 +01:00
David Given
2f1a5189d6 Oh, yeah, let's actually check out our project! 2019-12-13 23:21:58 +01:00
David Given
effaeff51e Something's not right --- test. 2019-12-13 23:19:48 +01:00
David Given
1210549f59 Try Windows builds on github. 2019-12-13 23:12:29 +01:00
David Given
7200de9702 Add more Homebrew packages. 2019-12-13 23:02:13 +01:00
David Given
5dd5c8516a Don't do builds on push_request, because these always coincide with pushes. 2019-12-13 23:01:08 +01:00
David Given
f7fb2a844b Github's OSX doesn't install pkg-config by default? 2019-12-13 23:00:10 +01:00
David Given
20b1b2a4a8 More YAML syntax fiddling? 2019-12-13 22:58:28 +01:00
David Given
f8b8bc2295 Fiddle with YAML syntax. 2019-12-13 22:57:29 +01:00
David Given
2d4d56d09f Try Github CI for OSX builds instead of Travis. 2019-12-13 22:55:37 +01:00
David Given
39599b76c8 Stop building the Ubuntu version with Travis. 2019-12-13 22:52:30 +01:00
David Given
c2c40ccfbb Also remember to install ninja-build. 2019-12-13 22:48:48 +01:00
David Given
ab42eb23f4 Remember to run apt as sudo. 2019-12-13 22:47:20 +01:00
David Given
05eff0e528 Try to build using github CI. 2019-12-13 22:44:58 +01:00
David Given
23311b4b68 Start looking at Github CI. 2019-12-13 22:41:19 +01:00
David Given
5e97df8d15 Better diagnostics when a package can't be found. 2019-12-13 22:39:58 +01:00
David Given
898e8c551c Produce a build-time error if the pkg-config packages aren't available. 2019-12-13 22:34:24 +01:00
David Given
ad69c6bd27 Fix stupid (but thankfully harmless) typo. 2019-12-13 22:33:39 +01:00
David Given
661399cc83 Update document with the new flippy mod doc; explain how Mac disks are broken. 2019-12-12 21:04:42 +01:00
David Given
edbb4b1daa Merge pull request #115 from davidgiven/reading
Rewrite the entire sampler.
2019-12-12 20:46:12 +01:00
David Given
6389e8a756 Update pin number (which was wrong). 2019-12-12 20:35:20 +01:00
David Given
c187b79d80 Add a 300RPM clock on 3[0] and a 360RPM clock on 3[1], for use with faking
index pulses to the drive.
2019-12-12 20:34:44 +01:00
David Given
edbe624c5a Hopefully, finally, fix the hang-on-read issue. 2019-12-12 20:09:49 +01:00
David Given
44e2334815 Typo fix. Make sure that both drives get deselected when the motor stops (to
make the LEDs go out).
2019-12-12 00:17:59 +01:00
David Given
b448ab7917 Finally squeeze everything in to the Verilog sampler. It does seem to work
better... the the USB hangup problem persists. Mac disks are still
nigh-unreadable.
2019-12-12 00:12:20 +01:00
David Given
072a097003 Archival (non-functioning) checkin of Verilog-based sampler code. Sadly, we've
run into size limits for the device, and I need to slim down.
2019-12-11 22:51:27 +01:00
David Given
a66e704bab Start ripping out the awful UDB-based sampler code, replacing it with a Verilog
one and a standalone FIFO. This gets the FIFO working.
2019-12-11 21:13:57 +01:00
David Given
ed0d578b18 Merge pull request #114 from davidgiven/fixing1
Add support for measuring signal line voltages.
2019-12-11 00:28:13 +01:00
David Given
32bb956710 Detect voltage levels *correctly*. 2019-12-11 00:05:34 +01:00
David Given
f436d6b582 Add a feature where we can measure the FDD bus signal voltages using the PSoC's
ADCs. Increase the track step pulse width to 6us, because.
2019-12-10 22:36:18 +01:00
David Given
d2f8c27cb6 Add checksum routine. 2019-12-01 09:11:36 +01:00
David Given
eaa3c57425 Non-functional boilerplate of Amiga write support. 2019-12-01 09:07:43 +01:00
David Given
549f12a2ab Merge from master. 2019-12-01 08:36:44 +01:00
David Given
aea254fbe7 Made the AES Lanier reader work again. 2019-12-01 08:35:25 +01:00
David Given
8ee6eed4dc Merge pull request #112 from davidgiven/fixing
Rework the sequencer completely, because bizarrely writing disks just stopped working
2019-11-29 22:02:44 +01:00
David Given
3094c5c919 Add missing files. 2019-11-29 18:49:22 +01:00
David Given
1e012699af Clean up the Verilog a bit. 2019-11-25 20:54:13 +01:00
David Given
91d6e9aeb9 Rewrite the sequencer engine with a separate fifo component and a pure verilog
sequencer --- much easier to understand. We can write disks again!
2019-11-25 20:52:13 +01:00
David Given
a40b26ff46 Archival checkin for trying to figure out why writes no longer work. 2019-11-24 15:14:32 +01:00
David Given
ebcb9c4bb0 Switch the output lines to open-drain drive low. 2019-11-24 02:06:45 +01:00
David Given
2520834b18 Add the brother240tool program. 2019-11-24 01:46:02 +01:00
David Given
a1f3087046 Add an 8" drive datasheet. 2019-11-24 01:45:43 +01:00
David Given
e9670e205e Don't erroneously crash out if the t and s parameters are omitted from the rpm
command.
2019-10-14 22:25:43 +02:00
David Given
658e2b7295 Properly initialise flags.
Fixes: #109
2019-09-22 21:55:37 +02:00
David Given
7b4a8d6de2 Merge pull request #108 from davidgiven/scp
Add very beta support for scp import and export
2019-09-21 22:32:52 +02:00
David Given
e8f7b51aef Another documentation tweak. 2019-09-21 22:15:44 +02:00
David Given
9d6bc57a5f Update documentation. 2019-08-31 12:32:52 +02:00
David Given
73766f92b4 Fix the flux to scp converter. 2019-08-31 12:31:33 +02:00
David Given
80badf3b54 Remember to check in the build file changes... 2019-08-31 12:09:11 +02:00
David Given
116529f85a Archival, non-working checkin of the flux to scp converter (it appears to
produce garbage).
2019-08-31 01:41:11 +02:00
David Given
5a2b2bc07a Allow support for command lines with non-argument filenames. 2019-08-31 01:40:44 +02:00
David Given
41070395c0 Merge pull request #105 from davidgiven/scp
Add conversion support for Supercard Pro scp files.
2019-08-28 23:52:27 +02:00
David Given
4304d1eede Add the Supercard Pro decoder. 2019-08-28 23:32:09 +02:00
David Given
46f1b0aef4 Merge pull request #104 from davidgiven/sampler
Fix a nasty sampler bug leading to corrupted data
2019-08-28 00:23:21 +02:00
David Given
9923d67a7c Merge pull request #103 from davidgiven/visualiser
Add a simple disk visualiser.
2019-08-28 00:20:49 +02:00
David Given
99335a84fd Add documentation for the visualiser. 2019-08-28 00:19:18 +02:00
David Given
c266779433 Fix a bug where index pulses where being turned into flux pulses on read,
leading to completely broken data whenever an index pulse happened.
2019-08-27 23:58:07 +02:00
David Given
bdcc12cd53 Correctly import M_PI. 2019-08-27 23:08:13 +02:00
David Given
7988d0fe24 Don't replace bad sectors with more bad sectors. This means that if a sector is
permanently bad, the one which wins and goes into the output SectorSet is the
first one, not the last one. Frequently the last sector is truncated by the end
of read and so it isn't useful.
2019-08-27 22:39:24 +02:00
David Given
27f5c294b1 The visualiser period can now be specified in a flag. 2019-08-27 01:21:49 +02:00
David Given
b9a53e0d1c First draft of the visualiser. 2019-08-27 01:07:57 +02:00
David Given
f8b6d5e6fb Merge. 2019-08-25 00:24:34 +02:00
David Given
04ff31c348 Add a flag to the IBM decoder to tell it to ignore the logical sector IDs (some
formats don't use these).
2019-08-25 00:24:02 +02:00
David Given
77b4aebd1b Fix crashing bug when reading Kryoflux streams. 2019-08-24 23:53:22 +02:00
David Given
4056364300 Merge pull request #99 from davidgiven/extensions
Validate image extensions before reading, not after.
2019-08-22 22:09:42 +02:00
David Given
60bfe050d3 Refactor the way image extensions are handled to be generally cleaner. Add
support for validating ImageSpecs before we actually want to read/write an
image, so as to allow us to check the extension *before* wasting time reading a
disk. Make .d81 an alias of .img.
2019-08-21 00:45:10 +02:00
David Given
28d0ce765e Merge pull request #93 from davidgiven/hex
Add precompiled firmware
2019-08-15 22:26:50 +02:00
David Given
4954d33307 Add documentation for using the precompiled firmware. 2019-08-15 22:19:30 +02:00
David Given
55f3354287 Add precompiled hex for the firmware. 2019-08-15 21:52:11 +02:00
David Given
d6ae373fa8 Merge pull request #92 from davidgiven/d64
Add write-only support for D64 disk images.
2019-08-15 20:46:02 +02:00
David Given
a626d5f9a0 Add write-only support for D64 disk images. 2019-08-15 20:30:07 +02:00
David Given
29db67528d Merge pull request #90 from davidgiven/write
Add support for writing LDBS image files.
2019-08-10 21:40:56 +02:00
David Given
31d7477c6a Add LDBS documentation. 2019-08-10 21:35:21 +02:00
David Given
56af9eaf18 The LDBS ST1 field is now populated correctly on error. 2019-08-10 21:25:07 +02:00
David Given
5de0636fe7 First attempt at writing LDBS files. Not quite right. 2019-08-09 23:21:55 +02:00
David Given
f9117b8d11 Added a simple library for reading and writing LDBS files. 2019-08-09 22:41:07 +02:00
David Given
10d385375f Merge pull request #87 from davidgiven/write
Add support for pluggable input and output formats.
2019-08-09 21:22:03 +02:00
David Given
2f72c3f8f0 Mac images now put the metadata second. 2019-08-09 21:13:29 +02:00
David Given
54edff9b94 Amiga disks can now optionally emit the metadata. 2019-08-09 21:04:48 +02:00
David Given
112377f885 Add pluggable image readers, plus some documentation. 2019-08-09 20:56:06 +02:00
David Given
87e29fc386 Merge from write branch (because we want the new image code). 2019-08-08 23:27:11 +02:00
David Given
b1db5c48b1 Ignore more temporary files. 2019-08-08 23:26:42 +02:00
David Given
38fab7edcb Refactor all the image writing stuff into a ImageWriter subclass hierarchy with
a factory based on extension.
2019-08-08 00:27:41 +02:00
David Given
d8172154c3 Output images now get geometry specs to indicate what kind of file to write. 2019-08-07 23:23:07 +02:00
David Given
eb924780ab Refactor dataspecs to allow them to be used for other things too. 2019-08-06 23:50:02 +02:00
David Given
28e0ef0463 Merge pull request #84 from davidgiven/cleanup
Mechanical refactor to rearrange the source files into a more pleasing order.
2019-08-06 22:33:05 +02:00
David Given
4b07c38782 Mechanical refactor to rearrange the source files into a more pleasing order. 2019-08-06 22:25:11 +02:00
David Given
e0256adf77 Merge pull request #83 from davidgiven/write
Write code refactoring.
2019-08-06 22:24:40 +02:00
David Given
5748f017dd Refactor the write code to make it easier to add new encoders. 2019-08-06 22:17:58 +02:00
David Given
973f4c2c2d Skeleton work to factor out the encoder logic. 2019-08-03 22:30:30 +02:00
David Given
8e1774c69f Show the clock rate in kHz as well, because that's more useful. 2019-07-12 23:09:50 +02:00
David Given
56a36072f7 Sampler state machine cleanup; more debugging tools for the logic analyser. 2019-07-12 21:09:53 +02:00
David Given
8755d108ed Sanity check Mac sectors --- reject anything with an out-of-bounds sector ID. 2019-07-11 23:16:02 +02:00
David Given
ea40cd73d1 Merge pull request #78 from davidgiven/mx
Bugfixing and documentation for MX disks.
2019-07-11 22:02:24 +02:00
David Given
0e28899b72 Add the page on the MX disk format. Mac disks are now unicorns. 2019-07-11 21:34:01 +02:00
David Given
eee30db981 Honour the logical track numbering in MX disks (allows reading 40-track disks). 2019-07-11 21:03:54 +02:00
David Given
6959d18017 Merge pull request #77 from davidgiven/build
Build cleanups
2019-07-11 12:18:59 +02:00
David Given
9f92ce0ef7 Typo fix. 2019-07-11 12:10:36 +02:00
David Given
7658c1d774 Move the fluxtoau tool into the main client. 2019-07-11 12:00:25 +02:00
David Given
31dc3504e6 Move the fluxtovcd file into the main client. 2019-07-11 11:52:38 +02:00
David Given
af0c9d4261 Move cwftoflux into the main client. 2019-07-11 11:45:15 +02:00
David Given
155b9daef6 Clean build scripts a bit. 2019-07-11 11:25:29 +02:00
David Given
a2fdbc5c73 Merge pull request #76 from davidgiven/sampling
Minor fixes and debugging tooling
2019-07-11 00:10:18 +02:00
David Given
1e3581c5f3 Turns out I was using the wrong error threshold flags for Mac disks. ND disks
work fine now.
2019-07-10 23:55:16 +02:00
David Given
a1d345856e Add a tool for converting flux files directly to mono or stereo au files,
suitable for comparison in Audacity.
2019-07-10 22:56:39 +02:00
David Given
7a775afaea Make sure that CounterClock is actually 12MHz, and not 12-ish MHz. Doesn't
help.
2019-07-10 20:26:17 +02:00
David Given
c27c4fe312 Synchronise input pins and set LVTTL levels. More correct, but doesn't help the
read issues.
2019-07-10 19:48:03 +02:00
David Given
ad295c683c The sampler pulse conversion now uses BUS_CLK as the sample clock. 2019-07-09 22:43:46 +02:00
David Given
3f8fdaa27a Fix missing flag initialisation. 2019-07-09 22:38:35 +02:00
David Given
9f5d01787f Fix missing flag initialisation. 2019-07-09 22:38:35 +02:00
David Given
3c4487c42e Add the tool to export flux files as VCD, so that they can be read into
pulseview.
2019-07-09 00:48:35 +02:00
David Given
e5c2168a35 Merge. 2019-07-08 23:32:53 +02:00
David Given
a06d8ff05a Merge pull request #74 from davidgiven/tools
Build brother120tool and cwftoflux.
2019-07-08 23:32:20 +02:00
David Given
c91ca1b730 Try to stop OSX from running brew cleanup every time. 2019-07-08 23:27:54 +02:00
David Given
3b6ea24df5 Rename fnmatchemu to just emu, because I'm sure we'll want to put more stuff
there.
2019-07-08 23:21:49 +02:00
David Given
b0e905fdd0 Typo fix. 2019-07-08 23:16:46 +02:00
David Given
34a858346e Add our own copy of fnmatch(), which mingw doesn't have --- we need it for the
Brother tool and I'm sure it'll come in useful elsewhere.
2019-07-08 23:12:58 +02:00
David Given
499cb4f720 Typo fix. 2019-07-08 22:46:16 +02:00
David Given
3960b1e4d7 Build brother120tool and cwftoflux. 2019-07-08 22:44:38 +02:00
David Given
98ea5e9600 Connect up pins 2.3, 2.4 and 2.5 for debugging with a logic analyser. 2019-07-08 01:08:05 +02:00
David Given
ce6077fa22 Apply Denis Kushch's timing fixes to the schematic. No more warnings on builds! 2019-07-08 00:52:59 +02:00
David Given
adb1e9ba00 Document the precompiled releases. 2019-07-07 01:50:31 +02:00
David Given
7752fd9f2c Remember that our build artifact is now a zipfile... 2019-07-07 01:45:11 +02:00
David Given
5db81e681f Appveyor really doesn't have zip? 2019-07-07 01:44:08 +02:00
David Given
6ef969fd7e Upload zipfiles rather than uncompressed exes. 2019-07-07 01:42:05 +02:00
David Given
98dece78c6 Let's see if we can avoid the infinite build loops this time... 2019-07-07 01:37:58 +02:00
David Given
aae068e1db Try uploading build artifacts. 2019-07-07 01:29:58 +02:00
David Given
1c683fa3f1 Merge pull request #72 from davidgiven/windows
Use mingw32 to build the Windows client, removing the cygwin dependency.
2019-07-07 01:17:34 +02:00
David Given
3a25a40974 Update documentation. 2019-07-07 01:12:01 +02:00
David Given
f38bad1784 Try to streamline Windows builds a bit. 2019-07-07 01:06:40 +02:00
David Given
5817714899 Let's build the Windows binary with lots of optimisation, as we're probably
going to package it as a precompiled binary.
2019-07-07 00:40:20 +02:00
David Given
e5baecbd4d Replace the glob() code with simple opendir stuff, since glob isn't supported
on Windows.
2019-07-07 00:38:29 +02:00
David Given
27ced28ffd Fix typos that were breaking OSX and Linux builds. 2019-07-07 00:26:19 +02:00
David Given
e80ba4ce92 Typo fix. 2019-07-07 00:18:00 +02:00
David Given
ee7ad96837 Attempt to prevent path contamination with Cygwin. 2019-07-07 00:16:31 +02:00
David Given
ca6629569f Can't make Travis work, but appveyor looks promising. 2019-07-07 00:13:57 +02:00
David Given
0807105b51 Maybe like this? 2019-07-06 21:16:35 +02:00
David Given
74ae1630aa Let's try msys2 with /noupdate, to see if it installs more quickly. 2019-07-06 21:10:57 +02:00
David Given
43a4a73990 That worked, but it's slow. 2019-07-06 21:09:03 +02:00
David Given
99827d6a4a I think Travis doesn't come with msys2. 2019-07-06 20:58:32 +02:00
David Given
a0e90a09e0 Can we directly invoke msys2 make? 2019-07-06 20:55:28 +02:00
David Given
6890c802a6 Choco *and* pacman? 2019-07-06 20:47:47 +02:00
David Given
c5a3411e1f Maybe pacman? 2019-07-06 20:46:05 +02:00
David Given
fe1c535a55 Bah. 2019-07-06 20:41:13 +02:00
David Given
b1b6b17168 Try installing chocolatey packages here? 2019-07-06 20:38:26 +02:00
David Given
3ced77518f Hey, look, Travis does windows now! 2019-07-06 20:34:56 +02:00
David Given
8abc73bb97 So many checkins. 2019-07-06 20:20:44 +02:00
David Given
fe5b171a7a Not a fan of this. 2019-07-06 20:19:28 +02:00
David Given
469129380c Set the path correctly? 2019-07-06 20:18:05 +02:00
David Given
30502f4f2d Start trying to make msys2/mingw32 work with appveyor. 2019-07-06 20:13:51 +02:00
David Given
c1e432584d Finally make build on msys2 (mingw32 mode). 2019-07-06 20:07:17 +02:00
David Given
7d42dff2f1 First (failed) attempt to make work with mingw. 2019-07-06 12:58:20 +02:00
David Given
e13f4942a0 Set build flags from the top-level makefile, not from mkninja.sh. 2019-07-05 00:18:53 +02:00
David Given
8cd64d1eac Don't build stripped versions of all the tests. 2019-07-05 00:03:33 +02:00
David Given
6e8b621674 Generate both debug and non-debug binaries. 2019-07-04 23:58:23 +02:00
David Given
cfdad7492b Attempt to generate build artifacts from appveyor. 2019-07-04 23:53:39 +02:00
David Given
e58de07036 Merge. 2019-07-04 13:32:57 +02:00
David Given
fe3812860a Make help options a bit more consistent. 2019-07-04 13:32:42 +02:00
David Given
22ff86ef9e Update date. 2019-07-04 11:13:49 +02:00
David Given
f83cfd5cd6 Merge. 2019-07-04 11:12:26 +02:00
David Given
4eff798237 Turns out I'd cocked up the build system setup --- bootstrap with make again. 2019-07-04 11:12:17 +02:00
David Given
fe8122afcc Turns out I'd cocked up the build system setup --- bootstrap with make again. 2019-07-04 11:12:17 +02:00
David Given
e5f0a355ef Tweak technical documentation a bit --- it was getting stale. 2019-07-04 00:00:49 +02:00
David Given
905fbe5b4a Add the note about the build system change. 2019-07-03 23:30:24 +02:00
David Given
b78ccfe887 Replace the ninja file with the stub. 2019-07-03 23:24:08 +02:00
David Given
40d093b36d Hook the MX reader up. 2019-07-03 23:23:05 +02:00
David Given
49cfba569d Merge. 2019-07-03 23:20:28 +02:00
David Given
d0a864c052 Merge. 2019-07-03 23:20:07 +02:00
David Given
5b894d768b Merge pull request #71 from davidgiven/merge
Massively simplify the build environment.
2019-07-03 23:15:51 +02:00
David Given
498ecd10a0 Add more dependencies. 2019-07-03 23:11:22 +02:00
David Given
33c3666d84 Only check in a stub build.ninja. 2019-07-03 22:57:52 +02:00
David Given
771b0e4db9 Oh dear, start-group and end-group don't work on OSX... 2019-07-03 22:49:28 +02:00
David Given
a6066e9b59 Try adding an appveyor config for Windows builds. 2019-07-03 22:47:00 +02:00
David Given
bc0f4efcf6 ...and again. 2019-07-03 22:41:22 +02:00
David Given
c9c63682df Travis' ancient linker doesn't like our link order. 2019-07-03 22:39:20 +02:00
David Given
d168719714 Bump the OSX version again. 2019-07-03 22:38:17 +02:00
David Given
6f81a8d1c4 Try updating the OSX image. 2019-07-03 22:35:38 +02:00
David Given
20d143248b Remove stray dependencies to the system fmt. 2019-07-03 22:34:04 +02:00
David Given
e2bb13ab16 Include the *right* fmt... 2019-07-03 22:30:06 +02:00
David Given
92601128c4 Switch back to the default OSX image; hopefully travis have fixed homebrew by
now.
2019-07-03 22:29:20 +02:00
David Given
ebafcc23ca Remember to include the dep directory. 2019-07-03 22:26:24 +02:00
David Given
76632713a9 Remember we need to explicitly specify C++14. 2019-07-03 22:23:13 +02:00
David Given
6450ffa4c3 Update the Travis configuration now we no longer have meson. 2019-07-03 22:20:55 +02:00
David Given
032df676c1 Replace meson with a very small shell script. 2019-07-03 22:18:34 +02:00
David Given
41b99b7f9d Update documentation. 2019-07-03 01:00:05 +02:00
David Given
54d0003368 Split the read and write commands up to make the command list a bit more
manageable.
2019-07-03 00:43:22 +02:00
David Given
cb4a5845dc Build with debug optimisation... 2019-07-03 00:09:42 +02:00
David Given
4649cf6206 Merge all the tools into a single monolithic binary. Much better! 2019-07-03 00:08:29 +02:00
David Given
f7af8bb99b I... think it's done? That was suspiciously easy. 2019-07-02 23:20:47 +02:00
David Given
a1c207cb8f First milestone towards flags rewrite --- it builds and the tests pass, but
nothing actually works.
2019-07-02 23:06:40 +02:00
David Given
3ee31b96a4 Add the prototype MX decoder. 2019-07-02 00:40:38 +02:00
David Given
bba2f856a5 Merge pull request #68 from davidgiven/bug-66
Fix memory corruption issue when replacing sectors.
2019-06-27 22:58:24 +02:00
David Given
a3f327b0b2 Update Homebrew pls? 2019-06-27 22:33:02 +02:00
David Given
299dd84034 Enable Homebrew updating because Travis' OSX image is outdated. 2019-06-27 22:19:34 +02:00
David Given
76e22995b7 Fix memory corruption issue when replacing sectors. 2019-06-27 22:10:35 +02:00
David Given
5410252316 Document Matthias Henkell's new tool. 2019-05-29 00:42:03 +02:00
David Given
9ae0842c63 New information from mathe1@github suggests that my interpretation of the type
byte was incorrect. Try to fix this.
2019-05-23 23:53:15 +02:00
David Given
ba83170a39 Correct typo in someone's name. 2019-05-23 23:49:03 +02:00
David Given
fc29ebf8fa Merge from master. 2019-05-01 16:15:34 +02:00
David Given
d1c2e2b611 Better handling of seeks (plus tracing). 2019-05-01 13:06:56 +02:00
David Given
c21177e2aa Finally make things work in release mode! 2019-05-01 13:06:43 +02:00
David Given
72cd3674fa Add datasheet reference to a 5.25" drive. 2019-05-01 13:03:58 +02:00
David Given
6cd684955c You can now specify the drive to seek to. 2019-04-30 23:09:15 +02:00
David Given
196f2bfd7e Cygwin doesn't have ffsll. 2019-04-30 22:56:15 +02:00
David Given
4f1c116822 Merge pull request #61 from davidgiven/rewrite
Rewrite the decoder logic to be substantially betterer.
2019-04-30 22:38:26 +02:00
David Given
c0e3606925 Update documentation. 2019-04-30 22:27:17 +02:00
David Given
0f56cd25e9 Warning fix. 2019-04-30 22:27:07 +02:00
David Given
27fb17b9b5 Move the clock guesser stuff into fe-inspect. 2019-04-30 21:55:44 +02:00
David Given
b1092c7f82 Simplify the decoder class hierarchy. 2019-04-30 21:44:56 +02:00
David Given
1fb67dfe3c Remove stateful decoder and split decoder. 2019-04-30 21:43:25 +02:00
David Given
c5d924c161 Reenable the old, hacky Brother write code. 2019-04-30 21:42:14 +02:00
David Given
c3bfc239bd Port the Victor 9000 to the new new architecture. 2019-04-30 21:41:51 +02:00
David Given
e8373b21b7 Port the Zilog MCZ to the new architecture. 2019-04-30 21:38:12 +02:00
David Given
9971dbd2c7 Update Mac to the new new architecture. 2019-04-30 21:34:33 +02:00
David Given
f652b9a21c Update the FB100 to the new new architecture. 2019-04-30 21:28:04 +02:00
David Given
e115d2046c Update the F85 decoder to the new architecture. 2019-04-30 21:25:25 +02:00
David Given
6d12586c25 Update C64 to the new new architecture. 2019-04-30 21:22:15 +02:00
David Given
d46d7db082 Port Apple 2 to the new new architecture. 2019-04-30 20:57:51 +02:00
David Given
2ba38b097a Reenable the Ampro as it's an IBM variant. 2019-04-30 20:54:25 +02:00
David Given
9140b822ee Update the Amiga to the new new architecture. 2019-04-30 20:53:50 +02:00
David Given
8bbbd1c1e1 Port the AES Lanier decoder to the new new architecture. 2019-04-30 20:50:55 +02:00
David Given
184e7766f0 Add some helper methods to make decoders easier. Port IBM to the new new
architecture.
2019-04-30 20:45:16 +02:00
David Given
4cc680057e Port the Brother decoder to the new *new* architecture. 2019-04-29 23:28:12 +02:00
David Given
c0c1121b91 Add debounce support (only for reading bits, not in pattern matching). 2019-04-29 23:27:58 +02:00
David Given
468a771f34 Finally get round to adding flux support back in to the instpector. Fix a seek
issue (where it wasn't!).
2019-04-29 23:27:41 +02:00
David Given
01151e70ed The C64 decoder now works with the new architecture, although it looks like I'm
going to have to do some rearchitecting...
2019-04-29 00:27:30 +02:00
David Given
c6a9acb136 Ignore vscode state directory. 2019-04-29 00:07:44 +02:00
David Given
af513a4c8d Typo fix. 2019-04-28 22:18:43 +02:00
David Given
28dd3e0a91 Add a link to Matthias Enke's WP-1 tool. 2019-04-28 22:13:20 +02:00
David Given
bd448e081f Remove the obsolete Fluxmap::decodeToBits(). 2019-04-28 20:57:55 +02:00
David Given
a2f38ed3fc Convert the Apple 2 decoder to the new architecture. 2019-04-28 20:56:27 +02:00
David Given
587f11afdc Update the AES Lanier decoder to use the new architecture. 2019-04-28 00:47:47 +02:00
David Given
00bae9fba7 Remove the obsolete decoder base classes. 2019-04-28 00:32:32 +02:00
David Given
a692382ea2 Update the Amiga decoder for the new architecture. 2019-04-27 23:22:32 +02:00
David Given
4e3d4e31af The flux pattern matcher will now preserve leading zeroes (although it can't
match them). The IBM decoder is now properly converted, autodetecting FM and
MFM.
2019-04-27 22:11:39 +02:00
David Given
bec46419d6 Remove the obsolete FluxPatterns. 2019-04-27 10:27:55 +02:00
David Given
374272ee71 Enable the IBM MFM frontends (although they're not working yet). 2019-04-27 10:26:49 +02:00
David Given
a483ad987e Archival checking: IBM FM works (but not MFM yet). Other formats have stopped
working.
2019-04-26 23:52:04 +02:00
David Given
643288bef8 Extend the flux pattern matcher to support trailing zeroes. 2019-04-25 23:18:47 +02:00
David Given
783b4fcf36 Switch the USB component to ask for 100mA rather than 500mA. 2019-04-21 01:18:28 +02:00
David Given
1d22111f4e Update components. 2019-04-21 01:16:25 +02:00
David Given
46b48f4638 Ignore the /DSKCHG line --- it doesn't add a lot of value (it allows us to
rehome if people change disks while the motor is running) and it means that
people need to worry about whether their drive produces /DSKCHG or /READY.
2019-04-21 01:15:30 +02:00
David Given
eefecc87fe The F85 decoder has been ported to work with the new architecture (works rather
better, too).
2019-04-19 18:19:11 +02:00
David Given
3a531c0889 The Zilog MCZ decoder is ported to the new architecture. 2019-04-19 15:10:24 +02:00
David Given
2ddc1045ec Rework the Victor 9000 decoder to use the new architecture. 2019-04-19 14:39:26 +02:00
David Given
5f8e0c846c Allow split decoders (into sector record and data record). 2019-04-19 00:55:01 +02:00
David Given
b158692a3a Radically simplify RawRecord and Sector. It all works, and the results are
better, but I've disabled a bunch of decoders for now.
2019-04-18 21:47:34 +02:00
David Given
4b480ce4f3 Rewrite the Macintosh decoder. 2019-04-18 01:31:52 +02:00
David Given
5ce2acdfb4 The new decoder architecture now works, at least for the FB100. All I need now
is to rewrite every single other decoder.
2019-04-18 00:47:28 +02:00
David Given
6e31a9e4ae Refactor so track state is passed around in the Track object. 2019-04-16 22:49:35 +02:00
David Given
3667595275 Rename FluxReader and FluxWriter to FluxSource and FluxSink. 2019-04-16 21:07:58 +02:00
David Given
0b937f5587 Merge pull request #59 from davidgiven/writer
Do some work towards better write support.
2019-04-16 20:53:46 +02:00
David Given
6b73d1745c Merge from trunk. 2019-04-16 20:16:38 +02:00
David Given
383696c473 Merge pull request #58 from davidgiven/v9k
Add support for double-sided Victor 9000 disks.
2019-04-16 20:06:11 +02:00
David Given
2b7dc5d9b0 Typo fix. 2019-04-16 19:56:29 +02:00
David Given
7ff86b4530 Update v9k documentation. 2019-04-16 19:52:15 +02:00
David Given
7a49ec7819 Moderately crudely hack in routing side information to the decoders; this is
needed by the Victor 9000 decoder to figure out the right clock rate.
2019-04-16 19:50:25 +02:00
David Given
315157ed63 Merge pull request #57 from davidgiven/v9k
Add the ability for decoders to specify their own clocks.
2019-04-16 01:23:41 +02:00
David Given
9b59e7025d Add the ability for decoders to specify their own clocks --- necessary for the
Victor 9k. We now have _much_ better decoding for this platform.
2019-04-16 01:13:28 +02:00
David Given
79b12b4c82 Merge pull request #56 from davidgiven/kryo
Add index mark support to the Kryoflux reader.
2019-04-14 15:00:08 +02:00
David Given
83aff45032 Add missing error string. 2019-04-14 14:53:45 +02:00
David Given
db14642504 Beat the Kryoflux stream reader into enough shape that it will handle the weird
Kryoflux index markers; refactor it to use Bytes rather than raw streams
(because streams in C++ are terrible).
2019-04-14 14:35:52 +02:00
David Given
64ae92b16f Add a few more useful functions. 2019-04-14 14:34:59 +02:00
David Given
1747ef1f74 Make the Zilog MCZ decoder a bit more robust. 2019-04-14 14:34:26 +02:00
David Given
7fdecbe46c Typo fix. 2019-04-12 23:16:28 +02:00
David Given
5c0326270a Add missing image. 2019-04-12 23:12:46 +02:00
David Given
689dc93ce3 Merge pull request #55 from davidgiven/fb100
Add Brother FB-100 support.
2019-04-12 23:10:48 +02:00
David Given
fd2ec91d66 Output images now contain the ID section. Add references to documentation. 2019-04-12 23:05:53 +02:00
David Given
6a215c35ee Add a reverse-engineered checksum routine, and some documentation. 2019-04-12 21:10:15 +02:00
David Given
84076674fd Add stateful decoders, which makes formats like the FB-100 much easier to work
with. Add a generic CRC tool allowing all the parameters to be set (currently
unused).
2019-04-12 00:13:56 +02:00
David Given
9c6fe1bafa Add a skeleton FB-100 decoder. 2019-04-11 19:55:30 +02:00
David Given
50cff528a3 Merge from master. 2019-04-07 02:19:12 +02:00
David Given
040fd8cf81 Merge pull request #54 from davidgiven/crunch
Decrease USB bandwidth and add proper high density support
2019-04-07 02:09:00 +02:00
David Given
1576be8138 Show more information with inspect. 2019-04-07 02:06:07 +02:00
David Given
61df636215 Remove stray debug tracing. 2019-04-06 22:28:45 +02:00
David Given
b5cd4a6246 Document the stuff about --hd. 2019-04-06 18:07:08 +02:00
David Given
da8cae61b7 Add a debug UART back on pin 2.0 to get some semblance of debug information off
the board. Discover a fun edge case where output transfers that were an exact
number of frames weren't being terminated correctly.
2019-04-06 17:59:23 +02:00
David Given
3c2654ea04 Warning fix. 2019-03-29 21:01:46 +01:00
David Given
7dd7057e1b Bump protocol number. 2019-03-28 23:10:08 +01:00
David Given
6c06689de8 Fix uninitialised variable error. 2019-03-28 23:09:56 +01:00
David Given
dfbe839826 Bump the protocol number. 2019-03-27 22:11:15 +01:00
David Given
707563bec6 Hopefully fix the underrun issue when reading from HD disks. 2019-03-27 22:10:58 +01:00
David Given
098b2371a4 Crunched datastreams are now used when writing. 2019-03-27 21:58:41 +01:00
David Given
bcc5a5f2cd Interim but working support for crunched data streams when reading from the
device; writes haven't been converted yet. Reduces the bandiwidth from about
800kB/s to about 500kB/s, which is about what I thought.
2019-03-26 23:03:19 +01:00
David Given
0453837c03 The high-density flag now actually changes the high-density line to the drive. 2019-03-26 20:05:16 +01:00
David Given
4fe27afe9f Backed out changeset cd5bed99b0b4 --- erroneously pushed to master. 2019-03-24 17:59:17 +01:00
David Given
d0726e13c0 Add a fluxwriter library to try and abstract writing --- but this is going to
need some more refactoring to make it work.
2019-03-24 11:06:38 +01:00
David Given
9b78c34fad Warning fix. 2019-03-24 10:40:14 +01:00
David Given
a79f3dff1e Fix OB1 error in the start position of Brother files. Headers and footers
should now be attached to the right file. Thanks to mathe1@github for figuring
this out.

Fixes: #47
2019-03-23 12:14:01 +01:00
David Given
45eaf14133 Add a flag for setting the drive to high density mode. 2019-03-23 11:32:55 +01:00
David Given
7f9a85ff77 Add a flag for setting the drive to high density mode. 2019-03-23 11:32:55 +01:00
David Given
d013b0fe55 Fix Bytes slicing buffer overrun; fix bug in the IBM decoder which was
provoking it.
2019-03-21 20:14:35 +01:00
979 changed files with 189696 additions and 17677 deletions

44
.clang-format Normal file
View File

@@ -0,0 +1,44 @@
---
AccessModifierOffset: -4
AlignAfterOpenBracket: DontAlign
AlignArrayOfStructures: Left
AlignEscapedNewlines: Left
AllowAllArgumentsOnNextLine: 'true'
AllowAllConstructorInitializersOnNextLine: 'false'
AllowAllParametersOfDeclarationOnNextLine: 'true'
AllowShortBlocksOnASingleLine: 'true'
AllowShortCaseLabelsOnASingleLine: 'false'
AllowShortFunctionsOnASingleLine: Empty
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: None
AllowShortLoopsOnASingleLine: 'false'
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: 'true'
AlwaysBreakTemplateDeclarations: 'Yes'
BinPackArguments: 'false'
BinPackParameters: 'false'
BreakBeforeBraces: Allman
BreakConstructorInitializers: 'AfterColon'
BreakInheritanceList: AfterColon
BreakStringLiterals: 'true'
ColumnLimit: '80'
ConstructorInitializerAllOnOneLineOrOnePerLine: 'true'
FixNamespaceComments: 'false'
IncludeBlocks: Preserve
IndentCaseLabels: 'true'
IndentWidth: '4'
IndentWrappedFunctionNames: 'false'
KeepEmptyLinesAtTheStartOfBlocks: 'true'
NamespaceIndentation: All
PointerAlignment: Left
ReflowComments: 'true'
SortIncludes: 'false'
SortUsingDeclarations: 'true'
SpaceAfterTemplateKeyword: 'true'
SpaceBeforeAssignmentOperators: 'true'
SpaceBeforeCtorInitializerColon: 'false'
SpaceBeforeInheritanceColon: 'true'
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: 'false'
...

102
.github/workflows/ccpp.yml vendored Normal file
View File

@@ -0,0 +1,102 @@
name: C/C++ CI
on: [push]
concurrency:
group: environment-${{ github.head_ref }}
cancel-in-progress: true
jobs:
build-linux:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v2
with:
repository: 'davidgiven/fluxengine'
path: 'fluxengine'
- uses: actions/checkout@v2
with:
repository: 'davidgiven/fluxengine-testdata'
path: 'fluxengine-testdata'
- name: apt
run: sudo apt update && sudo apt install libudev-dev libsqlite3-dev protobuf-compiler libwxgtk3.0-gtk3-dev libfmt-dev
- name: make
run: CXXFLAGS="-Wp,-D_GLIBCXX_ASSERTIONS" make -j2 -C fluxengine
build-macos-current:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
with:
repository: 'davidgiven/fluxengine'
path: 'fluxengine'
- uses: actions/checkout@v2
with:
repository: 'davidgiven/fluxengine-testdata'
path: 'fluxengine-testdata'
- name: brew
run: brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg
- name: make
run: gmake -j2 -C fluxengine
- name: Upload build artifacts
uses: actions/upload-artifact@v2
with:
name: ${{ github.event.repository.name }}.${{ github.sha }}
path: fluxengine/FluxEngine.pkg
build-windows:
runs-on: windows-latest
defaults:
run:
shell: msys2 {0}
steps:
- uses: msys2/setup-msys2@v2
with:
update: true
msystem: MINGW32
install: >-
diffutils
make
mingw-w64-i686-fmt
mingw-w64-i686-gcc
mingw-w64-i686-libusb
mingw-w64-i686-pkg-config
mingw-w64-i686-protobuf
mingw-w64-i686-sqlite3
mingw-w64-i686-wxWidgets
mingw-w64-i686-zlib
mingw-w64-i686-nsis
zip
vim
- name: update-protobuf
run: |
pacman -U --noconfirm https://repo.msys2.org/mingw/mingw32/mingw-w64-i686-protobuf-21.9-1-any.pkg.tar.zst
- uses: actions/checkout@v2
with:
repository: 'davidgiven/fluxengine'
path: 'fluxengine'
- uses: actions/checkout@v2
with:
repository: 'davidgiven/fluxengine-testdata'
path: 'fluxengine-testdata'
- name: build
run: make -j2 -C fluxengine
- name: nsis
run: |
cd fluxengine
strip fluxengine.exe -o fluxengine-stripped.exe
strip fluxengine-gui.exe -o fluxengine-gui-stripped.exe
makensis -v2 -nocd -dOUTFILE=fluxengine-installer.exe extras/windows-installer.nsi
- name: zip
run: |
cd fluxengine
zip -9 fluxengine-windows.zip fluxengine.exe fluxengine-gui.exe upgrade-flux-file.exe brother120tool.exe brother240tool.exe FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex fluxengine-installer.exe
- name: Upload build artifacts
uses: actions/upload-artifact@v2
with:
name: ${{ github.event.repository.name }}.${{ github.sha }}
path: fluxengine/fluxengine-windows.zip

127
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,127 @@
name: Autorelease
concurrency:
group: environment-release-${{ github.head_ref }}
cancel-in-progress: true
on:
push:
branches:
- "master"
jobs:
dev-release:
runs-on: windows-latest
defaults:
run:
shell: msys2 {0}
steps:
- uses: msys2/setup-msys2@v2
with:
update: true
msystem: MINGW32
install: >-
diffutils
make
mingw-w64-i686-fmt
mingw-w64-i686-gcc
mingw-w64-i686-libusb
mingw-w64-i686-pkg-config
mingw-w64-i686-protobuf
mingw-w64-i686-sqlite3
mingw-w64-i686-wxWidgets
mingw-w64-i686-zlib
mingw-w64-i686-nsis
zip
vim
- uses: actions/checkout@v3
- name: update-protobuf
run: |
pacman -U --noconfirm https://repo.msys2.org/mingw/mingw32/mingw-w64-i686-protobuf-21.9-1-any.pkg.tar.zst
- name: build
run: |
make -j2
- name: nsis
run: |
strip fluxengine.exe -o fluxengine-stripped.exe
strip fluxengine-gui.exe -o fluxengine-gui-stripped.exe
makensis -v2 -nocd -dOUTFILE=fluxengine-installer.exe extras/windows-installer.nsi
- name: zip
run: |
zip -9 fluxengine.zip fluxengine.exe fluxengine-gui.exe upgrade-flux-file.exe brother120tool.exe brother240tool.exe FluxEngine.cydsn/CortexM3/ARM_GCC_541/Release/FluxEngine.hex
- name: date
run: |
echo "RELEASE_DATE=$(date --rfc-3339=date)" >> ${GITHUB_ENV}
- name: tag
uses: EndBug/latest-tag@latest
with:
tag-name: dev
force-branch: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: delete-old-assets
uses: mknejp/delete-release-assets@v1
with:
token: ${{ github.token }}
tag: dev
assets: |
fluxengine.zip
fluxengine-installer.exe
fail-if-no-assets: false
- name: release
uses: softprops/action-gh-release@v1
with:
name: Development build ${{ env.RELEASE_DATE }}
files: |
fluxengine.zip
fluxengine-installer.exe
tag_name: dev
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
build-macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- name: brew
run: brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg
- name: make
run: gmake
- name: tag
uses: EndBug/latest-tag@latest
with:
tag-name: dev
force-branch: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: delete-old-assets
uses: mknejp/delete-release-assets@v1
with:
token: ${{ github.token }}
tag: dev
assets: |
FluxEngine.pkg
fail-if-no-assets: false
- name: release
uses: softprops/action-gh-release@v1
with:
name: Development build ${{ env.RELEASE_DATE }}
files: |
FluxEngine.pkg
tag_name: dev
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

8
.gitignore vendored
View File

@@ -1,2 +1,10 @@
.obj
.project
/.ninja*
/brother120tool
/brother120tool-*
/brother240tool
/brother240tool-*
/fluxengine
/fluxengine-*
/upgrade-flux-file

View File

@@ -3,4 +3,10 @@ streams
.*\.flux
.*\.img
.*\.raw
.*\.orig
.vscode
remote
FluxEngine.cydsn/CortexM3
FluxEngine.cydsn/Generated_Source
FluxEngine.cydsn/codegentemp

View File

@@ -1,37 +0,0 @@
language: generic
matrix:
include:
-
os: linux
sudo: false
dist: xenial
compiler: gcc
env: CXX=g++-8
-
os: osx
env: HOMEBREW_NO_AUTO_UPDATE=1
compiler: clang
addons:
apt:
sources:
- llvm-toolchain-precise-3.8
- ubuntu-toolchain-r-test
packages:
- ninja-build
- meson
- libusb-1.0-0-dev
- libsqlite3-dev
- g++-8
homebrew:
packages:
- ninja
- meson
git:
depth: 1
script:
- make

View File

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,27 @@
#include "cyfitter_cfg.h"
#include "cydevice_trm.h"
#include "cyfitter.h"
#include "`$INSTANCE_NAME`_h.h"
void `$INSTANCE_NAME`_Start()
{
`$INSTANCE_NAME`_Init();
}
void `$INSTANCE_NAME`_Stop()
{
`$INSTANCE_NAME`_Disable();
}
void `$INSTANCE_NAME`_Init()
{
`$INSTANCE_NAME`_Enable();
}
void `$INSTANCE_NAME`_Enable()
{
}
void `$INSTANCE_NAME`_Disable()
{
}

View File

@@ -0,0 +1,50 @@
#if !defined(`$INSTANCE_NAME`_H)
#define `$INSTANCE_NAME`_H
#include "cytypes.h"
#include "cyfitter.h"
#include "CyLib.h"
#define `$INSTANCE_NAME`_FIFO_PTR ((reg8 *) `$INSTANCE_NAME`_dp__F0_REG)
/* Macros to clear DP FIFOs.*/
#define `$INSTANCE_NAME`_CLEAR do { \
CY_SET_XTND_REG8(\
((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG), 0x01u | \
CY_GET_XTND_REG8(((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG)));\
CY_SET_XTND_REG8(\
((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG), 0xfeu & \
CY_GET_XTND_REG8(((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG)));\
} while(0)
/* Macros to set FIFO level mode. See the TRM for details */
#define `$INSTANCE_NAME`_SET_LEVEL_NORMAL \
CY_SET_XTND_REG8(\
((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG), 0xfbu & \
CY_GET_XTND_REG8(((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG)))
#define `$INSTANCE_NAME`_SET_LEVEL_MID \
CY_SET_XTND_REG8(\
((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG), 0x04u | \
CY_GET_XTND_REG8(((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG)))
/* Macros to set FIFO to single-buffer mode. */
#define `$INSTANCE_NAME`_SINGLE_BUFFER_SET \
CY_SET_XTND_REG8(\
((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG), 0x01u | \
CY_GET_XTND_REG8(((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG)))
/* Macros to return the FIFO to normal mode. */
#define `$INSTANCE_NAME`_SINGLE_BUFFER_UNSET \
CY_SET_XTND_REG8(\
((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG), 0xfeu & \
CY_GET_XTND_REG8(((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG)))
void `$INSTANCE_NAME`_Enable();
void `$INSTANCE_NAME`_Disable();
void `$INSTANCE_NAME`_Start();
void `$INSTANCE_NAME`_Stop();
void `$INSTANCE_NAME`_Init();
#endif
/* [] END OF FILE */

View File

Binary file not shown.

View File

@@ -0,0 +1,128 @@
//`#start header` -- edit after this line, do not edit this line
`include "cypress.v"
//`#end` -- edit above this line, do not edit this line
/* Ultra-simple FIFO in component: a byte is shifted in every clock when req
* is high. */
module FIFOin (drq, clk, d, req);
output drq;
input clk;
input [7:0] d;
input req;
//`#start body` -- edit after this line, do not edit this line
wire [7:0] pi;
assign pi = d;
wire load;
assign load = req;
cy_psoc3_dp #(.cy_dpconfig(
{
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM0: */
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM1: */
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM2: */
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM3: */
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM4: */
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM5: */
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM6: */
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM7: */
8'hFF, 8'h00, /*CFG9: */
8'hFF, 8'hFF, /*CFG11-10: */
`SC_CMPB_A1_D1, `SC_CMPA_A1_D1, `SC_CI_B_ARITH,
`SC_CI_A_ARITH, `SC_C1_MASK_DSBL, `SC_C0_MASK_DSBL,
`SC_A_MASK_DSBL, `SC_DEF_SI_0, `SC_SI_B_DEFSI,
`SC_SI_A_DEFSI, /*CFG13-12: */
`SC_A0_SRC_PIN, `SC_SHIFT_SL, 1'h0,
1'h0, `SC_FIFO1_BUS, `SC_FIFO0_ALU,
`SC_MSB_DSBL, `SC_MSB_BIT0, `SC_MSB_NOCHN,
`SC_FB_NOCHN, `SC_CMP1_NOCHN,
`SC_CMP0_NOCHN, /*CFG15-14: */
10'h00, `SC_FIFO_CLK__DP,`SC_FIFO_CAP_AX,
`SC_FIFO_LEVEL,`SC_FIFO__SYNC,`SC_EXTCRC_DSBL,
`SC_WRK16CAT_DSBL /*CFG17-16: */
}
)) dp(
/* input */ .clk(clk),
/* input [02:00] */ .cs_addr(3'b0), // Program counter
/* input */ .route_si(1'b0), // Shift in
/* input */ .route_ci(1'b0), // Carry in
/* input */ .f0_load(load), // Load FIFO 0
/* input */ .f1_load(1'b0), // Load FIFO 1
/* input */ .d0_load(1'b0), // Load Data Register 0
/* input */ .d1_load(1'b0), // Load Data Register 1
/* output */ .ce0(), // Accumulator 0 = Data register 0
/* output */ .cl0(), // Accumulator 0 < Data register 0
/* output */ .z0(), // Accumulator 0 = 0
/* output */ .ff0(), // Accumulator 0 = FF
/* output */ .ce1(), // Accumulator [0|1] = Data register 1
/* output */ .cl1(), // Accumulator [0|1] < Data register 1
/* output */ .z1(), // Accumulator 1 = 0
/* output */ .ff1(), // Accumulator 1 = FF
/* output */ .ov_msb(), // Operation over flow
/* output */ .co_msb(), // Carry out
/* output */ .cmsb(), // Carry out
/* output */ .so(), // Shift out
/* output */ .f0_bus_stat(drq), // not empty
/* output */ .f0_blk_stat(full),// full
/* output */ .f1_bus_stat(), // FIFO 1 status to uP
/* output */ .f1_blk_stat(), // FIFO 1 status to DP
/* input */ .ci(1'b0), // Carry in from previous stage
/* output */ .co(), // Carry out to next stage
/* input */ .sir(1'b0), // Shift in from right side
/* output */ .sor(), // Shift out to right side
/* input */ .sil(1'b0), // Shift in from left side
/* output */ .sol(), // Shift out to left side
/* input */ .msbi(1'b0), // MSB chain in
/* output */ .msbo(), // MSB chain out
/* input [01:00] */ .cei(2'b0), // Compare equal in from prev stage
/* output [01:00] */ .ceo(), // Compare equal out to next stage
/* input [01:00] */ .cli(2'b0), // Compare less than in from prv stage
/* output [01:00] */ .clo(), // Compare less than out to next stage
/* input [01:00] */ .zi(2'b0), // Zero detect in from previous stage
/* output [01:00] */ .zo(), // Zero detect out to next stage
/* input [01:00] */ .fi(2'b0), // 0xFF detect in from previous stage
/* output [01:00] */ .fo(), // 0xFF detect out to next stage
/* input [01:00] */ .capi(2'b0), // Capture in from previous stage
/* output [01:00] */ .capo(), // Capture out to next stage
/* input */ .cfbi(1'b0), // CRC Feedback in from previous stage
/* output */ .cfbo(), // CRC Feedback out to next stage
/* input [07:00] */ .pi(pi), // Parallel data port
/* output [07:00] */ .po() // Parallel data port
);
//`#end` -- edit above this line, do not edit this line
endmodule
//`#start footer` -- edit after this line, do not edit this line
//`#end` -- edit above this line, do not edit this line

View File

@@ -0,0 +1,27 @@
#include "cyfitter_cfg.h"
#include "cydevice_trm.h"
#include "cyfitter.h"
#include "`$INSTANCE_NAME`_h.h"
void `$INSTANCE_NAME`_Start()
{
`$INSTANCE_NAME`_Init();
}
void `$INSTANCE_NAME`_Stop()
{
`$INSTANCE_NAME`_Disable();
}
void `$INSTANCE_NAME`_Init()
{
`$INSTANCE_NAME`_Enable();
}
void `$INSTANCE_NAME`_Enable()
{
}
void `$INSTANCE_NAME`_Disable()
{
}

View File

@@ -0,0 +1,50 @@
#if !defined(`$INSTANCE_NAME`_H)
#define `$INSTANCE_NAME`_H
#include "cytypes.h"
#include "cyfitter.h"
#include "CyLib.h"
#define `$INSTANCE_NAME`_FIFO_PTR ((reg8 *) `$INSTANCE_NAME`_dp__F0_REG)
/* Macros to clear DP FIFOs.*/
#define `$INSTANCE_NAME`_CLEAR do { \
CY_SET_XTND_REG8(\
((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG), 0x01u | \
CY_GET_XTND_REG8(((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG)));\
CY_SET_XTND_REG8(\
((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG), 0xfeu & \
CY_GET_XTND_REG8(((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG)));\
} while(0)
/* Macros to set FIFO level mode. See the TRM for details */
#define `$INSTANCE_NAME`_SET_LEVEL_NORMAL \
CY_SET_XTND_REG8(\
((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG), 0xfbu & \
CY_GET_XTND_REG8(((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG)))
#define `$INSTANCE_NAME`_SET_LEVEL_MID \
CY_SET_XTND_REG8(\
((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG), 0x04u | \
CY_GET_XTND_REG8(((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG)))
/* Macros to set FIFO to single-buffer mode. */
#define `$INSTANCE_NAME`_SINGLE_BUFFER_SET \
CY_SET_XTND_REG8(\
((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG), 0x01u | \
CY_GET_XTND_REG8(((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG)))
/* Macros to return the FIFO to normal mode. */
#define `$INSTANCE_NAME`_SINGLE_BUFFER_UNSET \
CY_SET_XTND_REG8(\
((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG), 0xfeu & \
CY_GET_XTND_REG8(((reg8 *) `$INSTANCE_NAME`_dp__DP_AUX_CTL_REG)))
void `$INSTANCE_NAME`_Enable();
void `$INSTANCE_NAME`_Disable();
void `$INSTANCE_NAME`_Start();
void `$INSTANCE_NAME`_Stop();
void `$INSTANCE_NAME`_Init();
#endif
/* [] END OF FILE */

View File

Binary file not shown.

View File

@@ -0,0 +1,169 @@
//`#start header` -- edit after this line, do not edit this line
`include "cypress.v"
//`#end` -- edit above this line, do not edit this line
// Generated on 11/16/2017 at 15:44
// Component: FIFOout
module FIFOout (
input req,
input clk,
output [7:0] d,
output drq,
output empty,
output ack
);
//`#start body` -- edit after this line, do not edit this line
/* Reads from the FIFO are done based on the FIFO being not empty. */
wire [7:0] po;
assign d = po;
localparam STATE_WAITFORREQ = 0;
localparam STATE_READFROMFIFO = 1;
localparam STATE_WAITFORNREQ = 2;
reg [1:0] state;
wire readfromfifo;
assign ack = (state == STATE_WAITFORNREQ);
assign readfromfifo = (state == STATE_READFROMFIFO);
always @(posedge clk)
begin
case (state)
/* opcode is not valid; req is low; wait for req to go high. */
STATE_WAITFORREQ:
begin
if (!empty && req)
state <= STATE_READFROMFIFO;
end
/* Fetch a single value from the FIFO. */
STATE_READFROMFIFO:
state <= STATE_WAITFORNREQ;
/* opcode is valid; ack is high. Wait for req to go low. */
STATE_WAITFORNREQ:
if (!req)
state <= STATE_WAITFORREQ;
endcase
end
cy_psoc3_dp #(.cy_dpconfig(
{
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM0: idle */
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC___F0, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM1: read from fifo */
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM2: */
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM3: */
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM4: */
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM5: */
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM6: */
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM7: */
8'hFF, 8'h00, /*CFG9: */
8'hFF, 8'hFF, /*CFG11-10: */
`SC_CMPB_A1_D1, `SC_CMPA_A1_D1, `SC_CI_B_ARITH,
`SC_CI_A_ARITH, `SC_C1_MASK_DSBL, `SC_C0_MASK_DSBL,
`SC_A_MASK_DSBL, `SC_DEF_SI_0, `SC_SI_B_DEFSI,
`SC_SI_A_DEFSI, /*CFG13-12: */
`SC_A0_SRC_ACC, `SC_SHIFT_SL, 1'h0,
1'h0, `SC_FIFO1_BUS, `SC_FIFO0_BUS,
`SC_MSB_DSBL, `SC_MSB_BIT0, `SC_MSB_NOCHN,
`SC_FB_NOCHN, `SC_CMP1_NOCHN,
`SC_CMP0_NOCHN, /*CFG15-14: */
10'h00, `SC_FIFO_CLK__DP,`SC_FIFO_CAP_AX,
`SC_FIFO_LEVEL,`SC_FIFO_ASYNC,`SC_EXTCRC_DSBL,
`SC_WRK16CAT_DSBL /*CFG17-16: */
}
)) dp(
/* input */ .reset(1'b0),
/* input */ .clk(clk),
/* input [02:00] */ .cs_addr({2'b0, readfromfifo}),
/* input */ .route_si(1'b0),
/* input */ .route_ci(1'b0),
/* input */ .f0_load(1'b0),
/* input */ .f1_load(1'b0),
/* input */ .d0_load(1'b0),
/* input */ .d1_load(1'b0),
/* output */ .ce0(),
/* output */ .cl0(),
/* output */ .z0(),
/* output */ .ff0(),
/* output */ .ce1(),
/* output */ .cl1(),
/* output */ .z1(),
/* output */ .ff1(),
/* output */ .ov_msb(),
/* output */ .co_msb(),
/* output */ .cmsb(),
/* output */ .so(),
/* output */ .f0_bus_stat(drq), // not full
/* output */ .f0_blk_stat(empty), // empty
/* output */ .f1_bus_stat(),
/* output */ .f1_blk_stat(),
/* input */ .ci(1'b0), // Carry in from previous stage
/* output */ .co(),// Carry out to next stage
/* input */ .sir(1'b0), // Shift in from right side
/* output */ .sor(), // Shift out to right side
/* input */ .sil(1'b0), // Shift in from left side
/* output */ .sol(), // Shift out to left side
/* input */ .msbi(1'b0), // MSB chain in
/* output */ .msbo(), // MSB chain out
/* input [01:00] */ .cei(2'b0), // Compare equal in from prev stage
/* output [01:00] */ .ceo(), // Compare equal out to next stage
/* input [01:00] */ .cli(2'b0), // Compare less than in from prv stage
/* output [01:00] */ .clo(), // Compare less than out to next stage
/* input [01:00] */ .zi(2'b0), // Zero detect in from previous stage
/* output [01:00] */ .zo(), // Zero detect out to next stage
/* input [01:00] */ .fi(2'b0), // 0xFF detect in from previous stage
/* output [01:00] */ .fo(), // 0xFF detect out to next stage
/* input [01:00] */ .capi(2'b0), // Software capture from previous stage
/* output [01:00] */ .capo(), // Software capture to next stage
/* input */ .cfbi(1'b0), // CRC Feedback in from previous stage
/* output */ .cfbo(), // CRC Feedback out to next stage
/* input [07:00] */ .pi(8'b0), // Parallel data port
/* output [07:00] */ .po(po) // Parallel data port
);
//`#end` -- edit above this line, do not edit this line
endmodule
//`#start footer` -- edit after this line, do not edit this line
//`#end` -- edit above this line, do not edit this line

View File

@@ -28,13 +28,85 @@
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
</Group>
<Group key="1a7e8637-3b6b-4e84-839c-0dfc18fdaf5b">
<Data key="check_tolerance" value="True" />
<Data key="clock_version" value="v1" />
<Data key="derive_type" value="NAMED_DIVIDER" />
<Data key="desired_freq" value="0" />
<Data key="desired_unit" value="15" />
<Data key="divider" value="0" />
<Data key="domain" value="DIGITAL" />
<Data key="enabled" value="True" />
<Data key="minus_accuracy" value="0.25" />
<Data key="minus_tolerance" value="5" />
<Data key="name" value="Clock_5" />
<Data key="named_src_direct_connect" value="True" />
<Data key="netlist_name" value="Clock_5" />
<Data key="placement" value="AUTO" />
<Data key="plus_accuracy" value="0.25" />
<Data key="plus_tolerance" value="5" />
<Data key="scope" value="LOCAL" />
<Data key="src_clk_id" value="75C2148C-3656-4d8a-846D-0CAE99AB6FF7" />
<Data key="src_clk_name" value="BUS_CLK" />
<Data key="start_on_reset" value="True" />
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
</Group>
<Group key="3f3708ae-fb62-4012-919b-9a3b9a1dfbc2">
<Data key="check_tolerance" value="True" />
<Data key="clock_version" value="v1" />
<Data key="derive_type" value="NAMED_DIVIDER" />
<Data key="desired_freq" value="0" />
<Data key="desired_unit" value="15" />
<Data key="divider" value="0" />
<Data key="domain" value="DIGITAL" />
<Data key="enabled" value="True" />
<Data key="minus_accuracy" value="0.25" />
<Data key="minus_tolerance" value="5" />
<Data key="name" value="Clock_8" />
<Data key="named_src_direct_connect" value="True" />
<Data key="netlist_name" value="Clock_8" />
<Data key="placement" value="AUTO" />
<Data key="plus_accuracy" value="0.25" />
<Data key="plus_tolerance" value="5" />
<Data key="scope" value="LOCAL" />
<Data key="src_clk_id" value="75C2148C-3656-4d8a-846D-0CAE99AB6FF7" />
<Data key="src_clk_name" value="BUS_CLK" />
<Data key="start_on_reset" value="True" />
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
</Group>
<Group key="4eef02b9-8ad1-43c4-85f1-b3335faa5fc4">
<Data key="check_tolerance" value="True" />
<Data key="clock_version" value="v1" />
<Data key="derive_type" value="NAMED_DIVIDER" />
<Data key="desired_freq" value="0" />
<Data key="desired_unit" value="15" />
<Data key="divider" value="0" />
<Data key="domain" value="DIGITAL" />
<Data key="enabled" value="True" />
<Data key="minus_accuracy" value="0.25" />
<Data key="minus_tolerance" value="5" />
<Data key="name" value="Clock_3" />
<Data key="named_src_direct_connect" value="True" />
<Data key="netlist_name" value="Clock_3" />
<Data key="placement" value="AUTO" />
<Data key="plus_accuracy" value="0.25" />
<Data key="plus_tolerance" value="5" />
<Data key="scope" value="LOCAL" />
<Data key="src_clk_id" value="75C2148C-3656-4d8a-846D-0CAE99AB6FF7" />
<Data key="src_clk_name" value="BUS_CLK" />
<Data key="start_on_reset" value="True" />
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
</Group>
<Group key="06c4d5d4-f15f-4b29-a1d0-c24b2e38b1ec">
<Data key="check_tolerance" value="True" />
<Data key="clock_version" value="v1" />
<Data key="derive_type" value="NAMED_FREQ" />
<Data key="desired_freq" value="24" />
<Data key="desired_freq" value="12" />
<Data key="desired_unit" value="6" />
<Data key="divider" value="1" />
<Data key="divider" value="2" />
<Data key="domain" value="DIGITAL" />
<Data key="enabled" value="True" />
<Data key="minus_accuracy" value="0.25" />
@@ -50,7 +122,7 @@
<Data key="src_clk_name" value="IMO" />
<Data key="start_on_reset" value="True" />
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
<Data key="user_set_domain" value="True" />
</Group>
<Group key="24cd38f7-f472-4403-837f-86807c8f5333">
<Data key="check_tolerance" value="True" />
@@ -123,6 +195,54 @@
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
</Group>
<Group key="71bc291d-84a7-40a8-b7b2-1c8a34326a31">
<Data key="check_tolerance" value="True" />
<Data key="clock_version" value="v1" />
<Data key="derive_type" value="NAMED_FREQ" />
<Data key="desired_freq" value="300" />
<Data key="desired_unit" value="0" />
<Data key="divider" value="65536" />
<Data key="domain" value="DIGITAL" />
<Data key="enabled" value="True" />
<Data key="minus_accuracy" value="0.25" />
<Data key="minus_tolerance" value="5" />
<Data key="name" value="CLOCK300" />
<Data key="named_src_direct_connect" value="False" />
<Data key="netlist_name" value="CLOCK300" />
<Data key="placement" value="AUTO" />
<Data key="plus_accuracy" value="0.25" />
<Data key="plus_tolerance" value="5" />
<Data key="scope" value="LOCAL" />
<Data key="src_clk_id" value="CEF43CFB-0213-49b9-B980-2FFAB81C5B47" />
<Data key="src_clk_name" value="IMO" />
<Data key="start_on_reset" value="True" />
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
</Group>
<Group key="90ce0c72-9f10-44ef-a049-f0f525d59bea">
<Data key="check_tolerance" value="True" />
<Data key="clock_version" value="v1" />
<Data key="derive_type" value="NAMED_FREQ" />
<Data key="desired_freq" value="128" />
<Data key="desired_unit" value="0" />
<Data key="divider" value="65536" />
<Data key="domain" value="DIGITAL" />
<Data key="enabled" value="True" />
<Data key="minus_accuracy" value="0.25" />
<Data key="minus_tolerance" value="5" />
<Data key="name" value="CLOCK8" />
<Data key="named_src_direct_connect" value="False" />
<Data key="netlist_name" value="CLOCK8" />
<Data key="placement" value="AUTO" />
<Data key="plus_accuracy" value="0.25" />
<Data key="plus_tolerance" value="5" />
<Data key="scope" value="LOCAL" />
<Data key="src_clk_id" value="CEF43CFB-0213-49b9-B980-2FFAB81C5B47" />
<Data key="src_clk_name" value="IMO" />
<Data key="start_on_reset" value="True" />
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
</Group>
<Group key="349ffa20-8576-4ac3-9a6f-34ef606de6cf">
<Data key="check_tolerance" value="True" />
<Data key="clock_version" value="v1" />
@@ -146,6 +266,29 @@
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
</Group>
<Group key="4033c29d-f4bc-4e94-ac95-aa587e869f88/696a0979-21fc-4185-bf38-6c79febcde7a">
<Data key="check_tolerance" value="False" />
<Data key="clock_version" value="v1" />
<Data key="derive_type" value="AUTO" />
<Data key="desired_freq" value="1600000" />
<Data key="desired_unit" value="0" />
<Data key="divider" value="40" />
<Data key="domain" value="DIGITAL" />
<Data key="enabled" value="True" />
<Data key="minus_accuracy" value="0.25" />
<Data key="minus_tolerance" value="5" />
<Data key="name" value="OUTPUT_VOLTAGE_ADC_theACLK" />
<Data key="netlist_name" value="\OUTPUT_VOLTAGE_ADC:theACLK\" />
<Data key="placement" value="AUTO" />
<Data key="plus_accuracy" value="0.25" />
<Data key="plus_tolerance" value="5" />
<Data key="scope" value="LOCAL" />
<Data key="src_clk_id" value="61737EF6-3B74-48f9-8B91-F7473A442AE7" />
<Data key="src_clk_name" value="MASTER_CLK" />
<Data key="start_on_reset" value="True" />
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
</Group>
<Group key="6616e828-6611-4893-a674-66c861d79d6c">
<Data key="check_tolerance" value="True" />
<Data key="clock_version" value="v1" />
@@ -193,6 +336,101 @@
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
</Group>
<Group key="75187c05-9501-4450-b306-6ccdd3bb77db">
<Data key="check_tolerance" value="True" />
<Data key="clock_version" value="v1" />
<Data key="derive_type" value="NAMED_DIVIDER" />
<Data key="desired_freq" value="0" />
<Data key="desired_unit" value="15" />
<Data key="divider" value="0" />
<Data key="domain" value="DIGITAL" />
<Data key="enabled" value="True" />
<Data key="minus_accuracy" value="0.25" />
<Data key="minus_tolerance" value="5" />
<Data key="name" value="Clock_5" />
<Data key="named_src_direct_connect" value="True" />
<Data key="netlist_name" value="Clock_5" />
<Data key="placement" value="AUTO" />
<Data key="plus_accuracy" value="0.25" />
<Data key="plus_tolerance" value="5" />
<Data key="scope" value="LOCAL" />
<Data key="src_clk_id" value="75C2148C-3656-4d8a-846D-0CAE99AB6FF7" />
<Data key="src_clk_name" value="BUS_CLK" />
<Data key="start_on_reset" value="True" />
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
</Group>
<Group key="09974428-e912-491f-8d2f-361ba50e7599">
<Data key="check_tolerance" value="True" />
<Data key="clock_version" value="v1" />
<Data key="derive_type" value="NAMED_DIVIDER" />
<Data key="desired_freq" value="0" />
<Data key="desired_unit" value="15" />
<Data key="divider" value="0" />
<Data key="domain" value="DIGITAL" />
<Data key="enabled" value="True" />
<Data key="minus_accuracy" value="0.25" />
<Data key="minus_tolerance" value="5" />
<Data key="name" value="Clock_6" />
<Data key="named_src_direct_connect" value="True" />
<Data key="netlist_name" value="Clock_6" />
<Data key="placement" value="AUTO" />
<Data key="plus_accuracy" value="0.25" />
<Data key="plus_tolerance" value="5" />
<Data key="scope" value="LOCAL" />
<Data key="src_clk_id" value="75C2148C-3656-4d8a-846D-0CAE99AB6FF7" />
<Data key="src_clk_name" value="BUS_CLK" />
<Data key="start_on_reset" value="True" />
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
</Group>
<Group key="a5825a94-fa18-4e4f-a843-bc687cacbd56/696a0979-21fc-4185-bf38-6c79febcde7a">
<Data key="check_tolerance" value="False" />
<Data key="clock_version" value="v1" />
<Data key="derive_type" value="AUTO" />
<Data key="desired_freq" value="1600000" />
<Data key="desired_unit" value="0" />
<Data key="divider" value="40" />
<Data key="domain" value="DIGITAL" />
<Data key="enabled" value="True" />
<Data key="minus_accuracy" value="0.25" />
<Data key="minus_tolerance" value="5" />
<Data key="name" value="INPUT_VOLTAGE_ADC_theACLK" />
<Data key="netlist_name" value="\INPUT_VOLTAGE_ADC:theACLK\" />
<Data key="placement" value="AUTO" />
<Data key="plus_accuracy" value="0.25" />
<Data key="plus_tolerance" value="5" />
<Data key="scope" value="LOCAL" />
<Data key="src_clk_id" value="61737EF6-3B74-48f9-8B91-F7473A442AE7" />
<Data key="src_clk_name" value="MASTER_CLK" />
<Data key="start_on_reset" value="True" />
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
</Group>
<Group key="b762c287-7f87-4b21-982e-84be01dc5115">
<Data key="check_tolerance" value="True" />
<Data key="clock_version" value="v1" />
<Data key="derive_type" value="NAMED_DIVIDER" />
<Data key="desired_freq" value="0" />
<Data key="desired_unit" value="15" />
<Data key="divider" value="0" />
<Data key="domain" value="DIGITAL" />
<Data key="enabled" value="True" />
<Data key="minus_accuracy" value="0.25" />
<Data key="minus_tolerance" value="5" />
<Data key="name" value="Clock_2" />
<Data key="named_src_direct_connect" value="True" />
<Data key="netlist_name" value="Clock_2" />
<Data key="placement" value="AUTO" />
<Data key="plus_accuracy" value="0.25" />
<Data key="plus_tolerance" value="5" />
<Data key="scope" value="LOCAL" />
<Data key="src_clk_id" value="75C2148C-3656-4d8a-846D-0CAE99AB6FF7" />
<Data key="src_clk_name" value="BUS_CLK" />
<Data key="start_on_reset" value="True" />
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
</Group>
<Group key="b0162966-0060-4af5-82d1-fcb491ad7619/be0a0e37-ad17-42ca-b5a1-1a654d736358">
<Data key="check_tolerance" value="True" />
<Data key="clock_version" value="v1" />
@@ -216,6 +454,30 @@
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
</Group>
<Group key="b722443b-8f81-46dc-bf9b-c95eb62bc181">
<Data key="check_tolerance" value="True" />
<Data key="clock_version" value="v1" />
<Data key="derive_type" value="NAMED_DIVIDER" />
<Data key="desired_freq" value="0" />
<Data key="desired_unit" value="15" />
<Data key="divider" value="0" />
<Data key="domain" value="DIGITAL" />
<Data key="enabled" value="True" />
<Data key="minus_accuracy" value="0.25" />
<Data key="minus_tolerance" value="5" />
<Data key="name" value="Clock_1" />
<Data key="named_src_direct_connect" value="True" />
<Data key="netlist_name" value="Clock_1" />
<Data key="placement" value="AUTO" />
<Data key="plus_accuracy" value="0.25" />
<Data key="plus_tolerance" value="5" />
<Data key="scope" value="LOCAL" />
<Data key="src_clk_id" value="75C2148C-3656-4d8a-846D-0CAE99AB6FF7" />
<Data key="src_clk_name" value="BUS_CLK" />
<Data key="start_on_reset" value="True" />
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
</Group>
<Group key="cb7e877c-9fb4-4fc1-a708-f1e48eb5a68c">
<Data key="check_tolerance" value="True" />
<Data key="clock_version" value="v1" />
@@ -240,6 +502,30 @@
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
</Group>
<Group key="d3075dc6-05c8-4dc9-9959-cf7014c0e66f">
<Data key="check_tolerance" value="True" />
<Data key="clock_version" value="v1" />
<Data key="derive_type" value="NAMED_DIVIDER" />
<Data key="desired_freq" value="0" />
<Data key="desired_unit" value="15" />
<Data key="divider" value="0" />
<Data key="domain" value="DIGITAL" />
<Data key="enabled" value="True" />
<Data key="minus_accuracy" value="0.25" />
<Data key="minus_tolerance" value="5" />
<Data key="name" value="Clock_7" />
<Data key="named_src_direct_connect" value="True" />
<Data key="netlist_name" value="Clock_7" />
<Data key="placement" value="AUTO" />
<Data key="plus_accuracy" value="0.25" />
<Data key="plus_tolerance" value="5" />
<Data key="scope" value="LOCAL" />
<Data key="src_clk_id" value="75C2148C-3656-4d8a-846D-0CAE99AB6FF7" />
<Data key="src_clk_name" value="BUS_CLK" />
<Data key="start_on_reset" value="True" />
<Data key="sync_with_bus_clk" value="True" />
<Data key="user_set_domain" value="False" />
</Group>
<Group key="e4a53a4c-40e1-4747-a72a-10193ffdf31c">
<Data key="check_tolerance" value="True" />
<Data key="clock_version" value="v1" />
@@ -528,49 +814,70 @@
</Group>
<Group key="Component">
<Group key="v1">
<Data key="cy_boot" value="cy_boot_v5_80" />
<Data key="cy_boot" value="cy_boot_v6_10" />
<Data key="Em_EEPROM_Dynamic" value="Em_EEPROM_Dynamic_v2_20" />
<Data key="LIN_Dynamic" value="LIN_Dynamic_v4_0" />
<Data key="LIN_Dynamic" value="LIN_Dynamic_v6_0" />
</Group>
</Group>
<Data key="DataVersionKey" value="2" />
<Group key="DWRInstGuidMapping">
<Group key="Clock">
<Data key="0b2f9bbb-00ce-4115-a788-ffb9d046a9e5" value="Clock_4" />
<Data key="1a7e8637-3b6b-4e84-839c-0dfc18fdaf5b" value="Clock_5" />
<Data key="3f3708ae-fb62-4012-919b-9a3b9a1dfbc2" value="Clock_8" />
<Data key="4eef02b9-8ad1-43c4-85f1-b3335faa5fc4" value="Clock_3" />
<Data key="06c4d5d4-f15f-4b29-a1d0-c24b2e38b1ec" value="CounterClock" />
<Data key="24cd38f7-f472-4403-837f-86807c8f5333" value="PULSE_CLOCK" />
<Data key="63ed4137-0b09-4256-8a27-35c9a2653f1a" value="Clock_2" />
<Data key="66f14071-bddd-4b4d-a9aa-a129cceaa7b6" value="Clock_3" />
<Data key="71bc291d-84a7-40a8-b7b2-1c8a34326a31" value="CLOCK300" />
<Data key="90ce0c72-9f10-44ef-a049-f0f525d59bea" value="CLOCK8" />
<Data key="349ffa20-8576-4ac3-9a6f-34ef606de6cf" value="Clock_1" />
<Data key="4033c29d-f4bc-4e94-ac95-aa587e869f88/696a0979-21fc-4185-bf38-6c79febcde7a" value="OUTPUT_VOLTAGE_ADC_theACLK" />
<Data key="6616e828-6611-4893-a674-66c861d79d6c" value="SignalSamplingClock" />
<Data key="12664fc6-9d70-44b1-8a49-887a292e1b7f" value="Clock_3" />
<Data key="75187c05-9501-4450-b306-6ccdd3bb77db" value="Clock_5" />
<Data key="09974428-e912-491f-8d2f-361ba50e7599" value="Clock_6" />
<Data key="a5825a94-fa18-4e4f-a843-bc687cacbd56/696a0979-21fc-4185-bf38-6c79febcde7a" value="INPUT_VOLTAGE_ADC_theACLK" />
<Data key="b762c287-7f87-4b21-982e-84be01dc5115" value="Clock_2" />
<Data key="b0162966-0060-4af5-82d1-fcb491ad7619/be0a0e37-ad17-42ca-b5a1-1a654d736358" value="UART_IntClock" />
<Data key="b722443b-8f81-46dc-bf9b-c95eb62bc181" value="Clock_1" />
<Data key="cb7e877c-9fb4-4fc1-a708-f1e48eb5a68c" value="CounterClock" />
<Data key="d3075dc6-05c8-4dc9-9959-cf7014c0e66f" value="Clock_7" />
<Data key="e4a53a4c-40e1-4747-a72a-10193ffdf31c" value="Clock_1" />
<Data key="efd5f185-0c32-4824-ba72-3ceb5356f5a7" value="Clock_1" />
</Group>
<Group key="Pin">
<Data key="3e1862bb-be82-47b0-9549-7ebfe76b6f7b" value="Pin_2" />
<Data key="4a398466-709f-4228-9500-96178658e13e" value="RDATA" />
<Data key="5a3407c1-b434-4438-a7b4-b9dfd2280495" value="MOTEA" />
<Data key="8d318d8b-cf7b-4b6b-b02c-ab1c5c49d0ba" value="SW1" />
<Data key="8fc20a4f-e4d1-44b3-a5d4-546e8628d61e" value="LED" />
<Data key="12e00eac-69b5-4717-85c8-25ef6b224d4c" value="DEBUG_PINS" />
<Data key="41e2d8ed-5494-4d8c-8ff7-f4f789cece51" value="REDWC" />
<Data key="264be2d3-9481-494b-8d9c-c1905a45e9cc" value="FDD" />
<Data key="472f8fdb-f772-44fb-8897-cc690694237b" value="WDATA" />
<Data key="736cb12b-c863-43d4-a8f0-42f06023f8b5" value="SIDE1" />
<Data key="4249c923-fcff-453b-8629-bec6fddd00c1" value="STEP" />
<Data key="27315b0e-6a8c-4b7f-be77-73ab434fa803" value="Pin_1" />
<Data key="1425177d-0d0e-4468-8bcc-e638e5509a9b" value="UartRx" />
<Data key="a5d987c6-e45b-45b9-ad93-656fab06d720" value="TRK00" />
<Data key="a93ef5b3-00f4-42c0-8fad-0e275a7e2537" value="MOTEB" />
<Data key="b8380fb7-fdb8-449f-bd8d-c4ca96cdf55a" value="DEBUG_PINS" />
<Data key="bc2e8987-db82-469c-bf6f-22fd3464cc70" value="DEBUG_PINS" />
<Data key="bc5d52a1-1b25-4aa0-9ba9-3f81d122772f" value="DEBUG_PINS" />
<Data key="beca5e2d-f70f-4900-a4db-7eca1ed3126e/8b77a6c4-10a0-4390-971c-672353e2a49c" value="USBFS_Dm" />
<Data key="beca5e2d-f70f-4900-a4db-7eca1ed3126e/618a72fc-5ddd-4df5-958f-a3d55102db42" value="USBFS_Dp" />
<Data key="c5367cde-21d5-4866-9a32-d16abfea0c61" value="WPT" />
<Data key="d19368c5-6855-41bb-a9ff-808938abef00" value="INDEX" />
<Data key="e9f14b5a-b2bf-49b8-98f3-d7b5a43ace8d" value="DRVSB" />
<Data key="e851a3b9-efb8-48be-bbb8-b303b216c393" value="LED" />
<Data key="e16b5ef8-00d3-40a4-bc1c-194983c8eb3d" value="LOW_CURRENT" />
<Data key="e851a3b9-efb8-48be-bbb8-b303b216c393" value="INDEX300" />
<Data key="e51063a9-4fad-40c7-a06b-7cc4b137dc18" value="DSKCHG" />
<Data key="ea7ee228-8b3f-426c-8bb8-cd7a81937769" value="DIR" />
<Data key="ed092b9b-d398-4703-be89-cebf998501f6" value="UartTx" />
<Data key="f9a7371a-8a7d-4144-8b08-69e3d2a3a663" value="INDEX360" />
<Data key="fbd1f839-40f9-498e-a48b-5f3048ea5c3d/52f31aa9-2f0a-497d-9a1f-1424095e13e6" value="UART_tx" />
<Data key="fede1767-f3fd-4021-b3d7-8f9d88f36f9b" value="DRVSA" />
<Data key="fff78075-035e-43d7-8577-bc5be4d21926" value="WGATE" />
</Group>
@@ -3659,6 +3966,11 @@
</Group>
</Group>
<Group key="Pin2">
<Group key="3e1862bb-be82-47b0-9549-7ebfe76b6f7b">
<Group key="0">
<Data key="Port Format" value="0,6" />
</Group>
</Group>
<Group key="4a398466-709f-4228-9500-96178658e13e">
<Group key="0">
<Data key="Port Format" value="1,5" />
@@ -3674,6 +3986,25 @@
<Data key="Port Format" value="2,2" />
</Group>
</Group>
<Group key="8fc20a4f-e4d1-44b3-a5d4-546e8628d61e">
<Group key="0">
<Data key="Port Format" value="2,1" />
</Group>
</Group>
<Group key="12e00eac-69b5-4717-85c8-25ef6b224d4c">
<Group key="0">
<Data key="Port Format" value="2,2" />
</Group>
<Group key="1">
<Data key="Port Format" value="2,3" />
</Group>
<Group key="2">
<Data key="Port Format" value="2,4" />
</Group>
<Group key="3">
<Data key="Port Format" value="2,0" />
</Group>
</Group>
<Group key="41e2d8ed-5494-4d8c-8ff7-f4f789cece51">
<Group key="0">
<Data key="Port Format" value="2,7" />
@@ -3741,6 +4072,11 @@
<Data key="Port Format" value="1,0" />
</Group>
</Group>
<Group key="27315b0e-6a8c-4b7f-be77-73ab434fa803">
<Group key="0">
<Data key="Port Format" value="0,7" />
</Group>
</Group>
<Group key="1425177d-0d0e-4468-8bcc-e638e5509a9b">
<Group key="0">
<Data key="Port Format" value="12,6" />
@@ -3756,6 +4092,43 @@
<Data key="Port Format" value="12,1" />
</Group>
</Group>
<Group key="b8380fb7-fdb8-449f-bd8d-c4ca96cdf55a">
<Group key="0">
<Data key="Port Format" value="2,5" />
</Group>
<Group key="1">
<Data key="Port Format" value="2,4" />
</Group>
<Group key="2">
<Data key="Port Format" value="2,3" />
</Group>
</Group>
<Group key="bc2e8987-db82-469c-bf6f-22fd3464cc70">
<Group key="0">
<Data key="Port Format" value="0,0" />
</Group>
<Group key="1">
<Data key="Port Format" value="0,1" />
</Group>
<Group key="2">
<Data key="Port Format" value="0,2" />
</Group>
<Group key="3">
<Data key="Port Format" value="0,3" />
</Group>
<Group key="4">
<Data key="Port Format" value="0,4" />
</Group>
<Group key="5">
<Data key="Port Format" value="0,5" />
</Group>
<Group key="6">
<Data key="Port Format" value="0,6" />
</Group>
<Group key="7">
<Data key="Port Format" value="0,7" />
</Group>
</Group>
<Group key="bc5d52a1-1b25-4aa0-9ba9-3f81d122772f">
<Group key="0">
<Data key="Port Format" value="0,5" />
@@ -3789,9 +4162,14 @@
<Data key="Port Format" value="12,3" />
</Group>
</Group>
<Group key="e16b5ef8-00d3-40a4-bc1c-194983c8eb3d">
<Group key="0">
<Data key="Port Format" value="3,2" />
</Group>
</Group>
<Group key="e851a3b9-efb8-48be-bbb8-b303b216c393">
<Group key="0">
<Data key="Port Format" value="2,1" />
<Data key="Port Format" value="3,0" />
</Group>
</Group>
<Group key="e51063a9-4fad-40c7-a06b-7cc4b137dc18">
@@ -3809,6 +4187,16 @@
<Data key="Port Format" value="12,7" />
</Group>
</Group>
<Group key="f9a7371a-8a7d-4144-8b08-69e3d2a3a663">
<Group key="0">
<Data key="Port Format" value="3,1" />
</Group>
</Group>
<Group key="fbd1f839-40f9-498e-a48b-5f3048ea5c3d/52f31aa9-2f0a-497d-9a1f-1424095e13e6">
<Group key="0">
<Data key="Port Format" value="12,7" />
</Group>
</Group>
<Group key="fede1767-f3fd-4021-b3d7-8f9d88f36f9b">
<Group key="0">
<Data key="Port Format" value="12,2" />
@@ -3834,7 +4222,7 @@
<Data key="CYDEV_ECC_ENABLE" value="False" />
<Data key="CYDEV_HEAP_SIZE" value="0x80" />
<Data key="CYDEV_INSTRUCT_CACHE_ENABLED" value="True" />
<Data key="CYDEV_PROTECTION_ENABLE" value="False" />
<Data key="CYDEV_PROTECTION_ENABLE" value="True" />
<Data key="CYDEV_STACK_SIZE" value="0x0800" />
<Data key="CYDEV_TEMPERATURE" value="0C - 85/125C" />
<Data key="CYDEV_TRACE_ENABLED" value="False" />

View File

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,96 @@
//`#start header` -- edit after this line, do not edit this line
`include "cypress.v"
//`#end` -- edit above this line, do not edit this line
// Generated on 12/11/2019 at 21:18
// Component: Sampler
module Sampler (
output [2:0] debug_state,
output reg [7:0] opcode,
output reg req,
input clock,
input index,
input rdata,
input reset,
input sampleclock
);
//`#start body` -- edit after this line, do not edit this line
// NOTE: Reset pulse is used in both clock domains, and must be long enough
// to be detected in both.
reg [5:0] counter;
reg index_edge;
reg rdata_edge;
reg req_toggle;
reg rdata_toggle;
reg old_rdata_toggle;
reg index_toggle;
reg old_index_toggle;
always @(posedge rdata)
begin
rdata_toggle <= ~rdata_toggle;
end
always @(posedge index)
begin
index_toggle <= ~index_toggle;
end
always @(posedge sampleclock)
begin
if (reset)
begin
old_rdata_toggle <= 0;
old_index_toggle <= 0;
index_edge <= 0;
rdata_edge <= 0;
counter <= 0;
req_toggle <= 0;
end
else
begin
/* If data_toggle or index_toggle have changed state, this means that they've
* gone high since the last sampleclock. */
index_edge <= index_toggle != old_index_toggle;
old_index_toggle <= index_toggle;
rdata_edge <= rdata_toggle != old_rdata_toggle;
old_rdata_toggle <= rdata_toggle;
if (rdata_edge || index_edge || (counter == 6'h3f)) begin
opcode <= { rdata_edge, index_edge, counter };
req_toggle <= ~req_toggle;
counter <= 1; /* remember to count this tick */
end else begin
counter <= counter + 1;
end
end
end
reg req_toggle_q;
always @(posedge clock)
begin
if (reset) begin
req_toggle_q <= 0;
req <= 0;
end else begin
req_toggle_q <= req_toggle;
req <= (req_toggle != req_toggle_q);
end
end
//`#end` -- edit above this line, do not edit this line
endmodule
//`#start footer` -- edit after this line, do not edit this line
//`#end` -- edit above this line, do not edit this line

View File

@@ -0,0 +1,95 @@
//`#start header` -- edit after this line, do not edit this line
`include "cypress.v"
//`#end` -- edit above this line, do not edit this line
// Generated on 11/24/2019 at 17:25
// Component: Sequencer
module Sequencer (
output req, /* request new data on leading edge */
output wdata,
output [2:0] debug_state,
input clock,
input dataclock, /* incoming data on leading edge */
input [7:0] opcode,
input index,
input sampleclock,
input reset
);
//`#start body` -- edit after this line, do not edit this line
localparam STATE_LOAD = 0;
localparam STATE_WRITING = 1;
reg state;
reg [5:0] countdown;
reg pulsepending;
assign req = (!reset && (state == STATE_LOAD));
assign wdata = (!reset && (state == STATE_WRITING) && (countdown == 0) && pulsepending);
assign debug_state = 0;
reg olddataclock;
wire dataclocked;
always @(posedge clock) olddataclock <= dataclock;
assign dataclocked = !olddataclock && dataclock;
reg oldsampleclock;
reg sampleclocked;
reg oldindex;
wire indexed;
always @(posedge clock) oldindex <= index;
assign indexed = !oldindex && index;
always @(posedge clock)
begin
if (reset)
begin
state <= STATE_LOAD;
countdown <= 0;
pulsepending <= 0;
oldsampleclock <= 0;
end
else
begin
if (!oldsampleclock && sampleclock)
sampleclocked <= 1;
oldsampleclock <= sampleclock;
case (state)
STATE_LOAD:
begin
/* A posedge on dataclocked indicates that another opcode has
* arrived. */
if (dataclocked)
begin
pulsepending <= opcode[7];
if (opcode[5:0] == 0)
countdown <= 0;
else
countdown <= opcode[5:0] - 1; /* compensate for extra tick in state machine */
state <= STATE_WRITING;
end
end
STATE_WRITING:
begin
if (sampleclocked)
begin
if (countdown == 0)
state <= STATE_LOAD;
else
countdown <= countdown - 1;
sampleclocked <= 0;
end
end
endcase
end
end
//`#end` -- edit above this line, do not edit this line
endmodule
//`#start footer` -- edit after this line, do not edit this line
//`#end` -- edit above this line, do not edit this line

View File

Binary file not shown.

View File

@@ -0,0 +1,156 @@
//`#start header` -- edit after this line, do not edit this line
`include "cypress.v"
//`#end` -- edit above this line, do not edit this line
// Generated on 11/16/2017 at 15:44
// Component: FIFOout
module SuperCounter (
input clk,
input reset,
input count,
output [7:0] d,
output drq,
output empty,
output ack
);
//`#start body` -- edit after this line, do not edit this line
parameter ResetValue = 0;
parameter Delta = 1;
wire [7:0] po;
assign d = po;
localparam STATE_RESET = 0;
localparam STATE_WAIT = 1;
localparam STATE_ADD = 2;
reg oldcount;
wire counted;
assign counted = count && !oldcount;
always @(posedge clk) oldcount <= count;
wire [2:0] cs;
assign cs = reset ? STATE_RESET : (counted ? STATE_ADD : STATE_WAIT);
cy_psoc3_dp #(.d0_init(ResetValue), .d1_init(Delta),
.cy_dpconfig(
{
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC___D0, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM0: STATE_RESET*/
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC__ALU, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM1: STATE_WAIT*/
`CS_ALU_OP__ADD, `CS_SRCA_A0, `CS_SRCB_D1,
`CS_SHFT_OP_PASS, `CS_A0_SRC__ALU, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM2: STATE_ADD*/
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM3: */
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM4: */
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM5: */
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM6: */
`CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0,
`CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE,
`CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA,
`CS_CMP_SEL_CFGA, /*CFGRAM7: */
8'hFF, 8'h00, /*CFG9: */
8'hFF, 8'hFF, /*CFG11-10: */
`SC_CMPB_A1_D1, `SC_CMPA_A1_D1, `SC_CI_B_ARITH,
`SC_CI_A_ARITH, `SC_C1_MASK_DSBL, `SC_C0_MASK_DSBL,
`SC_A_MASK_DSBL, `SC_DEF_SI_0, `SC_SI_B_DEFSI,
`SC_SI_A_DEFSI, /*CFG13-12: */
`SC_A0_SRC_ACC, `SC_SHIFT_SL, 1'h0,
1'h0, `SC_FIFO1_BUS, `SC_FIFO0_BUS,
`SC_MSB_DSBL, `SC_MSB_BIT0, `SC_MSB_NOCHN,
`SC_FB_NOCHN, `SC_CMP1_NOCHN,
`SC_CMP0_NOCHN, /*CFG15-14: */
10'h00, `SC_FIFO_CLK__DP,`SC_FIFO_CAP_AX,
`SC_FIFO_LEVEL,`SC_FIFO_ASYNC,`SC_EXTCRC_DSBL,
`SC_WRK16CAT_DSBL /*CFG17-16: */
}
)) dp(
/* input */ .reset(1'b0),
/* input */ .clk(clk),
/* input [02:00] */ .cs_addr(cs),
/* input */ .route_si(1'b0),
/* input */ .route_ci(1'b0),
/* input */ .f0_load(1'b0),
/* input */ .f1_load(1'b0),
/* input */ .d0_load(1'b0),
/* input */ .d1_load(1'b0),
/* output */ .ce0(),
/* output */ .cl0(),
/* output */ .z0(),
/* output */ .ff0(),
/* output */ .ce1(),
/* output */ .cl1(),
/* output */ .z1(),
/* output */ .ff1(),
/* output */ .ov_msb(),
/* output */ .co_msb(),
/* output */ .cmsb(),
/* output */ .so(),
/* output */ .f0_bus_stat(),
/* output */ .f0_blk_stat(),
/* output */ .f1_bus_stat(),
/* output */ .f1_blk_stat(),
/* input */ .ci(1'b0), // Carry in from previous stage
/* output */ .co(),// Carry out to next stage
/* input */ .sir(1'b0), // Shift in from right side
/* output */ .sor(), // Shift out to right side
/* input */ .sil(1'b0), // Shift in from left side
/* output */ .sol(), // Shift out to left side
/* input */ .msbi(1'b0), // MSB chain in
/* output */ .msbo(), // MSB chain out
/* input [01:00] */ .cei(2'b0), // Compare equal in from prev stage
/* output [01:00] */ .ceo(), // Compare equal out to next stage
/* input [01:00] */ .cli(2'b0), // Compare less than in from prv stage
/* output [01:00] */ .clo(), // Compare less than out to next stage
/* input [01:00] */ .zi(2'b0), // Zero detect in from previous stage
/* output [01:00] */ .zo(), // Zero detect out to next stage
/* input [01:00] */ .fi(2'b0), // 0xFF detect in from previous stage
/* output [01:00] */ .fo(), // 0xFF detect out to next stage
/* input [01:00] */ .capi(2'b0), // Software capture from previous stage
/* output [01:00] */ .capo(), // Software capture to next stage
/* input */ .cfbi(1'b0), // CRC Feedback in from previous stage
/* output */ .cfbo(), // CRC Feedback out to next stage
/* input [07:00] */ .pi(8'b0), // Parallel data port
/* output [07:00] */ .po(po) // Parallel data port
);
//`#end` -- edit above this line, do not edit this line
endmodule
//`#start footer` -- edit after this line, do not edit this line
//`#end` -- edit above this line, do not edit this line

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

View File

File diff suppressed because it is too large Load Diff

View File

@@ -1,18 +0,0 @@
const READ = 1
const WRITE = 2
filename = "Generated_Source\PSoC5\USBFS_descr.c"
set fso = CreateObject("Scripting.FileSystemObject")
set file = fso.OpenTextFile(filename, READ)
text = file.ReadAll
file.Close
set r = New RegExp
r.MultiLine = True
r.Pattern = "/\* +compatibleID.*\n.*"
text = r.replace(text, "'W', 'I', 'N', 'U', 'S', 'B', 0, 0,")
set file = fso.CreateTextFile(filename, True)
file.Write text
file.Close

311
Makefile
View File

@@ -1,6 +1,305 @@
all: .obj/build.ninja
@ninja -C .obj test
.obj/build.ninja:
@mkdir -p .obj
meson .obj
#Special Windows settings.
ifeq ($(OS), Windows_NT)
MINGWBIN = /mingw32/bin
CCPREFIX = $(MINGWBIN)/
LUA = $(MINGWBIN)/lua
PKG_CONFIG = $(MINGWBIN)/pkg-config
WX_CONFIG = /usr/bin/sh $(MINGWBIN)/wx-config --static=yes
PROTOC = $(MINGWBIN)/protoc
PLATFORM = WINDOWS
LDFLAGS += \
-static
CXXFLAGS += \
-std=c++17 \
-fext-numeric-literals \
-Wno-deprecated-enum-float-conversion \
-Wno-deprecated-enum-enum-conversion
#Required to get the gcc run - time libraries on the path.
export PATH := $(PATH):$(MINGWBIN)
EXT ?= .exe
endif
#Special OSX settings.
ifeq ($(shell uname),Darwin)
PLATFORM = OSX
LDFLAGS += \
-framework IOKit \
-framework Foundation
endif
ifeq ($(shell uname),FreeBSD)
PLATFORM = FreeBSD
CFLAGS += -I/usr/local/include
endif
#Check the Make version.
ifeq ($(findstring 4.,$(MAKE_VERSION)),)
$(error You need GNU Make 4.x for this (if you're on OSX, use gmake).)
endif
#Normal settings.
OBJDIR ?= .obj
CCPREFIX ?=
LUA ?= lua
CC ?= $(CCPREFIX)gcc
CXX ?= $(CCPREFIX)g++
AR ?= $(CCPREFIX)ar
PKG_CONFIG ?= pkg-config
WX_CONFIG ?= wx-config
PROTOC ?= protoc
CFLAGS ?= -g -O3
CXXFLAGS += -std=c++17
LDFLAGS ?=
PLATFORM ?= UNIX
TESTS ?= yes
EXT ?=
DESTDIR ?=
PREFIX ?= /usr/local
BINDIR ?= $(PREFIX)/bin
CFLAGS += \
-Iarch \
-Ilib \
-I. \
-I$(OBJDIR)/arch \
-I$(OBJDIR)/lib \
-I$(OBJDIR) \
-Wno-deprecated-declarations \
LDFLAGS += \
-lz \
-lfmt
.SUFFIXES:
.DELETE_ON_ERROR:
define nl
endef
empty :=
space := $(empty) $(empty)
use-library = $(eval $(use-library-impl))
define use-library-impl
$1: $(call $3_LIB)
$1: private LDFLAGS += $(call $3_LDFLAGS)
$2: private CFLAGS += $(call $3_CFLAGS)
endef
use-pkgconfig = $(eval $(use-pkgconfig-impl))
define use-pkgconfig-impl
ifneq ($(strip $(shell $(PKG_CONFIG) $3; echo $$?)),0)
$$(error Missing required pkg-config dependency: $3)
endif
$(1): private LDFLAGS += $(shell $(PKG_CONFIG) --libs $(3))
$(2): private CFLAGS += $(shell $(PKG_CONFIG) --cflags $(3))
endef
.PHONY: all binaries tests clean install install-bin
all: binaries tests docs
PROTOS = \
arch/aeslanier/aeslanier.proto \
arch/agat/agat.proto \
arch/amiga/amiga.proto \
arch/apple2/apple2.proto \
arch/brother/brother.proto \
arch/c64/c64.proto \
arch/f85/f85.proto \
arch/fb100/fb100.proto \
arch/ibm/ibm.proto \
arch/macintosh/macintosh.proto \
arch/micropolis/micropolis.proto \
arch/mx/mx.proto \
arch/northstar/northstar.proto \
arch/rolandd20/rolandd20.proto \
arch/smaky6/smaky6.proto \
arch/tids990/tids990.proto \
arch/victor9k/victor9k.proto \
arch/zilogmcz/zilogmcz.proto \
lib/common.proto \
lib/config.proto \
lib/decoders/decoders.proto \
lib/drive.proto \
lib/encoders/encoders.proto \
lib/fl2.proto \
lib/fluxsink/fluxsink.proto \
lib/fluxsource/fluxsource.proto \
lib/imagereader/imagereader.proto \
lib/imagewriter/imagewriter.proto \
lib/layout.proto \
lib/usb/usb.proto \
lib/vfs/vfs.proto \
tests/testproto.proto \
PROTO_HDRS = $(patsubst %.proto, $(OBJDIR)/%.pb.h, $(PROTOS))
PROTO_SRCS = $(patsubst %.proto, $(OBJDIR)/%.pb.cc, $(PROTOS))
PROTO_OBJS = $(patsubst %.cc, %.o, $(PROTO_SRCS))
PROTO_CFLAGS := $(shell $(PKG_CONFIG) --cflags protobuf)
$(PROTO_SRCS): | $(PROTO_HDRS)
$(PROTO_OBJS): CFLAGS += $(PROTO_CFLAGS)
PROTO_LIB = $(OBJDIR)/libproto.a
$(PROTO_LIB): $(PROTO_OBJS)
PROTO_LDFLAGS := $(shell $(PKG_CONFIG) --libs protobuf) -pthread
.PRECIOUS: $(PROTO_HDRS) $(PROTO_SRCS)
include dep/agg/build.mk
include dep/libusbp/build.mk
include dep/stb/build.mk
include dep/emu/build.mk
include dep/fatfs/build.mk
include dep/adflib/build.mk
include dep/hfsutils/build.mk
include scripts/build.mk
include lib/build.mk
include arch/build.mk
include src/build.mk
include src/gui/build.mk
include tools/build.mk
include tests/build.mk
do-encodedecodetest = $(eval $(do-encodedecodetest-impl))
define do-encodedecodetest-impl
tests: $(OBJDIR)/$1$$(subst $$(space),_,$3).flux.encodedecode
$(OBJDIR)/$1$$(subst $$(space),_,$3).flux.encodedecode: scripts/encodedecodetest.sh $(FLUXENGINE_BIN) $2
@mkdir -p $(dir $$@)
@echo ENCODEDECODETEST $1 flux $(FLUXENGINE_BIN) $2 $3
@scripts/encodedecodetest.sh $1 flux $(FLUXENGINE_BIN) $2 $3 > $$@
tests: $(OBJDIR)/$1$$(subst $$(space),_,$3).scp.encodedecode
$(OBJDIR)/$1$$(subst $$(space),_,$3).scp.encodedecode: scripts/encodedecodetest.sh $(FLUXENGINE_BIN) $2
@mkdir -p $(dir $$@)
@echo ENCODEDECODETEST $1 scp $(FLUXENGINE_BIN) $2 $3
@scripts/encodedecodetest.sh $1 scp $(FLUXENGINE_BIN) $2 $3 > $$@
endef
$(call do-encodedecodetest,agat,,--drive.tpi=96)
$(call do-encodedecodetest,amiga,,--drive.tpi=135)
$(call do-encodedecodetest,apple2,,--140 --drive.tpi=96)
$(call do-encodedecodetest,atarist,,--360 --drive.tpi=135)
$(call do-encodedecodetest,atarist,,--370 --drive.tpi=135)
$(call do-encodedecodetest,atarist,,--400 --drive.tpi=135)
$(call do-encodedecodetest,atarist,,--410 --drive.tpi=135)
$(call do-encodedecodetest,atarist,,--720 --drive.tpi=135)
$(call do-encodedecodetest,atarist,,--740 --drive.tpi=135)
$(call do-encodedecodetest,atarist,,--800 --drive.tpi=135)
$(call do-encodedecodetest,atarist,,--820 --drive.tpi=135)
$(call do-encodedecodetest,bk)
$(call do-encodedecodetest,brother,,--120 --drive.tpi=135)
$(call do-encodedecodetest,brother,,--240 --drive.tpi=135)
$(call do-encodedecodetest,commodore,scripts/commodore1541_test.textpb,--171 --drive.tpi=96)
$(call do-encodedecodetest,commodore,scripts/commodore1541_test.textpb,--192 --drive.tpi=96)
$(call do-encodedecodetest,commodore,,--800 --drive.tpi=135)
$(call do-encodedecodetest,commodore,,--1620 --drive.tpi=135)
$(call do-encodedecodetest,hplif,,--264 --drive.tpi=135)
$(call do-encodedecodetest,hplif,,--608 --drive.tpi=135)
$(call do-encodedecodetest,hplif,,--616 --drive.tpi=135)
$(call do-encodedecodetest,hplif,,--770 --drive.tpi=135)
$(call do-encodedecodetest,ibm,,--1200 --drive.tpi=96)
$(call do-encodedecodetest,ibm,,--1232 --drive.tpi=96)
$(call do-encodedecodetest,ibm,,--1440 --drive.tpi=135)
$(call do-encodedecodetest,ibm,,--1680 --drive.tpi=135)
$(call do-encodedecodetest,ibm,,--180 --drive.tpi=96)
$(call do-encodedecodetest,ibm,,--160 --drive.tpi=96)
$(call do-encodedecodetest,ibm,,--320 --drive.tpi=96)
$(call do-encodedecodetest,ibm,,--360 --drive.tpi=96)
$(call do-encodedecodetest,ibm,,--720_96 --drive.tpi=96)
$(call do-encodedecodetest,ibm,,--720_135 --drive.tpi=135)
$(call do-encodedecodetest,mac,scripts/mac400_test.textpb,--400 --drive.tpi=135)
$(call do-encodedecodetest,mac,scripts/mac800_test.textpb,--800 --drive.tpi=135)
$(call do-encodedecodetest,n88basic,,--drive.tpi=96)
$(call do-encodedecodetest,rx50,,--drive.tpi=96)
$(call do-encodedecodetest,tids990,,--drive.tpi=48)
$(call do-encodedecodetest,victor9k,,--612 --drive.tpi=96)
$(call do-encodedecodetest,victor9k,,--1224 --drive.tpi=96)
do-corpustest = $(eval $(do-corpustest-impl))
define do-corpustest-impl
tests: $(OBJDIR)/corpustest/$2
$(OBJDIR)/corpustest/$2: $(FLUXENGINE_BIN) \
../fluxengine-testdata/data/$1 ../fluxengine-testdata/data/$2
@mkdir -p $(OBJDIR)/corpustest
@echo CORPUSTEST $1 $2 $3
@$(FLUXENGINE_BIN) read $3 -s ../fluxengine-testdata/data/$1 -o $$@ > $$@.log
@cmp $$@ ../fluxengine-testdata/data/$2
endef
ifneq ($(wildcard ../fluxengine-testdata/data),)
$(call do-corpustest,amiga.flux,amiga.adf,amiga --drive.tpi=135)
$(call do-corpustest,atarist360.flux,atarist360.st,atarist --360 --drive.tpi=135)
$(call do-corpustest,atarist720.flux,atarist720.st,atarist --720 --drive.tpi=135)
$(call do-corpustest,brother120.flux,brother120.img,brother --120 --drive.tpi=135)
$(call do-corpustest,cmd-fd2000.flux,cmd-fd2000.img,commodore --1620 --drive.tpi=135)
$(call do-corpustest,ibm1232.flux,ibm1232.img,ibm --1232 --drive.tpi=96)
$(call do-corpustest,ibm1440.flux,ibm1440.img,ibm --1440 --drive.tpi=135)
$(call do-corpustest,mac800.flux,mac800.dsk,mac --800 --drive.tpi=135)
$(call do-corpustest,micropolis315.flux,micropolis315.img,micropolis --315 --drive.tpi=100)
$(call do-corpustest,northstar87-synthetic.flux,northstar87-synthetic.nsi,northstar --87 --drive.tpi=48)
$(call do-corpustest,northstar175-synthetic.flux,northstar175-synthetic.nsi,northstar --175 --drive.tpi=48)
$(call do-corpustest,northstar350-synthetic.flux,northstar350-synthetic.nsi,northstar --350 --drive.tpi=48)
$(call do-corpustest,victor9k_ss.flux,victor9k_ss.img,victor9k --612 --drive.tpi=96)
$(call do-corpustest,victor9k_ds.flux,victor9k_ds.img,victor9k --1224 --drive.tpi=96)
endif
$(OBJDIR)/%.a:
@mkdir -p $(dir $@)
@echo AR $@
@$(AR) rc $@ $^
%.exe:
@mkdir -p $(dir $@)
@echo LINK $@
@$(CXX) -o $@ $(filter %.o,$^) $(filter %.a,$^) $(LDFLAGS) $(filter %.a,$^) $(LDFLAGS)
$(OBJDIR)/%.o: %.cpp
@mkdir -p $(dir $@)
@echo CXX $<
@$(CXX) $(CFLAGS) $(CXXFLAGS) -MMD -MP -MF $(@:.o=.d) -c -o $@ $<
$(OBJDIR)/%.o: %.cc
@mkdir -p $(dir $@)
@echo CXX $<
@$(CXX) $(CFLAGS) $(CXXFLAGS) -MMD -MP -MF $(@:.o=.d) -c -o $@ $<
$(OBJDIR)/%.o: $(OBJDIR)/%.cc
@mkdir -p $(dir $@)
@echo CXX $<
@$(CXX) $(CFLAGS) $(CXXFLAGS) -MMD -MP -MF $(@:.o=.d) -c -o $@ $<
$(OBJDIR)/%.o: %.c
@mkdir -p $(dir $@)
@echo CC $<
@$(CC) $(CFLAGS) $(CFLAGS) -MMD -MP -MF $(@:.o=.d) -c -o $@ $<
$(OBJDIR)/%.pb.h: %.proto
@mkdir -p $(dir $@)
@echo PROTOC $@
@$(PROTOC) -I. --cpp_out=$(OBJDIR) $<
clean:
rm -rf $(OBJDIR)
install: install-bin # install-man install-docs ...
install-bin: fluxengine$(EXT) fluxengine-gui$(EXT) brother120tool$(EXT) brother240tool$(EXT) upgrade-flux-file$(EXT)
install -d "$(DESTDIR)$(BINDIR)"
for target in $^; do \
install $$target "$(DESTDIR)$(BINDIR)/$$target"; \
done
-include $(OBJS:%.o=%.d)

180
README.md
View File

@@ -2,7 +2,17 @@ FluxEngine
==========
(If you're reading this on GitHub, the formatting's a bit messed up. [Try the
version on cowlark.com instead.](http://cowlark.com/fluxengine/)
version on cowlark.com instead.](http://cowlark.com/fluxengine/))
**Breaking news!** As of 2022-09-09, there's new [filesystem
support](doc/filesystem.md). Read (and sometimes write) files directly from
(and to) your disks, with eight different file systems! It works in the GUI,
too, which is available for Linux (and other Unix clones), Windows and OSX. See
the details below.
<div style="text-align: center">
<a href="doc/screenshot.jpg"><img src="doc/screenshot.jpg" style="width:60%" alt="screenshot of the GUI in action"></a>
</div>
What?
-----
@@ -24,10 +34,13 @@ Don't believe me? Watch the demo reel!
<iframe width="373" height="210" src="https://www.youtube.com/embed/m_s1iw8eW7o" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>
**Important note.** On 2019-02-09 I did a hardware redesign and moved the pins on
the board. Sorry for the inconvenience, but it means you don't have to modify
the board any more to make it work. If you built the hardware prior to then,
you'll need to adjust it.
**New!** The FluxEngine client software now works with
[Greaseweazle](https://github.com/keirf/Greaseweazle/wiki) hardware. So, if you
can't find a PSoC5 development kit, or don't want to use the Cypress Windows
tools for programming it, you can use one of these instead. Very nearly all
FluxEngine features are available with the Greaseweazle and it works out-of-the
box. See the [dedicated Greaseweazle documentation page](doc/greaseweazle.md)
for more information.
Where?
------
@@ -52,54 +65,85 @@ following friendly articles:
- [Using a FluxEngine](doc/using.md) ∾ what to do with your new hardware ∾
flux files and image files ∾ knowing what you're doing
- [Reading dubious disks](doc/problems.md) ∾ it's not an exact science ∾
the sector map ∾ clock detection and the histogram ∾ tuning the clock ∾
manual adjustment
- [Using Greaseweazle hardware with the FluxEngine client
software](doc/greaseweazle.md) ∾ what works ∾ what doesn't work ∾ where to
go for help
- [Configuring for your drive](doc/drives.md) ∾ but I don't have a 80 track
drive! ∾ reading and writing 40 track disks ∾ Shugart and Apple II
- [Direct filesystem access](doc/filesystem.md) ∾ imaging files is a pain
∾ accessing files directly ∾ features and limitation ∾ it works on disk
images too, you say?
- [Troubleshooting dubious disks](doc/problems.md) ∾ it's not an exact
science ∾ the sector map ∾ clock detection and the histogram
- [Disk densities](doc/driveresponse.md) ∾ what's the difference between an HD
and DD disk? ∾ you can't do that with that ∾ measuring your drive's ability to
work with exotic formats ∾ I think my drive is broken
Which?
------
The current support state is as follows.
Dinosaurs (🦖) have yet to be observed in real life --- I've written the
decoder based on Kryoflux (or other) dumps I've found. I don't (yet) have
real, physical disks in my hand to test the capture process.
Dinosaurs (🦖) have yet to be observed in real life --- I've written the encoder
and/or decoder based on Kryoflux (or other) dumps I've found. I don't (yet) have
real, physical disks in my hand to test the capture process, or hardware to
verify that written disks work.
Unicorns (🦄) are completely real --- this means that I've read actual,
physical disks with these formats and so know they work.
Unicorns (🦄) are completely real --- this means that I've read actual, physical
disks with these formats and/or written real, physical disks and then used them
on real hardware, and so know they work (or had reports from people who've had
it work).
### Old disk formats
If a filesystem is listed, this means that FluxEngine natively supports that
particular filesystem and can read (and sometimes write, support varies) files
directly from disks, flux files or disk images. Some formats have multiple
choices because they can store multiple types of file system.
| Format | Read? | Write? | Notes |
|:-----------------------------------------|:-----:|:------:|-------|
| IBM PC compatible | 🦄 | | and compatibles (like the Atari ST) |
| [Acorn ADFS](doc/disk-acornadfs.md) | 🦄 | | single- and double- sided |
| [Acorn DFS](doc/disk-acorndfs.md) | 🦄 | | |
| [Ampro Little Board](doc/disk-ampro.md) | 🦖 | | |
| [Apple II DOS 3.3](doc/disk-apple2.md) | 🦖 | | doesn't do logical sector remapping |
| [Amiga](doc/disk-amiga.md) | 🦄 | | |
| [Commodore 64 1541](doc/disk-c64.md) | 🦖 | | and probably the other GCR formats |
| [Brother 120kB](doc/disk-brother.md) | 🦄 | | |
| [Brother 240kB](doc/disk-brother.md) | 🦄 | 🦄 | |
| [Macintosh 800kB](doc/disk-macintosh.md) | 🦖 | | and probably the 400kB too |
| [TRS-80](doc/disk-trs80.md) | 🦖 | | a minor variation of the IBM scheme |
<!-- FORMATSSTART -->
<!-- This section is automatically generated. Do not edit. -->
| Profile | Format | Read? | Write? | Filesystem? |
|:--------|:-------|:-----:|:------:|:------------|
| [`acornadfs`](doc/disk-acornadfs.md) | Acorn ADFS: BBC Micro, Archimedes | 🦖 | | |
| [`acorndfs`](doc/disk-acorndfs.md) | Acorn DFS: Acorn Atom, BBC Micro series | 🦄 | | ACORNDFS |
| [`aeslanier`](doc/disk-aeslanier.md) | AES Lanier "No Problem": 616kB 5.25" 77-track SSDD hard sectored | 🦖 | | |
| [`agat`](doc/disk-agat.md) | Agat: 840kB 5.25" 80-track DS | 🦖 | 🦖 | |
| [`amiga`](doc/disk-amiga.md) | Amiga: 880kB 3.5" DSDD | 🦄 | 🦄 | AMIGAFFS |
| [`ampro`](doc/disk-ampro.md) | Ampro Little Board: CP/M | 🦖 | | CPMFS |
| [`apple2`](doc/disk-apple2.md) | Apple II: Prodos, Appledos, and CP/M | 🦄 | 🦄 | APPLEDOS CPMFS PRODOS |
| [`atarist`](doc/disk-atarist.md) | Atari ST: Almost PC compatible | 🦄 | 🦄 | |
| [`bk`](doc/disk-bk.md) | BK: 800kB 5.25"/3.5" 80-track 10-sector DSDD | 🦖 | 🦖 | |
| [`brother`](doc/disk-brother.md) | Brother word processors: GCR family | 🦄 | 🦄 | BROTHER120 FATFS |
| [`commodore`](doc/disk-commodore.md) | Commodore: 1541, 1581, 8050 and variations | 🦄 | 🦄 | CBMFS |
| [`eco1`](doc/disk-eco1.md) | VDS Eco1: CP/M; 1210kB 77-track mixed format DSHD | 🦖 | | CPMFS |
| [`epsonpf10`](doc/disk-epsonpf10.md) | Epson PF-10: CP/M; 3.5" 40-track DSDD | 🦖 | | CPMFS |
| [`f85`](doc/disk-f85.md) | Durango F85: 461kB 5.25" 77-track SS | 🦖 | | |
| [`fb100`](doc/disk-fb100.md) | Brother FB-100: 100kB 3.5" 40-track SSSD | 🦖 | | |
| [`hplif`](doc/disk-hplif.md) | Hewlett-Packard LIF: a variety of disk formats used by HP | 🦄 | 🦄 | LIF |
| [`ibm`](doc/disk-ibm.md) | IBM PC: Generic PC 3.5"/5.25" disks | 🦄 | 🦄 | FATFS |
| [`icl30`](doc/disk-icl30.md) | ICL Model 30: CP/M; 263kB 35-track DSSD | 🦖 | | CPMFS |
| [`mac`](doc/disk-mac.md) | Macintosh: 400kB/800kB 3.5" GCR | 🦄 | 🦄 | MACHFS |
| [`micropolis`](doc/disk-micropolis.md) | Micropolis: 100tpi MetaFloppy disks | 🦄 | 🦄 | |
| [`ms2000`](doc/disk-ms2000.md) | : MS2000 Microdisk Development System | | | MICRODOS |
| [`mx`](doc/disk-mx.md) | DVK MX: Soviet-era PDP-11 clone | 🦖 | | |
| [`n88basic`](doc/disk-n88basic.md) | N88-BASIC: PC8800/PC98 5.25" 77-track 26-sector DSHD | 🦄 | 🦄 | |
| [`northstar`](doc/disk-northstar.md) | Northstar: 5.25" hard sectored | 🦄 | 🦄 | |
| [`psos`](doc/disk-psos.md) | pSOS: 800kB DSDD with PHILE | 🦄 | 🦄 | PHILE |
| [`rolandd20`](doc/disk-rolandd20.md) | Roland D20: 3.5" electronic synthesiser disks | 🦄 | 🦖 | ROLAND |
| [`rx50`](doc/disk-rx50.md) | Digital RX50: 400kB 5.25" 80-track 10-sector SSDD | 🦖 | 🦖 | |
| [`smaky6`](doc/disk-smaky6.md) | Smaky 6: 308kB 5.25" 77-track 16-sector SSDD, hard sectored | 🦖 | | SMAKY6 |
| [`tids990`](doc/disk-tids990.md) | Texas Instruments DS990: 1126kB 8" DSSD | 🦖 | 🦖 | |
| [`tiki`](doc/disk-tiki.md) | Tiki 100: CP/M | | | CPMFS |
| [`victor9k`](doc/disk-victor9k.md) | Victor 9000 / Sirius One: 1224kB 5.25" DSDD GCR | 🦖 | 🦖 | |
| [`zilogmcz`](doc/disk-zilogmcz.md) | Zilog MCZ: 320kB 8" 77-track SSSD hard-sectored | 🦖 | | ZDOS |
{: .datatable }
### Even older disk formats
<!-- FORMATSEND -->
These formats are for particularly old, weird architectures, even by the
standards of floppy disks. They've largely been implemented from single flux
files with no access to physical hardware. Typically the reads were pretty
bad and I've had to make a number of guesses as to how things work. They do,
at least, check the CRC so what data's there is probably good.
| Format | Read? | Write? | Notes |
|:-----------------------------------------|:-----:|:------:|-------|
| [AES Superplus / No Problem](doc/disk-aeslanier.md) | 🦖 | | hard sectors! |
| [Durango F85](doc/disk-durangof85.md) | 🦖 | | 5.25" |
| [Victor 9000](doc/disk-victor9k.md) | 🦖 | | 8-inch |
| [Zilog MCZ](doc/disk-zilogmcz.md) | 🦖 | | 8-inch _and_ hard sectors |
{: .datatable }
### Notes
- IBM PC disks are the lowest-common-denominator standard. A number of other
@@ -115,7 +159,7 @@ at least, check the CRC so what data's there is probably good.
There hasn't been a lot of demand for this yet; if you have a pressing
need to write weird disks, [please
ask](https://github.com/davidgiven/fluxengine/issues/new). I haven't
implement write support for PC disks because they're boring and I'm lazy,
implemented write support for PC disks because they're boring and I'm lazy,
and also because they vary so much that figuring out how to specify them
is hard.
@@ -169,13 +213,51 @@ There may or may not be anything interesting there.
License
-------
Everything here _except the contents of the `dep` directory_ is © 2019 David
Given and is licensed under the MIT open source license. Please see
Everything here _except the contents of the `dep` directory_ is © 2022 The
FluxEngine Authors (mostly me, David Given; see the VCS history for the other
people) and is licensed under the MIT open source license. Please see
[COPYING](COPYING) for the full text. The tl;dr is: you can do what you like
with it provided you don't claim you wrote it.
As an exception, `dep/fmt` contains a copy of [fmt](http://fmtlib.net),
maintained by Victor Zverovich (`vitaut <https://github.com/vitaut>`) and
Jonathan Müller (`foonathan <https://github.com/foonathan>`) with
contributions from many other people. It is licensed under the terms of the
BSD license. Please see the contents of the directory for the full text.
As an exception, `dep/emu` contains parts of the OpenBSD C library
code, maintained by Todd Miller and William A. Rowe (and probably others). It is licensed
under the terms of the 3-clause BSD license. Please see the contents of the
directory for the full text. It's been lightly modified by me.
As an exception, `dep/agg` contains parts of the Anti-Grain Antialiasing
library, written by Maxim Semanarev (and others). It is licensed under the
terms of the 3-clause BSD license. Please see the contents of the directory for
the full text. It's been lightly modified by me.
As an exception, `dep/stb` contains parts of the libstb utility library,
written by Sean T Barett (and others). It is public domain/Unlicense/MIT
licensed, at your choice. Please see the contents of the directory for the full
text.
As an exception, `dep/snowhouse` contains the snowhouse assertion library,
taken from https://github.com/banditcpp/snowhouse. It is Boost Standard License
1.0 licensed. Please see the contents of the directory for the full text. Note
that this is only used during the build and no code ends up in the output
binaries.
As an exception, `dep/libusbp` contains the libusbp library, taken from
https://github.com/pololu/libusbp. It is MIT licensed. Please see the contents
of the directory for the full text.
As an exception, `dep/fatfs` contains the fatfs library, taken from
http://elm-chan.org/fsw/ff/00index_e.html. It is single-clause BSD licensed.
Please see the contents of the directory for the full text.
As an exception, `dep/adflib` contains the adflib library, written by Laurent
Clevy et al, taken from https://github.com/lclevy/ADFlib. It is GPL 2.0
licensed. Please see the contents of the directory for the full text.
As an exception, `dep/hfsutils` contains a partial copy of the hfsutils
package, written by Robert Leslie et al, taken from
https://www.mars.org/home/rob/proj/hfs. It is GPL 2.0 licensed. Please see the
contents of the directory for the full text.
__Important:__ Because of all these exceptions, if you distribute the
FluxEngine package as a whole, you must comply with the terms of _all_ of the
licensing terms. This means that __effectively the FluxEngine package is
distributable under the terms of the GPL 2.0__.

View File

@@ -0,0 +1,11 @@
#ifndef AESLANIER_H
#define AESLANIER_H
#define AESLANIER_RECORD_SEPARATOR 0x55555122
#define AESLANIER_SECTOR_LENGTH 256
#define AESLANIER_RECORD_SIZE (AESLANIER_SECTOR_LENGTH + 5)
extern std::unique_ptr<Decoder> createAesLanierDecoder(
const DecoderProto& config);
#endif

View File

@@ -0,0 +1,4 @@
syntax = "proto2";
message AesLanierDecoderProto {}

64
arch/aeslanier/decoder.cc Normal file
View File

@@ -0,0 +1,64 @@
#include "globals.h"
#include "decoders/decoders.h"
#include "aeslanier.h"
#include "crc.h"
#include "fluxmap.h"
#include "decoders/fluxmapreader.h"
#include "sector.h"
#include "bytes.h"
#include "fmt/format.h"
#include <string.h>
static const FluxPattern SECTOR_PATTERN(32, AESLANIER_RECORD_SEPARATOR);
/* This is actually M2FM, rather than MFM, but it our MFM/FM decoder copes fine
* with it. */
class AesLanierDecoder : public Decoder
{
public:
AesLanierDecoder(const DecoderProto& config): Decoder(config) {}
nanoseconds_t advanceToNextRecord() override
{
return seekToPattern(SECTOR_PATTERN);
}
void decodeSectorRecord() override
{
/* Skip ID mark (we know it's a AESLANIER_RECORD_SEPARATOR). */
readRawBits(16);
const auto& rawbits = readRawBits(AESLANIER_RECORD_SIZE * 16);
const auto& bytes =
decodeFmMfm(rawbits).slice(0, AESLANIER_RECORD_SIZE);
const auto& reversed = bytes.reverseBits();
_sector->logicalTrack = reversed[1];
_sector->logicalSide = 0;
_sector->logicalSector = reversed[2];
/* Check header 'checksum' (which seems far too simple to mean much). */
{
uint8_t wanted = reversed[3];
uint8_t got = reversed[1] + reversed[2];
if (wanted != got)
return;
}
/* Check data checksum, which also includes the header and is
* significantly better. */
_sector->data = reversed.slice(1, AESLANIER_SECTOR_LENGTH);
uint16_t wanted = reversed.reader().seek(0x101).read_le16();
uint16_t got = crc16ref(MODBUS_POLY_REF, _sector->data);
_sector->status = (wanted == got) ? Sector::OK : Sector::BAD_CHECKSUM;
}
};
std::unique_ptr<Decoder> createAesLanierDecoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new AesLanierDecoder(config));
}

20
arch/agat/agat.cc Normal file
View File

@@ -0,0 +1,20 @@
#include "globals.h"
#include "decoders/decoders.h"
#include "agat.h"
#include "bytes.h"
#include "fmt/format.h"
uint8_t agatChecksum(const Bytes& bytes)
{
uint16_t checksum = 0;
for (uint8_t b : bytes)
{
if (checksum > 0xff)
checksum = (checksum + 1) & 0xff;
checksum += b;
}
return checksum & 0xff;
}

19
arch/agat/agat.h Normal file
View File

@@ -0,0 +1,19 @@
#ifndef AGAT_H
#define AGAT_H
#define AGAT_SECTOR_SIZE 256
static constexpr uint64_t SECTOR_ID = 0x8924555549111444;
static constexpr uint64_t DATA_ID = 0x8924555514444911;
class Encoder;
class EncoderProto;
class Decoder;
class DecoderProto;
extern std::unique_ptr<Decoder> createAgatDecoder(const DecoderProto& config);
extern std::unique_ptr<Encoder> createAgatEncoder(const EncoderProto& config);
extern uint8_t agatChecksum(const Bytes& bytes);
#endif

19
arch/agat/agat.proto Normal file
View File

@@ -0,0 +1,19 @@
syntax = "proto2";
import "lib/common.proto";
message AgatDecoderProto {}
message AgatEncoderProto {
optional double target_clock_period_us = 1
[default=2.00, (help)="Data clock period of target format."];
optional double target_rotational_period_ms = 2
[default=200.0, (help)="Rotational period of target format."];
optional int32 post_index_gap_bytes = 3
[default=40, (help)="Post-index gap before first sector header."];
optional int32 pre_sector_gap_bytes = 4
[default=11, (help)="Gap before each sector header."];
optional int32 pre_data_gap_bytes = 5
[default=2, (help)="Gap before each sector data record."];
}

89
arch/agat/decoder.cc Normal file
View File

@@ -0,0 +1,89 @@
#include "globals.h"
#include "decoders/decoders.h"
#include "agat.h"
#include "crc.h"
#include "fluxmap.h"
#include "decoders/fluxmapreader.h"
#include "sector.h"
#include "bytes.h"
#include "fmt/format.h"
#include <string.h>
// clang-format off
/*
* data: X X X X X X X X X - - X - X - X - X X - X - X - = 0xff956a
* flux: 01 01 01 01 01 01 01 01 01 00 10 01 00 01 00 01 00 01 01 00 01 00 01 00 = 0x555549111444
*
* data: X X X X X X X X - X X - X - X - X - - X - X - X = 0xff6a95
* flux: 01 01 01 01 01 01 01 01 00 01 01 00 01 00 01 00 01 00 10 01 00 01 00 01 = 0x555514444911
*
* Each pattern is prefixed with this one:
*
* data: - - - X - - X - = 0x12
* flux: (10) 10 10 10 01 00 10 01 00 = 0xa924
* magic: (10) 10 00 10 01 00 10 01 00 = 0x8924
* ^
*
* This seems to be generated by emitting A4 in MFM and then a single 0 bit to
* shift it out of phase, so the data bits become clock bits and vice versa.
*
* X - X - - X - - = 0xA4
* 0100010010010010 = MFM encoded
* 1000100100100100 = with trailing zero
* - - - X - - X - = effective bitstream = 0x12
*/
// clang-format on
static const FluxPattern SECTOR_PATTERN(64, SECTOR_ID);
static const FluxPattern DATA_PATTERN(64, DATA_ID);
static const FluxMatchers ALL_PATTERNS = {&SECTOR_PATTERN, &DATA_PATTERN};
class AgatDecoder : public Decoder
{
public:
AgatDecoder(const DecoderProto& config): Decoder(config) {}
nanoseconds_t advanceToNextRecord() override
{
return seekToPattern(ALL_PATTERNS);
}
void decodeSectorRecord() override
{
if (readRaw64() != SECTOR_ID)
return;
auto bytes = decodeFmMfm(readRawBits(64)).slice(0, 4);
if (bytes[3] != 0x5a)
return;
_sector->logicalTrack = bytes[1] >> 1;
_sector->logicalSector = bytes[2];
_sector->logicalSide = bytes[1] & 1;
_sector->status = Sector::DATA_MISSING; /* unintuitive but correct */
}
void decodeDataRecord() override
{
if (readRaw64() != DATA_ID)
return;
Bytes bytes = decodeFmMfm(readRawBits((AGAT_SECTOR_SIZE + 2) * 16))
.slice(0, AGAT_SECTOR_SIZE + 2);
if (bytes[AGAT_SECTOR_SIZE + 1] != 0x5a)
return;
_sector->data = bytes.slice(0, AGAT_SECTOR_SIZE);
uint8_t wantChecksum = bytes[AGAT_SECTOR_SIZE];
uint8_t gotChecksum = agatChecksum(_sector->data);
_sector->status =
(wantChecksum == gotChecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
}
};
std::unique_ptr<Decoder> createAgatDecoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new AgatDecoder(config));
}

118
arch/agat/encoder.cc Normal file
View File

@@ -0,0 +1,118 @@
#include "lib/globals.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "agat.h"
#include "lib/crc.h"
#include "lib/readerwriter.h"
#include "lib/image.h"
#include "lib/layout.h"
#include "arch/agat/agat.pb.h"
#include "lib/encoders/encoders.pb.h"
class AgatEncoder : public Encoder
{
public:
AgatEncoder(const EncoderProto& config):
Encoder(config),
_config(config.agat())
{
}
private:
void writeRawBits(uint64_t data, int width)
{
_cursor += width;
_lastBit = data & 1;
for (int i = 0; i < width; i++)
{
unsigned pos = _cursor - i - 1;
if (pos < _bits.size())
_bits[pos] = data & 1;
data >>= 1;
}
}
void writeBytes(const Bytes& bytes)
{
encodeMfm(_bits, _cursor, bytes, _lastBit);
}
void writeByte(uint8_t byte)
{
Bytes b;
b.writer().write_8(byte);
writeBytes(b);
}
void writeFillerRawBytes(int count, uint16_t byte)
{
for (int i = 0; i < count; i++)
writeRawBits(byte, 16);
};
void writeFillerBytes(int count, uint8_t byte)
{
Bytes b{byte};
for (int i = 0; i < count; i++)
writeBytes(b);
};
public:
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{
auto trackLayout = Layout::getLayoutOfTrack(
trackInfo->logicalTrack, trackInfo->logicalSide);
double clockRateUs = _config.target_clock_period_us() / 2.0;
int bitsPerRevolution =
(_config.target_rotational_period_ms() * 1000.0) / clockRateUs;
_bits.resize(bitsPerRevolution);
_cursor = 0;
writeFillerRawBytes(_config.post_index_gap_bytes(), 0xaaaa);
for (const auto& sector : sectors)
{
/* Header */
writeFillerRawBytes(_config.pre_sector_gap_bytes(), 0xaaaa);
writeRawBits(SECTOR_ID, 64);
writeByte(0x5a);
writeByte((sector->logicalTrack << 1) | sector->logicalSide);
writeByte(sector->logicalSector);
writeByte(0x5a);
/* Data */
writeFillerRawBytes(_config.pre_data_gap_bytes(), 0xaaaa);
auto data = sector->data.slice(0, AGAT_SECTOR_SIZE);
writeRawBits(DATA_ID, 64);
writeBytes(data);
writeByte(agatChecksum(data));
writeByte(0x5a);
}
if (_cursor >= _bits.size())
error("track data overrun");
fillBitmapTo(_bits, _cursor, _bits.size(), {true, false});
auto fluxmap = std::make_unique<Fluxmap>();
fluxmap->appendBits(_bits,
calculatePhysicalClockPeriod(_config.target_clock_period_us() * 1e3,
_config.target_rotational_period_ms() * 1e6));
return fluxmap;
}
private:
const AgatEncoderProto& _config;
uint32_t _cursor;
bool _lastBit;
std::vector<bool> _bits;
};
std::unique_ptr<Encoder> createAgatEncoder(const EncoderProto& config)
{
return std::unique_ptr<Encoder>(new AgatEncoder(config));
}

104
arch/amiga/amiga.cc Normal file
View File

@@ -0,0 +1,104 @@
#include "globals.h"
#include "decoders/decoders.h"
#include "amiga.h"
#include "bytes.h"
#include "fmt/format.h"
uint32_t amigaChecksum(const Bytes& bytes)
{
ByteReader br(bytes);
uint32_t checksum = 0;
assert((bytes.size() & 3) == 0);
while (!br.eof())
checksum ^= br.read_be32();
return checksum & 0x55555555;
}
static uint8_t everyother(uint16_t x)
{
/* aabb ccdd eeff gghh */
x &= 0x6666; /* 0ab0 0cd0 0ef0 0gh0 */
x >>= 1; /* 00ab 00cd 00ef 00gh */
x |= x << 2; /* abab cdcd efef ghgh */
x &= 0x3c3c; /* 00ab cd00 00ef gh00 */
x >>= 2; /* 0000 abcd 0000 efgh */
x |= x >> 4; /* 0000 abcd abcd efgh */
return x;
}
Bytes amigaInterleave(const Bytes& input)
{
Bytes output;
ByteWriter bw(output);
/* Write all odd bits. (Numbering starts at 0...) */
{
ByteReader br(input);
while (!br.eof())
{
uint16_t x = br.read_be16();
x &= 0xaaaa; /* a0b0 c0d0 e0f0 g0h0 */
x |= x >> 1; /* aabb ccdd eeff gghh */
x = everyother(x); /* 0000 0000 abcd efgh */
bw.write_8(x);
}
}
/* Write all even bits. */
{
ByteReader br(input);
while (!br.eof())
{
uint16_t x = br.read_be16();
x &= 0x5555; /* 0a0b 0c0d 0e0f 0g0h */
x |= x << 1; /* aabb ccdd eeff gghh */
x = everyother(x); /* 0000 0000 abcd efgh */
bw.write_8(x);
}
}
return output;
}
Bytes amigaDeinterleave(const uint8_t*& input, size_t len)
{
assert(!(len & 1));
const uint8_t* odds = &input[0];
const uint8_t* evens = &input[len / 2];
Bytes output;
ByteWriter bw(output);
for (size_t i = 0; i < len / 2; i++)
{
uint8_t o = *odds++;
uint8_t e = *evens++;
/* This is the 'Interleave bits with 64-bit multiply' technique from
* http://graphics.stanford.edu/~seander/bithacks.html#InterleaveBMN
*/
uint16_t result =
(((e * 0x0101010101010101ULL & 0x8040201008040201ULL) *
0x0102040810204081ULL >>
49) &
0x5555) |
(((o * 0x0101010101010101ULL & 0x8040201008040201ULL) *
0x0102040810204081ULL >>
48) &
0xAAAA);
bw.write_be16(result);
}
input += len;
return output;
}
Bytes amigaDeinterleave(const Bytes& input)
{
const uint8_t* ptr = input.cbegin();
return amigaDeinterleave(ptr, input.size());
}

20
arch/amiga/amiga.h Normal file
View File

@@ -0,0 +1,20 @@
#ifndef AMIGA_H
#define AMIGA_H
#include "encoders/encoders.h"
#define AMIGA_SECTOR_RECORD 0xaaaa44894489LL
#define AMIGA_TRACKS_PER_DISK 80
#define AMIGA_SECTORS_PER_TRACK 11
#define AMIGA_RECORD_SIZE 0x21c
extern std::unique_ptr<Decoder> createAmigaDecoder(const DecoderProto& config);
extern std::unique_ptr<Encoder> createAmigaEncoder(const EncoderProto& config);
extern uint32_t amigaChecksum(const Bytes& bytes);
extern Bytes amigaInterleave(const Bytes& input);
extern Bytes amigaDeinterleave(const uint8_t*& input, size_t len);
extern Bytes amigaDeinterleave(const Bytes& input);
#endif

13
arch/amiga/amiga.proto Normal file
View File

@@ -0,0 +1,13 @@
syntax = "proto2";
import "lib/common.proto";
message AmigaDecoderProto {}
message AmigaEncoderProto {
optional double clock_rate_us = 1
[default=2.00, (help)="Encoded data clock rate."];
optional double post_index_gap_ms = 2
[default=0.5, (help)="Post-index gap before first sector header."];
}

84
arch/amiga/decoder.cc Normal file
View File

@@ -0,0 +1,84 @@
#include "globals.h"
#include "fluxmap.h"
#include "decoders/fluxmapreader.h"
#include "protocol.h"
#include "decoders/decoders.h"
#include "sector.h"
#include "amiga.h"
#include "bytes.h"
#include "fmt/format.h"
#include "lib/decoders/decoders.pb.h"
#include <string.h>
#include <algorithm>
/*
* Amiga disks use MFM but it's not quite the same as IBM MFM. They only use
* a single type of record with a different marker byte.
*
* See the big comment in the IBM MFM decoder for the gruesome details of how
* MFM works.
*/
static const FluxPattern SECTOR_PATTERN(48, AMIGA_SECTOR_RECORD);
class AmigaDecoder : public Decoder
{
public:
AmigaDecoder(const DecoderProto& config):
Decoder(config),
_config(config.amiga())
{
}
nanoseconds_t advanceToNextRecord() override
{
return seekToPattern(SECTOR_PATTERN);
}
void decodeSectorRecord() override
{
if (readRaw48() != AMIGA_SECTOR_RECORD)
return;
const auto& rawbits = readRawBits(AMIGA_RECORD_SIZE * 16);
if (rawbits.size() < (AMIGA_RECORD_SIZE * 16))
return;
const auto& rawbytes = toBytes(rawbits).slice(0, AMIGA_RECORD_SIZE * 2);
const auto& bytes = decodeFmMfm(rawbits).slice(0, AMIGA_RECORD_SIZE);
const uint8_t* ptr = bytes.begin();
Bytes header = amigaDeinterleave(ptr, 4);
Bytes recoveryinfo = amigaDeinterleave(ptr, 16);
_sector->logicalTrack = header[1] >> 1;
_sector->logicalSide = header[1] & 1;
_sector->logicalSector = header[2];
uint32_t wantedheaderchecksum =
amigaDeinterleave(ptr, 4).reader().read_be32();
uint32_t gotheaderchecksum = amigaChecksum(rawbytes.slice(0, 40));
if (gotheaderchecksum != wantedheaderchecksum)
return;
uint32_t wanteddatachecksum =
amigaDeinterleave(ptr, 4).reader().read_be32();
uint32_t gotdatachecksum = amigaChecksum(rawbytes.slice(56, 1024));
Bytes data;
data.writer().append(amigaDeinterleave(ptr, 512)).append(recoveryinfo);
_sector->data = data;
_sector->status = (gotdatachecksum == wanteddatachecksum)
? Sector::OK
: Sector::BAD_CHECKSUM;
}
private:
const AmigaDecoderProto& _config;
nanoseconds_t _clock;
};
std::unique_ptr<Decoder> createAmigaDecoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new AmigaDecoder(config));
}

149
arch/amiga/encoder.cc Normal file
View File

@@ -0,0 +1,149 @@
#include "globals.h"
#include "decoders/decoders.h"
#include "encoders/encoders.h"
#include "amiga.h"
#include "crc.h"
#include "readerwriter.h"
#include "image.h"
#include "arch/amiga/amiga.pb.h"
#include "lib/encoders/encoders.pb.h"
static bool lastBit;
static int charToInt(char c)
{
if (isdigit(c))
return c - '0';
return 10 + tolower(c) - 'a';
}
static void write_bits(
std::vector<bool>& bits, unsigned& cursor, const std::vector<bool>& src)
{
for (bool bit : src)
{
if (cursor < bits.size())
lastBit = bits[cursor++] = bit;
}
}
static void write_bits(
std::vector<bool>& bits, unsigned& cursor, uint64_t data, int width)
{
cursor += width;
lastBit = data & 1;
for (int i = 0; i < width; i++)
{
unsigned pos = cursor - i - 1;
if (pos < bits.size())
bits[pos] = data & 1;
data >>= 1;
}
}
static void write_bits(
std::vector<bool>& bits, unsigned& cursor, const Bytes& bytes)
{
ByteReader br(bytes);
BitReader bitr(br);
while (!bitr.eof())
{
if (cursor < bits.size())
bits[cursor++] = bitr.get();
}
}
static void write_sector(std::vector<bool>& bits,
unsigned& cursor,
const std::shared_ptr<const Sector>& sector)
{
if ((sector->data.size() != 512) && (sector->data.size() != 528))
error("unsupported sector size --- you must pick 512 or 528");
uint32_t checksum = 0;
auto write_interleaved_bytes = [&](const Bytes& bytes)
{
Bytes interleaved = amigaInterleave(bytes);
Bytes mfm = encodeMfm(interleaved, lastBit);
checksum ^= amigaChecksum(mfm);
checksum &= 0x55555555;
write_bits(bits, cursor, mfm);
};
auto write_interleaved_word = [&](uint32_t word)
{
Bytes b(4);
b.writer().write_be32(word);
write_interleaved_bytes(b);
};
write_bits(bits, cursor, 0xaaaa, 2 * 8);
write_bits(bits, cursor, AMIGA_SECTOR_RECORD, 6 * 8);
checksum = 0;
Bytes header = {0xff, /* Amiga 1.0 format byte */
(uint8_t)((sector->logicalTrack << 1) | sector->logicalSide),
(uint8_t)sector->logicalSector,
(uint8_t)(AMIGA_SECTORS_PER_TRACK - sector->logicalSector)};
write_interleaved_bytes(header);
Bytes recoveryInfo(16);
if (sector->data.size() == 528)
recoveryInfo = sector->data.slice(512, 16);
write_interleaved_bytes(recoveryInfo);
write_interleaved_word(checksum);
Bytes data = sector->data.slice(0, 512);
write_interleaved_word(
amigaChecksum(encodeMfm(amigaInterleave(data), lastBit)));
write_interleaved_bytes(data);
}
class AmigaEncoder : public Encoder
{
public:
AmigaEncoder(const EncoderProto& config):
Encoder(config),
_config(config.amiga())
{
}
public:
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{
/* Number of bits for one nominal revolution of a real 200ms Amiga disk.
*/
int bitsPerRevolution = 200e3 / _config.clock_rate_us();
std::vector<bool> bits(bitsPerRevolution);
unsigned cursor = 0;
fillBitmapTo(bits,
cursor,
_config.post_index_gap_ms() * 1000 / _config.clock_rate_us(),
{true, false});
lastBit = false;
for (const auto& sector : sectors)
write_sector(bits, cursor, sector);
if (cursor >= bits.size())
error("track data overrun");
fillBitmapTo(bits, cursor, bits.size(), {true, false});
auto fluxmap = std::make_unique<Fluxmap>();
fluxmap->appendBits(bits,
calculatePhysicalClockPeriod(_config.clock_rate_us() * 1e3, 200e6));
return fluxmap;
}
private:
const AmigaEncoderProto& _config;
};
std::unique_ptr<Encoder> createAmigaEncoder(const EncoderProto& config)
{
return std::unique_ptr<Encoder>(new AmigaEncoder(config));
}

19
arch/apple2/apple2.h Normal file
View File

@@ -0,0 +1,19 @@
#ifndef APPLE2_H
#define APPLE2_H
#include <memory.h>
#include "decoders/decoders.h"
#include "encoders/encoders.h"
#define APPLE2_SECTOR_RECORD 0xd5aa96
#define APPLE2_DATA_RECORD 0xd5aaad
#define APPLE2_SECTOR_LENGTH 256
#define APPLE2_ENCODED_SECTOR_LENGTH 342
#define APPLE2_SECTORS 16
extern std::unique_ptr<Decoder> createApple2Decoder(const DecoderProto& config);
extern std::unique_ptr<Encoder> createApple2Encoder(const EncoderProto& config);
#endif

22
arch/apple2/apple2.proto Normal file
View File

@@ -0,0 +1,22 @@
syntax = "proto2";
import "lib/common.proto";
message Apple2DecoderProto {
optional uint32 side_one_track_offset = 1
[ default = 0, (help) = "offset to apply to track numbers on side 1" ];
}
message Apple2EncoderProto
{
/* 245kHz. */
optional double clock_period_us = 1
[ default = 4, (help) = "clock rate on the real device" ];
/* Apple II disk drives spin at 300rpm. */
optional double rotational_period_ms = 2
[ default = 200.0, (help) = "rotational period on the real device" ];
optional uint32 side_one_track_offset = 3
[ default = 0, (help) = "offset to apply to track numbers on side 1" ];
}

175
arch/apple2/decoder.cc Normal file
View File

@@ -0,0 +1,175 @@
#include "globals.h"
#include "fluxmap.h"
#include "decoders/fluxmapreader.h"
#include "protocol.h"
#include "decoders/decoders.h"
#include "sector.h"
#include "apple2.h"
#include "arch/apple2/apple2.pb.h"
#include "lib/decoders/decoders.pb.h"
#include "bytes.h"
#include "fmt/format.h"
#include <string.h>
#include <algorithm>
const FluxPattern SECTOR_RECORD_PATTERN(24, APPLE2_SECTOR_RECORD);
const FluxPattern DATA_RECORD_PATTERN(24, APPLE2_DATA_RECORD);
const FluxMatchers ANY_RECORD_PATTERN(
{&SECTOR_RECORD_PATTERN, &DATA_RECORD_PATTERN});
static int decode_data_gcr(uint8_t gcr)
{
switch (gcr)
{
#define GCR_ENTRY(gcr, data) \
case gcr: \
return data;
#include "data_gcr.h"
#undef GCR_ENTRY
}
return -1;
}
/* This is extremely inspired by the MESS implementation, written by Nathan
* Woods and R. Belmont:
* https://github.com/mamedev/mame/blob/7914a6083a3b3a8c243ae6c3b8cb50b023f21e0e/src/lib/formats/ap2_dsk.cpp
*/
static Bytes decode_crazy_data(const uint8_t* inp, Sector::Status& status)
{
Bytes output(APPLE2_SECTOR_LENGTH);
uint8_t checksum = 0;
for (unsigned i = 0; i < APPLE2_ENCODED_SECTOR_LENGTH; i++)
{
checksum ^= decode_data_gcr(*inp++);
if (i >= 86)
{
/* 6 bit */
output[i - 86] |= (checksum << 2);
}
else
{
/* 3 * 2 bit */
output[i + 0] = ((checksum >> 1) & 0x01) | ((checksum << 1) & 0x02);
output[i + 86] =
((checksum >> 3) & 0x01) | ((checksum >> 1) & 0x02);
if ((i + 172) < APPLE2_SECTOR_LENGTH)
output[i + 172] =
((checksum >> 5) & 0x01) | ((checksum >> 3) & 0x02);
}
}
checksum &= 0x3f;
uint8_t wantedchecksum = decode_data_gcr(*inp);
status = (checksum == wantedchecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
return output;
}
static uint8_t combine(uint16_t word)
{
return word & (word >> 7);
}
class Apple2Decoder : public Decoder
{
public:
Apple2Decoder(const DecoderProto& config): Decoder(config) {}
nanoseconds_t advanceToNextRecord() override
{
return seekToPattern(ANY_RECORD_PATTERN);
}
void decodeSectorRecord() override
{
if (readRaw24() != APPLE2_SECTOR_RECORD)
return;
/* Read header. */
auto header = toBytes(readRawBits(8 * 8)).slice(0, 8);
ByteReader br(header);
uint8_t volume = combine(br.read_be16());
_sector->logicalTrack = combine(br.read_be16());
_sector->logicalSide = _sector->physicalSide;
_sector->logicalSector = combine(br.read_be16());
uint8_t checksum = combine(br.read_be16());
// If the checksum is correct, upgrade the sector from MISSING
// to DATA_MISSING in anticipation of its data record
if (checksum ==
(volume ^ _sector->logicalTrack ^ _sector->logicalSector))
_sector->status =
Sector::DATA_MISSING; /* unintuitive but correct */
if (_sector->logicalSide == 1)
_sector->logicalTrack -= _config.apple2().side_one_track_offset();
/* Sanity check. */
if (_sector->logicalTrack > 100)
{
_sector->status = Sector::MISSING;
return;
}
}
void decodeDataRecord() override
{
/* Check ID. */
if (readRaw24() != APPLE2_DATA_RECORD)
return;
// Sometimes there's a 1-bit gap between APPLE2_DATA_RECORD and
// the data itself. This has been seen on real world disks
// such as the Apple II Operating System Kit from Apple2Online.
// However, I haven't seen it described in any of the various
// references.
//
// This extra '0' bit would not affect the real disk interface,
// as it was a '1' reaching the top bit of a shift register
// that triggered a byte to be available, but it affects the
// way the data is read here.
//
// While the floppies tested only seemed to need this applied
// to the first byte of the data record, applying it
// consistently to all of them doesn't seem to hurt, and
// simplifies the code.
/* Read and decode data. */
auto readApple8 = [&]()
{
auto result = 0;
while ((result & 0x80) == 0)
{
auto b = readRawBits(1);
if (b.empty())
break;
result = (result << 1) | b[0];
}
return result;
};
constexpr unsigned recordLength = APPLE2_ENCODED_SECTOR_LENGTH + 2;
uint8_t bytes[recordLength];
for (auto& byte : bytes)
{
byte = readApple8();
}
// Upgrade the sector from MISSING to BAD_CHECKSUM.
// If decode_crazy_data succeeds, it upgrades the sector to
// OK.
_sector->status = Sector::BAD_CHECKSUM;
_sector->data = decode_crazy_data(&bytes[0], _sector->status);
}
};
std::unique_ptr<Decoder> createApple2Decoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new Apple2Decoder(config));
}

192
arch/apple2/encoder.cc Normal file
View File

@@ -0,0 +1,192 @@
#include "globals.h"
#include "arch/apple2/apple2.h"
#include "decoders/decoders.h"
#include "encoders/encoders.h"
#include "sector.h"
#include "readerwriter.h"
#include "image.h"
#include "fmt/format.h"
#include "lib/encoders/encoders.pb.h"
#include <ctype.h>
#include "bytes.h"
static int encode_data_gcr(uint8_t data)
{
switch (data)
{
#define GCR_ENTRY(gcr, data) \
case data: \
return gcr;
#include "data_gcr.h"
#undef GCR_ENTRY
}
return -1;
}
class Apple2Encoder : public Encoder
{
public:
Apple2Encoder(const EncoderProto& config):
Encoder(config),
_config(config.apple2())
{
}
private:
const Apple2EncoderProto& _config;
public:
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{
int bitsPerRevolution =
(_config.rotational_period_ms() * 1e3) / _config.clock_period_us();
std::vector<bool> bits(bitsPerRevolution);
unsigned cursor = 0;
for (const auto& sector : sectors)
writeSector(bits, cursor, *sector);
if (cursor >= bits.size())
error("track data overrun by {} bits", cursor - bits.size());
fillBitmapTo(bits, cursor, bits.size(), {true, false});
std::unique_ptr<Fluxmap> fluxmap(new Fluxmap);
fluxmap->appendBits(bits,
calculatePhysicalClockPeriod(_config.clock_period_us() * 1e3,
_config.rotational_period_ms() * 1e6));
return fluxmap;
}
private:
uint8_t volume_id = 254;
/* This is extremely inspired by the MESS implementation, written by Nathan
* Woods and R. Belmont:
* https://github.com/mamedev/mame/blob/7914a6083a3b3a8c243ae6c3b8cb50b023f21e0e/src/lib/formats/ap2_dsk.cpp
* as well as Understanding the Apple II (1983) Chapter 9
* https://archive.org/details/Understanding_the_Apple_II_1983_Quality_Software/page/n230/mode/1up?view=theater
*/
void writeSector(
std::vector<bool>& bits, unsigned& cursor, const Sector& sector) const
{
if ((sector.status == Sector::OK) or
(sector.status == Sector::BAD_CHECKSUM))
{
auto write_bit = [&](bool val)
{
if (cursor <= bits.size())
{
bits[cursor] = val;
}
cursor++;
};
auto write_bits = [&](uint32_t bits, int width)
{
for (int i = width; i--;)
{
write_bit(bits & (1u << i));
}
};
auto write_gcr44 = [&](uint8_t value)
{
write_bits((value << 7) | value | 0xaaaa, 16);
};
auto write_gcr6 = [&](uint8_t value)
{
write_bits(encode_data_gcr(value), 8);
};
// The special "FF40" sequence is used to synchronize the receiving
// shift register. It's written as "1111 1111 00"; FF indicates the
// 8 consecutive 1-bits, while "40" indicates the total number of
// microseconds.
auto write_ff40 = [&](int n = 1)
{
for (; n--;)
{
write_bits(0xff << 2, 10);
}
};
// There is data to encode to disk.
if ((sector.data.size() != APPLE2_SECTOR_LENGTH))
error("unsupported sector size {} --- you must pick 256",
sector.data.size());
// Write address syncing leader : A sequence of "FF40"s; 5 of them
// are said to suffice to synchronize the decoder.
// "FF40" indicates that the actual data written is "1111
// 1111 00" i.e., 8 1s and a total of 40 microseconds
//
// In standard formatting, the first logical sector apparently gets
// extra padding.
write_ff40(sector.logicalSector == 0 ? 32 : 8);
int track = sector.logicalTrack;
if (sector.logicalSide == 1)
track += _config.side_one_track_offset();
// Write address field: APPLE2_SECTOR_RECORD + sector identifier +
// DE AA EB
write_bits(APPLE2_SECTOR_RECORD, 24);
write_gcr44(volume_id);
write_gcr44(track);
write_gcr44(sector.logicalSector);
write_gcr44(volume_id ^ track ^ sector.logicalSector);
write_bits(0xDEAAEB, 24);
// Write data syncing leader: FF40 + APPLE2_DATA_RECORD + sector
// data + sum + DE AA EB (+ mystery bits cut off of the scan?)
write_ff40(8);
write_bits(APPLE2_DATA_RECORD, 24);
// Convert the sector data to GCR, append the checksum, and write it
// out
constexpr auto TWOBIT_COUNT =
0x56; // Size of the 'twobit' area at the start of the GCR data
uint8_t checksum = 0;
for (int i = 0; i < APPLE2_ENCODED_SECTOR_LENGTH; i++)
{
int value;
if (i >= TWOBIT_COUNT)
{
value = sector.data[i - TWOBIT_COUNT] >> 2;
}
else
{
uint8_t tmp = sector.data[i];
value = ((tmp & 1) << 1) | ((tmp & 2) >> 1);
tmp = sector.data[i + TWOBIT_COUNT];
value |= ((tmp & 1) << 3) | ((tmp & 2) << 1);
if (i + 2 * TWOBIT_COUNT < APPLE2_SECTOR_LENGTH)
{
tmp = sector.data[i + 2 * TWOBIT_COUNT];
value |= ((tmp & 1) << 5) | ((tmp & 2) << 3);
}
}
checksum ^= value;
// assert(checksum & ~0x3f == 0);
write_gcr6(checksum);
checksum = value;
}
if (sector.status == Sector::BAD_CHECKSUM)
checksum ^= 0x3f;
write_gcr6(checksum);
write_bits(0xDEAAEB, 24);
}
}
};
std::unique_ptr<Encoder> createApple2Encoder(const EncoderProto& config)
{
return std::unique_ptr<Encoder>(new Apple2Encoder(config));
}

21
arch/brother/brother.h Normal file
View File

@@ -0,0 +1,21 @@
#ifndef BROTHER_H
#define BROTHER_H
/* Brother word processor format (or at least, one of them) */
#define BROTHER_SECTOR_RECORD 0xFFFFFD57
#define BROTHER_DATA_RECORD 0xFFFFFDDB
#define BROTHER_DATA_RECORD_PAYLOAD 256
#define BROTHER_DATA_RECORD_CHECKSUM 3
#define BROTHER_DATA_RECORD_ENCODED_SIZE 415
#define BROTHER_TRACKS_PER_240KB_DISK 78
#define BROTHER_TRACKS_PER_120KB_DISK 39
#define BROTHER_SECTORS_PER_TRACK 12
extern std::unique_ptr<Decoder> createBrotherDecoder(
const DecoderProto& config);
extern std::unique_ptr<Encoder> createBrotherEncoder(
const EncoderProto& config);
#endif

View File

@@ -0,0 +1,18 @@
syntax = "proto2";
message BrotherDecoderProto {}
enum BrotherFormat {
BROTHER240 = 0;
BROTHER120 = 1;
};
message BrotherEncoderProto {
optional double clock_rate_us = 1 [default = 3.83];
optional double post_index_gap_ms = 2 [default = 1.0];
optional double sector_spacing_ms = 3 [default = 16.2];
optional double post_header_spacing_ms = 4 [default = 0.69];
optional BrotherFormat format = 6 [default = BROTHER240];
}

View File

@@ -1,13 +1,13 @@
GCR_ENTRY(0x55, 0) // 00000
GCR_ENTRY(0x57, 1) // 00001
GCR_ENTRY(0x5b, 2) // 00010
GCR_ENTRY(0x5d, 3) // 00011
GCR_ENTRY(0x5f, 4) // 00100
GCR_ENTRY(0x6b, 5) // 00101
GCR_ENTRY(0x6d, 6) // 00110
GCR_ENTRY(0x6f, 7) // 00111
GCR_ENTRY(0x75, 8) // 01000
GCR_ENTRY(0x77, 9) // 01001
GCR_ENTRY(0x55, 0) // 00000
GCR_ENTRY(0x57, 1) // 00001
GCR_ENTRY(0x5b, 2) // 00010
GCR_ENTRY(0x5d, 3) // 00011
GCR_ENTRY(0x5f, 4) // 00100
GCR_ENTRY(0x6b, 5) // 00101
GCR_ENTRY(0x6d, 6) // 00110
GCR_ENTRY(0x6f, 7) // 00111
GCR_ENTRY(0x75, 8) // 01000
GCR_ENTRY(0x77, 9) // 01001
GCR_ENTRY(0x7b, 10) // 01010
GCR_ENTRY(0x7d, 11) // 01011
GCR_ENTRY(0x7f, 12) // 01100
@@ -30,4 +30,3 @@ GCR_ENTRY(0xef, 28) // 11100
GCR_ENTRY(0xf5, 29) // 11101
GCR_ENTRY(0xf7, 30) // 11110
GCR_ENTRY(0xfb, 31) // 11111

121
arch/brother/decoder.cc Normal file
View File

@@ -0,0 +1,121 @@
#include "globals.h"
#include "fluxmap.h"
#include "decoders/fluxmapreader.h"
#include "decoders/decoders.h"
#include "encoders/encoders.h"
#include "brother.h"
#include "sector.h"
#include "bytes.h"
#include "crc.h"
#include <ctype.h>
const FluxPattern SECTOR_RECORD_PATTERN(32, BROTHER_SECTOR_RECORD);
const FluxPattern DATA_RECORD_PATTERN(32, BROTHER_DATA_RECORD);
const FluxMatchers ANY_RECORD_PATTERN(
{&SECTOR_RECORD_PATTERN, &DATA_RECORD_PATTERN});
static std::vector<uint8_t> outputbuffer;
/*
* Brother disks have this very very non-IBM system where sector header records
* and data records use two different kinds of GCR: sector headers are 8-in-16
* (but the encodable values range from 0 to 77ish only) and data headers are
* 5-in-8. In addition, there's a non-encoded 10-bit ID word at the beginning
* of each record, as well as a string of 53 1s introducing them. That does at
* least make them easy to find.
*
* Disk formats vary from machine to machine, but mine uses 78 tracks. Track 0
* is erased but not formatted. Track alignment is extremely dubious and
* Brother track 0 shows up on my machine at track 2.
*/
static int decode_data_gcr(uint8_t gcr)
{
switch (gcr)
{
#define GCR_ENTRY(gcr, data) \
case gcr: \
return data;
#include "data_gcr.h"
#undef GCR_ENTRY
}
return -1;
}
static int decode_header_gcr(uint16_t word)
{
switch (word)
{
#define GCR_ENTRY(gcr, data) \
case gcr: \
return data;
#include "header_gcr.h"
#undef GCR_ENTRY
}
return -1;
}
class BrotherDecoder : public Decoder
{
public:
BrotherDecoder(const DecoderProto& config): Decoder(config) {}
nanoseconds_t advanceToNextRecord() override
{
return seekToPattern(ANY_RECORD_PATTERN);
}
void decodeSectorRecord() override
{
if (readRaw32() != BROTHER_SECTOR_RECORD)
return;
const auto& rawbits = readRawBits(32);
const auto& bytes = toBytes(rawbits).slice(0, 4);
ByteReader br(bytes);
_sector->logicalTrack = decode_header_gcr(br.read_be16());
_sector->logicalSector = decode_header_gcr(br.read_be16());
/* Sanity check the values read; there's no header checksum and
* occasionally we get garbage due to bit errors. */
if (_sector->logicalSector > 11)
return;
if (_sector->logicalTrack > 79)
return;
_sector->status = Sector::DATA_MISSING;
}
void decodeDataRecord() override
{
if (readRaw32() != BROTHER_DATA_RECORD)
return;
const auto& rawbits = readRawBits(BROTHER_DATA_RECORD_ENCODED_SIZE * 8);
const auto& rawbytes =
toBytes(rawbits).slice(0, BROTHER_DATA_RECORD_ENCODED_SIZE);
Bytes bytes;
ByteWriter bw(bytes);
BitWriter bitw(bw);
for (uint8_t b : rawbytes)
{
uint32_t nibble = decode_data_gcr(b);
bitw.push(nibble, 5);
}
bitw.flush();
_sector->data = bytes.slice(0, BROTHER_DATA_RECORD_PAYLOAD);
uint32_t realCrc = crcbrother(_sector->data);
uint32_t wantCrc =
bytes.reader().seek(BROTHER_DATA_RECORD_PAYLOAD).read_be24();
_sector->status =
(realCrc == wantCrc) ? Sector::OK : Sector::BAD_CHECKSUM;
}
};
std::unique_ptr<Decoder> createBrotherDecoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new BrotherDecoder(config));
}

154
arch/brother/encoder.cc Normal file
View File

@@ -0,0 +1,154 @@
#include "globals.h"
#include "decoders/decoders.h"
#include "encoders/encoders.h"
#include "brother.h"
#include "crc.h"
#include "readerwriter.h"
#include "image.h"
#include "arch/brother/brother.pb.h"
#include "lib/encoders/encoders.pb.h"
static int encode_header_gcr(uint16_t word)
{
switch (word)
{
#define GCR_ENTRY(gcr, data) \
case data: \
return gcr;
#include "header_gcr.h"
#undef GCR_ENTRY
}
return -1;
}
static int encode_data_gcr(uint8_t data)
{
switch (data)
{
#define GCR_ENTRY(gcr, data) \
case data: \
return gcr;
#include "data_gcr.h"
#undef GCR_ENTRY
}
return -1;
}
static void write_bits(
std::vector<bool>& bits, unsigned& cursor, uint32_t data, int width)
{
cursor += width;
for (int i = 0; i < width; i++)
{
unsigned pos = cursor - i - 1;
if (pos < bits.size())
bits[pos] = data & 1;
data >>= 1;
}
}
static void write_sector_header(
std::vector<bool>& bits, unsigned& cursor, int track, int sector)
{
write_bits(bits, cursor, 0xffffffff, 31);
write_bits(bits, cursor, BROTHER_SECTOR_RECORD, 32);
write_bits(bits, cursor, encode_header_gcr(track), 16);
write_bits(bits, cursor, encode_header_gcr(sector), 16);
write_bits(bits, cursor, encode_header_gcr(0x2f), 16);
}
static void write_sector_data(
std::vector<bool>& bits, unsigned& cursor, const Bytes& data)
{
write_bits(bits, cursor, 0xffffffff, 32);
write_bits(bits, cursor, BROTHER_DATA_RECORD, 32);
uint16_t fifo = 0;
int width = 0;
if (data.size() != BROTHER_DATA_RECORD_PAYLOAD)
error("unsupported sector size");
auto write_byte = [&](uint8_t byte)
{
fifo |= (byte << (8 - width));
width += 8;
while (width >= 5)
{
uint8_t quintet = fifo >> 11;
fifo <<= 5;
width -= 5;
write_bits(bits, cursor, encode_data_gcr(quintet), 8);
}
};
for (uint8_t byte : data)
write_byte(byte);
uint32_t realCrc = crcbrother(data);
write_byte(realCrc >> 16);
write_byte(realCrc >> 8);
write_byte(realCrc);
write_byte(0x58); /* magic */
write_byte(0xd4);
while (width != 0)
write_byte(0);
}
class BrotherEncoder : public Encoder
{
public:
BrotherEncoder(const EncoderProto& config):
Encoder(config),
_config(config.brother())
{
}
public:
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{
int bitsPerRevolution = 200000.0 / _config.clock_rate_us();
std::vector<bool> bits(bitsPerRevolution);
unsigned cursor = 0;
int sectorCount = 0;
for (const auto& sectorData : sectors)
{
double headerMs = _config.post_index_gap_ms() +
sectorCount * _config.sector_spacing_ms();
unsigned headerCursor = headerMs * 1e3 / _config.clock_rate_us();
double dataMs = headerMs + _config.post_header_spacing_ms();
unsigned dataCursor = dataMs * 1e3 / _config.clock_rate_us();
fillBitmapTo(bits, cursor, headerCursor, {true, false});
write_sector_header(bits,
cursor,
sectorData->logicalTrack,
sectorData->logicalSector);
fillBitmapTo(bits, cursor, dataCursor, {true, false});
write_sector_data(bits, cursor, sectorData->data);
sectorCount++;
}
if (cursor >= bits.size())
error("track data overrun");
fillBitmapTo(bits, cursor, bits.size(), {true, false});
std::unique_ptr<Fluxmap> fluxmap(new Fluxmap);
fluxmap->appendBits(bits, _config.clock_rate_us() * 1e3);
return fluxmap;
}
private:
const BrotherEncoderProto& _config;
};
std::unique_ptr<Encoder> createBrotherEncoder(const EncoderProto& config)
{
return std::unique_ptr<Encoder>(new BrotherEncoder(config));
}

View File

@@ -76,4 +76,3 @@ GCR_ENTRY(0x6BAB, 74)
GCR_ENTRY(0xAD5F, 75)
GCR_ENTRY(0xDBED, 76)
GCR_ENTRY(0x55BB, 77)

43
arch/build.mk Normal file
View File

@@ -0,0 +1,43 @@
LIBARCH_SRCS = \
arch/aeslanier/decoder.cc \
arch/agat/agat.cc \
arch/agat/decoder.cc \
arch/agat/encoder.cc \
arch/amiga/amiga.cc \
arch/amiga/decoder.cc \
arch/amiga/encoder.cc \
arch/apple2/decoder.cc \
arch/apple2/encoder.cc \
arch/brother/decoder.cc \
arch/brother/encoder.cc \
arch/c64/c64.cc \
arch/c64/decoder.cc \
arch/c64/encoder.cc \
arch/f85/decoder.cc \
arch/fb100/decoder.cc \
arch/ibm/decoder.cc \
arch/ibm/encoder.cc \
arch/macintosh/decoder.cc \
arch/macintosh/encoder.cc \
arch/micropolis/decoder.cc \
arch/micropolis/encoder.cc \
arch/mx/decoder.cc \
arch/northstar/decoder.cc \
arch/northstar/encoder.cc \
arch/rolandd20/decoder.cc \
arch/smaky6/decoder.cc \
arch/tids990/decoder.cc \
arch/tids990/encoder.cc \
arch/victor9k/decoder.cc \
arch/victor9k/encoder.cc \
arch/zilogmcz/decoder.cc \
LIBARCH_OBJS = $(patsubst %.cc, $(OBJDIR)/%.o, $(LIBARCH_SRCS))
OBJS += $(LIBARCH_OBJS)
$(LIBARCH_SRCS): | $(PROTO_HDRS)
$(LIBARCH_SRCS): CFLAGS += $(PROTO_CFLAGS)
LIBARCH_LIB = $(OBJDIR)/libarch.a
LIBARCH_LDFLAGS =
$(LIBARCH_LIB): $(LIBARCH_OBJS)
$(call use-pkgconfig, $(LIBARCH_LIB), $(LIBARCH_OBJS), fmt)

28
arch/c64/c64.cc Normal file
View File

@@ -0,0 +1,28 @@
#include "globals.h"
#include "c64.h"
/*
* Track Sectors/track # Sectors Storage in Bytes Clock rate
* ----- ------------- --------- ---------------- ----------
* 1-17 21 357 7820 3.25
* 18-24 19 133 7170 3.5
* 25-30 18 108 6300 3.75
* 31-40(*) 17 85 6020 4
* ---
* 683 (for a 35 track image)
*
* The clock rate is normalised for a 200ms drive.
*/
nanoseconds_t clockPeriodForC64Track(unsigned track)
{
constexpr double b = 8.0;
if (track < 17)
return 26.0 / b;
if (track < 24)
return 28.0 / b;
if (track < 30)
return 30.0 / b;
return 32.0 / b;
}

37
arch/c64/c64.h Normal file
View File

@@ -0,0 +1,37 @@
#ifndef C64_H
#define C64_H
#include "decoders/decoders.h"
#include "encoders/encoders.h"
#define C64_SECTOR_RECORD 0xffd49
#define C64_DATA_RECORD 0xffd57
#define C64_SECTOR_LENGTH 256
/* Source: http://www.unusedino.de/ec64/technical/formats/g64.html
1. Header sync FF FF FF FF FF (40 'on' bits, not GCR)
2. Header info 52 54 B5 29 4B 7A 5E 95 55 55 (10 GCR bytes)
3. Header gap 55 55 55 55 55 55 55 55 55 (9 bytes, never read)
4. Data sync FF FF FF FF FF (40 'on' bits, not GCR)
5. Data block 55...4A (325 GCR bytes)
6. Inter-sector gap 55 55 55 55...55 55 (4 to 12 bytes, never read)
1. Header sync (SYNC for the next sector)
*/
#define C64_HEADER_DATA_SYNC 0xFF
#define C64_HEADER_BLOCK_ID 0x08
#define C64_DATA_BLOCK_ID 0x07
#define C64_HEADER_GAP 0x55
#define C64_INTER_SECTOR_GAP 0x55
#define C64_PADDING 0x0F
#define C64_TRACKS_PER_DISK 40
#define C64_BAM_TRACK 17
extern std::unique_ptr<Decoder> createCommodore64Decoder(
const DecoderProto& config);
extern std::unique_ptr<Encoder> createCommodore64Encoder(
const EncoderProto& config);
extern nanoseconds_t clockPeriodForC64Track(unsigned track);
#endif

11
arch/c64/c64.proto Normal file
View File

@@ -0,0 +1,11 @@
syntax = "proto2";
import "lib/common.proto";
message Commodore64DecoderProto {}
message Commodore64EncoderProto {
optional double post_index_gap_us = 1 [default=0.0,
(help) = "post-index gap before first sector header."];
}

View File

102
arch/c64/decoder.cc Normal file
View File

@@ -0,0 +1,102 @@
#include "globals.h"
#include "fluxmap.h"
#include "decoders/fluxmapreader.h"
#include "protocol.h"
#include "decoders/decoders.h"
#include "sector.h"
#include "c64.h"
#include "crc.h"
#include "bytes.h"
#include "fmt/format.h"
#include <string.h>
#include <algorithm>
const FluxPattern SECTOR_RECORD_PATTERN(20, C64_SECTOR_RECORD);
const FluxPattern DATA_RECORD_PATTERN(20, C64_DATA_RECORD);
const FluxMatchers ANY_RECORD_PATTERN(
{&SECTOR_RECORD_PATTERN, &DATA_RECORD_PATTERN});
static int decode_data_gcr(uint8_t gcr)
{
switch (gcr)
{
#define GCR_ENTRY(gcr, data) \
case gcr: \
return data;
#include "data_gcr.h"
#undef GCR_ENTRY
}
return -1;
}
static Bytes decode(const std::vector<bool>& bits)
{
Bytes output;
ByteWriter bw(output);
BitWriter bitw(bw);
auto ii = bits.begin();
while (ii != bits.end())
{
uint8_t inputfifo = 0;
for (size_t i = 0; i < 5; i++)
{
if (ii == bits.end())
break;
inputfifo = (inputfifo << 1) | *ii++;
}
bitw.push(decode_data_gcr(inputfifo), 4);
}
bitw.flush();
return output;
}
class Commodore64Decoder : public Decoder
{
public:
Commodore64Decoder(const DecoderProto& config): Decoder(config) {}
nanoseconds_t advanceToNextRecord() override
{
return seekToPattern(ANY_RECORD_PATTERN);
}
void decodeSectorRecord() override
{
if (readRaw20() != C64_SECTOR_RECORD)
return;
const auto& bits = readRawBits(5 * 10);
const auto& bytes = decode(bits).slice(0, 5);
uint8_t checksum = bytes[0];
_sector->logicalSector = bytes[1];
_sector->logicalSide = 0;
_sector->logicalTrack = bytes[2] - 1;
if (checksum == xorBytes(bytes.slice(1, 4)))
_sector->status =
Sector::DATA_MISSING; /* unintuitive but correct */
}
void decodeDataRecord() override
{
if (readRaw20() != C64_DATA_RECORD)
return;
const auto& bits = readRawBits(259 * 10);
const auto& bytes = decode(bits).slice(0, 259);
_sector->data = bytes.slice(0, C64_SECTOR_LENGTH);
uint8_t gotChecksum = xorBytes(_sector->data);
uint8_t wantChecksum = bytes[256];
_sector->status =
(wantChecksum == gotChecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
}
};
std::unique_ptr<Decoder> createCommodore64Decoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new Commodore64Decoder(config));
}

318
arch/c64/encoder.cc Normal file
View File

@@ -0,0 +1,318 @@
#include "globals.h"
#include "decoders/decoders.h"
#include "encoders/encoders.h"
#include "c64.h"
#include "crc.h"
#include "sector.h"
#include "readerwriter.h"
#include "image.h"
#include "fmt/format.h"
#include "arch/c64/c64.pb.h"
#include "lib/encoders/encoders.pb.h"
#include "lib/layout.h"
#include <ctype.h>
#include "bytes.h"
static bool lastBit;
static int encode_data_gcr(uint8_t data)
{
switch (data)
{
#define GCR_ENTRY(gcr, data) \
case data: \
return gcr;
#include "data_gcr.h"
#undef GCR_ENTRY
}
return -1;
}
static void write_bits(
std::vector<bool>& bits, unsigned& cursor, const std::vector<bool>& src)
{
for (bool bit : src) // Range-based for loop
{
if (cursor < bits.size())
bits[cursor++] = bit;
}
}
static void write_bits(
std::vector<bool>& bits, unsigned& cursor, uint64_t data, int width)
{
cursor += width;
for (int i = 0; i < width; i++)
{
unsigned pos = cursor - i - 1;
if (pos < bits.size())
bits[pos] = data & 1;
data >>= 1;
}
}
static std::vector<bool> encode_data(uint8_t input)
{
/*
* Four 8-bit data bytes are converted to four 10-bit GCR bytes at a time by
* the 1541 DOS. RAM is only an 8-bit storage device though. This hardware
* limitation prevents a 10-bit GCR byte from being stored in a single
* memory location. Four 10-bit GCR bytes total 40 bits - a number evenly
* divisible by our overriding 8-bit constraint. Commodore sub- divides the
* 40 GCR bits into five 8-bit bytes to solve this dilemma. This explains
* why four 8-bit data bytes are converted to GCR form at a time. The
* following step by step example demonstrates how this bit manipulation is
* performed by the DOS.
*
* STEP 1. Four 8-bit Data Bytes
* $08 $10 $00 $12
*
* STEP 2. Hexadecimal to Binary Conversion
* 1. Binary Equivalents
* $08 $10 $00 $12
* 00001000 00010000 00000000 00010010
*
* STEP 3. Binary to GCR Conversion
* 1. Four 8-bit Data Bytes
* 00001000 00010000 00000000 00010010
* 2. High and Low Nybbles
* 0000 1000 0001 0000 0000 0000 0001 0010
* 3. High and Low Nybble GCR Equivalents
* 01010 01001 01011 01010 01010 01010 01011 10010
* 4. Four 10-bit GCR Bytes
* 0101001001 0101101010 0101001010 0101110010
*
* STEP 4. 10-bit GCR to 8-bit GCR Conversion
* 1. Concatenate Four 10-bit GCR Bytes
* 0101001001010110101001010010100101110010
* 2. Five 8-bit Subdivisions
* 01010010 01010110 10100101 00101001 01110010
*
* STEP 5. Binary to Hexadecimal Conversion
* 1. Hexadecimal Equivalents
* 01010010 01010110 10100101 00101001 01110010
* $52 $56 $A5 $29 $72
*
* STEP 6. Four 8-bit Data Bytes are Recorded as Five 8-bit GCR Bytes
* $08 $10 $00 $12
*
* are recorded as
* $52 $56 $A5 $29 $72
*/
std::vector<bool> output(10, false);
uint8_t hi = 0;
uint8_t lo = 0;
uint8_t lo_GCR = 0;
uint8_t hi_GCR = 0;
// Convert the byte in high and low nibble
lo = input >> 4; // get the lo nibble shift the bits 4 to the right
hi = input & 15; // get the hi nibble bij masking the lo bits (00001111)
lo_GCR = encode_data_gcr(lo); // example value: 0000 GCR = 01010
hi_GCR = encode_data_gcr(hi); // example value: 1000 GCR = 01001
// output = [0,1,2,3,4,5,6,7,8,9]
// value = [0,1,0,1,0,0,1,0,0,1]
// 01010 01001
int b = 4;
for (int i = 0; i < 10; i++)
{
if (i < 5) // 01234
{ // i = 0 op
output[4 - i] = (lo_GCR & 1); // 01010
// 01010 -> & 00001 -> 00000 output[4] = 0
// 00101 -> & 00001 -> 00001 output[3] = 1
// 00010 -> & 00001 -> 00000 output[2] = 0
// 00001 -> & 00001 -> 00001 output[1] = 1
// 00000 -> & 00001 -> 00000 output[0] = 0
lo_GCR >>= 1;
}
else
{
output[i + b] = (hi_GCR & 1); // 01001
// 01001 -> & 00001 -> 00001 output[9] = 1
// 00100 -> & 00001 -> 00000 output[8] = 0
// 00010 -> & 00001 -> 00000 output[7] = 0
// 00001 -> & 00001 -> 00001 output[6] = 1
// 00000 -> & 00001 -> 00000 output[5] = 0
hi_GCR >>= 1;
b = b - 2;
}
}
return output;
}
class Commodore64Encoder : public Encoder
{
public:
Commodore64Encoder(const EncoderProto& config):
Encoder(config),
_config(config.c64())
{
}
public:
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{
/* The format ID Character # 1 and # 2 are in the .d64 image only
* present in track 18 sector zero which contains the BAM info in byte
* 162 and 163. it is written in every header of every sector and track.
* headers are not stored in a d64 disk image so we have to get it from
* track 18 which contains the BAM.
*/
const auto& sectorData = image.get(
C64_BAM_TRACK, 0, 0); // Read de BAM to get the DISK ID bytes
if (sectorData)
{
ByteReader br(sectorData->data);
br.seek(162); // goto position of the first Disk ID Byte
_formatByte1 = br.read_8();
_formatByte2 = br.read_8();
}
else
_formatByte1 = _formatByte2 = 0;
double clockRateUs = clockPeriodForC64Track(trackInfo->logicalTrack);
int bitsPerRevolution = 200000.0 / clockRateUs;
std::vector<bool> bits(bitsPerRevolution);
unsigned cursor = 0;
fillBitmapTo(bits,
cursor,
_config.post_index_gap_us() / clockRateUs,
{true, false});
lastBit = false;
for (const auto& sector : sectors)
writeSector(bits, cursor, sector);
if (cursor >= bits.size())
error("track data overrun by {} bits", cursor - bits.size());
fillBitmapTo(bits, cursor, bits.size(), {true, false});
std::unique_ptr<Fluxmap> fluxmap(new Fluxmap);
fluxmap->appendBits(
bits, calculatePhysicalClockPeriod(clockRateUs * 1e3, 200e6));
return fluxmap;
}
private:
void writeSector(std::vector<bool>& bits,
unsigned& cursor,
std::shared_ptr<const Sector> sector) const
{
/* Source: http://www.unusedino.de/ec64/technical/formats/g64.html
* 1. Header sync FF FF FF FF FF (40 'on' bits, not GCR)
* 2. Header info 52 54 B5 29 4B 7A 5E 95 55 55 (10 GCR bytes)
* 3. Header gap 55 55 55 55 55 55 55 55 55 (9 bytes, never read)
* 4. Data sync FF FF FF FF FF (40 'on' bits, not GCR)
* 5. Data block 55...4A (325 GCR bytes)
* 6. Inter-sector gap 55 55 55 55...55 55 (4 to 12 bytes, never read)
* 1. Header sync (SYNC for the next sector)
*/
if ((sector->status == Sector::OK) or
(sector->status == Sector::BAD_CHECKSUM))
{
// There is data to encode to disk.
if ((sector->data.size() != C64_SECTOR_LENGTH))
error("unsupported sector size {} --- you must pick 256",
sector->data.size());
// 1. Write header Sync (not GCR)
for (int i = 0; i < 6; i++)
write_bits(
bits, cursor, C64_HEADER_DATA_SYNC, 1 * 8); /* sync */
// 2. Write Header info 10 GCR bytes
/*
* The 10 byte header info (#2) is GCR encoded and must be decoded
* to it's normal 8 bytes to be understood. Once decoded, its
* breakdown is as follows:
*
* Byte $00 - header block ID ($08)
* 01 - header block checksum 16 (EOR of $02-$05)
* 02 - Sector
* 03 - Track
* 04 - Format ID byte #2
* 05 - Format ID byte #1
* 06-07 - $0F ("off" bytes)
*/
uint8_t encodedTrack =
((sector->logicalTrack) +
1); // C64 track numbering starts with 1. Fluxengine with 0.
uint8_t encodedSector = sector->logicalSector;
// uint8_t formatByte1 = C64_FORMAT_ID_BYTE1;
// uint8_t formatByte2 = C64_FORMAT_ID_BYTE2;
uint8_t headerChecksum =
(encodedTrack ^ encodedSector ^ _formatByte1 ^ _formatByte2);
write_bits(bits, cursor, encode_data(C64_HEADER_BLOCK_ID));
write_bits(bits, cursor, encode_data(headerChecksum));
write_bits(bits, cursor, encode_data(encodedSector));
write_bits(bits, cursor, encode_data(encodedTrack));
write_bits(bits, cursor, encode_data(_formatByte2));
write_bits(bits, cursor, encode_data(_formatByte1));
write_bits(bits, cursor, encode_data(C64_PADDING));
write_bits(bits, cursor, encode_data(C64_PADDING));
// 3. Write header GAP not GCR
for (int i = 0; i < 9; i++)
write_bits(
bits, cursor, C64_HEADER_GAP, 1 * 8); /* header gap */
// 4. Write Data sync not GCR
for (int i = 0; i < 6; i++)
write_bits(
bits, cursor, C64_HEADER_DATA_SYNC, 1 * 8); /* sync */
// 5. Write data block 325 GCR bytes
/*
* The 325 byte data block (#5) is GCR encoded and must be decoded
* to its normal 260 bytes to be understood. The data block is made
* up of the following:
*
* Byte $00 - data block ID ($07)
* 01-100 - 256 bytes data
* 101 - data block checksum (EOR of $01-100)
* 102-103 - $00 ("off" bytes, to make the sector size a
* multiple of 5)
*/
write_bits(bits, cursor, encode_data(C64_DATA_BLOCK_ID));
uint8_t dataChecksum = xorBytes(sector->data);
ByteReader br(sector->data);
int i = 0;
for (i = 0; i < C64_SECTOR_LENGTH; i++)
{
uint8_t val = br.read_8();
write_bits(bits, cursor, encode_data(val));
}
write_bits(bits, cursor, encode_data(dataChecksum));
write_bits(bits, cursor, encode_data(C64_PADDING));
write_bits(bits, cursor, encode_data(C64_PADDING));
// 6. Write inter-sector gap 9 - 12 bytes nor gcr
for (int i = 0; i < 9; i++)
write_bits(
bits, cursor, C64_INTER_SECTOR_GAP, 1 * 8); /* sync */
}
}
private:
const Commodore64EncoderProto& _config;
uint8_t _formatByte1;
uint8_t _formatByte2;
};
std::unique_ptr<Encoder> createCommodore64Encoder(const EncoderProto& config)
{
return std::unique_ptr<Encoder>(new Commodore64Encoder(config));
}
// vim: sw=4 ts=4 et

View File

110
arch/f85/decoder.cc Normal file
View File

@@ -0,0 +1,110 @@
#include "globals.h"
#include "fluxmap.h"
#include "decoders/fluxmapreader.h"
#include "protocol.h"
#include "decoders/decoders.h"
#include "sector.h"
#include "f85.h"
#include "crc.h"
#include "bytes.h"
#include "fmt/format.h"
#include <string.h>
#include <algorithm>
const FluxPattern SECTOR_RECORD_PATTERN(24, F85_SECTOR_RECORD);
const FluxPattern DATA_RECORD_PATTERN(24, F85_DATA_RECORD);
const FluxMatchers ANY_RECORD_PATTERN(
{&SECTOR_RECORD_PATTERN, &DATA_RECORD_PATTERN});
static int decode_data_gcr(uint8_t gcr)
{
switch (gcr)
{
#define GCR_ENTRY(gcr, data) \
case gcr: \
return data;
#include "data_gcr.h"
#undef GCR_ENTRY
}
return -1;
}
static Bytes decode(const std::vector<bool>& bits)
{
Bytes output;
ByteWriter bw(output);
BitWriter bitw(bw);
auto ii = bits.begin();
while (ii != bits.end())
{
uint8_t inputfifo = 0;
for (size_t i = 0; i < 5; i++)
{
if (ii == bits.end())
break;
inputfifo = (inputfifo << 1) | *ii++;
}
bitw.push(decode_data_gcr(inputfifo), 4);
}
bitw.flush();
return output;
}
class DurangoF85Decoder : public Decoder
{
public:
DurangoF85Decoder(const DecoderProto& config): Decoder(config) {}
nanoseconds_t advanceToNextRecord() override
{
return seekToPattern(ANY_RECORD_PATTERN);
}
void decodeSectorRecord() override
{
/* Skip sync bits and ID byte. */
if (readRaw24() != F85_SECTOR_RECORD)
return;
/* Read header. */
const auto& bytes = decode(readRawBits(6 * 10));
_sector->logicalSector = bytes[2];
_sector->logicalSide = 0;
_sector->logicalTrack = bytes[0];
uint16_t wantChecksum = bytes.reader().seek(4).read_be16();
uint16_t gotChecksum = crc16(CCITT_POLY, 0xef21, bytes.slice(0, 4));
if (wantChecksum == gotChecksum)
_sector->status =
Sector::DATA_MISSING; /* unintuitive but correct */
}
void decodeDataRecord() override
{
/* Skip sync bits ID byte. */
if (readRaw24() != F85_DATA_RECORD)
return;
const auto& bytes = decode(readRawBits((F85_SECTOR_LENGTH + 3) * 10))
.slice(0, F85_SECTOR_LENGTH + 3);
ByteReader br(bytes);
_sector->data = br.read(F85_SECTOR_LENGTH);
uint16_t wantChecksum = br.read_be16();
uint16_t gotChecksum = crc16(CCITT_POLY, 0xbf84, _sector->data);
_sector->status =
(wantChecksum == gotChecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
}
};
std::unique_ptr<Decoder> createDurangoF85Decoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new DurangoF85Decoder(config));
}

11
arch/f85/f85.h Normal file
View File

@@ -0,0 +1,11 @@
#ifndef F85_H
#define F85_H
#define F85_SECTOR_RECORD 0xffffce /* 1111 1111 1111 1111 1100 1110 */
#define F85_DATA_RECORD 0xffffcb /* 1111 1111 1111 1111 1100 1101 */
#define F85_SECTOR_LENGTH 512
extern std::unique_ptr<Decoder> createDurangoF85Decoder(
const DecoderProto& config);
#endif

4
arch/f85/f85.proto Normal file
View File

@@ -0,0 +1,4 @@
syntax = "proto2";
message F85DecoderProto {}

142
arch/fb100/decoder.cc Normal file
View File

@@ -0,0 +1,142 @@
#include "globals.h"
#include "fluxmap.h"
#include "decoders/fluxmapreader.h"
#include "protocol.h"
#include "decoders/decoders.h"
#include "sector.h"
#include "fb100.h"
#include "crc.h"
#include "bytes.h"
#include "decoders/rawbits.h"
#include "fmt/format.h"
#include <string.h>
#include <algorithm>
const FluxPattern SECTOR_ID_PATTERN(16, 0xabaa);
/*
* Reverse engineered from a dump of the floppy drive's ROM. I have no idea how
* it works.
*
* LF8BA:
* clra
* staa X00B0
* staa X00B1
* ldx #$8000
* LF8C2: ldaa $00,x
* inx
* bsr LF8CF
* cpx #$8011
* bne LF8C2
* ldd X00B0
* rts
* LF8CF:
* eora X00B0
* staa X00CF
* asla
* asla
* asla
* asla
* eora X00CF
* staa X00CF
* rola
* rola
* rola
* tab
* anda #$F8
* eora X00B1
* staa X00B0
* rolb
* rolb
* andb #$0F
* eorb X00B0
* stab X00B0
* rolb
* eorb X00CF
* stab X00B1
* rts
*/
static void rol(uint8_t& b, bool& c)
{
bool newc = b & 0x80;
b <<= 1;
b |= c;
c = newc;
}
static uint16_t checksum(const Bytes& bytes)
{
uint8_t crclo = 0;
uint8_t crchi = 0;
for (uint8_t a : bytes)
{
a ^= crchi;
uint8_t t1 = a;
a <<= 4;
bool c = a & 0x10;
a ^= t1;
t1 = a;
rol(a, c);
rol(a, c);
rol(a, c);
uint8_t b = a;
a &= 0xf8;
a ^= crclo;
crchi = a;
rol(b, c);
rol(b, c);
b &= 0x0f;
b ^= crchi;
crchi = b;
rol(b, c);
b ^= t1;
crclo = b;
}
return (crchi << 8) | crclo;
}
class Fb100Decoder : public Decoder
{
public:
Fb100Decoder(const DecoderProto& config): Decoder(config) {}
nanoseconds_t advanceToNextRecord() override
{
return seekToPattern(SECTOR_ID_PATTERN);
}
void decodeSectorRecord() override
{
auto rawbits = readRawBits(FB100_RECORD_SIZE * 16);
const Bytes bytes = decodeFmMfm(rawbits).slice(0, FB100_RECORD_SIZE);
ByteReader br(bytes);
br.seek(1);
const Bytes id = br.read(FB100_ID_SIZE);
uint16_t wantIdCrc = br.read_be16();
uint16_t gotIdCrc = checksum(id);
const Bytes payload = br.read(FB100_PAYLOAD_SIZE);
uint16_t wantPayloadCrc = br.read_be16();
uint16_t gotPayloadCrc = checksum(payload);
if (wantIdCrc != gotIdCrc)
return;
uint8_t abssector = id[2];
_sector->logicalTrack = abssector >> 1;
_sector->logicalSide = 0;
_sector->logicalSector = abssector & 1;
_sector->data.writer().append(id.slice(5, 12)).append(payload);
_sector->status = (wantPayloadCrc == gotPayloadCrc)
? Sector::OK
: Sector::BAD_CHECKSUM;
}
};
std::unique_ptr<Decoder> createFb100Decoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new Fb100Decoder(config));
}

10
arch/fb100/fb100.h Normal file
View File

@@ -0,0 +1,10 @@
#ifndef FB100_H
#define FB100_H
#define FB100_RECORD_SIZE 0x516 /* bytes */
#define FB100_ID_SIZE 17
#define FB100_PAYLOAD_SIZE 0x500
extern std::unique_ptr<Decoder> createFb100Decoder(const DecoderProto& config);
#endif

4
arch/fb100/fb100.proto Normal file
View File

@@ -0,0 +1,4 @@
syntax = "proto2";
message Fb100DecoderProto {}

250
arch/ibm/decoder.cc Normal file
View File

@@ -0,0 +1,250 @@
#include "globals.h"
#include "decoders/decoders.h"
#include "ibm.h"
#include "crc.h"
#include "fluxmap.h"
#include "decoders/fluxmapreader.h"
#include "sector.h"
#include "arch/ibm/ibm.pb.h"
#include "proto.h"
#include "lib/layout.h"
#include <string.h>
static_assert(std::is_trivially_copyable<IbmIdam>::value,
"IbmIdam is not trivially copyable");
/*
* The markers at the beginning of records are special, and have
* missing clock pulses, allowing them to be found by the logic.
*
* IAM record:
* flux: XXXX-XXX-XXXX-X- = 0xf77a
* clock: X X - X - X X X = 0xd7
* data: X X X X X X - - = 0xfc
*
* (We just ignore this one --- it's useless and optional.)
*/
/*
* IDAM record:
* flux: XXXX-X-X-XXXXXX- = 0xf57e
* clock: X X - - - X X X = 0xc7
* data: X X X X X X X - = 0xfe
*/
const FluxPattern FM_IDAM_PATTERN(16, 0xf57e);
/*
* DAM1 record:
* flux: XXXX-X-X-XX-X-X- = 0xf56a
* clock: X X - - - X X X = 0xc7
* data: X X X X X - - - = 0xf8
*/
const FluxPattern FM_DAM1_PATTERN(16, 0xf56a);
/*
* DAM2 record:
* flux: XXXX-X-X-XX-XXXX = 0xf56f
* clock: X X - - - X X X = 0xc7
* data: X X X X X - X X = 0xfb
*/
const FluxPattern FM_DAM2_PATTERN(16, 0xf56f);
/*
* TRS80DAM1 record:
* flux: XXXX-X-X-XX-X-XX = 0xf56b
* clock: X X - - - X X X = 0xc7
* data: X X X X X - - X = 0xf9
*/
const FluxPattern FM_TRS80DAM1_PATTERN(16, 0xf56b);
/*
* TRS80DAM2 record:
* flux: XXXX-X-X-XX-XXX- = 0xf56e
* clock: X X - - - X X X = 0xc7
* data: X X X X X - X - = 0xfa
*/
const FluxPattern FM_TRS80DAM2_PATTERN(16, 0xf56e);
/* MFM record separator:
* 0xA1 is:
* data: 1 0 1 0 0 0 0 1 = 0xa1
* mfm: 01 00 01 00 10 10 10 01 = 0x44a9
* special: 01 00 01 00 10 00 10 01 = 0x4489
* ^^^^^
* When shifted out of phase, the special 0xa1 byte becomes an illegal
* encoding (you can't do 10 00). So this can't be spoofed by user data.
*
* shifted: 10 00 10 01 00 01 00 1
*
* It's repeated three times.
*/
const FluxPattern MFM_PATTERN(48, 0x448944894489LL);
const FluxMatchers ANY_RECORD_PATTERN({
&MFM_PATTERN,
&FM_IDAM_PATTERN,
&FM_DAM1_PATTERN,
&FM_DAM2_PATTERN,
&FM_TRS80DAM1_PATTERN,
&FM_TRS80DAM2_PATTERN,
});
class IbmDecoder : public Decoder
{
public:
IbmDecoder(const DecoderProto& config):
Decoder(config),
_config(config.ibm())
{
}
nanoseconds_t advanceToNextRecord() override
{
return seekToPattern(ANY_RECORD_PATTERN);
}
void decodeSectorRecord() override
{
/* This is really annoying because the IBM record scheme has a
* variable-sized header _and_ the checksum covers this header too. So
* we have to read and decode a byte at a time until we know where the
* record itself starts, saving the bytes for the checksumming later.
*/
Bytes bytes;
ByteWriter bw(bytes);
auto readByte = [&]()
{
auto bits = readRawBits(16);
auto bytes = decodeFmMfm(bits).slice(0, 1);
uint8_t byte = bytes[0];
bw.write_8(byte);
return byte;
};
uint8_t id = readByte();
if (id == 0xa1)
{
readByte();
readByte();
id = readByte();
}
if (id != IBM_IDAM)
return;
ByteReader br(bytes);
br.seek(bw.pos);
auto bits = readRawBits(IBM_IDAM_LEN * 16);
bw += decodeFmMfm(bits).slice(0, IBM_IDAM_LEN);
IbmDecoderProto::TrackdataProto trackdata;
getTrackFormat(
trackdata, _sector->physicalTrack, _sector->physicalSide);
_sector->logicalTrack = br.read_8();
_sector->logicalSide = br.read_8();
_sector->logicalSector = br.read_8();
_currentSectorSize = 1 << (br.read_8() + 7);
uint16_t gotCrc = crc16(CCITT_POLY, bytes.slice(0, br.pos));
uint16_t wantCrc = br.read_be16();
if (wantCrc == gotCrc)
_sector->status =
Sector::DATA_MISSING; /* correct but unintuitive */
if (trackdata.ignore_side_byte())
_sector->logicalSide =
Layout::remapSidePhysicalToLogical(_sector->physicalSide);
_sector->logicalSide ^= trackdata.invert_side_byte();
if (trackdata.ignore_track_byte())
_sector->logicalTrack = _sector->physicalTrack;
for (int sector : trackdata.ignore_sector())
if (_sector->logicalSector == sector)
{
_sector->status = Sector::MISSING;
break;
}
}
void decodeDataRecord() override
{
/* This is the same deal as the sector record. */
Bytes bytes;
ByteWriter bw(bytes);
auto readByte = [&]()
{
auto bits = readRawBits(16);
auto bytes = decodeFmMfm(bits).slice(0, 1);
uint8_t byte = bytes[0];
bw.write_8(byte);
return byte;
};
uint8_t id = readByte();
if (id == 0xa1)
{
readByte();
readByte();
id = readByte();
}
if ((id != IBM_DAM1) && (id != IBM_DAM2) && (id != IBM_TRS80DAM1) &&
(id != IBM_TRS80DAM2))
return;
ByteReader br(bytes);
br.seek(bw.pos);
auto bits = readRawBits((_currentSectorSize + 2) * 16);
bw += decodeFmMfm(bits).slice(0, _currentSectorSize + 2);
_sector->data = br.read(_currentSectorSize);
uint16_t gotCrc = crc16(CCITT_POLY, bytes.slice(0, br.pos));
uint16_t wantCrc = br.read_be16();
_sector->status =
(wantCrc == gotCrc) ? Sector::OK : Sector::BAD_CHECKSUM;
auto layout = Layout::getLayoutOfTrack(
_sector->logicalTrack, _sector->logicalSide);
if (_currentSectorSize != layout->sectorSize)
std::cerr << fmt::format(
"Warning: configured sector size for t{}.h{}.s{} is {} bytes "
"but that seen on disk is {} bytes\n",
_sector->logicalTrack,
_sector->logicalSide,
_sector->logicalSector,
layout->sectorSize,
_currentSectorSize);
}
private:
void getTrackFormat(IbmDecoderProto::TrackdataProto& trackdata,
unsigned track,
unsigned head) const
{
trackdata.Clear();
for (const auto& f : _config.trackdata())
{
if (f.has_track() && (f.track() != track))
continue;
if (f.has_head() && (f.head() != head))
continue;
trackdata.MergeFrom(f);
}
}
private:
const IbmDecoderProto& _config;
unsigned _currentSectorSize;
unsigned _currentHeaderLength;
};
std::unique_ptr<Decoder> createIbmDecoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new IbmDecoder(config));
}

282
arch/ibm/encoder.cc Normal file
View File

@@ -0,0 +1,282 @@
#include "globals.h"
#include "decoders/decoders.h"
#include "encoders/encoders.h"
#include "ibm.h"
#include "crc.h"
#include "readerwriter.h"
#include "image.h"
#include "arch/ibm/ibm.pb.h"
#include "lib/encoders/encoders.pb.h"
#include "fmt/format.h"
#include "lib/proto.h"
#include "lib/layout.h"
#include <ctype.h>
/* IAM record separator:
* 0xC2 is:
* data: 1 1 0 0 0 0 1 0 = 0xc2
* mfm: 01 01 00 10 10 10 01 00 = 0x5254
* special: 01 01 00 10 00 10 01 00 = 0x5224
*/
#define MFM_IAM_SEPARATOR 0x5224
/* FM IAM record:
* flux: XXXX-XXX-XXXX-X- = 0xf77a
* clock: X X - X - X X X = 0xd7
* data: X X X X X X - - = 0xfc
*/
#define FM_IAM_RECORD 0xf77a
/* MFM IAM record:
* data: 1 1 1 1 1 1 0 0 = 0xfc
* flux: 01 01 01 01 01 01 00 10 = 0x5552
*/
#define MFM_IAM_RECORD 0x5552
/* MFM record separator:
* 0xA1 is:
* data: 1 0 1 0 0 0 0 1 = 0xa1
* mfm: 01 00 01 00 10 10 10 01 = 0x44a9
* special: 01 00 01 00 10 00 10 01 = 0x4489
* ^^^^^
* When shifted out of phase, the special 0xa1 byte becomes an illegal
* encoding (you can't do 10 00). So this can't be spoofed by user data.
*
* shifted: 10 00 10 01 00 01 00 1
*
* It's repeated three times.
*/
#define MFM_RECORD_SEPARATOR 0x4489
#define MFM_RECORD_SEPARATOR_BYTE 0xa1
/* MFM IDAM byte:
* data: 1 1 1 1 1 1 1 0 = 0xfe
* mfm: 01 01 01 01 01 01 01 00 = 0x5554
*/
/* MFM DAM byte:
* data: 1 1 1 1 1 0 1 1 = 0xfb
* mfm: 01 01 01 01 01 00 01 01 = 0x5545
*/
static uint8_t decodeUint16(uint16_t raw)
{
Bytes b;
ByteWriter bw(b);
bw.write_be16(raw);
return decodeFmMfm(b.toBits())[0];
}
class IbmEncoder : public Encoder
{
public:
IbmEncoder(const EncoderProto& config):
Encoder(config),
_config(config.ibm())
{
}
private:
void writeRawBits(uint32_t data, int width)
{
_cursor += width;
_lastBit = data & 1;
for (int i = 0; i < width; i++)
{
unsigned pos = _cursor - i - 1;
if (pos < _bits.size())
_bits[pos] = data & 1;
data >>= 1;
}
}
void getEncoderTrackData(IbmEncoderProto::TrackdataProto& trackdata,
unsigned track,
unsigned head)
{
trackdata.Clear();
for (const auto& f : _config.trackdata())
{
if (f.has_track() && (f.track() != track))
continue;
if (f.has_head() && (f.head() != head))
continue;
trackdata.MergeFrom(f);
}
}
public:
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{
IbmEncoderProto::TrackdataProto trackdata;
getEncoderTrackData(
trackdata, trackInfo->logicalTrack, trackInfo->logicalSide);
auto trackLayout = Layout::getLayoutOfTrack(
trackInfo->logicalTrack, trackInfo->logicalSide);
auto writeBytes = [&](const Bytes& bytes)
{
if (trackdata.use_fm())
encodeFm(_bits, _cursor, bytes);
else
encodeMfm(_bits, _cursor, bytes, _lastBit);
};
auto writeFillerRawBytes = [&](int count, uint16_t byte)
{
for (int i = 0; i < count; i++)
writeRawBits(byte, 16);
};
auto writeFillerBytes = [&](int count, uint8_t byte)
{
Bytes b{byte};
for (int i = 0; i < count; i++)
writeBytes(b);
};
double clockRateUs = trackdata.target_clock_period_us();
if (!trackdata.use_fm())
clockRateUs /= 2.0;
int bitsPerRevolution =
(trackdata.target_rotational_period_ms() * 1000.0) / clockRateUs;
_bits.resize(bitsPerRevolution);
_cursor = 0;
uint8_t idamUnencoded = decodeUint16(trackdata.idam_byte());
uint8_t damUnencoded = decodeUint16(trackdata.dam_byte());
uint8_t sectorSize = 0;
{
int s = trackLayout->sectorSize >> 7;
while (s > 1)
{
s >>= 1;
sectorSize += 1;
}
}
uint16_t gapFill = trackdata.gap_fill_byte();
writeFillerRawBytes(trackdata.gap0(), gapFill);
if (trackdata.emit_iam())
{
writeFillerBytes(trackdata.use_fm() ? 6 : 12, 0x00);
if (!trackdata.use_fm())
{
for (int i = 0; i < 3; i++)
writeRawBits(MFM_IAM_SEPARATOR, 16);
}
writeRawBits(
trackdata.use_fm() ? FM_IAM_RECORD : MFM_IAM_RECORD, 16);
writeFillerRawBytes(trackdata.gap1(), gapFill);
}
bool first = true;
for (const auto& sectorData : sectors)
{
if (!first)
writeFillerRawBytes(trackdata.gap3(), gapFill);
first = false;
/* Writing the sector and data records are fantastically annoying.
* The CRC is calculated from the *very start* of the record, and
* include the malformed marker bytes. Our encoder doesn't know
* about this, of course, with the result that we have to construct
* the unencoded header, calculate the checksum, and then use the
* same logic to emit the bytes which require special encoding
* before encoding the rest of the header normally. */
{
Bytes header;
ByteWriter bw(header);
writeFillerBytes(trackdata.use_fm() ? 6 : 12, 0x00);
if (!trackdata.use_fm())
{
for (int i = 0; i < 3; i++)
bw.write_8(MFM_RECORD_SEPARATOR_BYTE);
}
bw.write_8(idamUnencoded);
bw.write_8(sectorData->logicalTrack);
bw.write_8(
sectorData->logicalSide ^ trackdata.invert_side_byte());
bw.write_8(sectorData->logicalSector);
bw.write_8(sectorSize);
uint16_t crc = crc16(CCITT_POLY, header);
bw.write_be16(crc);
int conventionalHeaderStart = 0;
if (!trackdata.use_fm())
{
for (int i = 0; i < 3; i++)
writeRawBits(MFM_RECORD_SEPARATOR, 16);
conventionalHeaderStart += 3;
}
writeRawBits(trackdata.idam_byte(), 16);
conventionalHeaderStart += 1;
writeBytes(header.slice(conventionalHeaderStart));
}
writeFillerRawBytes(trackdata.gap2(), gapFill);
{
Bytes data;
ByteWriter bw(data);
writeFillerBytes(trackdata.use_fm() ? 6 : 12, 0x00);
if (!trackdata.use_fm())
{
for (int i = 0; i < 3; i++)
bw.write_8(MFM_RECORD_SEPARATOR_BYTE);
}
bw.write_8(damUnencoded);
Bytes truncatedData =
sectorData->data.slice(0, trackLayout->sectorSize);
bw += truncatedData;
uint16_t crc = crc16(CCITT_POLY, data);
bw.write_be16(crc);
int conventionalHeaderStart = 0;
if (!trackdata.use_fm())
{
for (int i = 0; i < 3; i++)
writeRawBits(MFM_RECORD_SEPARATOR, 16);
conventionalHeaderStart += 3;
}
writeRawBits(trackdata.dam_byte(), 16);
conventionalHeaderStart += 1;
writeBytes(data.slice(conventionalHeaderStart));
}
}
if (_cursor >= _bits.size())
error("track data overrun");
while (_cursor < _bits.size())
writeFillerRawBytes(1, gapFill);
std::unique_ptr<Fluxmap> fluxmap(new Fluxmap);
fluxmap->appendBits(_bits,
calculatePhysicalClockPeriod(clockRateUs * 1e3,
trackdata.target_rotational_period_ms() * 1e6));
return fluxmap;
}
private:
const IbmEncoderProto& _config;
std::vector<bool> _bits;
unsigned _cursor;
bool _lastBit;
};
std::unique_ptr<Encoder> createIbmEncoder(const EncoderProto& config)
{
return std::unique_ptr<Encoder>(new IbmEncoder(config));
}

37
arch/ibm/ibm.h Normal file
View File

@@ -0,0 +1,37 @@
#ifndef IBM_H
#define IBM_H
/* IBM format (i.e. ordinary PC floppies). */
#define IBM_MFM_SYNC 0xA1 /* sync byte for MFM */
#define IBM_IAM 0xFC /* start-of-track record */
#define IBM_IAM_LEN 1 /* plus prologue */
#define IBM_IDAM 0xFE /* sector header */
#define IBM_IDAM_LEN 7 /* plus prologue */
#define IBM_DAM1 0xF8 /* sector data (type 1) */
#define IBM_DAM2 0xFB /* sector data (type 2) */
#define IBM_TRS80DAM1 0xF9 /* sector data (TRS-80 directory) */
#define IBM_TRS80DAM2 0xFA /* sector data (TRS-80 directory) */
#define IBM_DAM_LEN 1 /* plus prologue and user data */
/* Length of a DAM record is determined by the previous sector header. */
struct IbmIdam
{
uint8_t id;
uint8_t track;
uint8_t side;
uint8_t sector;
uint8_t sectorSize;
uint8_t crc[2];
};
class Encoder;
class Decoder;
class DecoderProto;
class EncoderProto;
extern std::unique_ptr<Decoder> createIbmDecoder(const DecoderProto& config);
extern std::unique_ptr<Encoder> createIbmEncoder(const EncoderProto& config);
#endif

43
arch/ibm/ibm.proto Normal file
View File

@@ -0,0 +1,43 @@
syntax = "proto2";
import "lib/common.proto";
message IbmDecoderProto {
// Next: 11
message TrackdataProto {
optional int32 track = 7 [(help) = "if set, the format applies only to this track"];
optional int32 head = 8 [(help) = "if set, the format applies only to this head"];
optional bool ignore_side_byte = 2 [default = false, (help) = "ignore side byte in sector header"];
optional bool ignore_track_byte = 6 [default = false, (help) = "ignore track byte in sector header"];
optional bool invert_side_byte = 4 [default = false, (help) = "invert the side byte in the sector header"];
repeated int32 ignore_sector = 10 [(help) = "sectors with these IDs will not be read"];
}
repeated TrackdataProto trackdata = 1;
}
message IbmEncoderProto {
// Next: 20
message TrackdataProto {
optional int32 track = 15 [(help) = "if set, the format applies only to this track"];
optional int32 head = 16 [(help) = "if set, the format applies only to this head"];
optional bool emit_iam = 3 [default=true, (help) = "whether to emit an IAM record"];
optional double target_clock_period_us = 5 [default=4, (help) = "data clock rate on target disk"];
optional bool use_fm = 6 [default=false, (help) = "whether to use FM encoding rather than MFM"];
optional int32 idam_byte = 7 [default=0x5554, (help) = "16-bit raw bit pattern of IDAM byte"];
optional int32 dam_byte = 8 [default=0x5545, (help) = "16-bit raw bit pattern of DAM byte"];
optional int32 gap0 = 9 [default=80, (help) = "size of gap 1 (the post-index gap)"];
optional int32 gap1 = 10 [default=50, (help) = "size of gap 2 (the post-ID gap)"];
optional int32 gap2 = 11 [default=22, (help) = "size of gap 3 (the pre-data gap)"];
optional int32 gap3 = 12 [default=80, (help) = "size of gap 4 (the post-data or format gap)"];
optional bool invert_side_byte = 19 [default=false, (help) = "invert the side byte before writing"];
optional int32 gap_fill_byte = 18 [default=0x9254, (help) = "16-bit raw bit pattern of gap fill byte"];
optional double target_rotational_period_ms = 1 [default=200, (help) = "rotational period of target disk"];
}
repeated TrackdataProto trackdata = 1;
}

195
arch/macintosh/decoder.cc Normal file
View File

@@ -0,0 +1,195 @@
#include "globals.h"
#include "fluxmap.h"
#include "decoders/fluxmapreader.h"
#include "protocol.h"
#include "decoders/decoders.h"
#include "sector.h"
#include "macintosh.h"
#include "bytes.h"
#include "fmt/format.h"
#include <string.h>
#include <algorithm>
const FluxPattern SECTOR_RECORD_PATTERN(24, MAC_SECTOR_RECORD);
const FluxPattern DATA_RECORD_PATTERN(24, MAC_DATA_RECORD);
const FluxMatchers ANY_RECORD_PATTERN(
{&SECTOR_RECORD_PATTERN, &DATA_RECORD_PATTERN});
static int decode_data_gcr(uint8_t gcr)
{
switch (gcr)
{
#define GCR_ENTRY(gcr, data) \
case gcr: \
return data;
#include "data_gcr.h"
#undef GCR_ENTRY
}
return -1;
}
/* This is extremely inspired by the MESS implementation, written by Nathan
* Woods and R. Belmont:
* https://github.com/mamedev/mame/blob/4263a71e64377db11392c458b580c5ae83556bc7/src/lib/formats/ap_dsk35.cpp
*/
static Bytes decode_crazy_data(const Bytes& input, Sector::Status& status)
{
Bytes output;
ByteWriter bw(output);
ByteReader br(input);
static const int LOOKUP_LEN = MAC_SECTOR_LENGTH / 3;
uint8_t b1[LOOKUP_LEN + 1];
uint8_t b2[LOOKUP_LEN + 1];
uint8_t b3[LOOKUP_LEN + 1];
for (int i = 0; i <= LOOKUP_LEN; i++)
{
uint8_t w4 = br.read_8();
uint8_t w1 = br.read_8();
uint8_t w2 = br.read_8();
uint8_t w3 = (i != 174) ? br.read_8() : 0;
b1[i] = (w1 & 0x3F) | ((w4 << 2) & 0xC0);
b2[i] = (w2 & 0x3F) | ((w4 << 4) & 0xC0);
b3[i] = (w3 & 0x3F) | ((w4 << 6) & 0xC0);
}
/* Copy from the user's buffer to our buffer, while computing
* the three-byte data checksum. */
uint32_t c1 = 0;
uint32_t c2 = 0;
uint32_t c3 = 0;
unsigned count = 0;
for (;;)
{
c1 = (c1 & 0xFF) << 1;
if (c1 & 0x0100)
c1++;
uint8_t val = b1[count] ^ c1;
c3 += val;
if (c1 & 0x0100)
{
c3++;
c1 &= 0xFF;
}
bw.write_8(val);
val = b2[count] ^ c3;
c2 += val;
if (c3 > 0xFF)
{
c2++;
c3 &= 0xFF;
}
bw.write_8(val);
if (output.size() == 524)
break;
val = b3[count] ^ c2;
c1 += val;
if (c2 > 0xFF)
{
c1++;
c2 &= 0xFF;
}
bw.write_8(val);
count++;
}
uint8_t c4 = ((c1 & 0xC0) >> 6) | ((c2 & 0xC0) >> 4) | ((c3 & 0xC0) >> 2);
c1 &= 0x3f;
c2 &= 0x3f;
c3 &= 0x3f;
c4 &= 0x3f;
uint8_t g4 = br.read_8();
uint8_t g3 = br.read_8();
uint8_t g2 = br.read_8();
uint8_t g1 = br.read_8();
if ((g4 == c4) && (g3 == c3) && (g2 == c2) && (g1 == c1))
status = Sector::OK;
return output;
}
uint8_t decode_side(uint8_t side)
{
/* Mac disks, being weird, use the side byte to encode both the side (in
* bit 5) and also whether we're above track 0x3f (in bit 0).
*/
return !!(side & 0x20);
}
class MacintoshDecoder : public Decoder
{
public:
MacintoshDecoder(const DecoderProto& config): Decoder(config) {}
nanoseconds_t advanceToNextRecord() override
{
return seekToPattern(ANY_RECORD_PATTERN);
}
void decodeSectorRecord() override
{
if (readRaw24() != MAC_SECTOR_RECORD)
return;
/* Read header. */
auto header = toBytes(readRawBits(7 * 8)).slice(0, 7);
uint8_t encodedTrack = decode_data_gcr(header[0]);
if (encodedTrack != (_sector->physicalTrack & 0x3f))
return;
uint8_t encodedSector = decode_data_gcr(header[1]);
uint8_t encodedSide = decode_data_gcr(header[2]);
uint8_t formatByte = decode_data_gcr(header[3]);
uint8_t wantedsum = decode_data_gcr(header[4]);
if (encodedSector > 11)
return;
_sector->logicalTrack = _sector->physicalTrack;
_sector->logicalSide = decode_side(encodedSide);
_sector->logicalSector = encodedSector;
uint8_t gotsum =
(encodedTrack ^ encodedSector ^ encodedSide ^ formatByte) & 0x3f;
if (wantedsum == gotsum)
_sector->status =
Sector::DATA_MISSING; /* unintuitive but correct */
}
void decodeDataRecord() override
{
if (readRaw24() != MAC_DATA_RECORD)
return;
/* Read data. */
readRawBits(8); /* skip spare byte */
auto inputbuffer = toBytes(readRawBits(MAC_ENCODED_SECTOR_LENGTH * 8))
.slice(0, MAC_ENCODED_SECTOR_LENGTH);
for (unsigned i = 0; i < inputbuffer.size(); i++)
inputbuffer[i] = decode_data_gcr(inputbuffer[i]);
_sector->status = Sector::BAD_CHECKSUM;
Bytes userData = decode_crazy_data(inputbuffer, _sector->status);
_sector->data.clear();
_sector->data.writer()
.append(userData.slice(12, 512))
.append(userData.slice(0, 12));
}
};
std::unique_ptr<Decoder> createMacintoshDecoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new MacintoshDecoder(config));
}

258
arch/macintosh/encoder.cc Normal file
View File

@@ -0,0 +1,258 @@
#include "globals.h"
#include "decoders/decoders.h"
#include "encoders/encoders.h"
#include "macintosh.h"
#include "crc.h"
#include "readerwriter.h"
#include "image.h"
#include "fmt/format.h"
#include "lib/encoders/encoders.pb.h"
#include "lib/layout.h"
#include "arch/macintosh/macintosh.pb.h"
#include <ctype.h>
static bool lastBit;
static double clockRateUsForTrack(unsigned track)
{
if (track < 16)
return 2.63;
if (track < 32)
return 2.89;
if (track < 48)
return 3.20;
if (track < 64)
return 3.57;
return 3.98;
}
static unsigned sectorsForTrack(unsigned track)
{
if (track < 16)
return 12;
if (track < 32)
return 11;
if (track < 48)
return 10;
if (track < 64)
return 9;
return 8;
}
static int encode_data_gcr(uint8_t gcr)
{
switch (gcr)
{
#define GCR_ENTRY(gcr, data) \
case data: \
return gcr;
#include "data_gcr.h"
#undef GCR_ENTRY
}
return -1;
}
/* This is extremely inspired by the MESS implementation, written by Nathan
* Woods and R. Belmont:
* https://github.com/mamedev/mame/blob/4263a71e64377db11392c458b580c5ae83556bc7/src/lib/formats/ap_dsk35.cpp
*/
static Bytes encode_crazy_data(const Bytes& input)
{
Bytes output;
ByteWriter bw(output);
ByteReader br(input);
uint8_t w1, w2, w3, w4;
static const int LOOKUP_LEN = MAC_SECTOR_LENGTH / 3;
uint8_t b1[LOOKUP_LEN + 1];
uint8_t b2[LOOKUP_LEN + 1];
uint8_t b3[LOOKUP_LEN + 1];
uint32_t c1 = 0;
uint32_t c2 = 0;
uint32_t c3 = 0;
for (int j = 0;; j++)
{
c1 = (c1 & 0xff) << 1;
if (c1 & 0x0100)
c1++;
uint8_t val = br.read_8();
c3 += val;
if (c1 & 0x0100)
{
c3++;
c1 &= 0xff;
}
b1[j] = (val ^ c1) & 0xff;
val = br.read_8();
c2 += val;
if (c3 > 0xff)
{
c2++;
c3 &= 0xff;
}
b2[j] = (val ^ c3) & 0xff;
if (br.pos == 524)
break;
val = br.read_8();
c1 += val;
if (c2 > 0xff)
{
c1++;
c2 &= 0xff;
}
b3[j] = (val ^ c2) & 0xff;
}
uint32_t c4 = ((c1 & 0xc0) >> 6) | ((c2 & 0xc0) >> 4) | ((c3 & 0xc0) >> 2);
b3[LOOKUP_LEN] = 0;
for (int i = 0; i <= LOOKUP_LEN; i++)
{
w1 = b1[i] & 0x3f;
w2 = b2[i] & 0x3f;
w3 = b3[i] & 0x3f;
w4 = ((b1[i] & 0xc0) >> 2);
w4 |= ((b2[i] & 0xc0) >> 4);
w4 |= ((b3[i] & 0xc0) >> 6);
bw.write_8(w4);
bw.write_8(w1);
bw.write_8(w2);
if (i != LOOKUP_LEN)
bw.write_8(w3);
}
bw.write_8(c4 & 0x3f);
bw.write_8(c3 & 0x3f);
bw.write_8(c2 & 0x3f);
bw.write_8(c1 & 0x3f);
return output;
}
static void write_bits(
std::vector<bool>& bits, unsigned& cursor, const std::vector<bool>& src)
{
for (bool bit : src)
{
if (cursor < bits.size())
bits[cursor++] = bit;
}
}
static void write_bits(
std::vector<bool>& bits, unsigned& cursor, uint64_t data, int width)
{
cursor += width;
for (int i = 0; i < width; i++)
{
unsigned pos = cursor - i - 1;
if (pos < bits.size())
bits[pos] = data & 1;
data >>= 1;
}
}
static uint8_t encode_side(uint8_t track, uint8_t side)
{
/* Mac disks, being weird, use the side byte to encode both the side (in
* bit 5) and also whether we're above track 0x3f (in bit 0).
*/
return (side ? 0x20 : 0x00) | ((track > 0x3f) ? 0x01 : 0x00);
}
static void write_sector(std::vector<bool>& bits,
unsigned& cursor,
const std::shared_ptr<const Sector>& sector)
{
if ((sector->data.size() != 512) && (sector->data.size() != 524))
error("unsupported sector size --- you must pick 512 or 524");
write_bits(bits, cursor, 0xff, 1 * 8); /* pad byte */
for (int i = 0; i < 7; i++)
write_bits(bits, cursor, 0xff3fcff3fcffLL, 6 * 8); /* sync */
write_bits(bits, cursor, MAC_SECTOR_RECORD, 3 * 8);
uint8_t encodedTrack = sector->logicalTrack & 0x3f;
uint8_t encodedSector = sector->logicalSector;
uint8_t encodedSide =
encode_side(sector->logicalTrack, sector->logicalSide);
uint8_t formatByte = MAC_FORMAT_BYTE;
uint8_t headerChecksum =
(encodedTrack ^ encodedSector ^ encodedSide ^ formatByte) & 0x3f;
write_bits(bits, cursor, encode_data_gcr(encodedTrack), 1 * 8);
write_bits(bits, cursor, encode_data_gcr(encodedSector), 1 * 8);
write_bits(bits, cursor, encode_data_gcr(encodedSide), 1 * 8);
write_bits(bits, cursor, encode_data_gcr(formatByte), 1 * 8);
write_bits(bits, cursor, encode_data_gcr(headerChecksum), 1 * 8);
write_bits(bits, cursor, 0xdeaaff, 3 * 8);
write_bits(bits, cursor, 0xff3fcff3fcffLL, 6 * 8); /* sync */
write_bits(bits, cursor, MAC_DATA_RECORD, 3 * 8);
write_bits(bits, cursor, encode_data_gcr(sector->logicalSector), 1 * 8);
Bytes wireData;
wireData.writer()
.append(sector->data.slice(512, 12))
.append(sector->data.slice(0, 512));
for (uint8_t b : encode_crazy_data(wireData))
write_bits(bits, cursor, encode_data_gcr(b), 1 * 8);
write_bits(bits, cursor, 0xdeaaff, 3 * 8);
}
class MacintoshEncoder : public Encoder
{
public:
MacintoshEncoder(const EncoderProto& config):
Encoder(config),
_config(config.macintosh())
{
}
public:
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{
double clockRateUs = clockRateUsForTrack(trackInfo->logicalTrack);
int bitsPerRevolution = 200000.0 / clockRateUs;
std::vector<bool> bits(bitsPerRevolution);
unsigned cursor = 0;
fillBitmapTo(bits,
cursor,
_config.post_index_gap_us() / clockRateUs,
{true, false});
lastBit = false;
for (const auto& sector : sectors)
write_sector(bits, cursor, sector);
if (cursor >= bits.size())
error("track data overrun by {} bits", cursor - bits.size());
fillBitmapTo(bits, cursor, bits.size(), {true, false});
std::unique_ptr<Fluxmap> fluxmap(new Fluxmap);
fluxmap->appendBits(
bits, calculatePhysicalClockPeriod(clockRateUs * 1e3, 200e6));
return fluxmap;
}
private:
const MacintoshEncoderProto& _config;
};
std::unique_ptr<Encoder> createMacintoshEncoder(const EncoderProto& config)
{
return std::unique_ptr<Encoder>(new MacintoshEncoder(config));
}

View File

@@ -0,0 +1,23 @@
#ifndef MACINTOSH_H
#define MACINTOSH_H
#define MAC_SECTOR_RECORD 0xd5aa96 /* 1101 0101 1010 1010 1001 0110 */
#define MAC_DATA_RECORD 0xd5aaad /* 1101 0101 1010 1010 1010 1101 */
#define MAC_SECTOR_LENGTH 524 /* yes, really */
#define MAC_ENCODED_SECTOR_LENGTH 703
#define MAC_FORMAT_BYTE 0x22
#define MAC_TRACKS_PER_DISK 80
class Encoder;
class Decoder;
class DecoderProto;
class EncoderProto;
extern std::unique_ptr<Decoder> createMacintoshDecoder(
const DecoderProto& config);
extern std::unique_ptr<Encoder> createMacintoshEncoder(
const EncoderProto& config);
#endif

View File

@@ -0,0 +1,11 @@
syntax = "proto2";
import "lib/common.proto";
message MacintoshDecoderProto {}
message MacintoshEncoderProto {
optional double post_index_gap_us = 1 [default = 0.0,
(help) = "post-index gap before first sector header (microseconds)."];
}

286
arch/micropolis/decoder.cc Normal file
View File

@@ -0,0 +1,286 @@
#include "globals.h"
#include "fluxmap.h"
#include "decoders/fluxmapreader.h"
#include "decoders/decoders.h"
#include "sector.h"
#include "micropolis.h"
#include "bytes.h"
#include "fmt/format.h"
#include "lib/decoders/decoders.pb.h"
/* The sector has a preamble of MFM 0x00s and uses 0xFF as a sync pattern.
*
* 00 00 00 F F
* 0000 0000 0000 0000 0000 0000 0101 0101 0101 0101
* A A A A A A 5 5 5 5
*/
static const FluxPattern SECTOR_SYNC_PATTERN(64, 0xAAAAAAAAAAAA5555LL);
/* Pattern to skip past current SYNC. */
static const FluxPattern SECTOR_ADVANCE_PATTERN(64, 0xAAAAAAAAAAAAAAAALL);
/* Standard Micropolis checksum. Adds all bytes, with carry. */
uint8_t micropolisChecksum(const Bytes& bytes)
{
ByteReader br(bytes);
uint16_t sum = 0;
while (!br.eof())
{
if (sum > 0xFF)
{
sum -= 0x100 - 1;
}
sum += br.read_8();
}
/* The last carry is ignored */
return sum & 0xFF;
}
/* Vector MZOS does not use the standard Micropolis checksum.
* The checksum is initially 0.
* For each data byte in the 256-byte payload, rotate left,
* carrying bit 7 to bit 0. XOR with the current checksum.
*
* Unlike the Micropolis checksum, this does not cover the 12-byte
* header (track, sector, 10 OS-specific bytes.)
*/
uint8_t mzosChecksum(const Bytes& bytes)
{
ByteReader br(bytes);
uint8_t checksum = 0;
uint8_t databyte;
while (!br.eof())
{
databyte = br.read_8();
checksum ^= ((databyte << 1) | (databyte >> 7));
}
return checksum;
}
static uint8_t b(uint32_t field, uint8_t pos)
{
return (field >> pos) & 1;
}
static uint8_t eccNextBit(uint32_t ecc, uint8_t data_bit)
{
// This is 0x81932080 which is 0x0104C981 with reversed bits
return b(ecc, 7) ^ b(ecc, 13) ^ b(ecc, 16) ^ b(ecc, 17) ^ b(ecc, 20)
^ b(ecc, 23) ^ b(ecc, 24) ^ b(ecc, 31) ^ data_bit;
}
uint32_t vectorGraphicEcc(const Bytes& bytes)
{
uint32_t e = 0;
Bytes payloadBytes = bytes.slice(0, bytes.size()-4);
ByteReader payload(payloadBytes);
while (!payload.eof()) {
uint8_t byte = payload.read_8();
for (int i = 0; i < 8; i++) {
e = (e << 1) | eccNextBit(e, byte >> 7);
byte <<= 1;
}
}
Bytes trailerBytes = bytes.slice(bytes.size()-4);
ByteReader trailer(trailerBytes);
uint32_t res = e;
while (!trailer.eof()) {
uint8_t byte = trailer.read_8();
for (int i = 0; i < 8; i++) {
res = (res << 1) | eccNextBit(e, byte >> 7);
e <<= 1;
byte <<= 1;
}
}
return res;
}
/* Fixes bytes when possible, returning true if changed. */
static bool vectorGraphicEccFix(Bytes& bytes, uint32_t syndrome)
{
uint32_t ecc = syndrome;
int pos = (MICROPOLIS_ENCODED_SECTOR_SIZE-5)*8+7;
bool aligned = false;
while ((ecc & 0xff000000) == 0) {
pos += 8;
ecc <<= 8;
}
for (; pos >= 0; pos--) {
bool bit = ecc & 1;
ecc >>= 1;
if (bit)
ecc ^= 0x808264c0;
if ((ecc & 0xff07ffff) == 0)
aligned = true;
if (aligned && pos % 8 == 0)
break;
}
if (pos < 0)
return false;
bytes[pos/8] ^= ecc >> 16;
return true;
}
class MicropolisDecoder : public Decoder
{
public:
MicropolisDecoder(const DecoderProto& config):
Decoder(config),
_config(config.micropolis())
{
_checksumType = _config.checksum_type();
}
nanoseconds_t advanceToNextRecord() override
{
nanoseconds_t now = tell().ns();
/* For all but the first sector, seek to the next sector pulse.
* The first sector does not contain the sector pulse in the fluxmap.
*/
if (now != 0)
{
seekToIndexMark();
now = tell().ns();
}
/* Discard a possible partial sector at the end of the track.
* This partial sector could be mistaken for a conflicted sector, if
* whatever data read happens to match the checksum of 0, which is
* rare, but has been observed on some disks. There's 570uS of slack in
* each sector, after accounting for preamble, data, and postamble.
*/
if (now > (getFluxmapDuration() - 12.0e6))
{
seekToIndexMark();
return 0;
}
nanoseconds_t clock = seekToPattern(SECTOR_SYNC_PATTERN);
auto syncDelta = tell().ns() - now;
/* Due to the weak nature of the Micropolis SYNC patern,
* it's possible to detect a false SYNC during the gap
* between the sector pulse and the write gate. If the SYNC
* is detected less than 100uS after the sector pulse, search
* for another valid SYNC.
*
* Reference: Vector Micropolis Disk Controller Board Technical
* Information Manual, pp. 1-16.
*/
if ((syncDelta > 0) && (syncDelta < 100e3))
{
seekToPattern(SECTOR_ADVANCE_PATTERN);
clock = seekToPattern(SECTOR_SYNC_PATTERN);
}
_sector->headerStartTime = tell().ns();
/* seekToPattern() can skip past the index hole, if this happens
* too close to the end of the Fluxmap, discard the sector. The
* preamble was expected to be 640uS long.
*/
if (_sector->headerStartTime > (getFluxmapDuration() - 11.3e6))
{
return 0;
}
return clock;
}
void decodeSectorRecord() override
{
readRawBits(48);
auto rawbits = readRawBits(MICROPOLIS_ENCODED_SECTOR_SIZE * 16);
auto bytes =
decodeFmMfm(rawbits).slice(0, MICROPOLIS_ENCODED_SECTOR_SIZE);
bool eccPresent = bytes[274] == 0xaa;
uint32_t ecc = 0;
if (_config.ecc_type() == MicropolisDecoderProto::VECTOR && eccPresent) {
ecc = vectorGraphicEcc(bytes.slice(0, 274));
if (ecc != 0) {
vectorGraphicEccFix(bytes, ecc);
ecc = vectorGraphicEcc(bytes.slice(0, 274));
}
}
ByteReader br(bytes);
int syncByte = br.read_8(); /* sync */
if (syncByte != 0xFF)
return;
_sector->logicalTrack = br.read_8();
_sector->logicalSide = _sector->physicalSide;
_sector->logicalSector = br.read_8();
if (_sector->logicalSector > 15)
return;
if (_sector->logicalTrack > 76)
return;
if (_sector->logicalTrack != _sector->physicalTrack)
return;
br.read(10); /* OS data or padding */
auto data = br.read(MICROPOLIS_PAYLOAD_SIZE);
uint8_t wantChecksum = br.read_8();
/* If not specified, automatically determine the checksum type.
* Once the checksum type is determined, it will be used for the
* entire disk.
*/
if (_checksumType == MicropolisDecoderProto::AUTO)
{
/* Calculate both standard Micropolis (MDOS, CP/M, OASIS) and MZOS
* checksums */
if (wantChecksum == micropolisChecksum(bytes.slice(1, 2 + 266)))
{
_checksumType = MicropolisDecoderProto::MICROPOLIS;
}
else if (wantChecksum ==
mzosChecksum(bytes.slice(
MICROPOLIS_HEADER_SIZE, MICROPOLIS_PAYLOAD_SIZE)))
{
_checksumType = MicropolisDecoderProto::MZOS;
std::cout << "Note: MZOS checksum detected." << std::endl;
}
}
uint8_t gotChecksum;
if (_checksumType == MicropolisDecoderProto::MZOS)
{
gotChecksum = mzosChecksum(
bytes.slice(MICROPOLIS_HEADER_SIZE, MICROPOLIS_PAYLOAD_SIZE));
}
else
{
gotChecksum = micropolisChecksum(bytes.slice(1, 2 + 266));
}
br.read(5); /* 4 byte ECC and ECC-present flag */
if (_config.sector_output_size() == MICROPOLIS_PAYLOAD_SIZE)
_sector->data = data;
else if (_config.sector_output_size() == MICROPOLIS_ENCODED_SECTOR_SIZE)
_sector->data = bytes;
else
error("Sector output size may only be 256 or 275");
if (wantChecksum == gotChecksum && (!eccPresent || ecc == 0))
_sector->status = Sector::OK;
else
_sector->status = Sector::BAD_CHECKSUM;
}
private:
const MicropolisDecoderProto& _config;
MicropolisDecoderProto_ChecksumType
_checksumType; /* -1 = auto, 1 = Micropolis, 2=MZOS */
};
std::unique_ptr<Decoder> createMicropolisDecoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new MicropolisDecoder(config));
}

133
arch/micropolis/encoder.cc Normal file
View File

@@ -0,0 +1,133 @@
#include "globals.h"
#include "micropolis.h"
#include "sector.h"
#include "decoders/decoders.h"
#include "encoders/encoders.h"
#include "image.h"
#include "lib/encoders/encoders.pb.h"
static void write_sector(std::vector<bool>& bits,
unsigned& cursor,
const std::shared_ptr<const Sector>& sector,
MicropolisEncoderProto::EccType eccType)
{
if ((sector->data.size() != 256) &&
(sector->data.size() != MICROPOLIS_ENCODED_SECTOR_SIZE))
error("unsupported sector size --- you must pick 256 or 275");
int fullSectorSize = 40 + MICROPOLIS_ENCODED_SECTOR_SIZE + 40 + 35;
auto fullSector = std::make_shared<std::vector<uint8_t>>();
fullSector->reserve(fullSectorSize);
/* sector preamble */
for (int i = 0; i < 40; i++)
fullSector->push_back(0);
Bytes sectorData;
if (sector->data.size() == MICROPOLIS_ENCODED_SECTOR_SIZE)
{
if (sector->data[0] != 0xFF)
error(
"275 byte sector doesn't start with sync byte 0xFF. "
"Corrupted sector");
uint8_t wantChecksum = sector->data[1 + 2 + 266];
uint8_t gotChecksum =
micropolisChecksum(sector->data.slice(1, 2 + 266));
if (wantChecksum != gotChecksum)
std::cerr << "Warning: checksum incorrect. Sector: "
<< sector->logicalSector << std::endl;
sectorData = sector->data;
}
else
{
ByteWriter writer(sectorData);
writer.write_8(0xff); /* Sync */
writer.write_8(sector->logicalTrack);
writer.write_8(sector->logicalSector);
for (int i = 0; i < 10; i++)
writer.write_8(0); /* Padding */
writer += sector->data;
writer.write_8(micropolisChecksum(sectorData.slice(1)));
uint8_t eccPresent = 0;
uint32_t ecc = 0;
if (eccType == MicropolisEncoderProto::VECTOR) {
eccPresent = 0xaa;
ecc = vectorGraphicEcc(sectorData + Bytes(4));
}
writer.write_be32(ecc);
writer.write_8(eccPresent);
}
for (uint8_t b : sectorData)
fullSector->push_back(b);
/* sector postamble */
for (int i = 0; i < 40; i++)
fullSector->push_back(0);
/* filler */
for (int i = 0; i < 35; i++)
fullSector->push_back(0);
if (fullSector->size() != fullSectorSize)
error("sector mismatched length");
bool lastBit = false;
encodeMfm(bits, cursor, fullSector, lastBit);
/* filler */
for (int i = 0; i < 5; i++)
{
bits[cursor++] = 1;
bits[cursor++] = 0;
}
}
class MicropolisEncoder : public Encoder
{
public:
MicropolisEncoder(const EncoderProto& config):
Encoder(config),
_config(config.micropolis())
{
}
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{
int bitsPerRevolution =
(_config.rotational_period_ms() * 1e3) / _config.clock_period_us();
std::vector<bool> bits(bitsPerRevolution);
std::vector<unsigned> indexes;
unsigned prev_cursor = 0;
unsigned cursor = 0;
for (const auto& sectorData : sectors) {
indexes.push_back(cursor);
prev_cursor = cursor;
write_sector(bits, cursor, sectorData, _config.ecc_type());
}
indexes.push_back(prev_cursor + (cursor - prev_cursor)/2);
indexes.push_back(cursor);
if (cursor != bits.size())
error("track data mismatched length");
std::unique_ptr<Fluxmap> fluxmap(new Fluxmap);
nanoseconds_t clockPeriod = calculatePhysicalClockPeriod(
_config.clock_period_us() * 1e3,
_config.rotational_period_ms() * 1e6);
auto pos = bits.begin();
for (int i = 1; i < indexes.size(); i++) {
auto end = bits.begin() + indexes[i];
fluxmap->appendBits(std::vector<bool>(pos, end), clockPeriod);
fluxmap->appendIndex();
pos = end;
}
return fluxmap;
}
private:
const MicropolisEncoderProto& _config;
};
std::unique_ptr<Encoder> createMicropolisEncoder(const EncoderProto& config)
{
return std::unique_ptr<Encoder>(new MicropolisEncoder(config));
}

View File

@@ -0,0 +1,22 @@
#ifndef MICROPOLIS_H
#define MICROPOLIS_H
#define MICROPOLIS_PAYLOAD_SIZE (256)
#define MICROPOLIS_HEADER_SIZE (1 + 2 + 10)
#define MICROPOLIS_ENCODED_SECTOR_SIZE \
(MICROPOLIS_HEADER_SIZE + MICROPOLIS_PAYLOAD_SIZE + 6)
class Decoder;
class Encoder;
class EncoderProto;
class DecoderProto;
extern std::unique_ptr<Decoder> createMicropolisDecoder(
const DecoderProto& config);
extern std::unique_ptr<Encoder> createMicropolisEncoder(
const EncoderProto& config);
extern uint8_t micropolisChecksum(const Bytes& bytes);
extern uint32_t vectorGraphicEcc(const Bytes& bytes);
#endif

View File

@@ -0,0 +1,37 @@
syntax = "proto2";
import "lib/common.proto";
message MicropolisDecoderProto {
enum ChecksumType {
AUTO = 0;
MICROPOLIS = 1;
MZOS = 2;
}
enum EccType {
NONE = 0;
VECTOR = 1;
}
optional int32 sector_output_size = 1 [default = 256,
(help) = "How much of the raw sector should be saved. Must be 256 or 275"];
optional ChecksumType checksum_type = 2 [default = AUTO,
(help) = "Checksum type to use: AUTO, MICROPOLIS, MZOS"];
optional EccType ecc_type = 3 [default = NONE,
(help) = "ECC type to use: NONE, VECTOR"];
}
message MicropolisEncoderProto {
enum EccType {
NONE = 0;
VECTOR = 1;
}
optional double clock_period_us = 1
[ default = 2.0, (help) = "clock rate on the real device" ];
optional double rotational_period_ms = 2
[ default = 200.0, (help) = "rotational period on the real device" ];
optional EccType ecc_type = 3 [default = NONE,
(help) = "ECC type to use for IMG data: NONE, VECTOR"];
}

83
arch/mx/decoder.cc Normal file
View File

@@ -0,0 +1,83 @@
#include "globals.h"
#include "decoders/decoders.h"
#include "mx/mx.h"
#include "crc.h"
#include "fluxmap.h"
#include "decoders/fluxmapreader.h"
#include "sector.h"
#include <string.h>
const int SECTOR_SIZE = 256;
/*
* MX disks are a bunch of sectors glued together with no gaps or sync markers,
* following a single beginning-of-track synchronisation and identification
* sequence.
*/
/* FM beginning of track marker:
* 0 0 f 3 decoded nibbles
* 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1
* 1010 1010 1010 1010 1111 1111 1010 1111
* a a a a f f a f encoded nibbles
*/
const FluxPattern ID_PATTERN(32, 0xaaaaffaf);
class MxDecoder : public Decoder
{
public:
MxDecoder(const DecoderProto& config): Decoder(config) {}
void beginTrack() override
{
_clock = _sector->clock = seekToPattern(ID_PATTERN);
_currentSector = 0;
}
nanoseconds_t advanceToNextRecord() override
{
if (_currentSector == 11)
{
/* That was the last sector on the disk. */
return 0;
}
else
return _clock;
}
void decodeSectorRecord() override
{
/* Skip the ID pattern and track word, which is only present on the
* first sector. We don't trust the track word because some driver
* don't write it correctly. */
if (_currentSector == 0)
readRawBits(64);
auto bits = readRawBits((SECTOR_SIZE + 2) * 16);
auto bytes = decodeFmMfm(bits).slice(0, SECTOR_SIZE + 2);
uint16_t gotChecksum = 0;
ByteReader br(bytes);
for (int i = 0; i < (SECTOR_SIZE / 2); i++)
gotChecksum += br.read_be16();
uint16_t wantChecksum = br.read_be16();
_sector->logicalTrack = _sector->physicalTrack;
_sector->logicalSide = _sector->physicalSide;
_sector->logicalSector = _currentSector;
_sector->data = bytes.slice(0, SECTOR_SIZE).swab();
_sector->status =
(gotChecksum == wantChecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
_currentSector++;
}
private:
nanoseconds_t _clock;
int _currentSector;
};
std::unique_ptr<Decoder> createMxDecoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new MxDecoder(config));
}

8
arch/mx/mx.h Normal file
View File

@@ -0,0 +1,8 @@
#ifndef MX_H
#define MX_H
#include "decoders/decoders.h"
extern std::unique_ptr<Decoder> createMxDecoder(const DecoderProto& config);
#endif

4
arch/mx/mx.proto Normal file
View File

@@ -0,0 +1,4 @@
syntax = "proto2";
message MxDecoderProto {}

186
arch/northstar/decoder.cc Normal file
View File

@@ -0,0 +1,186 @@
/* Decoder for North Star 10-sector hard-sectored disks.
*
* Supports both single- and double-density. For the sector format and
* checksum algorithm, see pp. 33 of the North Star Double Density Controller
* manual:
*
* http://bitsavers.org/pdf/northstar/boards/Northstar_MDS-A-D_1978.pdf
*
* North Star disks do not contain any track/head/sector information
* encoded in the sector record. For this reason, we have to be absolutely
* sure that the hardSectorId is correct.
*/
#include "globals.h"
#include "fluxmap.h"
#include "decoders/fluxmapreader.h"
#include "decoders/decoders.h"
#include "sector.h"
#include "northstar.h"
#include "bytes.h"
#include "lib/decoders/decoders.pb.h"
#include "fmt/format.h"
#define MFM_ID 0xaaaaaaaaaaaa5545LL
#define FM_ID 0xaaaaaaaaaaaaffefLL
/*
* MFM sectors have 32 bytes of 00's followed by two sync characters,
* specified in the North Star MDS manual as 0xFBFB.
*
* This is true for most disks; however, I found a few disks, including an
* original North Star DOS/BASIC v2.2.1 DQ disk) that uses 0xFBnn, where
* nn is an incrementing pattern.
*
* 00 00 00 F B
* 0000 0000 0000 0000 0000 0000 0101 0101 0100 0101
* A A A A A A 5 5 4 5
*/
static const FluxPattern MFM_PATTERN(64, MFM_ID);
/* FM sectors have 16 bytes of 00's followed by 0xFB.
* 00 FB
* 0000 0000 1111 1111 1110 1111
* A A F F E F
*/
static const FluxPattern FM_PATTERN(64, FM_ID);
const FluxMatchers ANY_SECTOR_PATTERN({
&MFM_PATTERN,
&FM_PATTERN,
});
/* Checksum is initially 0.
* For each data byte, XOR with the current checksum.
* Rotate checksum left, carrying bit 7 to bit 0.
*/
uint8_t northstarChecksum(const Bytes& bytes)
{
ByteReader br(bytes);
uint8_t checksum = 0;
while (!br.eof())
{
checksum ^= br.read_8();
checksum = ((checksum << 1) | ((checksum >> 7)));
}
return checksum;
}
class NorthstarDecoder : public Decoder
{
public:
NorthstarDecoder(const DecoderProto& config):
Decoder(config),
_config(config.northstar())
{
}
/* Search for FM or MFM sector record */
nanoseconds_t advanceToNextRecord() override
{
nanoseconds_t now = tell().ns();
/* For all but the first sector, seek to the next sector pulse.
* The first sector does not contain the sector pulse in the fluxmap.
*/
if (now != 0)
{
seekToIndexMark();
now = tell().ns();
}
/* Discard a possible partial sector at the end of the track.
* This partial sector could be mistaken for a conflicted sector, if
* whatever data read happens to match the checksum of 0, which is
* rare, but has been observed on some disks.
*/
if (now > (getFluxmapDuration() - 21e6))
{
seekToIndexMark();
return 0;
}
int msSinceIndex = std::round(now / 1e6);
/* Note that the seekToPattern ignores the sector pulses, so if
* a sector is not found for some reason, the seek will advance
* past one or more sector pulses. For this reason, calculate
* _hardSectorId after the sector header is found.
*/
nanoseconds_t clock = seekToPattern(ANY_SECTOR_PATTERN);
_sector->headerStartTime = tell().ns();
/* Discard a possible partial sector. */
if (_sector->headerStartTime > (getFluxmapDuration() - 21e6))
{
return 0;
}
int sectorFoundTimeRaw = std::round(_sector->headerStartTime / 1e6);
int sectorFoundTime;
/* Round time to the nearest 20ms */
if ((sectorFoundTimeRaw % 20) < 10)
{
sectorFoundTime = (sectorFoundTimeRaw / 20) * 20;
}
else
{
sectorFoundTime = ((sectorFoundTimeRaw + 20) / 20) * 20;
}
/* Calculate the sector ID based on time since the index */
_hardSectorId = (sectorFoundTime / 20) % 10;
return clock;
}
void decodeSectorRecord() override
{
uint64_t id = toBytes(readRawBits(64)).reader().read_be64();
unsigned recordSize, payloadSize, headerSize;
if (id == MFM_ID)
{
recordSize = NORTHSTAR_ENCODED_SECTOR_SIZE_DD;
payloadSize = NORTHSTAR_PAYLOAD_SIZE_DD;
headerSize = NORTHSTAR_HEADER_SIZE_DD;
}
else
{
recordSize = NORTHSTAR_ENCODED_SECTOR_SIZE_SD;
payloadSize = NORTHSTAR_PAYLOAD_SIZE_SD;
headerSize = NORTHSTAR_HEADER_SIZE_SD;
}
auto rawbits = readRawBits(recordSize * 16);
auto bytes = decodeFmMfm(rawbits).slice(0, recordSize);
ByteReader br(bytes);
_sector->logicalSide = _sector->physicalSide;
_sector->logicalSector = _hardSectorId;
_sector->logicalTrack = _sector->physicalTrack;
if (headerSize == NORTHSTAR_HEADER_SIZE_DD)
{
br.read_8(); /* MFM second Sync char, usually 0xFB */
}
_sector->data = br.read(payloadSize);
uint8_t wantChecksum = br.read_8();
uint8_t gotChecksum =
northstarChecksum(bytes.slice(headerSize - 1, payloadSize));
_sector->status =
(wantChecksum == gotChecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
}
private:
const NorthstarDecoderProto& _config;
uint8_t _hardSectorId;
};
std::unique_ptr<Decoder> createNorthstarDecoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new NorthstarDecoder(config));
}

168
arch/northstar/encoder.cc Normal file
View File

@@ -0,0 +1,168 @@
#include "globals.h"
#include "northstar.h"
#include "sector.h"
#include "bytes.h"
#include "decoders/decoders.h"
#include "encoders/encoders.h"
#include "image.h"
#include "lib/encoders/encoders.pb.h"
#define GAP_FILL_SIZE_SD 30
#define PRE_HEADER_GAP_FILL_SIZE_SD 9
#define GAP_FILL_SIZE_DD 62
#define PRE_HEADER_GAP_FILL_SIZE_DD 16
#define GAP1_FILL_BYTE (0x4F)
#define GAP2_FILL_BYTE (0x4F)
#define TOTAL_SECTOR_BYTES ()
static void write_sector(std::vector<bool>& bits,
unsigned& cursor,
const std::shared_ptr<const Sector>& sector)
{
int preambleSize = 0;
int encodedSectorSize = 0;
int gapFillSize = 0;
int preHeaderGapFillSize = 0;
bool doubleDensity;
switch (sector->data.size())
{
case NORTHSTAR_PAYLOAD_SIZE_SD:
preambleSize = NORTHSTAR_PREAMBLE_SIZE_SD;
encodedSectorSize = PRE_HEADER_GAP_FILL_SIZE_SD +
NORTHSTAR_ENCODED_SECTOR_SIZE_SD +
GAP_FILL_SIZE_SD;
gapFillSize = GAP_FILL_SIZE_SD;
preHeaderGapFillSize = PRE_HEADER_GAP_FILL_SIZE_SD;
doubleDensity = false;
break;
case NORTHSTAR_PAYLOAD_SIZE_DD:
preambleSize = NORTHSTAR_PREAMBLE_SIZE_DD;
encodedSectorSize = PRE_HEADER_GAP_FILL_SIZE_DD +
NORTHSTAR_ENCODED_SECTOR_SIZE_DD +
GAP_FILL_SIZE_DD;
gapFillSize = GAP_FILL_SIZE_DD;
preHeaderGapFillSize = PRE_HEADER_GAP_FILL_SIZE_DD;
doubleDensity = true;
break;
default:
error("unsupported sector size --- you must pick 256 or 512");
break;
}
int fullSectorSize = preambleSize + encodedSectorSize;
auto fullSector = std::make_shared<std::vector<uint8_t>>();
fullSector->reserve(fullSectorSize);
/* sector gap after index pulse */
for (int i = 0; i < preHeaderGapFillSize; i++)
fullSector->push_back(GAP1_FILL_BYTE);
/* sector preamble */
for (int i = 0; i < preambleSize; i++)
fullSector->push_back(0);
Bytes sectorData;
if (sector->data.size() == encodedSectorSize)
sectorData = sector->data;
else
{
ByteWriter writer(sectorData);
writer.write_8(0xFB); /* sync character */
if (doubleDensity == true)
{
writer.write_8(0xFB); /* Double-density has two sync characters */
}
writer += sector->data;
if (doubleDensity == true)
{
writer.write_8(northstarChecksum(sectorData.slice(2)));
}
else
{
writer.write_8(northstarChecksum(sectorData.slice(1)));
}
}
for (uint8_t b : sectorData)
fullSector->push_back(b);
if (sector->logicalSector != 9)
{
/* sector postamble */
for (int i = 0; i < gapFillSize; i++)
fullSector->push_back(GAP2_FILL_BYTE);
if (fullSector->size() != fullSectorSize)
error("sector mismatched length ({}); expected {}, got {}",
sector->data.size(),
fullSector->size(),
fullSectorSize);
}
else
{
/* sector postamble */
for (int i = 0; i < gapFillSize; i++)
fullSector->push_back(GAP2_FILL_BYTE);
}
bool lastBit = false;
if (doubleDensity == true)
{
encodeMfm(bits, cursor, fullSector, lastBit);
}
else
{
encodeFm(bits, cursor, fullSector);
}
}
class NorthstarEncoder : public Encoder
{
public:
NorthstarEncoder(const EncoderProto& config):
Encoder(config),
_config(config.northstar())
{
}
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{
int bitsPerRevolution = 100000;
double clockRateUs = _config.clock_period_us();
const auto& sector = *sectors.begin();
if (sector->data.size() == NORTHSTAR_PAYLOAD_SIZE_SD)
bitsPerRevolution /= 2; // FM
else
clockRateUs /= 2.00;
std::vector<bool> bits(bitsPerRevolution);
unsigned cursor = 0;
for (const auto& sectorData : sectors)
write_sector(bits, cursor, sectorData);
if (cursor > bits.size())
error("track data overrun");
std::unique_ptr<Fluxmap> fluxmap(new Fluxmap);
fluxmap->appendBits(bits,
calculatePhysicalClockPeriod(
clockRateUs * 1e3, _config.rotational_period_ms() * 1e6));
return fluxmap;
}
private:
const NorthstarEncoderProto& _config;
};
std::unique_ptr<Encoder> createNorthstarEncoder(const EncoderProto& config)
{
return std::unique_ptr<Encoder>(new NorthstarEncoder(config));
}

View File

@@ -0,0 +1,42 @@
#ifndef NORTHSTAR_H
#define NORTHSTAR_H
/* Northstar floppies are 10-hard sectored disks with a sector format as
* follows:
*
* |----------------------------------|
* | SYNC Byte | Payload | Checksum |
* |------------+----------+----------|
* | 1 (0xFB) | 256 (SD) | 1 |
* | 2 (0xFBFB) | 512 (DD) | |
* |----------------------------------|
*
*/
#define NORTHSTAR_PREAMBLE_SIZE_SD (16)
#define NORTHSTAR_PREAMBLE_SIZE_DD (32)
#define NORTHSTAR_HEADER_SIZE_SD (1)
#define NORTHSTAR_HEADER_SIZE_DD (2)
#define NORTHSTAR_PAYLOAD_SIZE_SD (256)
#define NORTHSTAR_PAYLOAD_SIZE_DD (512)
#define NORTHSTAR_CHECKSUM_SIZE (1)
#define NORTHSTAR_ENCODED_SECTOR_SIZE_SD \
(NORTHSTAR_HEADER_SIZE_SD + NORTHSTAR_PAYLOAD_SIZE_SD + \
NORTHSTAR_CHECKSUM_SIZE)
#define NORTHSTAR_ENCODED_SECTOR_SIZE_DD \
(NORTHSTAR_HEADER_SIZE_DD + NORTHSTAR_PAYLOAD_SIZE_DD + \
NORTHSTAR_CHECKSUM_SIZE)
class Decoder;
class Encoder;
class EncoderProto;
class DecoderProto;
extern uint8_t northstarChecksum(const Bytes& bytes);
extern std::unique_ptr<Decoder> createNorthstarDecoder(
const DecoderProto& config);
extern std::unique_ptr<Encoder> createNorthstarEncoder(
const EncoderProto& config);
#endif /* NORTHSTAR */

View File

@@ -0,0 +1,13 @@
syntax = "proto2";
import "lib/common.proto";
message NorthstarDecoderProto {}
message NorthstarEncoderProto {
optional double clock_period_us = 1
[ default = 4.0, (help) = "clock rate on the real device (for FM)" ];
optional double rotational_period_ms = 2
[ default = 166.0, (help) = "rotational period on the real device" ];
}

51
arch/rolandd20/decoder.cc Normal file
View File

@@ -0,0 +1,51 @@
#include "lib/globals.h"
#include "lib/decoders/decoders.h"
#include "lib/crc.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/sector.h"
#include "lib/bytes.h"
#include "rolandd20.h"
#include <string.h>
/* Sector header record:
*
* BF FF FF FF FF FF FE AB
*
* This encodes to:
*
* e d 5 5 5 5 5 5
* 1110 1101 0101 0101 0101 0101 0101 0101
* 5 5 5 5 5 5 5 5
* 0101 0101 0101 0101 0101 0101 0101 0101
* 5 5 5 5 5 5 5 5
* 0101 0101 0101 0101 0101 0101 0101 0101
* 5 5 5 4 4 4 4 5
* 0101 0101 0101 0100 0100 0100 0100 0101
*/
static const FluxPattern SECTOR_PATTERN(64, 0xed55555555555555LL);
class RolandD20Decoder : public Decoder
{
public:
RolandD20Decoder(const DecoderProto& config): Decoder(config) {}
nanoseconds_t advanceToNextRecord() override
{
return seekToPattern(SECTOR_PATTERN);
}
void decodeSectorRecord() override
{
auto rawbits = readRawBits(256);
const auto& bytes = decodeFmMfm(rawbits);
fmt::print("{} ", _sector->clock);
hexdump(std::cout, bytes);
}
};
std::unique_ptr<Decoder> createRolandD20Decoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new RolandD20Decoder(config));
}

View File

@@ -0,0 +1,4 @@
#pragma once
extern std::unique_ptr<Decoder> createRolandD20Decoder(
const DecoderProto& config);

View File

@@ -0,0 +1,5 @@
syntax = "proto2";
message RolandD20DecoderProto {}

154
arch/smaky6/decoder.cc Normal file
View File

@@ -0,0 +1,154 @@
#include "globals.h"
#include "fluxmap.h"
#include "decoders/fluxmapreader.h"
#include "protocol.h"
#include "decoders/decoders.h"
#include "sector.h"
#include "smaky6.h"
#include "bytes.h"
#include "crc.h"
#include "fmt/format.h"
#include "lib/decoders/decoders.pb.h"
#include <string.h>
#include <algorithm>
static const FluxPattern SECTOR_PATTERN(32, 0x54892aaa);
class Smaky6Decoder : public Decoder
{
public:
Smaky6Decoder(const DecoderProto& config):
Decoder(config),
_config(config.smaky6())
{
}
private:
/* Returns the sector ID of the _current_ sector. */
int advanceToNextSector()
{
auto previous = tell();
seekToIndexMark();
auto now = tell();
if ((now.ns() - previous.ns()) < 9e6)
{
seekToIndexMark();
auto next = tell();
if ((next.ns() - now.ns()) < 9e6)
{
/* We just found sector 0. */
_sectorId = 0;
}
else
{
/* Spurious... */
seek(now);
}
}
return _sectorId++;
}
public:
void beginTrack() override
{
/* Find the start-of-track index marks, which will be an interval
* of about 6ms. */
seekToIndexMark();
_sectorId = 99;
for (;;)
{
auto pos = tell();
advanceToNextSector();
if (_sectorId < 99)
{
seek(pos);
break;
}
if (eof())
return;
}
/* Now we know where to start counting, start finding sectors. */
_sectorStarts.clear();
for (;;)
{
auto now = tell();
if (eof())
break;
int id = advanceToNextSector();
if (id < 16)
_sectorStarts.push_back(std::make_pair(id, now));
}
_sectorIndex = 0;
}
nanoseconds_t advanceToNextRecord() override
{
if (_sectorIndex == _sectorStarts.size())
{
seekToIndexMark();
return 0;
}
const auto& p = _sectorStarts[_sectorIndex++];
_sectorId = p.first;
seek(p.second);
nanoseconds_t clock = seekToPattern(SECTOR_PATTERN);
_sector->headerStartTime = tell().ns();
return clock;
}
void decodeSectorRecord() override
{
readRawBits(33);
const auto& rawbits = readRawBits(SMAKY6_RECORD_SIZE * 16);
if (rawbits.size() < SMAKY6_SECTOR_SIZE)
return;
const auto& rawbytes =
toBytes(rawbits).slice(0, SMAKY6_RECORD_SIZE * 16);
/* The Smaky bytes are stored backwards! Backwards! */
const auto& bytes =
decodeFmMfm(rawbits).slice(0, SMAKY6_RECORD_SIZE).reverseBits();
ByteReader br(bytes);
uint8_t track = br.read_8();
Bytes data = br.read(SMAKY6_SECTOR_SIZE);
uint8_t wantedChecksum = br.read_8();
uint8_t gotChecksum = sumBytes(data) & 0xff;
if (track != _sector->physicalTrack)
return;
_sector->logicalTrack = _sector->physicalTrack;
_sector->logicalSide = _sector->physicalSide;
_sector->logicalSector = _sectorId;
_sector->data = data;
_sector->status =
(wantedChecksum == gotChecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
}
private:
const Smaky6DecoderProto& _config;
nanoseconds_t _startOfTrack;
std::vector<std::pair<int, Fluxmap::Position>> _sectorStarts;
int _sectorId;
int _sectorIndex;
};
std::unique_ptr<Decoder> createSmaky6Decoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new Smaky6Decoder(config));
}

9
arch/smaky6/smaky6.h Normal file
View File

@@ -0,0 +1,9 @@
#ifndef SMAKY6_H
#define SMAKY6_H
#define SMAKY6_SECTOR_SIZE 256
#define SMAKY6_RECORD_SIZE (1 + SMAKY6_SECTOR_SIZE + 1)
extern std::unique_ptr<Decoder> createSmaky6Decoder(const DecoderProto& config);
#endif

6
arch/smaky6/smaky6.proto Normal file
View File

@@ -0,0 +1,6 @@
syntax = "proto2";
import "lib/common.proto";
message Smaky6DecoderProto {}

100
arch/tids990/decoder.cc Normal file
View File

@@ -0,0 +1,100 @@
#include "globals.h"
#include "decoders/decoders.h"
#include "encoders/encoders.h"
#include "tids990/tids990.h"
#include "crc.h"
#include "fluxmap.h"
#include "decoders/fluxmapreader.h"
#include "sector.h"
#include <string.h>
#include <fmt/format.h>
/* The Texas Instruments DS990 uses MFM with a scheme similar to a simplified
* version of the IBM record scheme (it's actually easier to parse than IBM).
* There are 26 sectors per track, each holding a rather weird 288 bytes.
*/
/*
* Sector record:
* data: 0 1 0 1 0 1 0 1 .0 0 0 0 1 0 1 0 = 0x550a
* mfm: 00 01 00 01 00 01 00 01.00 10 10 10 01 00 01 00 = 0x11112a44
* special: 00 01 00 01 00 01 00 01.00 10 00 10 01 00 01 00 = 0x11112244
* ^^
* When shifted out of phase, the special 0xa1 byte becomes an illegal
* encoding (you can't do 10 00). So this can't be spoofed by user data.
*/
const uint16_t SECTOR_ID = 0x550a;
const FluxPattern SECTOR_RECORD_PATTERN(32, 0x11112244);
/*
* Data record:
* data: 0 1 0 1 0 1 0 1 .0 0 0 0 1 0 1 1 = 0x550b
* mfm: 00 01 00 01 00 01 00 01.00 10 10 10 01 00 01 01 = 0x11112a45
* special: 00 01 00 01 00 01 00 01.00 10 00 10 01 00 01 01 = 0x11112245
* ^^
* When shifted out of phase, the special 0xa1 byte becomes an illegal
* encoding (you can't do 10 00). So this can't be spoofed by user data.
*/
const uint16_t DATA_ID = 0x550b;
const FluxPattern DATA_RECORD_PATTERN(32, 0x11112245);
const FluxMatchers ANY_RECORD_PATTERN(
{&SECTOR_RECORD_PATTERN, &DATA_RECORD_PATTERN});
class Tids990Decoder : public Decoder
{
public:
Tids990Decoder(const DecoderProto& config): Decoder(config) {}
nanoseconds_t advanceToNextRecord() override
{
return seekToPattern(ANY_RECORD_PATTERN);
}
void decodeSectorRecord() override
{
auto bits = readRawBits(TIDS990_SECTOR_RECORD_SIZE * 16);
auto bytes = decodeFmMfm(bits).slice(0, TIDS990_SECTOR_RECORD_SIZE);
ByteReader br(bytes);
if (br.read_be16() != SECTOR_ID)
return;
uint16_t gotChecksum =
crc16(CCITT_POLY, bytes.slice(1, TIDS990_SECTOR_RECORD_SIZE - 3));
_sector->logicalSide = br.read_8() >> 3;
_sector->logicalTrack = br.read_8();
br.read_8(); /* number of sectors per track */
_sector->logicalSector = br.read_8();
br.read_be16(); /* sector size */
uint16_t wantChecksum = br.read_be16();
if (wantChecksum == gotChecksum)
_sector->status =
Sector::DATA_MISSING; /* correct but unintuitive */
}
void decodeDataRecord() override
{
auto bits = readRawBits(TIDS990_DATA_RECORD_SIZE * 16);
auto bytes = decodeFmMfm(bits).slice(0, TIDS990_DATA_RECORD_SIZE);
ByteReader br(bytes);
if (br.read_be16() != DATA_ID)
return;
uint16_t gotChecksum =
crc16(CCITT_POLY, bytes.slice(1, TIDS990_DATA_RECORD_SIZE - 3));
_sector->data = br.read(TIDS990_PAYLOAD_SIZE);
uint16_t wantChecksum = br.read_be16();
_sector->status =
(wantChecksum == gotChecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
}
};
std::unique_ptr<Decoder> createTids990Decoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new Tids990Decoder(config));
}

151
arch/tids990/encoder.cc Normal file
View File

@@ -0,0 +1,151 @@
#include "globals.h"
#include "decoders/decoders.h"
#include "encoders/encoders.h"
#include "tids990.h"
#include "crc.h"
#include "readerwriter.h"
#include "image.h"
#include "arch/tids990/tids990.pb.h"
#include "lib/encoders/encoders.pb.h"
#include <fmt/format.h>
static int charToInt(char c)
{
if (isdigit(c))
return c - '0';
return 10 + tolower(c) - 'a';
}
static uint8_t decodeUint16(uint16_t raw)
{
Bytes b;
ByteWriter bw(b);
bw.write_be16(raw);
return decodeFmMfm(b.toBits())[0];
}
class Tids990Encoder : public Encoder
{
public:
Tids990Encoder(const EncoderProto& config):
Encoder(config),
_config(config.tids990())
{
}
private:
void writeRawBits(uint32_t data, int width)
{
_cursor += width;
_lastBit = data & 1;
for (int i = 0; i < width; i++)
{
unsigned pos = _cursor - i - 1;
if (pos < _bits.size())
_bits[pos] = data & 1;
data >>= 1;
}
}
void writeBytes(const Bytes& bytes)
{
encodeMfm(_bits, _cursor, bytes, _lastBit);
}
void writeBytes(int count, uint8_t byte)
{
Bytes bytes = {byte};
for (int i = 0; i < count; i++)
writeBytes(bytes);
}
public:
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{
double clockRateUs = _config.clock_period_us() / 2.0;
int bitsPerRevolution =
(_config.rotational_period_ms() * 1000.0) / clockRateUs;
_bits.resize(bitsPerRevolution);
_cursor = 0;
uint8_t am1Unencoded = decodeUint16(_config.am1_byte());
uint8_t am2Unencoded = decodeUint16(_config.am2_byte());
writeBytes(_config.gap1_bytes(), 0x55);
bool first = true;
for (const auto& sectorData : sectors)
{
if (!first)
writeBytes(_config.gap3_bytes(), 0x55);
first = false;
/* Writing the sector and data records are fantastically annoying.
* The CRC is calculated from the *very start* of the record, and
* include the malformed marker bytes. Our encoder doesn't know
* about this, of course, with the result that we have to construct
* the unencoded header, calculate the checksum, and then use the
* same logic to emit the bytes which require special encoding
* before encoding the rest of the header normally. */
{
Bytes header;
ByteWriter bw(header);
writeBytes(12, 0x55);
bw.write_8(am1Unencoded);
bw.write_8(sectorData->logicalSide << 3);
bw.write_8(sectorData->logicalTrack);
bw.write_8(_config.sector_count());
bw.write_8(sectorData->logicalSector);
bw.write_be16(sectorData->data.size());
uint16_t crc = crc16(CCITT_POLY, header);
bw.write_be16(crc);
writeRawBits(_config.am1_byte(), 16);
writeBytes(header.slice(1));
}
writeBytes(_config.gap2_bytes(), 0x55);
{
Bytes data;
ByteWriter bw(data);
writeBytes(12, 0x55);
bw.write_8(am2Unencoded);
bw += sectorData->data;
uint16_t crc = crc16(CCITT_POLY, data);
bw.write_be16(crc);
writeRawBits(_config.am2_byte(), 16);
writeBytes(data.slice(1));
}
}
if (_cursor >= _bits.size())
error("track data overrun");
while (_cursor < _bits.size())
writeBytes(1, 0x55);
auto fluxmap = std::make_unique<Fluxmap>();
fluxmap->appendBits(_bits,
calculatePhysicalClockPeriod(
clockRateUs * 1e3, _config.rotational_period_ms() * 1e6));
return fluxmap;
}
private:
const Tids990EncoderProto& _config;
std::vector<bool> _bits;
unsigned _cursor;
bool _lastBit;
};
std::unique_ptr<Encoder> createTids990Encoder(const EncoderProto& config)
{
return std::unique_ptr<Encoder>(new Tids990Encoder(config));
}

18
arch/tids990/tids990.h Normal file
View File

@@ -0,0 +1,18 @@
#ifndef TIDS990_H
#define TIDS990_H
#define TIDS990_PAYLOAD_SIZE 288 /* bytes */
#define TIDS990_SECTOR_RECORD_SIZE 10 /* bytes */
#define TIDS990_DATA_RECORD_SIZE (TIDS990_PAYLOAD_SIZE + 4) /* bytes */
class Encoder;
class Decoder;
class DecoderProto;
class EncoderProto;
extern std::unique_ptr<Decoder> createTids990Decoder(
const DecoderProto& config);
extern std::unique_ptr<Encoder> createTids990Encoder(
const EncoderProto& config);
#endif

View File

@@ -0,0 +1,25 @@
syntax = "proto2";
import "lib/common.proto";
message Tids990DecoderProto {}
message Tids990EncoderProto {
optional double rotational_period_ms = 1 [ default = 166,
(help) = "length of a track" ];
optional int32 sector_count = 2 [ default = 26,
(help) = "number of sectors per track" ];
optional double clock_period_us = 3 [ default = 2,
(help) = "clock rate of data to write" ];
optional int32 am1_byte = 4 [ default = 0x2244,
(help) = "16-bit RAW bit pattern to use for the AM1 ID byte" ];
optional int32 am2_byte = 5 [ default = 0x2245,
(help) = "16-bit RAW bit pattern to use for the AM2 ID byte" ];
optional int32 gap1_bytes = 6 [ default = 80,
(help) = "size of gap 1 (the post-index gap)" ];
optional int32 gap2_bytes = 7 [ default = 21,
(help) = "size of gap 2 (the post-ID gap)" ];
optional int32 gap3_bytes = 8 [ default = 51,
(help) = "size of gap 3 (the post-data or format gap)" ];
}

118
arch/victor9k/decoder.cc Normal file
View File

@@ -0,0 +1,118 @@
#include "globals.h"
#include "fluxmap.h"
#include "decoders/fluxmapreader.h"
#include "protocol.h"
#include "decoders/decoders.h"
#include "sector.h"
#include "victor9k.h"
#include "crc.h"
#include "bytes.h"
#include "fmt/format.h"
#include <string.h>
#include <algorithm>
const FluxPattern SECTOR_RECORD_PATTERN(32, VICTOR9K_SECTOR_RECORD);
const FluxPattern DATA_RECORD_PATTERN(32, VICTOR9K_DATA_RECORD);
const FluxMatchers ANY_RECORD_PATTERN(
{&SECTOR_RECORD_PATTERN, &DATA_RECORD_PATTERN});
static int decode_data_gcr(uint8_t gcr)
{
switch (gcr)
{
#define GCR_ENTRY(gcr, data) \
case gcr: \
return data;
#include "data_gcr.h"
#undef GCR_ENTRY
}
return -1;
}
static Bytes decode(const std::vector<bool>& bits)
{
Bytes output;
ByteWriter bw(output);
BitWriter bitw(bw);
auto ii = bits.begin();
while (ii != bits.end())
{
uint8_t inputfifo = 0;
for (size_t i = 0; i < 5; i++)
{
if (ii == bits.end())
break;
inputfifo = (inputfifo << 1) | *ii++;
}
uint8_t decoded = decode_data_gcr(inputfifo);
bitw.push(decoded, 4);
}
bitw.flush();
return output;
}
class Victor9kDecoder : public Decoder
{
public:
Victor9kDecoder(const DecoderProto& config): Decoder(config) {}
nanoseconds_t advanceToNextRecord() override
{
return seekToPattern(ANY_RECORD_PATTERN);
}
void decodeSectorRecord() override
{
/* Check the ID. */
if (readRaw32() != VICTOR9K_SECTOR_RECORD)
return;
/* Read header. */
auto bytes = decode(readRawBits(3 * 10)).slice(0, 3);
uint8_t rawTrack = bytes[0];
_sector->logicalSector = bytes[1];
uint8_t gotChecksum = bytes[2];
_sector->logicalTrack = rawTrack & 0x7f;
_sector->logicalSide = rawTrack >> 7;
uint8_t wantChecksum = bytes[0] + bytes[1];
if ((_sector->logicalSector > 20) || (_sector->logicalTrack > 85) ||
(_sector->logicalSide > 1))
return;
if (wantChecksum == gotChecksum)
_sector->status =
Sector::DATA_MISSING; /* unintuitive but correct */
}
void decodeDataRecord() override
{
/* Check the ID. */
if (readRaw32() != VICTOR9K_DATA_RECORD)
return;
/* Read data. */
auto bytes = decode(readRawBits((VICTOR9K_SECTOR_LENGTH + 4) * 10))
.slice(0, VICTOR9K_SECTOR_LENGTH + 4);
ByteReader br(bytes);
_sector->data = br.read(VICTOR9K_SECTOR_LENGTH);
uint16_t gotChecksum = sumBytes(_sector->data);
uint16_t wantChecksum = br.read_le16();
_sector->status =
(gotChecksum == wantChecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
}
};
std::unique_ptr<Decoder> createVictor9kDecoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new Victor9kDecoder(config));
}

Some files were not shown because too many files have changed in this diff Show More