Compare commits

...

590 Commits

Author SHA1 Message Date
David Given
dcae381973 Add some more GUI for the disk exerciser. 2025-10-24 01:00:11 +02:00
David Given
2142bc7cce Add a Disk menu. 2025-10-23 01:12:40 +02:00
David Given
ae3f82264a Add the boilerplate for the exerciser. 2025-10-22 01:13:36 +02:00
David Given
710e83c098 Try to fix OSX build failure. 2025-10-18 13:03:14 +02:00
David Given
4f46fff3be Remove a bunch of extraneous Providers. 2025-10-18 01:03:39 +02:00
David Given
58ea21a9a2 Add a menu option to allow resetting the workspace. 2025-10-18 00:36:52 +02:00
David Given
0fd1aa82a6 Crudely bodge image writes into working. 2025-10-17 23:41:16 +02:00
David Given
5b7f9d84f9 Fix some rendering issues. 2025-10-16 22:32:20 +02:00
David Given
4b7e8e74a7 Fix NPE. 2025-10-16 22:32:02 +02:00
David Given
5375c72d02 Correctly set the rotational period on Disks even on non-hardware readers. 2025-10-16 21:34:40 +02:00
David Given
5c257be164 Add a message if there's no flux data to draw. 2025-10-16 21:15:38 +02:00
David Given
7fa17322dc Remember to debounce index marks. 2025-10-16 21:00:57 +02:00
David Given
ed3640d945 Add a first draft visualiser. 2025-10-16 00:52:54 +02:00
David Given
87ce3ad61d Fluxmaps can now be queried for a (cached) list of index marks. Tracks
now contain both the raw list of sectors and a deduplicated list,
suitable for the visualiser.
2025-10-16 00:52:37 +02:00
David Given
6d75feb0ce Increase the default number of revolutions to 2.5 to ensure we get at
least one complete revolution.
2025-10-16 00:51:51 +02:00
David Given
168b8b6f6c Turn optimisation back on _again_. 2025-10-15 14:11:30 +02:00
David Given
3d063e932a Rereading disks through the GUI now works. 2025-10-15 00:41:49 +02:00
David Given
157ec569b2 Some more renaming. 2025-10-14 23:16:56 +02:00
David Given
f63c8dadf1 Lots more renaming. 2025-10-14 22:53:26 +02:00
David Given
d17f6116f0 Lots of symbol renaming. 2025-10-14 22:32:42 +02:00
David Given
2d6cb22e3a Looks like we're going to have to rework the reader/writer/source/sink
interfaces, so do fluxsink. This lets us test for overwriting a flux
file on writing in the GUI. HG: Enter commit message.
2025-10-14 21:54:59 +02:00
David Given
2de8b52e56 Fix the Micropolis options. 2025-10-14 00:18:27 +02:00
David Given
171576e538 Rename some stuff. 2025-10-14 00:14:11 +02:00
David Given
2db9f65e8b Move the flux file button into the config area. 2025-10-14 00:06:56 +02:00
David Given
2572b64bd1 You can now load images. 2025-10-14 00:03:44 +02:00
David Given
533aaf85f2 Add a status line. 2025-10-13 23:27:31 +02:00
David Given
f67ddc1f77 Writes now work. 2025-10-13 22:24:00 +02:00
David Given
b1d64f3683 Try and fix the Linux build. 2025-10-13 00:39:26 +02:00
David Given
7e8840e03f Add a rotational speed global option. 2025-10-13 00:38:10 +02:00
David Given
b003297b22 Remove the partially-finished MemoryFluxSink. 2025-10-13 00:33:55 +02:00
David Given
7341cec2c4 Add missing file. 2025-10-13 00:30:24 +02:00
David Given
a98b7f72fd Rearrange some UI. 2025-10-13 00:29:55 +02:00
David Given
2e97579394 Fix optimisation. 2025-10-13 00:20:16 +02:00
David Given
f960c7efd0 Added functionality for faking the necessary data in a DecodedDisk to
make the visualiser work. Blank images can now be created in memory.
2025-10-13 00:19:59 +02:00
David Given
c2e7f32cba Fix various issues to do with shared state and occasional crashes. 2025-10-12 15:51:33 +02:00
David Given
137528fc53 Format. 2025-10-12 15:51:02 +02:00
David Given
cbf4cc35fb Fix some default setting issues. 2025-10-12 15:50:50 +02:00
David Given
cd7b3de1b3 Finally add support for setting the default option. 2025-10-12 15:50:33 +02:00
David Given
fddc2270e5 Ensure that the layout's sector size is honoured. 2025-10-11 18:48:31 +02:00
David Given
2a96d9bd78 Some cleanup. 2025-10-11 18:48:14 +02:00
David Given
fd554f0808 Update imhex module. 2025-10-11 12:25:04 +02:00
David Given
6776c51b23 Add read/write indicators to the summary view. Fix a pile of minor bugs. 2025-10-11 00:49:59 +02:00
David Given
ef58295304 Better and more consistent exception handling. 2025-10-10 21:49:43 +02:00
David Given
2e2c3e3e34 Set a best-guess physical location on missing sectors. 2025-10-10 21:49:14 +02:00
David Given
e87bb44a2d Another OSX fix. 2025-10-10 20:53:11 +02:00
David Given
0ba0a9cce5 Tweak to try and make OSX happy. 2025-10-10 00:54:22 +02:00
David Given
97bb563ba0 Another massive overhaul to rip out the last remaining bits of Layout. 2025-10-10 00:21:47 +02:00
David Given
8f047f842e Massive overhaul to use the new disklayout stuff while
encoding/decoding. Fix lots of bugs, be more consistent with logical and
physical locations.
2025-10-08 22:41:13 +02:00
David Given
9d596ef530 Rename many things for clarity. 2025-10-06 23:29:20 +02:00
David Given
580ffa8cf7 Rename flux.h. 2025-10-06 23:11:50 +02:00
David Given
341e0a320d Rename the stuff in flux.h to actually make sense. 2025-10-06 23:09:26 +02:00
David Given
cff0a9703c Rework the flux data structures to be a bit more sensibly designed and
more amenable to copying.
2025-10-06 22:58:24 +02:00
David Given
38618532c4 Change sandboxing settings again. 2025-10-05 21:17:16 +02:00
David Given
6026dcd86d Try and fix sandboxing. 2025-10-05 21:02:17 +02:00
David Given
3949971546 Add a log viewer view. 2025-10-05 19:55:16 +02:00
David Given
6146f442fb Fix a bunch of minor UI issues. 2025-10-05 13:18:47 +02:00
David Given
7090c1bfdf Rework the way jobs are run so that everything happens in one callback,
which means thrown exceptions propagate properly and will cancel ongoing
jobs. Also, the state machine is much cleaner.
2025-10-05 01:35:16 +02:00
David Given
563babc969 Disable the config settings when the worker thread is busy. 2025-10-03 22:45:19 +02:00
David Given
b649c2b9af Tweak the way the debug menu works. 2025-10-03 22:34:55 +02:00
David Given
f7f887789c Override the debug and feedback menu URLs. 2025-10-03 22:27:44 +02:00
David Given
a8fcdcc528 Add a custom default layout. 2025-10-03 22:27:21 +02:00
David Given
a988578cc7 Oops, turn the sandbox back on! 2025-10-03 22:27:02 +02:00
David Given
ee585b24f0 Hopefully now almost correctly build the OSX package. 2025-10-03 20:49:54 +02:00
David Given
3d6e980990 Remove debugging. 2025-10-03 19:47:00 +02:00
David Given
f5d19416a9 Try something else for OSX. 2025-10-03 02:58:43 +02:00
David Given
4187fa5a09 Adjust Windows dependencies. 2025-10-03 02:55:48 +02:00
David Given
eb7613c03f Debugging. 2025-10-03 02:27:08 +02:00
David Given
7910429037 Debugging. 2025-10-03 02:24:28 +02:00
David Given
cd1cc736a7 Make the new gui canonical. 2025-10-03 02:24:17 +02:00
David Given
e6d6805f25 Switch from pkg-config to pkgconf. 2025-10-03 01:52:58 +02:00
David Given
9733879360 Debugging. 2025-10-03 01:48:48 +02:00
David Given
725712f796 I think boost needs to be linked. 2025-10-02 22:53:11 +02:00
David Given
2122cea5c4 More missing dependencies. 2025-10-02 22:37:13 +02:00
David Given
5466e716a9 Finally figure out the macos dependency problem. 2025-10-02 22:15:28 +02:00
David Given
0dc0e3d9a1 Debugging. 2025-10-02 21:51:08 +02:00
David Given
4bb12b2caa Debugging. 2025-10-02 21:43:48 +02:00
David Given
0d9c5f5150 Try updating homebrew before building. 2025-10-02 21:31:32 +02:00
David Given
4030031a2c Update OSX dependencies. 2025-10-02 21:22:00 +02:00
David Given
3143c87f1c Adjust dependencies... again. 2025-10-02 20:05:26 +02:00
David Given
f16f02c4c7 Adjust dependencies. 2025-10-02 19:57:29 +02:00
David Given
3e13b2461d Adjust dependencies. 2025-10-02 19:52:26 +02:00
David Given
5fd0d1589e Update msys before use. 2025-10-02 19:46:58 +02:00
David Given
23e6d234d0 Change the way we install msys to see if that helps. 2025-10-02 19:44:27 +02:00
David Given
cf2a97f8aa Update splash screen to contain the imhex logo. 2025-10-02 00:23:45 +02:00
David Given
5a815e0cd6 Extend DiskLayout to contain the sector offset and block number data.
Update the gui to use it.
2025-10-01 23:33:21 +02:00
David Given
06a3af2a1d Add filesystem sector offsets to the disk layout structure. 2025-10-01 00:34:09 +02:00
David Given
0558d95fa3 Attach the current layout to DiskFlux objects. 2025-10-01 00:26:19 +02:00
David Given
81f9246ab8 Rework summaryview to use the new DiskLayout. 2025-09-30 00:26:22 +02:00
David Given
6979567429 Add basic tests for DiskLayout. 2025-09-29 20:54:05 +02:00
David Given
348de4165d Initial version of the new DiskLayout class. 2025-09-25 00:04:51 +02:00
David Given
0755d420dd Change gitmodules to use my own fork of imhex. 2025-09-24 23:51:17 +02:00
David Given
dead21bce5 Typo fix. 2025-09-22 18:27:25 +02:00
David Given
4cf451ce60 We can't update msys because it kills the terminal. 2025-09-22 18:26:15 +02:00
David Given
72298ac805 Force msys update before installing dependencies. 2025-09-22 18:22:21 +02:00
David Given
3d1ad81652 Don't try and materialise the symbolic link; it breaks things. 2025-09-21 21:20:40 +02:00
David Given
88c79169b6 Don't log the environment any more. 2025-09-21 20:02:43 +02:00
David Given
d9747b9021 Don't build macos 13 any more. 2025-09-21 19:53:08 +02:00
David Given
256976a5a1 Adjust dependencies. 2025-09-21 19:52:20 +02:00
David Given
0ba4b82e10 Only require libtre on Windows. 2025-09-21 19:49:46 +02:00
David Given
ffd9e28b42 Try and build the Windows package. 2025-09-21 19:49:32 +02:00
David Given
9c919c786d Tweak dependencies. 2025-09-21 19:54:04 +02:00
David Given
47a9a56959 Remember to set -static for source file compilation, not just linking. Use the correct
protoc on mingw.
2025-09-21 17:49:17 +02:00
David Given
6e03bc604a Turns out undefined format_type and drive_type fields are normal. 2025-09-21 17:07:54 +02:00
David Given
feea6a027a Add another ignored variable. 2025-09-21 17:07:21 +02:00
David Given
08fa06b7fe Enable static builds on Windows. 2025-09-21 03:40:25 +02:00
David Given
8a976edef9 Warning fix. 2025-09-20 23:19:22 +02:00
David Given
c71d8d6c74 Another typo fix. 2025-09-20 20:59:39 +02:00
David Given
e809af7426 Typo fix. 2025-09-20 20:54:55 +02:00
David Given
ab05db9040 Switch back to gcc. 2025-09-20 20:49:18 +02:00
David Given
04f916741e Try big-obj instead. 2025-09-20 20:26:42 +02:00
David Given
f6224f3718 Try mcmodel=medium. 2025-09-20 20:09:07 +02:00
David Given
10185bb7a1 Do I need -fPIC for Windows? 2025-09-20 17:36:37 +02:00
David Given
d565960c70 Flag adjustment. 2025-09-20 16:58:24 +02:00
David Given
c21073294f More adjustments. 2025-09-20 16:13:32 +02:00
David Given
3cd95de434 Try using clang instead of gcc. 2025-09-20 16:00:38 +02:00
David Given
6552dba9aa Even more dependencies. 2025-09-20 13:00:15 +02:00
David Given
c8ebe55aa9 Warning fix. 2025-09-20 13:00:04 +02:00
David Given
1eefa2d604 Even even more dependencies. 2025-09-20 12:28:53 +02:00
David Given
a359394eea Even more dependencies. 2025-09-20 12:25:56 +02:00
David Given
9f13026bec Even more dependency changes. 2025-09-20 12:23:14 +02:00
David Given
8fcc99b2a1 More dependencies. 2025-09-20 12:20:26 +02:00
David Given
125a0536ff More dependency tweaks. 2025-09-20 12:17:53 +02:00
David Given
4115947d80 Don't use /dev/stderr as it makes msys sad. 2025-09-20 12:17:09 +02:00
David Given
2f1dcd7c9a More build tweak. 2025-09-20 12:11:34 +02:00
David Given
5e00ffca13 Remove some more WSL stuff. 2025-09-20 12:07:44 +02:00
David Given
ac27095493 Don't need this any more. 2025-09-20 11:54:28 +02:00
David Given
e27ca5cd4c Reformat. 2025-09-20 12:00:52 +02:00
David Given
cc72ac6327 Ignore some more variables. 2025-09-20 12:00:33 +02:00
David Given
5443aa6501 Some work towards making things build on Windows. 2025-09-20 03:24:49 +02:00
David Given
902bf32169 Allow bypassing the sandbox, as it makes msys sad. 2025-09-20 03:24:10 +02:00
David Given
d200633747 Fix windows weirdness. 2025-09-20 03:23:55 +02:00
David Given
a48b749c2e Support Windows protoc command syntax. 2025-09-20 01:22:24 +02:00
David Given
46fab84b95 Progress towards making everything build on Windows. 2025-09-19 02:02:34 +02:00
David Given
b0290f858c Tweak build system. 2025-09-18 22:28:03 +02:00
David Given
fe09c12cd6 Modernise protobuf usage. 2025-09-18 16:37:56 +02:00
David Given
b5ae5a1cea Don't try and use the dbus library on OSX. 2025-09-18 16:26:35 +02:00
David Given
113cb85512 Fix dependencies. 2025-09-18 14:47:43 +02:00
David Given
da276bcb3b Fix dependencies. 2025-09-18 14:45:34 +02:00
David Given
9a78d0f38c Fix OSX build script. 2025-09-18 14:40:23 +02:00
David Given
ec2e1666e7 Make build on Linux again. 2025-09-18 14:39:38 +02:00
David Given
478df40d4b Attempt to make build on OSX. 2025-09-18 00:56:53 +02:00
David Given
a8b9d79cb1 Header fix for OSX. 2025-09-18 00:55:17 +02:00
David Given
23865d1a10 Rip out a lot of imhex stuff we don't want. 2025-09-17 22:46:30 +02:00
David Given
458b3f24fe Make a basic splash screen. 2025-09-17 22:18:54 +02:00
David Given
86fa23e6fa Add missing files. 2025-09-17 21:09:21 +02:00
David Given
dd9d5aaed5 Remember to build all of libpl. 2025-09-17 21:08:50 +02:00
David Given
b22df17bb5 Fix some fmt strings. 2025-09-17 14:28:41 +02:00
David Given
b81e609e66 Hopefully fix the format_to ambiguity. 2025-09-17 14:11:17 +02:00
David Given
d41e57cba6 Fix format errors. 2025-09-17 01:07:37 +02:00
David Given
da7e83e257 Update dependencies. 2025-09-17 00:41:39 +02:00
David Given
83be12fcf1 Update dependencies. 2025-09-17 00:26:25 +02:00
David Given
a999e2d6c9 Adjust dependencies. 2025-09-17 00:14:58 +02:00
David Given
6d6251e757 Adjust dependencies. 2025-09-17 00:12:59 +02:00
David Given
be8b26ef94 Try updating Ubuntu to get a better compiler. 2025-09-17 00:09:40 +02:00
David Given
c6b8bce5d6 Reenable optimisation. 2025-09-17 00:08:29 +02:00
David Given
d8b3452c07 Update dependencies. 2025-09-17 00:05:09 +02:00
David Given
eddbd43cd9 Update dependencies. 2025-09-17 00:03:14 +02:00
David Given
168189180d Update dependencies. 2025-09-16 23:53:58 +02:00
David Given
9e092bab6a Nope, pkg-config for mbedtls doesn't work. 2025-09-16 23:47:28 +02:00
David Given
2c35126b3a mbedcrypto and mbedtls are linked on most systems, and the pkg-config
files seem bad.
2025-09-16 23:42:47 +02:00
David Given
7dc0e4ca31 Rearrange for consistency. 2025-09-16 22:55:58 +02:00
David Given
96257f89d5 Use a local lunasvg. 2025-09-16 22:40:46 +02:00
David Given
09919343b4 Import LunaSVG. 2025-09-16 22:33:20 +02:00
David Given
b070c1068c Add a mostly-functioning logical map in the summary view. 2025-09-16 22:30:53 +02:00
David Given
5628a576db Don't mix up physical and logical units when seeking to a track. 2025-09-16 22:30:09 +02:00
David Given
073c78e25f Be firmer about rebuilding the configuration. 2025-09-16 22:29:29 +02:00
David Given
6a826d6eb5 Move the controls into their own panel. 2025-09-16 00:42:02 +02:00
David Given
11a6143d4c Move all the settings out to a config view again, but designed
differently. Much better.
2025-09-15 22:49:30 +02:00
David Given
6127c9a46d Wire up some more control panel buttons. Create an in-memory sector
interface for doing filesystem stuff.
2025-09-15 20:06:16 +02:00
David Given
98f7febef7 Make two variations on the sector map; one for the physical view and one
for the logical view.
2025-09-13 22:54:48 +02:00
David Given
85afadacf0 Don't make images with holes --- ensure that all sectors in the image
are populated, even if with a stub 'MISSING' sector, with layout
information.
2025-09-13 01:55:01 +02:00
David Given
01cd812162 Use std::optional a bit more right. 2025-09-13 01:54:09 +02:00
David Given
39329acc77 Remove the obsolete configview. 2025-09-12 22:37:27 +02:00
David Given
bdc96038ef Get the format part of the new control panel working. 2025-09-12 22:31:50 +02:00
David Given
93760d989a Get the device config part of the new control panel working. 2025-09-12 22:14:13 +02:00
David Given
b306c7063b Start moving the config view functionality into the control panel. The
current config is now displayed there.
2025-09-12 00:20:46 +02:00
David Given
e3d7fa69d8 Add a --hd global option for setting high density. 2025-09-12 00:20:10 +02:00
David Given
f6c0e5405a Wire up some control panel buttons. Make toasts work. 2025-09-11 01:05:15 +02:00
David Given
fc12a2662c ImGui text entries are very sensitive and don't like skipping frames or
being disabled, so do it less often.
2025-09-10 23:52:23 +02:00
David Given
ab5b16488c The control panel mostly works. 2025-09-10 00:13:07 +02:00
David Given
4d5900268b Create a DiskProvider on startup so we go straight into the GUI. 2025-09-09 00:27:49 +02:00
David Given
b5c5a4335d Wire up the summary and sector map views; although it's shown that the
layout code really needs refactoring. Again.
2025-09-09 00:14:21 +02:00
David Given
e76235541a Add custom out-of-box and welcome screen implementations. 2025-09-08 21:11:26 +02:00
David Given
e75e1a6e27 Make the track/cylinder side/head terminology more consistent. 2025-09-08 20:08:23 +02:00
David Given
aa220ecbcb Sectors and Images now store more unseful information. The DiskProvider
now works.
2025-09-08 19:52:57 +02:00
David Given
edc8d74418 The sector map view is now mostly working. 2025-09-07 00:56:37 +02:00
David Given
2831aa09ae Add CylinderHeadSector in place of some of the 3-tuples I was previously
using; do some refactoring.
2025-09-07 00:56:18 +02:00
David Given
e1b4b0d3a3 Fix kryoflux reading and writing. 2025-09-07 00:55:49 +02:00
David Given
e5df6ca33b Remember to set the correct drive type for 80-track disks. 2025-09-07 00:31:52 +02:00
David Given
68c3cbb020 Sketch out the image view. 2025-09-06 13:22:40 +02:00
David Given
ca3c37d20a Add logic to Image for access filesystem blocks. 2025-09-06 13:22:29 +02:00
David Given
6fcd9233ea Disks can now be read, and incremental progress shows up in the summary view. 2025-09-06 01:21:46 +02:00
David Given
3761c4b1e2 Broadcast a DiskReadLogMessage every time a track is read, with the
entire accumulated disk data (including all the resolved sectors). This
makes it much easier to show partial results in the GUI.
2025-09-06 01:21:07 +02:00
David Given
c89c53b1c7 Try displaying the track status. 2025-09-06 00:04:46 +02:00
David Given
be0f63a133 The summary view now shows a respectable track summary. 2025-09-05 23:14:12 +02:00
David Given
a8216995ad Merge. 2025-09-04 00:57:35 +02:00
David Given
995359ef45 Start preparing to do a read. 2025-09-04 00:55:50 +02:00
David Given
bc84e3c8a0 It doesn't look great, but I think the config view is mostly done. 2025-09-03 23:48:48 +02:00
David Given
af12a25a9d Update dependencies. 2025-09-03 14:47:24 +02:00
David Given
f6b2821221 Update dependencies. 2025-09-03 14:32:20 +02:00
David Given
458601a139 Update dependencies. 2025-09-03 14:29:39 +02:00
David Given
a89130edbd The config viewer now mostly works, and sets mostly correct
configurations in the settings.
2025-09-03 01:14:53 +02:00
David Given
c95cd8a4da Add hints for global options to tell the GUI where to show them. 2025-09-03 01:14:23 +02:00
David Given
4d313a8495 Add in our custom view. 2025-09-01 00:45:36 +02:00
David Given
263eef3442 Try and enable submodules on github. 2025-09-01 00:30:52 +02:00
David Given
2e97996211 Get a minimal FE plugin working. 2025-09-01 00:29:55 +02:00
David Given
7035b9c3c2 Rearrange and clean up. 2025-08-31 23:58:07 +02:00
David Given
5628d2ca06 We need a custom romfs generator. 2025-08-31 23:55:24 +02:00
David Given
61cf7fbccf Get a fully working static imhex. 2025-08-31 23:37:51 +02:00
David Given
ce347c6326 A fair number of assets now load. 2025-08-31 16:43:13 +02:00
David Given
94119b19fe Getting my head around the way imhex works. 2025-08-31 00:35:47 +02:00
David Given
9c7be1268f Build some more bits. 2025-08-29 21:18:14 +02:00
David Given
a9d59f67ba It finally builds! Although does nothing. 2025-08-29 20:37:39 +02:00
David Given
8d2a72228f A reasonable amount of the imhex framework now builds. 2025-08-29 00:35:00 +02:00
David Given
60b95dd3f3 Added throwing_ptr. 2025-08-28 23:41:51 +02:00
David Given
b1094f40dc Add libromfs. 2025-08-28 23:27:40 +02:00
David Given
e40ea80e34 Add xdgpp. 2025-08-28 22:34:27 +02:00
David Given
9e1222d38a Add Native File Dialog. 2025-08-28 22:20:31 +02:00
David Given
4446785729 Put pattern-language in the right place. 2025-08-28 21:40:09 +02:00
David Given
790f015d72 Add the pattern language. 2025-08-28 21:36:42 +02:00
David Given
ccb0dcea3c Finally remember to add the build file! 2025-08-28 21:35:59 +02:00
David Given
15a0632af0 Add imgui. 2025-08-28 21:30:21 +02:00
David Given
3c0da28947 Some more building. 2025-08-28 21:23:22 +02:00
David Given
95227f32ca Start putting together the imhex build. 2025-08-28 21:10:41 +02:00
David Given
edf75b5cda Add libwolv. 2025-08-28 21:09:27 +02:00
David Given
af87c48451 Add an imhex submodule. 2025-08-28 20:18:02 +02:00
David Given
7cde8e3aa6 Merge pull request #824 from davidgiven/ab
Update ab to the new ninja version.
2025-08-27 19:47:09 +01:00
David Given
34fe6f0a5f _Actually_ update ab. 2025-08-27 20:23:46 +02:00
David Given
76c9674f3f Update ab. 2025-08-27 20:21:29 +02:00
David Given
addbabd123 Disable make parallelism (although I'm not sure this will help). 2025-08-27 19:57:24 +02:00
David Given
46b90d9c36 Merge pull request #825 from boamaod/master
Correct Juku E5104 documentation
2025-08-27 13:44:49 +01:00
Märt Põder
7ee67082aa Fix ambigious description about "both sides" and update links 2025-08-27 13:22:09 +03:00
David Given
e8042ed5f3 Adjust parallelism settings again. 2025-08-27 11:40:34 +02:00
David Given
8828874c25 Don't run more than one ninja instance at a time. 2025-08-27 11:22:53 +02:00
David Given
1bdb093319 Update ab. 2025-08-27 02:10:08 +02:00
David Given
a1e2191ad5 mingw is less aggressive about dead code removal that other gccs are, so
we need to add dependencies in places where they're really not used.
2025-08-27 03:06:31 +02:00
David Given
e61fcf1d9b utils.shell now takes a command string rather than an argv list. 2025-08-27 02:28:29 +02:00
David Given
610ef0dc4b Remember to put set -e in front of command scripts. 2025-08-27 02:27:40 +02:00
David Given
273d38f237 Fix command detection when a command string contains multiple words. 2025-08-27 00:11:57 +02:00
David Given
8194a08382 Update ab. 2025-08-26 23:09:47 +02:00
David Given
6170b704b1 Fix escaping of $$ strings; then escape them again before passing to ninja! 2025-08-26 21:30:50 +02:00
David Given
b05f5e7caa Warning fix. 2025-08-26 14:29:27 +02:00
David Given
4b38fc6044 Update ab again. 2025-08-26 02:06:32 +02:00
David Given
cee16a75ca Fix Windows dependencies. 2025-08-26 01:37:28 +02:00
David Given
9fd85a8289 Add missing file. 2025-08-26 01:28:53 +02:00
David Given
2f1eff1474 Update documentation. 2025-08-26 01:27:33 +02:00
David Given
8c582b8d72 Update to the new ninja-fied ab. 2025-08-26 01:23:58 +02:00
David Given
e49673329d Merge pull request #823 from davidgiven/cleanup
Do some cleanup since the last changes.
2025-08-21 19:31:57 +02:00
David Given
07ebed83bf Fix some documentation from the global options change. 2025-08-21 19:14:26 +02:00
David Given
1def87fdc3 Remove the rawReadDiskCommand() function, as it's no longer used. 2025-08-21 19:00:29 +02:00
David Given
d91fed7dd4 Update documentation. 2025-08-21 18:59:02 +02:00
David Given
5f2f7e70ef Remove rawread and merge. 2025-08-21 18:55:46 +02:00
David Given
83432beff6 Merge pull request #822 from davidgiven/config
Overhaul the config file CLI.
2025-08-21 18:42:21 +02:00
David Given
979b550178 Looks like our string_view fix hasn't worked --- tweak. 2025-08-21 01:19:19 +02:00
David Given
9062a531f3 Migrate the 40track etc extension configs to actual options. Add the
ability to have --group=value options to make this cleaner.
2025-08-21 00:53:50 +02:00
David Given
e2a6fbcf3c Update a few places which used -c for other purposes. 2025-08-20 21:30:06 +02:00
David Given
ec16931f3a Update documentation for -c. 2025-08-20 21:23:02 +02:00
David Given
0ec0ca7495 Config files are now specified with -c, rather than via filename
arguments, because otherwise you get really unhelpful error messages
when you get things wrong.
2025-08-20 21:19:34 +02:00
David Given
51fa7c9371 Fix broken link.
Closes: #799
2025-08-20 00:23:21 +02:00
David Given
6c69f10fe7 Merge pull request #821 from davidgiven/protobuf
Expose the .app on OSX (in a zipfile).
2025-08-20 00:17:43 +02:00
David Given
206e85a356 Expose the .app on OSX (in a zipfile).
Closes: #800
2025-08-20 00:02:43 +02:00
David Given
8d7dd4867b Merge pull request #820 from davidgiven/protobuf
Apply the fix from #811 to make everything build against Protobuf 31.
2025-08-19 23:43:26 +02:00
David Given
d1524f78fb Apply the fix from #811 to make everything build against Protobuf 31. 2025-08-19 23:28:19 +02:00
David Given
b26735d520 Merge pull request #819 from davidgiven/fl2
Add some flux file manipulation tools.
2025-08-19 22:58:05 +02:00
David Given
603baee777 Fix a subtle bug that was causing misparsing of indexed fields on OSX. I hate
C++.
2025-08-19 22:43:45 +02:00
David Given
e105b7f498 Merge from master. 2025-08-19 20:13:41 +02:00
David Given
bb3fbccb50 Merge pull request #818 from davidgiven/convert
Add a fe-convert (plus all the necessary backend work).
2025-08-19 19:59:12 +02:00
David Given
c8edcd963d Merge pull request #817 from davidgiven/ab
Update ab.
2025-08-19 01:32:40 +02:00
David Given
3b60cdc707 Remove the -j from the build scripts for OSX. 2025-08-19 01:15:47 +02:00
David Given
ea061d65c9 Update ab. 2025-08-19 01:14:33 +02:00
David Given
da64c0237f Update documentation. 2025-08-19 01:11:40 +02:00
David Given
d2b1602881 Add a working fluxfile cp. 2025-08-19 00:55:53 +02:00
David Given
1afd45068c Merge. 2025-08-19 00:18:59 +02:00
David Given
f01b30e112 Make fluxfile rm work. 2025-08-19 00:18:47 +02:00
David Given
b5f7fbe14e Finally come up with a fluxfile ls I can live with. 2025-08-18 23:59:57 +02:00
David Given
8b6073ccbb Try making the error collector non-constexpr? 2025-08-18 22:14:48 +02:00
David Given
f902c759df Try the suggested workaround in lexy for older compilers. 2025-08-18 22:10:06 +02:00
David Given
996fdbc0f5 More overhauling of the proto layer; fluxfile ls now works. 2025-08-18 00:37:42 +02:00
David Given
9ff3e3b42a Finally make the getters and setters work with repeated fields. 2025-08-17 23:04:14 +02:00
David Given
0a5604521e Merge in fluxfile stuff. 2025-08-17 21:12:27 +02:00
David Given
786636ef5d Don't allow writing Apple 2 flux images to SCP files, because there
isn't space for the quarter-step tracks.
2025-08-17 11:42:34 +02:00
David Given
18bdb27225 fluxengine convert now uses the same syntax as the other tools. 2025-08-17 11:26:16 +02:00
David Given
faca35dec0 Update documentation. 2025-08-17 10:51:50 +02:00
David Given
f8813daae3 Attempt to make work on Windows. 2025-08-17 10:47:54 +02:00
David Given
da5a20390f Fix unhelpful message. 2025-08-17 10:40:34 +02:00
David Given
3ab3db92f5 Add basic support for TI-99 disks. 2025-08-17 10:40:07 +02:00
David Given
a3cd3dd9dc Adjust dependencies. 2025-08-17 09:45:54 +02:00
David Given
918868e9e8 Try updating the Ubuntu version. 2025-08-17 09:43:10 +02:00
David Given
cf05a25445 Does _error_collector need a constexpr constructor and destructor? 2025-08-17 01:01:32 +02:00
David Given
5d5399a267 Add another weirdly missing file. 2025-08-17 00:55:10 +02:00
David Given
2de7af0ba5 Add weirdly missing file. 2025-08-17 00:52:01 +02:00
David Given
0382c304ad Warning fix. 2025-08-17 00:46:50 +02:00
David Given
182d9946fe Add missing file. 2025-08-17 00:40:55 +02:00
David Given
f24e4029b4 Flux sources now add the locations of their data to _extraConfig ---
which is now honoured. Fix a bunch of bugs in some of the flux sources
and sinks. The converter now actually works, maybe.
2025-08-17 00:38:25 +02:00
David Given
4ebda29171 Rename track -> cylinder in lots of places. 2025-08-16 17:39:55 +02:00
David Given
53026f3d02 Rework the way locations are handled to use the new locations
microformat rather than the old RangeProto.
2025-08-16 16:59:44 +02:00
David Given
99c0e95a2f Added a routine for parsing location lists using Lexy. 2025-08-15 23:39:21 +02:00
David Given
dfa56c6b08 Raw import of Lexy. 2025-08-14 23:36:31 +02:00
David Given
0419df4b2d Another archival checkin... 2025-08-13 23:00:08 +02:00
David Given
70bdcd0978 Non-functioning archival checkin. 2025-08-12 20:31:54 +01:00
David Given
022df995aa Update for newer C++. 2025-08-11 16:21:03 +01:00
David Given
dcbe7ec41d Raw import of alphanum. 2025-08-11 16:14:27 +01:00
David Given
df4d27eefe Better support for repeated fields in the config language. Add a helper
for showing all config fields in a proto.
2025-08-10 22:22:58 +01:00
David Given
8f233f55e9 Add fluxfile ls. 2025-07-28 23:20:41 +01:00
David Given
7db49aec21 Merge pull request #814 from davidgiven/build
Update ab.
2025-07-28 13:36:21 +02:00
David Given
b5eaec0778 Try more Windows fix? 2025-07-28 12:23:41 +01:00
David Given
06b126a2e7 Typo fix. 2025-07-27 23:20:32 +01:00
David Given
ed96ebac79 Another Windows fix. 2025-07-27 23:08:37 +01:00
David Given
c6e34d2d88 Alternative Windows fix. 2025-07-27 22:50:43 +01:00
David Given
53ac8bad79 Hopefully fix Windows. 2025-07-27 21:43:26 +01:00
David Given
d2e163bc3b More Windows build debugging. 2025-07-27 21:33:52 +01:00
David Given
1404123281 Windows debugging. 2025-07-27 21:20:28 +01:00
David Given
01a7afd28a Merge from master. 2025-07-27 20:48:27 +01:00
David Given
3a42911e6f Update ab. 2025-07-27 20:48:10 +01:00
David Given
8e5d52f2c7 Update ab. 2025-07-24 23:25:41 +02:00
David Given
dfff5d7230 Merge pull request #796 from davidgiven/layout
Fix and expand the layout support to allow libdsk `altback` layouts.
2025-07-21 00:29:10 +02:00
David Given
19b63786c8 Merge from master. 2025-07-21 00:01:41 +02:00
David Given
5293e1c18b Merge pull request #792 from davidgiven/builds
Make an attempt to switch to WSL 1 for better builds.
2025-04-24 21:07:12 +02:00
David Given
f200bb8b00 Update documentation. 2025-04-24 21:06:32 +02:00
David Given
ed11a5c412 Update release build script to match. 2025-04-24 21:04:21 +02:00
David Given
cdcc63f519 Disable the Debian 11 build, as it doesn't work. Try WSL1 again. 2025-04-24 20:49:44 +02:00
David Given
7096e9fd9c Disable Windows verbose builds. 2025-04-24 19:41:46 +02:00
David Given
c8fe56ea95 Switch the sandbox back to hardlinks. 2025-04-24 19:41:38 +02:00
David Given
8a2a58b1a5 Hopefully beat the OSX build into working. 2025-04-24 01:16:54 +02:00
David Given
42aec98368 Add missing file. 2025-04-22 23:11:43 +02:00
David Given
6d73371a79 Update ab. 2025-04-22 23:10:51 +02:00
David Given
4d60ff8e67 Update ab. 2025-03-20 02:11:10 +01:00
David Given
311ff4a89f Add in some missing dependencies. 2025-03-19 03:01:10 +01:00
David Given
5d57957a6e Add missing dependency. 2025-03-18 01:19:58 +01:00
David Given
f89adce02d Add missing file. 2025-03-18 01:08:09 +01:00
David Given
3e505f47bc It now builds properly! 2025-03-18 01:05:07 +01:00
David Given
06e29142e6 Arch files are now built as one library per subdirectory, and everything
is autodetected.
2025-03-18 00:37:07 +01:00
David Given
15a69f6dcb Make build with the new ab --- but the tests fail. 2025-03-17 22:33:54 +01:00
David Given
0f763fe06b Patch up for the libfmt change and update to c++20.Patch up for the
libfmt change and update to c++20.
2025-03-12 01:22:18 +01:00
David Given
f5adb89338 Upgrade dep/fmt to 11.1.4. 2025-03-12 01:07:17 +01:00
Märt Põder
36b120bdbe Add Juku 5104 floppies with a new filesystem_track_order option 2024-11-30 15:31:24 +02:00
David Given
cc169d414f Add experimental support for libdsk 'altback' mode layouts. 2024-11-29 22:39:34 +01:00
David Given
0fcb2075e0 Move filesystem_track_ordering from ImageReaderProto/ImageWriterProto to
ImgInputOutputProto; it now only applies to img files. Make it honour the
appropriate track layout setting too.
2024-11-29 22:30:33 +01:00
David Given
2bda78fb40 Distinguish between filesystem track ordering and image track ordering
(although currently only the filesystem ordering is used).
2024-11-29 22:07:58 +01:00
David Given
e878c6eef6 Remove the unused sector_order field from FilesystemProto. 2024-11-29 21:24:32 +01:00
David Given
9ce405cec5 Remove the broken install rule. 2024-11-24 23:10:48 +01:00
David Given
f064d413b3 Add a docker test for Manjaro Linux. 2024-11-24 22:50:44 +01:00
David Given
e5a3331f24 Enable debug tracing. 2024-11-22 21:44:56 +01:00
David Given
6f99f88b29 Merge from master. 2024-11-22 21:22:24 +01:00
David Given
8ff0153708 Add fedora 40 docker test. 2024-11-22 21:21:05 +01:00
David Given
c7273c06da Add docker tests for Fedora 41. 2024-11-22 21:17:34 +01:00
David Given
cd36caccc7 Warning fix. 2024-11-22 20:34:00 +01:00
David Given
a022aab28a Change the wx library order. 2024-11-09 20:52:47 +01:00
David Given
949e9c216d No, we need to stick with WSL2. 2024-11-09 19:35:03 +01:00
David Given
3fcf7d4e69 More adjust. 2024-11-09 19:11:00 +01:00
David Given
e335621558 Adjust. 2024-11-09 19:04:50 +01:00
David Given
9a0357c67b Fix filename. 2024-11-09 18:56:30 +01:00
David Given
0953039369 Try using WSL 1 with Fedora 41. 2024-11-09 18:52:34 +01:00
David Given
d4a8eb5847 More. 2024-11-09 18:19:14 +01:00
David Given
d48ab7c84e Adjust Docker setup script. 2024-11-09 18:00:15 +01:00
David Given
c43b88ac0b Try doing a Debian 11 build on github. 2024-11-09 17:59:02 +01:00
David Given
76ffbb96ba Remember to update the autorelease script for the new Fedora rpmsphere. 2024-11-09 14:05:25 +01:00
David Given
b6b28c8a02 Merge pull request #791 from davidgiven/docker
Make work on Debian 11.
2024-11-09 13:37:27 +01:00
David Given
a736e1da05 Upgrade rpm sphere to release 40. 2024-11-09 00:35:28 +01:00
David Given
a8cc280574 Looks like we need special options for OSX. 2024-11-08 22:15:35 +01:00
David Given
da9d9385b9 Another try at fixing the custom formatter. 2024-11-08 21:32:59 +01:00
David Given
149e5c6fba Make work on Debian 11. Add some Docker tests to make sure it keeps working on
Debian 11.
2024-11-08 21:07:17 +01:00
David Given
e14da81b48 Merge pull request #790 from davidgiven/ab
Update ab. Again.
2024-11-07 21:20:43 +01:00
David Given
49a0a6fdb3 Fix things caused by the ab upgrade. 2024-11-07 21:16:27 +01:00
David Given
da678dc52d Update ab. 2024-11-07 21:07:20 +01:00
David Given
6ff68f3f06 Update ab. 2024-11-07 21:06:56 +01:00
David Given
33feda7208 Update ab. 2024-10-23 14:34:38 +02:00
David Given
38af98ec9b Reformat. 2024-10-19 18:02:16 +02:00
David Given
d6a11d7164 Merge pull request #786 from davidgiven/refactor
Even more refactoring.
2024-10-19 17:32:44 +02:00
David Given
33d241c33e Move common.proto into config. 2024-10-19 16:58:44 +02:00
David Given
944ac97ba4 Move layout proto into config. 2024-10-19 16:44:02 +02:00
David Given
bb6e8dc6b2 Move the drive proto into config. 2024-10-19 16:34:34 +02:00
David Given
ed604f6284 Finally eliminate the +lib target. 2024-10-19 13:18:28 +02:00
David Given
3c67a67ae7 Merge pull request #785 from davidgiven/ab
Update ab.
2024-10-19 00:49:14 +02:00
David Given
f3e7a4e439 Update ab. 2024-10-19 00:27:38 +02:00
David Given
fb5bb874dd Update ab. 2024-10-19 00:19:05 +02:00
David Given
d3ccb4b0d7 Merge pull request #784 from davidgiven/refactor
Even more cleanup.
2024-10-18 21:15:04 +02:00
David Given
d096d7742f Adjust the number of OSX cpus. 2024-10-16 22:57:21 +02:00
David Given
92b5accb90 Tidy rule count. 2024-10-16 22:37:47 +02:00
David Given
1bcc8f45b5 Modularise encoders. Change arch to not depend on +lib. 2024-10-16 22:00:51 +02:00
David Given
5eef01377f Modularise decoders. 2024-10-16 21:52:53 +02:00
David Given
4c140b1b90 Modularise arch. 2024-10-16 21:17:59 +02:00
David Given
4bcbf2b089 Fix bad documentation which got checked in somehow. 2024-10-16 21:17:43 +02:00
David Given
6d3969ab79 Split the dependency so that the encoders/decoders don't depend on arch. 2024-10-16 21:00:48 +02:00
David Given
ea35551b9d Merge. 2024-10-16 20:28:46 +02:00
David Given
0d4c747a05 Merge pull request #783 from davidgiven/osx
More build script fixes.
2024-10-16 17:52:41 +02:00
David Given
6cc7d7b8fe Update build script... again. 2024-10-16 14:22:59 +02:00
David Given
3d0f82e4c6 Update ab. 2024-10-16 14:21:47 +02:00
David Given
26abcbaf81 Adjust OSX scripts... again. 2024-10-16 14:12:09 +02:00
David Given
f7efaa37f5 Merge pull request #782 from davidgiven/osx
Fix OSX builds.
2024-10-16 01:38:34 +02:00
David Given
167bb0287e Fix a stray header. 2024-10-16 01:29:35 +02:00
David Given
3020705012 Modularise imagewriter. 2024-10-16 01:12:35 +02:00
David Given
ecd80775d8 Modularise fluxsource. 2024-10-16 01:00:48 +02:00
David Given
c42e73f17a Modularise fluxsink and usb. 2024-10-16 00:41:57 +02:00
David Given
ec271a67ad Move the flx stuff into external. 2024-10-16 00:00:09 +02:00
David Given
ce4a9cfbd7 OSX 15 runners seem hard to find? 2024-10-15 23:36:58 +02:00
David Given
45f769893c Try and update the build scripts to use a matrix. 2024-10-15 23:07:36 +02:00
David Given
8a23046187 Fix another protocc invocation. 2024-10-15 22:48:48 +02:00
David Given
ca8f2a886e Was this the problem? 2024-10-15 22:45:50 +02:00
David Given
9dc6bdb03b Return of debugging. 2024-10-15 22:37:21 +02:00
David Given
c9b3e5e7e5 Bride of debugging. 2024-10-15 22:32:57 +02:00
David Given
f0ce9c1431 Even more debugging. 2024-10-15 22:12:48 +02:00
David Given
0b22593572 More debugging. 2024-10-15 22:11:06 +02:00
David Given
2fd1115ec9 Add debugging. 2024-10-15 22:05:42 +02:00
David Given
38d4bbdba1 Try upgrading the OSX version on CI. 2024-10-15 21:45:31 +02:00
David Given
cb9325843e Merge pull request #781 from davidgiven/refactor
More refactoring and modularisation.
2024-10-15 21:44:56 +02:00
David Given
900ba11623 Move csvreader into external. Why was it in core? 2024-10-15 00:56:57 +02:00
David Given
7da4e15b73 Move the Kryoflux and Catweasel stuff into external. 2024-10-15 00:52:02 +02:00
David Given
7983a4b883 Move the external file format stuff into its own module. 2024-10-15 00:46:46 +02:00
David Given
ea4a147751 Move fluxmapreader/fluxpattern into data. 2024-10-15 00:00:27 +02:00
David Given
33495e812e Update ab. 2024-10-14 23:29:09 +02:00
David Given
c6e2958665 Update ab. 2024-10-14 23:14:36 +02:00
David Given
86ede224ac Merge pull request #778 from davidgiven/refactor
Even more cleanup refactoring.
2024-10-14 00:35:08 +02:00
David Given
e07a906731 Silence some warnings. 2024-10-13 23:39:03 +02:00
David Given
76d139c29e Remember to add a virtual descructor to LogRenderer. 2024-10-13 23:32:41 +02:00
David Given
4b8487f164 Add missing file. 2024-10-13 23:27:12 +02:00
David Given
a006e0bf6f Overhaul the log stuff to actually work again (better). 2024-10-13 23:26:12 +02:00
David Given
c5373480ba Move a lot of the data-handling utilities into their own module. 2024-10-13 13:35:48 +02:00
David Given
e1f2494966 Create a config module containing all the configuration, proto and flags
stuff.
2024-10-13 11:57:18 +02:00
David Given
9ddfa5a56b Move the logger into core. 2024-10-13 11:39:33 +02:00
David Given
6339cd6b31 Move the routines which render log messages out of logger.cc; this breaks the
dependency which required logger.cc to have access to the entire rest of the
system. Although we still need to forward declare all the log messages.
2024-10-13 11:20:27 +02:00
David Given
7e80e255a4 Config no longer depends on Flux/Image/Encode/Decode, breaking a circular
dependency.
2024-10-12 01:49:13 +02:00
David Given
c6cbae4bc4 Merge pull request #777 from davidgiven/refactor
Lots more refactoring to build in a more modular way (and with a dramatically improved ab).
2024-10-11 22:45:59 +02:00
David Given
68f239765c Update ab. 2024-10-11 21:49:15 +02:00
David Given
77c57d7344 Update ab. 2024-10-09 23:03:35 +02:00
David Given
259c5d67e6 Update ab. 2024-10-09 22:36:42 +02:00
David Given
4c2fa27717 Update ab. 2024-10-09 15:40:01 +02:00
David Given
f5b14cadf8 Use "" to access the fmt headers, not <>, or else Windows can't find the
fallback library.
2024-10-09 15:10:22 +02:00
David Given
e154e41bc0 Alternate flag for thin archives. 2024-10-09 01:49:35 +02:00
David Given
1f2ebe8c33 Fixup due to bad intermediate files... 2024-10-09 01:37:15 +02:00
David Given
28444b7907 imagewriter protos built separately. 2024-10-09 01:30:28 +02:00
David Given
75f41fc630 imagereader proto built separately. 2024-10-09 01:28:07 +02:00
David Given
d091479f29 decoders protos now built separately. 2024-10-09 01:25:54 +02:00
David Given
665ceb9ea6 Add missing file. 2024-10-08 23:24:07 +02:00
David Given
27ab1e3e5a Refactor a lot of the proto stuff. 2024-10-08 23:18:30 +02:00
David Given
a777470cda Update ab. 2024-10-02 19:46:50 +02:00
David Given
f48d1c5196 Add progress info to MKDOC. 2024-10-02 11:38:24 +02:00
David Given
cee893b845 Merge pull request #774 from davidgiven/refactor
Do a lot of badly needed refactoring so that things aren't built as one huge library.
2024-10-02 11:34:24 +02:00
David Given
07ccb6319a Tweak dependencies. 2024-10-02 01:16:38 +02:00
David Given
a6981ff7ef Split the FluxmapReader and FluxPattern files. 2024-10-02 00:42:06 +02:00
David Given
fc8d0283b1 Remove the applesauce.cc and test, as it's not used any more. 2024-10-02 00:28:04 +02:00
David Given
5e892e8fc3 Fixup for Applesauce. 2024-10-02 00:23:39 +02:00
David Given
8b124e5ced Merge. 2024-10-01 23:58:48 +02:00
David Given
65dc707c29 Merge pull request #773 from davidgiven/applesauce
Add basic support for Applesauce hardware.
2024-10-01 23:52:37 +02:00
David Given
65fb3e9e76 Detect index marks and interleave them into the flux stream. 2024-10-01 22:26:02 +02:00
David Given
3a0c02459d Add documentation for the Applesauce. 2024-10-01 21:50:33 +02:00
David Given
33f3c97b03 Crudely hack in a lock against writing, as I'll have to wait for the v3
firmware.
2024-10-01 21:30:53 +02:00
David Given
c55032531c Move the VFS stuff into its own library. 2024-10-01 21:06:14 +02:00
David Given
12f999e9e4 Move hexdump into core. 2024-10-01 21:00:22 +02:00
David Given
817cf03592 Fixup after last checkin. 2024-10-01 20:55:02 +02:00
David Given
ca940d1599 Refactor core libraries into their own library. 2024-10-01 20:36:53 +02:00
David Given
d00fba02a0 Rename greaseWeazle to greaseweazle (as it needs doing). 2024-09-30 22:03:17 +02:00
David Given
045e5e7303 Rename write_clock to write_clock_ns, because it is. Tweak the default value
for correctness.
2024-09-30 22:02:09 +02:00
David Given
6fd98e3c67 Writing with the Applesauce now mostly works, although there's still stuff to
be dealt with.
2024-09-29 23:40:19 +02:00
David Given
98279e44ef Remove stray logging. 2024-09-29 23:39:59 +02:00
David Given
22b78cee56 Report which flag could not be recognised on error. 2024-09-29 23:39:32 +02:00
David Given
8f7203e38b Fix testpattern: to actually work. 2024-09-29 23:12:02 +02:00
David Given
38b8cd2574 Reads mostly work; writes not yet. 2024-09-29 13:05:46 +02:00
David Given
6b28f36b97 getVersion() doesn't need to be a public USB method. 2024-09-28 23:44:33 +02:00
David Given
d394b21920 Got our first track read! 2024-09-28 23:39:30 +02:00
David Given
14255a5076 Successfully read raw Applesauce data. 2024-09-28 23:07:05 +02:00
David Given
8fa1a887ce Initial work towards Applesauce support --- you can connect to the device and
test bandwidth.
2024-09-28 20:04:54 +02:00
David Given
fb6fa969a8 Update release script. 2024-09-28 17:05:41 +02:00
David Given
2840831017 Initial boilerplate for the Applesauce. 2024-09-28 17:03:59 +02:00
David Given
a4a83c6cfc Merge pull request #770 from davidgiven/ab
Update ab.
2024-09-28 16:55:52 +02:00
David Given
2c508cf51d Give artifacts unique names. 2024-09-28 16:08:59 +02:00
David Given
e02aa00d07 WSL2 works, so use it for the release script. 2024-09-28 13:35:48 +02:00
David Given
dc384c3635 Pre-release doesn't work. 2024-09-28 12:44:12 +02:00
David Given
69db44d1cf Try WSL 2. 2024-09-28 12:42:50 +02:00
David Given
6fdc9a252a Update ab. 2024-09-28 12:35:22 +02:00
David Given
11166a3c5c Try using the prerelease wsl. 2024-09-28 12:19:00 +02:00
David Given
3b2a3c6e3a Make the _progress script a bit more robust. 2024-09-28 12:12:58 +02:00
David Given
d890383ad2 Update ab. 2024-09-28 12:07:10 +02:00
David Given
4c4b6ee045 Try setting WSL1 explicitly. 2024-09-19 16:31:31 +02:00
David Given
a55196e7e5 Update ab. 2024-09-19 16:15:27 +02:00
David Given
866d5a2933 Update ab. 2024-09-19 00:55:45 +02:00
David Given
8cba89722b Mutter mutter. 2024-09-12 00:19:11 +02:00
David Given
6d1c623716 Typo fix. 2024-09-12 00:17:26 +02:00
David Given
a8c7ffc77d Update Fedora WSL. 2024-09-12 00:15:16 +02:00
David Given
fb05b6ac6d Merge pull request #769 from davidgiven/ab
Update ab.
2024-09-11 23:17:11 +02:00
David Given
0e83b2e7df Try building with macos-13. 2024-09-11 21:37:22 +02:00
David Given
1baaa4402d Merge. 2024-09-10 21:24:50 +02:00
David Given
2af61e4aca Update ab. 2024-09-10 21:22:17 +02:00
David Given
db235dae5e Merge. 2024-09-10 21:21:54 +02:00
David Given
241878bd0e New fmt requires a slight API change. 2024-09-10 21:12:58 +02:00
David Given
1386e343ec New fmt requires a slight API change. 2024-09-10 21:12:58 +02:00
David Given
9ff51ec8ef Update CI script. 2024-09-10 19:53:44 +02:00
David Given
45036b708f Update CI script. 2024-09-10 19:53:44 +02:00
David Given
ec3b5b10df Adjust default Brother head_bias, and fix the documentation.
Fixes: #768
2024-09-10 18:32:03 +02:00
David Given
4817298dbb Update ab. 2024-09-10 17:55:45 +02:00
David Given
af0ce4cf35 Update ab. 2024-09-02 23:51:03 +02:00
David Given
3c3d8d080c Merge pull request #763 from davidgiven/protos
Encode all the protos in one go (per library), as it's vastly faster.
2024-08-12 17:43:35 +02:00
David Given
dc6af483a5 Remember to build the drivetypes table. 2024-08-12 17:32:13 +02:00
David Given
9a0b487f4b Remember to build the formats table. 2024-08-12 17:26:28 +02:00
David Given
cac4d1ce86 Encode all the protos in one go (per library), as it's vastly faster. 2024-08-12 12:36:39 +02:00
David Given
7a3a31a929 Merge pull request #759 from davidgiven/a2r
Improve the A2R writer.
2024-07-31 23:45:51 +02:00
David Given
eee6f95b15 Typo fix. 2024-07-31 13:48:06 +02:00
David Given
7a3d10451d Rework the A2R writer to be a bit less broken. 2024-07-30 22:54:59 +02:00
David Given
e4f1a5a06f Merge pull request #752 from davidgiven/tartu
Add encoder support for the Tartu format.
2024-05-14 21:48:36 +02:00
David Given
500fcde21b Merge. 2024-05-14 21:41:30 +02:00
David Given
eb363a4b2a Update Tartu documentation. 2024-05-14 21:40:50 +02:00
David Given
8a78e609b0 And fix everywhere else... 2024-05-13 23:41:37 +02:00
David Given
15c67b8cc1 Bash into workingness on OSX. 2024-05-13 23:27:53 +02:00
David Given
00e9c5a07f Add support for updating file metadata (only the SRA bits, really). 2024-05-13 21:44:58 +02:00
David Given
7643457374 Add support for renaming files. 2024-05-13 21:12:42 +02:00
David Given
78d5584e21 Add creeate, put and delete support to the CP/M filesystem driver. 2024-05-13 00:32:57 +02:00
David Given
1d1143a893 Merge from master. 2024-05-10 00:19:57 +02:00
David Given
91093e1304 Merge pull request #754 from davidgiven/greaseweazle
Correctly twiddle DTR on Linux/OSX when changing baud rates.
2024-05-01 19:11:57 +02:00
David Given
1175a06f3d Merge from master. 2024-05-01 16:23:59 +02:00
David Given
6e5abd1189 Merge from master. 2024-05-01 16:23:38 +02:00
David Given
34f97384e7 Merge pull request #753 from davidgiven/osx
Fix OSX build problems.
2024-05-01 16:23:09 +02:00
David Given
653a6a0189 Be more consistent about DTR toggling (needed to reset serial devices). 2024-05-01 12:54:22 +02:00
David Given
f0b1b61eac Merge pull request #749 from p-j-b/fix-hang-windows-adafruit-floppy-greaseweazle
Set DTR after calling SetCommState
2024-05-01 12:46:08 +02:00
David Given
c0fd121bdf Restore build script to normal. 2024-05-01 00:25:41 +02:00
David Given
b805b86ddb Fix truncate arg ordering because of stupid OSX. 2024-05-01 00:25:10 +02:00
David Given
654e7e750c Fix truncate arg ordering because of stupid OSX. 2024-05-01 00:25:10 +02:00
David Given
7501fcfe8b Looks like compiling protobuf files now requires access to the protobuf
libraries.
2024-05-01 00:18:18 +02:00
David Given
fdb7837e03 Looks like compiling protobuf files now requires access to the protobuf
libraries.
2024-05-01 00:18:18 +02:00
David Given
1c57cea483 Try and debug the OSX build failure. 2024-05-01 00:00:30 +02:00
David Given
0c8e8d4d69 Remember to mark the 40-track format as being such. 2024-04-30 23:09:45 +02:00
David Given
8876aae2cc Calculate gaps in bits, not bytes (more accurate). Pad the end of the track to
avoid weirdness reading the last sector.
2024-04-30 23:09:30 +02:00
David Given
3e053b32e2 Display a useful command to repeat a test if one fails. 2024-04-30 23:07:10 +02:00
David Given
0611728537 Don't try to change the build system just yet. 2024-04-30 21:32:58 +02:00
David Given
a84cf83ce5 Add a prototype Tartu encoder. 2024-04-30 00:56:26 +02:00
David Given
c064aa7862 Merge pull request #751 from davidgiven/tartu
Add support for the Tartu Palivere.
2024-04-23 22:21:05 +02:00
David Given
195f7126cc Update link. 2024-04-23 21:58:42 +02:00
David Given
50d466c9c1 Update Tartu documentation. 2024-04-23 21:56:42 +02:00
David Given
5763574634 Update documentation. 2024-04-21 01:18:17 +02:00
David Given
2da568b3e8 Update the Tartu documentation. 2024-04-21 00:35:39 +02:00
David Given
2732d9aec8 Get the Tartu checksums working, and hook up the CP/M filesystem code. 2024-04-21 00:17:11 +02:00
David Given
15d34aff15 Work-in-progress Tartu decoder. 2024-04-20 01:20:49 +02:00
David Given
af3e257c78 Add boilerplate for the Tartu. 2024-04-19 21:10:49 +02:00
p-j-b
c2248c7e4a Added CLRDTR and SETDTR to setBaudRate
Fixes hang in Windows with Adafruit Floppy GreaseWeazle
2024-04-02 13:05:29 +01:00
David Given
a7967b6dc3 More release script tweaks. 2024-03-31 22:50:55 +02:00
David Given
c1f47921e6 Adjust release script. 2024-03-31 22:38:21 +02:00
David Given
cda93d516b Merge pull request #748 from davidgiven/windows
Switch from MSYS builds to WSL/Fedora builds.
2024-03-31 22:31:36 +02:00
David Given
8f9c12b26c Update the release build script. 2024-03-31 22:18:56 +02:00
David Given
cdb4e9ed21 Typo fix. 2024-03-31 22:00:27 +02:00
David Given
1a612c3db5 Pull the .a file out of fallback targets at make time, not at config time. 2024-03-31 21:53:40 +02:00
David Given
72ab957134 Remember to build C++ files with g++. 2024-03-31 21:44:12 +02:00
David Given
621523db62 Try not to build fallback packages unless necessary. 2024-03-31 21:30:26 +02:00
David Given
cdf9cc387c Finally, it works! 2024-03-31 18:42:37 +02:00
David Given
b84ecd289d Again. 2024-03-31 18:25:36 +02:00
David Given
d4cb8f414a Again. 2024-03-31 18:06:19 +02:00
David Given
8180c1f79e Again. 2024-03-31 17:47:16 +02:00
David Given
b23b21a7bf Again. 2024-03-31 17:38:36 +02:00
David Given
b30eff294d Again. 2024-03-31 15:45:54 +02:00
David Given
cacb397198 Again. 2024-03-31 15:36:28 +02:00
David Given
0f8c7d6969 Again. 2024-03-31 15:13:43 +02:00
David Given
7b35232cad Again. 2024-03-31 14:47:44 +02:00
David Given
43624796db Again. 2024-03-31 14:30:52 +02:00
David Given
bc17c624d3 Again. 2024-03-31 14:10:53 +02:00
David Given
61476ea0cc Again. 2024-03-31 13:59:19 +02:00
David Given
f0663030e1 Again. 2024-03-31 13:39:19 +02:00
David Given
989a11931b Add libssp. 2024-03-31 13:27:00 +02:00
David Given
94372a7f09 Again. 2024-03-31 13:12:39 +02:00
David Given
5c2702c6ab Again. 2024-03-31 13:07:07 +02:00
David Given
586c09f5c3 Again. 2024-03-31 12:53:49 +02:00
David Given
7a94123f0d Again. 2024-03-31 12:31:58 +02:00
David Given
4cad34a8a4 Update ccpp.yml 2024-03-31 00:30:14 +01:00
David Given
c0ef3215df Update ccpp.yml 2024-03-30 23:48:40 +01:00
David Given
08982aae7a Update ccpp.yml 2024-03-30 23:34:38 +01:00
David Given
6366ac6639 Update ccpp.yml 2024-03-30 23:08:14 +01:00
David Given
3807d22a78 Update ccpp.yml 2024-03-30 22:57:18 +01:00
David Given
3adbfd7ef5 Update ccpp.yml 2024-03-30 22:52:56 +01:00
David Given
7e40dfa5da Update ccpp.yml 2024-03-30 22:45:15 +01:00
David Given
62ddca2bb4 Update ccpp.yml 2024-03-30 22:44:20 +01:00
David Given
1a59e5065d Update ccpp.yml 2024-03-30 22:36:39 +01:00
David Given
52c0c409e9 Update ccpp.yml 2024-03-30 22:35:28 +01:00
David Given
e74b16d28b Update ccpp.yml 2024-03-30 22:29:37 +01:00
David Given
c2369bcc31 Again. 2024-03-30 22:23:26 +01:00
David Given
2636352a49 Try doing real work. 2024-03-30 23:03:57 +01:00
David Given
222a88f097 Again. 2024-03-30 21:01:14 +01:00
David Given
dbc691726d Again. 2024-03-30 20:55:04 +01:00
David Given
9ff3aedf18 Again. 2024-03-30 20:53:20 +01:00
David Given
8303a1fbca Again. 2024-03-30 20:51:12 +01:00
David Given
0f584ee343 Can we install the Fedora WSL system? 2024-03-30 20:50:18 +01:00
David Given
aafad0a628 Install the rest of the packages. 2024-03-30 20:35:08 +01:00
David Given
9d03951da9 Try installing OpenSUSE packages. 2024-03-30 20:28:53 +01:00
David Given
b15d6cb8e5 Try out a WSL github workflow. 2024-03-30 20:25:42 +01:00
David Given
f9c1816e6f Format. 2024-03-30 19:29:48 +01:00
David Given
d960b020ea Get the executables building on WSL2 Fedora. 2024-03-30 19:14:02 +01:00
David Given
72e9d57b15 Raw import of libfmt. 2024-03-30 14:09:18 +01:00
David Given
968b90dbab Merge pull request #747 from davidgiven/ab
Convert to the latest ab.
2024-03-30 00:35:22 +01:00
David Given
2bccdcc93b Disable more Windows builds. 2024-03-30 00:25:01 +01:00
David Given
ce2a5eb6d9 Disable Windows builds. 2024-03-30 00:23:26 +01:00
David Given
353e4f6210 Try to fix OSX build. 2024-03-30 00:20:56 +01:00
David Given
c115de9d40 Update to build with ab. 2024-03-29 23:53:05 +01:00
David Given
df83b558bf Merge pull request #742 from davidgiven/devices
Don't print the detection banner if no devices were detected.
2024-01-30 22:59:18 +01:00
David Given
30fe75f9bf Merge pull request #741 from davidgiven/devices
Add a command to list detectable devices on the command line.
2024-01-30 22:57:01 +01:00
835 changed files with 96451 additions and 27364 deletions

View File

@@ -8,84 +8,114 @@ concurrency:
jobs:
build-linux:
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
repository: 'davidgiven/fluxengine'
path: 'fluxengine'
- uses: actions/checkout@v2
submodules: 'true'
- uses: actions/checkout@v4
with:
repository: 'davidgiven/fluxengine-testdata'
path: 'fluxengine-testdata'
- name: apt
run: |
sudo apt install libudev-dev libsqlite3-dev protobuf-compiler libwxgtk3.0-gtk3-dev libfmt-dev libprotobuf-dev wx-common
sudo apt update
sudo apt install libudev-dev libsqlite3-dev protobuf-compiler libwxgtk3.2-dev libfmt-dev libprotobuf-dev libmagic-dev libmbedtls-dev libcurl4-openssl-dev libmagic-dev nlohmann-json3-dev libdbus-1-dev libglfw3-dev libmd4c-dev libfreetype-dev libcli11-dev libboost-regex-dev
- name: make
run: CXXFLAGS="-Wp,-D_GLIBCXX_ASSERTIONS" make -j`nproc` -C fluxengine
#build-linux-debian-11:
# runs-on: ubuntu-22.04
# container: debian:11
# steps:
# - uses: actions/checkout@v4
# with:
# repository: 'davidgiven/fluxengine'
# path: 'fluxengine'
# - uses: actions/checkout@v4
# with:
# repository: 'davidgiven/fluxengine-testdata'
# path: 'fluxengine-testdata'
# - name: apt update
# run: apt update
# - name: apt
# run: >
# apt install -y python3 make xz-utils python3 python3-hamcrest
# protobuf-compiler libprotobuf-dev libsqlite3-dev
# libfmt-dev libprotobuf-dev wx-common pkg-config
# libudev-dev g++ libwxgtk3.0-gtk3-dev
# - name: make
# run: make -C fluxengine
build-macos-current:
runs-on: macos-latest
strategy:
matrix:
runs-on: [macos-15, macos-15-intel]
runs-on: ${{ matrix.runs-on }}
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
repository: 'davidgiven/fluxengine'
path: 'fluxengine'
- uses: actions/checkout@v2
submodules: 'true'
- uses: actions/checkout@v4
with:
repository: 'davidgiven/fluxengine-testdata'
path: 'fluxengine-testdata'
- name: brew
run: brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg
run: |
brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg libmagic nlohmann-json cli11 boost glfw3 md4c ninja python freetype2 mbedtls
brew upgrade
- name: make
run: gmake -j`nproc` -C fluxengine
run: gmake -C fluxengine
- name: Upload build artifacts
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v4
with:
name: ${{ github.event.repository.name }}.${{ github.sha }}
path: fluxengine/FluxEngine.pkg
name: ${{ github.event.repository.name }}.${{ github.sha }}.fluxengine.${{ runner.arch }}.pkg
path: |
fluxengine/FluxEngine.pkg
fluxengine/FluxEngine.app.zip
build-windows:
runs-on: windows-latest
defaults:
run:
shell: msys2 {0}
steps:
- uses: msys2/setup-msys2@v2
with:
msystem: mingw64
update: true
msystem: MINGW32
install: >-
diffutils
make
mingw-w64-i686-binutils
mingw-w64-i686-fmt
mingw-w64-i686-gcc
mingw-w64-i686-libusb
mingw-w64-i686-nsis
mingw-w64-i686-pkg-config
mingw-w64-i686-protobuf
mingw-w64-i686-python
mingw-w64-i686-sqlite3
mingw-w64-i686-wxWidgets
mingw-w64-i686-zlib
mingw-w64-i686-png2ico
vim
zip
- name: update-protobuf
install: |
python diffutils ninja make zip
pacboy: |
protobuf:p pkgconf:p curl-winssl:p file:p glfw:p mbedtls:p
sqlite:p freetype:p boost:p gcc:p binutils:p nsis:p abseil-cpp:p
- name: debug
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
pacboy -Q --info protobuf:p
cat /mingw64/lib/pkgconfig/protobuf.pc
/mingw64/bin/pkg-config.exe protobuf --cflags
/mingw64/bin/pkg-config.exe protobuf --cflags --static
- uses: actions/checkout@v4
with:
repository: 'davidgiven/fluxengine'
path: 'fluxengine'
- uses: actions/checkout@v2
submodules: 'true'
- uses: actions/checkout@v4
with:
repository: 'davidgiven/fluxengine-testdata'
path: 'fluxengine-testdata'
- name: build
run: MAGICK_TIME_LIMIT=100 make -j`nproc` -C fluxengine
- name: run
run: |
make -C fluxengine BUILDTYPE=windows
- name: nsis
run: |
@@ -96,11 +126,10 @@ jobs:
- 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
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
uses: actions/upload-artifact@v4
with:
name: ${{ github.event.repository.name }}.${{ github.sha }}
name: ${{ github.event.repository.name }}.${{ github.sha }}.windows.zip
path: fluxengine/fluxengine-windows.zip

View File

@@ -12,50 +12,43 @@ on:
jobs:
dev-release:
runs-on: windows-latest
defaults:
run:
shell: msys2 {0}
steps:
- uses: msys2/setup-msys2@v2
- name: setup WSL
run: |
curl -L https://github.com/WhitewaterFoundry/Fedora-Remix-for-WSL/releases/download/41.0.0/Fedora-Remix-for-WSL-SL_41.0.0.0_x64_arm64.msixbundle -o fedora.msixbundle
unzip fedora.msixbundle Fedora-Remix-for-WSL-SL_41.0.0.0_x64.msix
unzip Fedora-Remix-for-WSL-SL_41.0.0.0_x64.msix install.tar.gz
wsl --update
wsl --set-default-version 1
wsl --import fedora fedora install.tar.gz
wsl --set-default fedora
wsl sh -c 'dnf -y install https://github.com/rpmsphere/noarch/raw/master/r/rpmsphere-release-40-1.noarch.rpm'
wsl sh -c 'dnf -y install gcc gcc-c++ protobuf-c-compiler protobuf-devel fmt-devel systemd-devel sqlite-devel wxGTK-devel mingw32-gcc mingw32-gcc-c++ mingw32-zlib-static mingw32-protobuf-static mingw32-sqlite-static mingw32-wxWidgets3-static mingw32-libpng-static mingw32-libjpeg-static mingw32-libtiff-static mingw32-nsis png2ico ninja-build'
- name: fix line endings
run: |
git config --global core.autocrlf false
git config --global core.eol lf
- uses: actions/checkout@v4
with:
update: true
msystem: MINGW32
install: >-
diffutils
make
mingw-w64-i686-binutils
mingw-w64-i686-fmt
mingw-w64-i686-gcc
mingw-w64-i686-libusb
mingw-w64-i686-nsis
mingw-w64-i686-pkg-config
mingw-w64-i686-protobuf
mingw-w64-i686-python
mingw-w64-i686-sqlite3
mingw-w64-i686-wxWidgets
mingw-w64-i686-zlib
mingw-w64-i686-png2ico
vim
zip
- uses: actions/checkout@v3
repository: 'davidgiven/fluxengine'
path: 'fluxengine'
- name: update-protobuf
- name: run
run: |
pacman -U --noconfirm https://repo.msys2.org/mingw/mingw32/mingw-w64-i686-protobuf-21.9-1-any.pkg.tar.zst
- name: build
run: |
MAGICK_TIME_LIMIT=100 make -j`nproc`
wsl sh -c 'cd fluxengine && make BUILDTYPE=windows -j$(nproc)'
- 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
wsl sh -c 'cd fluxengine && strip fluxengine.exe -o fluxengine-stripped.exe'
wsl sh -c 'cd fluxengine && strip fluxengine-gui.exe -o fluxengine-gui-stripped.exe'
wsl sh -c 'cd fluxengine && 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
wsl sh -c '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: date
run: |
@@ -66,6 +59,7 @@ jobs:
with:
tag-name: dev
force-branch: false
git-directory: 'fluxengine'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -84,22 +78,28 @@ jobs:
with:
name: Development build ${{ env.RELEASE_DATE }}
files: |
fluxengine.zip
fluxengine-installer.exe
fluxengine/fluxengine.zip
fluxengine/fluxengine-installer.exe
tag_name: dev
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
build-macos:
runs-on: macos-latest
strategy:
matrix:
runs-on: [macos-13, macos-latest]
runs-on: ${{ matrix.runs-on }}
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: brew
run: brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg
- name: make
run: gmake -j`nproc`
run: |
gmake
mv FluxEngine.pkg FluxEngine-${{ runner.arch }}.pkg
mv FluxEngine.app.zip FluxEngine-${{ runner.arch }}.app.zip
- name: tag
uses: EndBug/latest-tag@latest
@@ -115,7 +115,8 @@ jobs:
token: ${{ github.token }}
tag: dev
assets: |
FluxEngine.pkg
FluxEngine-${{ runner.arch }}.pkg
FluxEngine-${{ runner.arch }}.app.zip
fail-if-no-assets: false
- name: release
@@ -123,7 +124,8 @@ jobs:
with:
name: Development build ${{ env.RELEASE_DATE }}
files: |
FluxEngine.pkg
FluxEngine-${{ runner.arch }}.pkg
FluxEngine-${{ runner.arch }}.app.zip
tag_name: dev
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

36
.gitmodules vendored Normal file
View File

@@ -0,0 +1,36 @@
[submodule "dep/imhex"]
path = dep/imhex
url = git@github.com:davidgiven/ImHex.git
[submodule "dep/libwolv"]
path = dep/libwolv
url = https://github.com/WerWolv/libwolv.git
[submodule "dep/imgui"]
path = dep/imgui
url = https://github.com/ocornut/imgui.git
[submodule "dep/pattern-language"]
path = dep/pattern-language
url = https://github.com/WerWolv/PatternLanguage.git
[submodule "dep/native-file-dialog"]
path = dep/native-file-dialog
url = https://github.com/btzy/nativefiledialog-extended.git
[submodule "dep/xdgpp"]
path = dep/xdgpp
url = https://github.com/WerWolv/xdgpp.git
[submodule "dep/libromfs"]
path = dep/libromfs
url = https://github.com/WerWolv/libromfs.git
[submodule "dep/throwing_ptr"]
path = dep/throwing_ptr
url = https://github.com/rockdreamer/throwing_ptr.git
[submodule "dep/lunasvg"]
path = dep/lunasvg
url = https://github.com/sammycage/lunasvg.git
[submodule "dep/md4c"]
path = dep/md4c
url = https://github.com/mity/md4c
[submodule "dep/nlohmann_json"]
path = dep/nlohmann_json
url = https://github.com/nlohmann/json
[submodule "dep/cli11"]
path = dep/cli11
url = https://github.com/CLIUtils/CLI11

147
Makefile
View File

@@ -1,40 +1,110 @@
CC = gcc
CXX = g++ -std=c++17
CFLAGS = -g -O3
LDFLAGS =
ifeq ($(BUILDTYPE),)
buildtype_Darwin = osx
buildtype_Haiku = haiku
BUILDTYPE := $(buildtype_$(shell uname -s ))
ifeq ($(BUILDTYPE),)
BUILDTYPE := unix
endif
endif
export BUILDTYPE
OBJ = .obj
OPTFLAGS = -g -O3
ifeq ($(BUILDTYPE),windows)
MINGW = x86_64-w64-mingw32-
CC = $(MINGW)gcc
CXX = $(MINGW)g++
CFLAGS += \
$(OPTFLAGS) \
-ffunction-sections \
-fdata-sections \
-Wno-attributes \
-Wa,-mbig-obj \
-static
CXXFLAGS += \
$(OPTFLAGS) \
-std=c++23 \
-Wno-deprecated-enum-float-conversion \
-Wno-deprecated-enum-enum-conversion \
-Wno-attributes \
-Wa,-mbig-obj \
-static
LDFLAGS += -Wl,--gc-sections -static
AR = $(MINGW)gcc-ar
PKG_CONFIG = $(MINGW)pkg-config --static
WINDRES = $(MINGW)windres
WX_CONFIG = /usr/i686-w64-mingw32/sys-root/mingw/bin/wx-config-3.0 --static=yes
NINJA = /bin/ninja
PROTOC = /mingw64/bin/protoc
PROTOC_SEPARATOR = ;
EXT = .exe
AB_SANDBOX = no
else
CC = clang
CXX = clang++
CFLAGS = \
$(OPTFLAGS) \
-I/opt/homebrew/include -I/usr/local/include \
-Wno-unknown-warning-option
CXXFLAGS = \
$(OPTFLAGS) \
-std=c++23 \
-fexperimental-library \
-I/opt/homebrew/include -I/usr/local/include \
-Wformat \
-Wformat-security \
-Wno-deprecated-enum-float-conversion \
-Wno-deprecated-enum-enum-conversion
LDFLAGS =
AR = ar
PKG_CONFIG = pkg-config
ifeq ($(BUILDTYPE),osx)
else
LDFLAGS += -pthread -Wl,--no-as-needed
endif
endif
HOSTCC = gcc
HOSTCXX = g++ -std=c++20
HOSTCFLAGS = -g -O3
HOSTLDFLAGS =
REALOBJ = .obj
OBJ = $(REALOBJ)/$(BUILDTYPE)
DESTDIR ?=
PREFIX ?= /usr/local
BINDIR ?= $(PREFIX)/bin
# Special Windows settings.
ifeq ($(OS), Windows_NT)
EXT ?= .exe
MINGWBIN = /mingw32/bin
CCPREFIX = $(MINGWBIN)/
PKG_CONFIG = $(MINGWBIN)/pkg-config
WX_CONFIG = /usr/bin/sh $(MINGWBIN)/wx-config --static=yes
PROTOC = $(MINGWBIN)/protoc
WINDRES = windres
LDFLAGS += \
-static
CXXFLAGS += \
-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)
endif
#ifeq ($(OS), Windows_NT)
# EXT ?= .exe
# MINGWBIN = /mingw32/bin
# CCPREFIX = $(MINGWBIN)/
# PKG_CONFIG = $(MINGWBIN)/pkg-config
# WX_CONFIG = /usr/bin/sh $(MINGWBIN)/wx-config --static=yes
# PROTOC = $(MINGWBIN)/protoc
# WINDRES = windres
# LDFLAGS += \
# -static
# CXXFLAGS += \
# -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)
#endif
# Special OSX settings.
ifeq ($(shell uname),Darwin)
LDFLAGS += \
-framework IOKit \
-framework Foundation
-framework AppKit \
-framework UniformTypeIdentifiers \
-framework UserNotifications
endif
.PHONY: all
@@ -44,22 +114,27 @@ all: +all README.md
binaries: all
tests: all
README.md: $(OBJ)/scripts+mkdocindex/scripts+mkdocindex$(EXT)
@echo MKDOC $@
README.md: $(OBJ)/scripts/+mkdocindex/mkdocindex$(EXT)
@echo $(PROGRESSINFO)MKDOC $@
@csplit -s -f$(OBJ)/README. README.md '/<!-- FORMATSSTART -->/' '%<!-- FORMATSEND -->%'
@(cat $(OBJ)/README.00 && $< && cat $(OBJ)/README.01) > README.md
.PHONY: tests
.PHONY: install install-bin
install:: all install-bin
install-bin:
@echo "INSTALL"
$(hide) install -D -v "$(OBJ)/src+fluxengine/src+fluxengine" "$(DESTDIR)$(BINDIR)/fluxengine"
$(hide) install -D -v "$(OBJ)/src/gui+gui/gui+gui" "$(DESTDIR)$(BINDIR)/fluxengine-gui"
$(hide) install -D -v "$(OBJ)/tools+brother120tool/tools+brother120tool" "$(DESTDIR)$(BINDIR)/brother120tool"
$(hide) install -D -v "$(OBJ)/tools+brother240tool/tools+brother240tool" "$(DESTDIR)$(BINDIR)/brother240tool"
$(hide) install -D -v "$(OBJ)/tools+upgrade-flux-file/tools+upgrade-flux-file" "$(DESTDIR)$(BINDIR)/upgrade-flux-file"
clean::
$(hide) rm -rf $(REALOBJ)
include build/ab.mk
DOCKERFILES = \
debian11 \
debian12 \
fedora40 \
fedora41 \
manjaro
docker-%: tests/docker/Dockerfile.%
docker build -t $* -f $< .
.PHONY: dockertests
dockertests: $(foreach f,$(DOCKERFILES), docker-$(strip $f) .WAIT)

View File

@@ -4,11 +4,8 @@ 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/))
**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.
**Breaking news!** As of 2024-10-01, the FluxEngine client software works
(to a point) with [Applesauce](doc/applesauce.md) hardware.
<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>
@@ -35,12 +32,14 @@ Don't believe me? Watch the demo reel!
</div>
**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.
[Greaseweazle](https://github.com/keirf/Greaseweazle/wiki) and
[Applesauce](https://applesaucefdc.com/) 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; the Applesauce is a
bit less supported but still works. See the [dedicated Greaseweazle
documentation page](doc/greaseweazle.md) or the [Applesauce
page](doc/applesauce.md) for more information.
Where?
------
@@ -126,6 +125,7 @@ choices because they can store multiple types of file system.
| [`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 |
| [`juku`](doc/disk-juku.md) | Juku E5104: CP/M | | | 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 |
@@ -136,6 +136,8 @@ choices because they can store multiple types of file system.
| [`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 |
| [`tartu`](doc/disk-tartu.md) | Tartu: The Palivere and variations | 🦄 | 🦖 | CPMFS |
| [`ti99`](doc/disk-ti99.md) | TI-99: 90kB 35-track SSSD | 🦖 | | |
| [`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 | 🦖 | 🦖 | |
@@ -257,6 +259,15 @@ 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.
As an exception, `dep/lexy` contains a partial copy of the lexy package, written
by foonathen@github, taken from https://github.com/foonathan/lexy. It is BSL 1.0
licensed. Please see the contents of the directory for the full text.
As an exception, `dep/alphanum` contains a copy of the alphanum package,
written by Dave Koelle, taken from
https://web.archive.org/web/20210207124255/davekoelle.com/alphanum.html. It is
MIT licensed. Please see the source 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

View File

@@ -1,11 +1,12 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/decoders/decoders.h"
#include "aeslanier.h"
#include "lib/crc.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/sector.h"
#include "lib/bytes.h"
#include "arch/aeslanier/aeslanier.h"
#include "lib/core/crc.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/data/sector.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
#include <string.h>
@@ -35,8 +36,8 @@ public:
decodeFmMfm(rawbits).slice(0, AESLANIER_RECORD_SIZE);
const auto& reversed = bytes.reverseBits();
_sector->logicalTrack = reversed[1];
_sector->logicalSide = 0;
_sector->logicalCylinder = reversed[1];
_sector->logicalHead = 0;
_sector->logicalSector = reversed[2];
/* Check header 'checksum' (which seems far too simple to mean much). */

View File

@@ -1,7 +1,7 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/decoders/decoders.h"
#include "agat.h"
#include "lib/bytes.h"
#include "arch/agat/agat.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
uint8_t agatChecksum(const Bytes& bytes)

View File

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

View File

@@ -1,11 +1,12 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/decoders/decoders.h"
#include "agat.h"
#include "lib/crc.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/sector.h"
#include "lib/bytes.h"
#include "arch/agat/agat.h"
#include "lib/core/crc.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/data/sector.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
#include <string.h>
@@ -58,9 +59,9 @@ public:
if (bytes[3] != 0x5a)
return;
_sector->logicalTrack = bytes[1] >> 1;
_sector->logicalCylinder = bytes[1] >> 1;
_sector->logicalSector = bytes[2];
_sector->logicalSide = bytes[1] & 1;
_sector->logicalHead = bytes[1] & 1;
_sector->status = Sector::DATA_MISSING; /* unintuitive but correct */
}

View File

@@ -1,11 +1,11 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/core/utils.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.h"
#include "lib/core/crc.h"
#include "lib/data/image.h"
#include "lib/data/layout.h"
#include "arch/agat/agat.pb.h"
#include "lib/encoders/encoders.pb.h"
@@ -58,13 +58,10 @@ private:
};
public:
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
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;
@@ -80,7 +77,7 @@ public:
writeFillerRawBytes(_config.pre_sector_gap_bytes(), 0xaaaa);
writeRawBits(SECTOR_ID, 64);
writeByte(0x5a);
writeByte((sector->logicalTrack << 1) | sector->logicalSide);
writeByte((sector->logicalCylinder << 1) | sector->logicalHead);
writeByte(sector->logicalSector);
writeByte(0x5a);

View File

@@ -1,7 +1,7 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/decoders/decoders.h"
#include "amiga.h"
#include "lib/bytes.h"
#include "arch/amiga/amiga.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
uint32_t amigaChecksum(const Bytes& bytes)

View File

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

View File

@@ -1,11 +1,12 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "protocol.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "amiga.h"
#include "lib/bytes.h"
#include "lib/data/sector.h"
#include "arch/amiga/amiga.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
#include "lib/decoders/decoders.pb.h"
#include <string.h>
@@ -51,8 +52,8 @@ public:
Bytes header = amigaDeinterleave(ptr, 4);
Bytes recoveryinfo = amigaDeinterleave(ptr, 16);
_sector->logicalTrack = header[1] >> 1;
_sector->logicalSide = header[1] & 1;
_sector->logicalCylinder = header[1] >> 1;
_sector->logicalHead = header[1] & 1;
_sector->logicalSector = header[2];
uint32_t wantedheaderchecksum =

View File

@@ -1,10 +1,10 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/core/utils.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "amiga.h"
#include "lib/crc.h"
#include "lib/readerwriter.h"
#include "lib/image.h"
#include "arch/amiga/amiga.h"
#include "lib/core/crc.h"
#include "lib/data/image.h"
#include "arch/amiga/amiga.pb.h"
#include "lib/encoders/encoders.pb.h"
@@ -84,7 +84,7 @@ static void write_sector(std::vector<bool>& bits,
checksum = 0;
Bytes header = {0xff, /* Amiga 1.0 format byte */
(uint8_t)((sector->logicalTrack << 1) | sector->logicalSide),
(uint8_t)((sector->logicalCylinder << 1) | sector->logicalHead),
(uint8_t)sector->logicalSector,
(uint8_t)(AMIGA_SECTORS_PER_TRACK - sector->logicalSector)};
write_interleaved_bytes(header);
@@ -110,7 +110,7 @@ public:
}
public:
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{

View File

@@ -1,6 +1,6 @@
syntax = "proto2";
import "lib/common.proto";
import "lib/config/common.proto";
message Apple2DecoderProto {
optional uint32 side_one_track_offset = 1

View File

@@ -1,13 +1,15 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "protocol.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "apple2.h"
#include "lib/data/sector.h"
#include "lib/data/layout.h"
#include "arch/apple2/apple2.h"
#include "arch/apple2/apple2.pb.h"
#include "lib/decoders/decoders.pb.h"
#include "lib/bytes.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
#include <string.h>
#include <algorithm>
@@ -92,24 +94,25 @@ public:
ByteReader br(header);
uint8_t volume = combine(br.read_be16());
_sector->logicalTrack = combine(br.read_be16());
_sector->logicalSide = _sector->physicalSide;
_sector->logicalCylinder = combine(br.read_be16());
_sector->logicalHead = _ltl->logicalHead;
_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))
(volume ^ _sector->logicalCylinder ^ _sector->logicalSector))
_sector->status =
Sector::DATA_MISSING; /* unintuitive but correct */
if (_sector->logicalSide == 1)
_sector->logicalTrack -= _config.apple2().side_one_track_offset();
if (_sector->logicalHead == 1)
_sector->logicalCylinder -=
_config.apple2().side_one_track_offset();
/* Sanity check. */
if (_sector->logicalTrack > 100)
if (_sector->logicalCylinder > 100)
{
_sector->status = Sector::MISSING;
return;

View File

@@ -1,14 +1,14 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/core/utils.h"
#include "arch/apple2/apple2.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "lib/sector.h"
#include "lib/readerwriter.h"
#include "lib/image.h"
#include "lib/data/sector.h"
#include "lib/data/image.h"
#include "fmt/format.h"
#include "lib/encoders/encoders.pb.h"
#include <ctype.h>
#include "lib/bytes.h"
#include "lib/core/bytes.h"
static int encode_data_gcr(uint8_t data)
{
@@ -36,7 +36,7 @@ private:
const Apple2EncoderProto& _config;
public:
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{
@@ -129,8 +129,8 @@ private:
// extra padding.
write_ff40(sector.logicalSector == 0 ? 32 : 8);
int track = sector.logicalTrack;
if (sector.logicalSide == 1)
int track = sector.logicalCylinder;
if (sector.logicalHead == 1)
track += _config.side_one_track_offset();
// Write address field: APPLE2_SECTOR_RECORD + sector identifier +

97
arch/arch.cc Normal file
View File

@@ -0,0 +1,97 @@
#include "lib/core/globals.h"
#include "lib/encoders/encoders.h"
#include "lib/decoders/decoders.h"
#include "lib/config/config.h"
#include "arch/agat/agat.h"
#include "arch/aeslanier/aeslanier.h"
#include "arch/amiga/amiga.h"
#include "arch/apple2/apple2.h"
#include "arch/brother/brother.h"
#include "arch/c64/c64.h"
#include "arch/f85/f85.h"
#include "arch/fb100/fb100.h"
#include "arch/ibm/ibm.h"
#include "arch/macintosh/macintosh.h"
#include "arch/micropolis/micropolis.h"
#include "arch/mx/mx.h"
#include "arch/northstar/northstar.h"
#include "arch/rolandd20/rolandd20.h"
#include "arch/smaky6/smaky6.h"
#include "arch/tartu/tartu.h"
#include "arch/tids990/tids990.h"
#include "arch/victor9k/victor9k.h"
#include "arch/zilogmcz/zilogmcz.h"
#include "arch/arch.h"
std::unique_ptr<Encoder> Arch::createEncoder(Config& config)
{
if (!config.hasEncoder())
error("no encoder configured");
return createEncoder(config->encoder());
}
std::unique_ptr<Encoder> Arch::createEncoder(const EncoderProto& config)
{
static const std::map<int,
std::function<std::unique_ptr<Encoder>(const EncoderProto&)>>
encoders = {
{EncoderProto::kAgat, createAgatEncoder },
{EncoderProto::kAmiga, createAmigaEncoder },
{EncoderProto::kApple2, createApple2Encoder },
{EncoderProto::kBrother, createBrotherEncoder },
{EncoderProto::kC64, createCommodore64Encoder},
{EncoderProto::kIbm, createIbmEncoder },
{EncoderProto::kMacintosh, createMacintoshEncoder },
{EncoderProto::kMicropolis, createMicropolisEncoder },
{EncoderProto::kNorthstar, createNorthstarEncoder },
{EncoderProto::kTartu, createTartuEncoder },
{EncoderProto::kTids990, createTids990Encoder },
{EncoderProto::kVictor9K, createVictor9kEncoder },
};
auto encoder = encoders.find(config.format_case());
if (encoder == encoders.end())
error("no encoder specified");
return (encoder->second)(config);
}
std::unique_ptr<Decoder> Arch::createDecoder(Config& config)
{
if (!config.hasDecoder())
error("no decoder configured");
return createDecoder(config->decoder());
}
std::unique_ptr<Decoder> Arch::createDecoder(const DecoderProto& config)
{
static const std::map<int,
std::function<std::unique_ptr<Decoder>(const DecoderProto&)>>
decoders = {
{DecoderProto::kAgat, createAgatDecoder },
{DecoderProto::kAeslanier, createAesLanierDecoder },
{DecoderProto::kAmiga, createAmigaDecoder },
{DecoderProto::kApple2, createApple2Decoder },
{DecoderProto::kBrother, createBrotherDecoder },
{DecoderProto::kC64, createCommodore64Decoder},
{DecoderProto::kF85, createDurangoF85Decoder },
{DecoderProto::kFb100, createFb100Decoder },
{DecoderProto::kIbm, createIbmDecoder },
{DecoderProto::kMacintosh, createMacintoshDecoder },
{DecoderProto::kMicropolis, createMicropolisDecoder },
{DecoderProto::kMx, createMxDecoder },
{DecoderProto::kNorthstar, createNorthstarDecoder },
{DecoderProto::kRolandd20, createRolandD20Decoder },
{DecoderProto::kSmaky6, createSmaky6Decoder },
{DecoderProto::kTartu, createTartuDecoder },
{DecoderProto::kTids990, createTids990Decoder },
{DecoderProto::kVictor9K, createVictor9kDecoder },
{DecoderProto::kZilogmcz, createZilogMczDecoder },
};
auto decoder = decoders.find(config.format_case());
if (decoder == decoders.end())
error("no decoder specified");
return (decoder->second)(config);
}

16
arch/arch.h Normal file
View File

@@ -0,0 +1,16 @@
#pragma once
class Encoder;
class Decoder;
class DecoderProto;
class EncoderProto;
class Config;
namespace Arch
{
std::unique_ptr<Decoder> createDecoder(Config& config);
std::unique_ptr<Decoder> createDecoder(const DecoderProto& config);
std::unique_ptr<Encoder> createEncoder(Config& config);
std::unique_ptr<Encoder> createEncoder(const EncoderProto& config);
}

View File

@@ -1,12 +1,13 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "brother.h"
#include "lib/sector.h"
#include "lib/bytes.h"
#include "lib/crc.h"
#include "arch/brother/brother.h"
#include "lib/data/sector.h"
#include "lib/core/bytes.h"
#include "lib/core/crc.h"
#include <ctype.h>
const FluxPattern SECTOR_RECORD_PATTERN(32, BROTHER_SECTOR_RECORD);
@@ -74,14 +75,14 @@ public:
const auto& bytes = toBytes(rawbits).slice(0, 4);
ByteReader br(bytes);
_sector->logicalTrack = decode_header_gcr(br.read_be16());
_sector->logicalCylinder = 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)
if (_sector->logicalCylinder > 79)
return;
_sector->status = Sector::DATA_MISSING;

View File

@@ -1,10 +1,10 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/core/utils.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "brother.h"
#include "lib/crc.h"
#include "lib/readerwriter.h"
#include "lib/image.h"
#include "arch/brother/brother.h"
#include "lib/core/crc.h"
#include "lib/data/image.h"
#include "arch/brother/brother.pb.h"
#include "lib/encoders/encoders.pb.h"
@@ -107,7 +107,7 @@ public:
}
public:
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{
@@ -127,7 +127,7 @@ public:
fillBitmapTo(bits, cursor, headerCursor, {true, false});
write_sector_header(bits,
cursor,
sectorData->logicalTrack,
sectorData->logicalCylinder,
sectorData->logicalSector);
fillBitmapTo(bits, cursor, dataCursor, {true, false});
write_sector_data(bits, cursor, sectorData->data);

View File

@@ -1,26 +1,61 @@
from build.c import cxxlibrary
from build.protobuf import proto, protocc
from build.protobuf import proto, protocc, protolib
from os.path import *
from glob import glob
import sys
proto(
name="arch_proto",
srcs=[
"./aeslanier/aeslanier.proto",
"./agat/agat.proto",
"./amiga/amiga.proto",
"./apple2/apple2.proto",
"./brother/brother.proto",
"./c64/c64.proto",
"./f85/f85.proto",
"./fb100/fb100.proto",
"./ibm/ibm.proto",
"./macintosh/macintosh.proto",
"./micropolis/micropolis.proto",
"./mx/mx.proto",
"./northstar/northstar.proto",
"./rolandd20/rolandd20.proto",
"./smaky6/smaky6.proto",
"./tids990/tids990.proto",
"./victor9k/victor9k.proto",
"./zilogmcz/zilogmcz.proto",
],
archs = [f for f in glob("*", root_dir="arch") if isfile(f"arch/{f}/{f}.proto")]
ps = []
pls = []
cls = []
for a in archs:
ps += [
proto(
name=f"proto_{a}",
srcs=[f"arch/{a}/{a}.proto"],
deps=["lib/config+common_proto"],
)
]
pls += [
protocc(
name=f"proto_lib_{a}",
srcs=[f".+proto_{a}"],
deps=["lib/config+common_proto_lib"],
)
]
cls += [
cxxlibrary(
name=f"arch_{a}",
srcs=glob(f"arch/{a}/*.cc") + glob(f"arch/{a}/*.h"),
hdrs={f"arch/{a}/{a}.h": f"arch/{a}/{a}.h"},
deps=[
"lib/core",
"lib/data",
"lib/config",
"lib/encoders",
"lib/decoders",
],
)
]
protolib(
name="proto",
srcs=ps + ["lib/config+common_proto"],
)
cxxlibrary(name="proto_lib", deps=pls)
cxxlibrary(
name="arch",
srcs=[
"./arch.cc",
],
hdrs={
"arch/arch.h": "./arch.h",
},
deps=cls
+ ["lib/core", "lib/data", "lib/config", "lib/encoders", "lib/decoders"],
)

View File

@@ -1,5 +1,5 @@
#include "lib/globals.h"
#include "c64.h"
#include "lib/core/globals.h"
#include "arch/c64/c64.h"
/*
* Track Sectors/track # Sectors Storage in Bytes Clock rate

View File

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

View File

@@ -1,12 +1,13 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "protocol.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "c64.h"
#include "lib/crc.h"
#include "lib/bytes.h"
#include "lib/data/sector.h"
#include "arch/c64/c64.h"
#include "lib/core/crc.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
#include <string.h>
#include <algorithm>
@@ -73,8 +74,8 @@ public:
uint8_t checksum = bytes[0];
_sector->logicalSector = bytes[1];
_sector->logicalSide = 0;
_sector->logicalTrack = bytes[2] - 1;
_sector->logicalHead = 0;
_sector->logicalCylinder = bytes[2] - 1;
if (checksum == xorBytes(bytes.slice(1, 4)))
_sector->status =
Sector::DATA_MISSING; /* unintuitive but correct */

View File

@@ -1,17 +1,17 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/core/utils.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "c64.h"
#include "lib/crc.h"
#include "lib/sector.h"
#include "lib/readerwriter.h"
#include "lib/image.h"
#include "arch/c64/c64.h"
#include "lib/core/crc.h"
#include "lib/data/sector.h"
#include "lib/data/image.h"
#include "fmt/format.h"
#include "arch/c64/c64.pb.h"
#include "lib/encoders/encoders.pb.h"
#include "lib/layout.h"
#include "lib/data/layout.h"
#include <ctype.h>
#include "lib/bytes.h"
#include "lib/core/bytes.h"
static bool lastBit;
@@ -155,7 +155,7 @@ public:
}
public:
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{
@@ -178,7 +178,7 @@ public:
else
_formatByte1 = _formatByte2 = 0;
double clockRateUs = clockPeriodForC64Track(trackInfo->logicalTrack);
double clockRateUs = clockPeriodForC64Track(ltl.logicalCylinder);
int bitsPerRevolution = 200000.0 / clockRateUs;
std::vector<bool> bits(bitsPerRevolution);
@@ -245,7 +245,7 @@ private:
* 06-07 - $0F ("off" bytes)
*/
uint8_t encodedTrack =
((sector->logicalTrack) +
((sector->logicalCylinder) +
1); // C64 track numbering starts with 1. Fluxengine with 0.
uint8_t encodedSector = sector->logicalSector;
// uint8_t formatByte1 = C64_FORMAT_ID_BYTE1;

View File

@@ -1,12 +1,13 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "protocol.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "f85.h"
#include "lib/crc.h"
#include "lib/bytes.h"
#include "lib/data/sector.h"
#include "arch/f85/f85.h"
#include "lib/core/crc.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
#include <string.h>
#include <algorithm>
@@ -75,8 +76,8 @@ public:
const auto& bytes = decode(readRawBits(6 * 10));
_sector->logicalSector = bytes[2];
_sector->logicalSide = 0;
_sector->logicalTrack = bytes[0];
_sector->logicalHead = 0;
_sector->logicalCylinder = bytes[0];
uint16_t wantChecksum = bytes.reader().seek(4).read_be16();
uint16_t gotChecksum = crc16(CCITT_POLY, 0xef21, bytes.slice(0, 4));

View File

@@ -1,12 +1,13 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "protocol.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "fb100.h"
#include "lib/crc.h"
#include "lib/bytes.h"
#include "lib/data/sector.h"
#include "arch/fb100/fb100.h"
#include "lib/core/crc.h"
#include "lib/core/bytes.h"
#include "lib/decoders/rawbits.h"
#include "fmt/format.h"
#include <string.h>
@@ -125,8 +126,8 @@ public:
return;
uint8_t abssector = id[2];
_sector->logicalTrack = abssector >> 1;
_sector->logicalSide = 0;
_sector->logicalCylinder = abssector >> 1;
_sector->logicalHead = 0;
_sector->logicalSector = abssector & 1;
_sector->data.writer().append(id.slice(5, 12)).append(payload);

View File

@@ -1,13 +1,14 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/decoders/decoders.h"
#include "ibm.h"
#include "lib/crc.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/sector.h"
#include "arch/ibm/ibm.h"
#include "lib/core/crc.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/data/sector.h"
#include "arch/ibm/ibm.pb.h"
#include "lib/proto.h"
#include "lib/layout.h"
#include "lib/config/proto.h"
#include "lib/data/layout.h"
#include <string.h>
static_assert(std::is_trivially_copyable<IbmIdam>::value,
@@ -140,11 +141,10 @@ public:
bw += decodeFmMfm(bits).slice(0, IBM_IDAM_LEN);
IbmDecoderProto::TrackdataProto trackdata;
getTrackFormat(
trackdata, _sector->physicalTrack, _sector->physicalSide);
getTrackFormat(trackdata, _ltl->logicalCylinder, _ltl->logicalHead);
_sector->logicalTrack = br.read_8();
_sector->logicalSide = br.read_8();
_sector->logicalCylinder = br.read_8();
_sector->logicalHead = br.read_8();
_sector->logicalSector = br.read_8();
_currentSectorSize = 1 << (br.read_8() + 7);
@@ -155,11 +155,10 @@ public:
Sector::DATA_MISSING; /* correct but unintuitive */
if (trackdata.ignore_side_byte())
_sector->logicalSide =
Layout::remapSidePhysicalToLogical(_sector->physicalSide);
_sector->logicalSide ^= trackdata.invert_side_byte();
_sector->logicalHead = _ltl->logicalHead;
_sector->logicalHead ^= trackdata.invert_side_byte();
if (trackdata.ignore_track_byte())
_sector->logicalTrack = _sector->physicalTrack;
_sector->logicalCylinder = _ltl->logicalCylinder;
for (int sector : trackdata.ignore_sector())
if (_sector->logicalSector == sector)
@@ -208,16 +207,14 @@ public:
_sector->status =
(wantCrc == gotCrc) ? Sector::OK : Sector::BAD_CHECKSUM;
auto layout = Layout::getLayoutOfTrack(
_sector->logicalTrack, _sector->logicalSide);
if (_currentSectorSize != layout->sectorSize)
if (_currentSectorSize != _ltl->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->logicalCylinder,
_sector->logicalHead,
_sector->logicalSector,
layout->sectorSize,
_ltl->sectorSize,
_currentSectorSize);
}

View File

@@ -1,15 +1,15 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/config/config.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "ibm.h"
#include "lib/crc.h"
#include "lib/readerwriter.h"
#include "lib/image.h"
#include "arch/ibm/ibm.h"
#include "lib/core/crc.h"
#include "lib/data/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 "lib/config/proto.h"
#include "lib/data/layout.h"
#include <ctype.h>
/* IAM record separator:
@@ -107,16 +107,12 @@ private:
}
public:
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
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);
getEncoderTrackData(trackdata, ltl.logicalCylinder, ltl.logicalHead);
auto writeBytes = [&](const Bytes& bytes)
{
@@ -152,7 +148,7 @@ public:
uint8_t sectorSize = 0;
{
int s = trackLayout->sectorSize >> 7;
int s = ltl.sectorSize >> 7;
while (s > 1)
{
s >>= 1;
@@ -202,9 +198,9 @@ public:
bw.write_8(MFM_RECORD_SEPARATOR_BYTE);
}
bw.write_8(idamUnencoded);
bw.write_8(sectorData->logicalTrack);
bw.write_8(sectorData->logicalCylinder);
bw.write_8(
sectorData->logicalSide ^ trackdata.invert_side_byte());
sectorData->logicalHead ^ trackdata.invert_side_byte());
bw.write_8(sectorData->logicalSector);
bw.write_8(sectorSize);
uint16_t crc = crc16(CCITT_POLY, header);
@@ -237,8 +233,7 @@ public:
}
bw.write_8(damUnencoded);
Bytes truncatedData =
sectorData->data.slice(0, trackLayout->sectorSize);
Bytes truncatedData = sectorData->data.slice(0, ltl.sectorSize);
bw += truncatedData;
uint16_t crc = crc16(CCITT_POLY, data);
bw.write_be16(crc);

View File

@@ -1,6 +1,6 @@
syntax = "proto2";
import "lib/common.proto";
import "lib/config/common.proto";
message IbmDecoderProto {
// Next: 11

View File

@@ -1,11 +1,13 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "protocol.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "macintosh.h"
#include "lib/bytes.h"
#include "lib/data/sector.h"
#include "lib/data/layout.h"
#include "arch/macintosh/macintosh.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
#include <string.h>
#include <algorithm>
@@ -145,7 +147,7 @@ public:
auto header = toBytes(readRawBits(7 * 8)).slice(0, 7);
uint8_t encodedTrack = decode_data_gcr(header[0]);
if (encodedTrack != (_sector->physicalTrack & 0x3f))
if (encodedTrack != (_ltl->logicalCylinder & 0x3f))
return;
uint8_t encodedSector = decode_data_gcr(header[1]);
@@ -156,8 +158,8 @@ public:
if (encodedSector > 11)
return;
_sector->logicalTrack = _sector->physicalTrack;
_sector->logicalSide = decode_side(encodedSide);
_sector->logicalCylinder = _ltl->logicalCylinder;
_sector->logicalHead = decode_side(encodedSide);
_sector->logicalSector = encodedSector;
uint8_t gotsum =
(encodedTrack ^ encodedSector ^ encodedSide ^ formatByte) & 0x3f;

View File

@@ -1,13 +1,13 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/core/utils.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "macintosh.h"
#include "lib/crc.h"
#include "lib/readerwriter.h"
#include "lib/image.h"
#include "arch/macintosh/macintosh.h"
#include "lib/core/crc.h"
#include "lib/data/image.h"
#include "fmt/format.h"
#include "lib/encoders/encoders.pb.h"
#include "lib/layout.h"
#include "lib/data/layout.h"
#include "arch/macintosh/macintosh.pb.h"
#include <ctype.h>
@@ -181,10 +181,10 @@ static void write_sector(std::vector<bool>& bits,
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 encodedTrack = sector->logicalCylinder & 0x3f;
uint8_t encodedSector = sector->logicalSector;
uint8_t encodedSide =
encode_side(sector->logicalTrack, sector->logicalSide);
encode_side(sector->logicalCylinder, sector->logicalHead);
uint8_t formatByte = MAC_FORMAT_BYTE;
uint8_t headerChecksum =
(encodedTrack ^ encodedSector ^ encodedSide ^ formatByte) & 0x3f;
@@ -220,11 +220,11 @@ public:
}
public:
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{
double clockRateUs = clockRateUsForTrack(trackInfo->logicalTrack);
double clockRateUs = clockRateUsForTrack(ltl.logicalCylinder);
int bitsPerRevolution = 200000.0 / clockRateUs;
std::vector<bool> bits(bitsPerRevolution);
unsigned cursor = 0;

View File

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

View File

@@ -1,10 +1,12 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "micropolis.h"
#include "lib/bytes.h"
#include "lib/data/sector.h"
#include "lib/data/layout.h"
#include "arch/micropolis/micropolis.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
#include "lib/decoders/decoders.pb.h"
@@ -221,14 +223,14 @@ public:
if (syncByte != 0xFF)
return;
_sector->logicalTrack = br.read_8();
_sector->logicalSide = _sector->physicalSide;
_sector->logicalCylinder = br.read_8();
_sector->logicalHead = _ltl->logicalHead;
_sector->logicalSector = br.read_8();
if (_sector->logicalSector > 15)
return;
if (_sector->logicalTrack > 76)
if (_sector->logicalCylinder > 76)
return;
if (_sector->logicalTrack != _sector->physicalTrack)
if (_sector->logicalCylinder != _ltl->logicalCylinder)
return;
br.read(10); /* OS data or padding */

View File

@@ -1,9 +1,9 @@
#include "lib/globals.h"
#include "micropolis.h"
#include "lib/sector.h"
#include "lib/core/globals.h"
#include "arch/micropolis/micropolis.h"
#include "lib/data/sector.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "lib/image.h"
#include "lib/data/image.h"
#include "lib/encoders/encoders.pb.h"
static void write_sector(std::vector<bool>& bits,
@@ -40,7 +40,7 @@ static void write_sector(std::vector<bool>& bits,
{
ByteWriter writer(sectorData);
writer.write_8(0xff); /* Sync */
writer.write_8(sector->logicalTrack);
writer.write_8(sector->logicalCylinder);
writer.write_8(sector->logicalSector);
for (int i = 0; i < 10; i++)
writer.write_8(0); /* Padding */
@@ -87,7 +87,7 @@ public:
{
}
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{

View File

@@ -1,6 +1,6 @@
syntax = "proto2";
import "lib/common.proto";
import "lib/config/common.proto";
message MicropolisDecoderProto {
enum ChecksumType {

View File

@@ -1,10 +1,12 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/decoders/decoders.h"
#include "arch/mx/mx.h"
#include "lib/crc.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/sector.h"
#include "lib/core/crc.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/data/sector.h"
#include "lib/data/layout.h"
#include <string.h>
const int SECTOR_SIZE = 256;
@@ -63,8 +65,8 @@ public:
gotChecksum += br.read_be16();
uint16_t wantChecksum = br.read_be16();
_sector->logicalTrack = _sector->physicalTrack;
_sector->logicalSide = _sector->physicalSide;
_sector->logicalCylinder = _ltl->logicalCylinder;
_sector->logicalHead = _ltl->logicalHead;
_sector->logicalSector = _currentSector;
_sector->data = bytes.slice(0, SECTOR_SIZE).swab();
_sector->status =

View File

@@ -11,13 +11,15 @@
* sure that the hardSectorId is correct.
*/
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "northstar.h"
#include "lib/bytes.h"
#include "lib/data/sector.h"
#include "lib/data/layout.h"
#include "arch/northstar/northstar.h"
#include "lib/core/bytes.h"
#include "lib/decoders/decoders.pb.h"
#include "fmt/format.h"
@@ -158,9 +160,9 @@ public:
auto bytes = decodeFmMfm(rawbits).slice(0, recordSize);
ByteReader br(bytes);
_sector->logicalSide = _sector->physicalSide;
_sector->logicalHead = _ltl->logicalHead;
_sector->logicalSector = _hardSectorId;
_sector->logicalTrack = _sector->physicalTrack;
_sector->logicalCylinder = _ltl->logicalCylinder;
if (headerSize == NORTHSTAR_HEADER_SIZE_DD)
{

View File

@@ -1,10 +1,10 @@
#include "lib/globals.h"
#include "northstar.h"
#include "lib/sector.h"
#include "lib/bytes.h"
#include "lib/core/globals.h"
#include "arch/northstar/northstar.h"
#include "lib/data/sector.h"
#include "lib/core/bytes.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "lib/image.h"
#include "lib/data/image.h"
#include "lib/encoders/encoders.pb.h"
#define GAP_FILL_SIZE_SD 30
@@ -129,7 +129,7 @@ public:
{
}
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{

View File

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

View File

@@ -1,11 +1,12 @@
#include "lib/globals.h"
#include "lib/core/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 "lib/core/crc.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/data/sector.h"
#include "lib/core/bytes.h"
#include "arch/rolandd20/rolandd20.h"
#include <string.h>
/* Sector header record:

View File

@@ -1,12 +1,14 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "protocol.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "smaky6.h"
#include "lib/bytes.h"
#include "lib/crc.h"
#include "lib/data/sector.h"
#include "lib/data/layout.h"
#include "arch/smaky6/smaky6.h"
#include "lib/core/bytes.h"
#include "lib/core/crc.h"
#include "fmt/format.h"
#include "lib/decoders/decoders.pb.h"
#include <string.h>
@@ -128,11 +130,11 @@ public:
uint8_t wantedChecksum = br.read_8();
uint8_t gotChecksum = sumBytes(data) & 0xff;
if (track != _sector->physicalTrack)
if (track != _ltl->logicalCylinder)
return;
_sector->logicalTrack = _sector->physicalTrack;
_sector->logicalSide = _sector->physicalSide;
_sector->logicalCylinder = _ltl->physicalCylinder;
_sector->logicalHead = _ltl->logicalHead;
_sector->logicalSector = _sectorId;
_sector->data = data;

View File

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

81
arch/tartu/decoder.cc Normal file
View File

@@ -0,0 +1,81 @@
#include "lib/core/globals.h"
#include "lib/config/config.h"
#include "lib/decoders/decoders.h"
#include "arch/tartu/tartu.h"
#include "lib/core/crc.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/data/sector.h"
#include <string.h>
constexpr uint64_t HEADER_BITS = 0xaaaaaaaa44895554LL;
constexpr uint64_t DATA_BITS = 0xaaaaaaaa44895545LL;
static const FluxPattern HEADER_PATTERN(64, HEADER_BITS);
static const FluxPattern DATA_PATTERN(64, DATA_BITS);
const FluxMatchers ANY_RECORD_PATTERN{&HEADER_PATTERN, &DATA_PATTERN};
class TartuDecoder : public Decoder
{
public:
TartuDecoder(const DecoderProto& config):
Decoder(config),
_config(config.tartu())
{
}
void beginTrack() override {}
nanoseconds_t advanceToNextRecord() override
{
return seekToPattern(ANY_RECORD_PATTERN);
}
void decodeSectorRecord() override
{
if (readRaw64() != HEADER_BITS)
return;
auto bits = readRawBits(16 * 4);
auto bytes = decodeFmMfm(bits).slice(0, 4);
ByteReader br(bytes);
uint8_t track = br.read_8();
_sector->logicalCylinder = track >> 1;
_sector->logicalHead = track & 1;
br.skip(1); /* seems always to be 1 */
_sector->logicalSector = br.read_8();
uint8_t wantChecksum = br.read_8();
uint8_t gotChecksum = ~sumBytes(bytes.slice(0, 3));
if (wantChecksum == gotChecksum)
_sector->status = Sector::DATA_MISSING;
_sector->status = Sector::DATA_MISSING;
}
void decodeDataRecord() override
{
if (readRaw64() != DATA_BITS)
return;
const auto& bits = readRawBits(129 * 16);
const auto& bytes = decodeFmMfm(bits).slice(0, 129);
_sector->data = bytes.slice(0, 128);
uint8_t wantChecksum = bytes.reader().seek(128).read_8();
uint8_t gotChecksum = ~sumBytes(_sector->data);
_sector->status =
(wantChecksum == gotChecksum) ? Sector::OK : Sector::BAD_CHECKSUM;
}
private:
const TartuDecoderProto& _config;
};
std::unique_ptr<Decoder> createTartuDecoder(const DecoderProto& config)
{
return std::unique_ptr<Decoder>(new TartuDecoder(config));
}

115
arch/tartu/encoder.cc Normal file
View File

@@ -0,0 +1,115 @@
#include "lib/core/globals.h"
#include "lib/config/config.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "arch/tartu/tartu.h"
#include "lib/core/crc.h"
#include "lib/data/fluxmap.h"
#include "lib/data/sector.h"
#include <string.h>
class TartuEncoder : public Encoder
{
public:
TartuEncoder(const EncoderProto& config):
Encoder(config),
_config(config.tartu())
{
}
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{
_clockRateUs = _config.clock_period_us();
int bitsPerRevolution =
(_config.target_rotational_period_ms() * 1000.0) / _clockRateUs;
const auto& sector = *sectors.begin();
_bits.resize(bitsPerRevolution);
_cursor = 0;
writeFillerRawBitsUs(_config.gap1_us());
bool first = true;
for (const auto& sectorData : sectors)
{
if (!first)
writeFillerRawBitsUs(_config.gap4_us());
first = false;
writeSector(sectorData);
}
if (_cursor > _bits.size())
error("track data overrun");
writeFillerRawBitsUs(_config.target_rotational_period_ms() * 1000.0);
std::unique_ptr<Fluxmap> fluxmap(new Fluxmap);
fluxmap->appendBits(_bits,
calculatePhysicalClockPeriod(_clockRateUs * 1e3,
_config.target_rotational_period_ms() * 1e6));
return fluxmap;
}
private:
void writeBytes(const Bytes& bytes)
{
encodeMfm(_bits, _cursor, bytes, _lastBit);
}
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 writeFillerRawBitsUs(double us)
{
unsigned count = (us / _clockRateUs) / 2;
for (int i = 0; i < count; i++)
writeRawBits(0b10, 2);
};
void writeSector(const std::shared_ptr<const Sector>& sectorData)
{
writeRawBits(_config.header_marker(), 64);
{
Bytes bytes;
ByteWriter bw(bytes);
bw.write_8(
(sectorData->logicalCylinder << 1) | sectorData->logicalHead);
bw.write_8(1);
bw.write_8(sectorData->logicalSector);
bw.write_8(~sumBytes(bytes.slice(0, 3)));
writeBytes(bytes);
}
writeFillerRawBitsUs(_config.gap3_us());
writeRawBits(_config.data_marker(), 64);
{
Bytes bytes;
ByteWriter bw(bytes);
bw.append(sectorData->data);
bw.write_8(~sumBytes(bytes.slice(0, sectorData->data.size())));
writeBytes(bytes);
}
}
private:
const TartuEncoderProto& _config;
double _clockRateUs;
std::vector<bool> _bits;
unsigned _cursor;
bool _lastBit;
};
std::unique_ptr<Encoder> createTartuEncoder(const EncoderProto& config)
{
return std::unique_ptr<Encoder>(new TartuEncoder(config));
}

7
arch/tartu/tartu.h Normal file
View File

@@ -0,0 +1,7 @@
#ifndef TARTU_H
#define TARTU_H
extern std::unique_ptr<Decoder> createTartuDecoder(const DecoderProto& config);
extern std::unique_ptr<Encoder> createTartuEncoder(const EncoderProto& config);
#endif

27
arch/tartu/tartu.proto Normal file
View File

@@ -0,0 +1,27 @@
syntax = "proto2";
import "lib/config/common.proto";
message TartuDecoderProto {}
message TartuEncoderProto {
optional double clock_period_us = 1
[ default = 2.0, (help) = "clock rate on the real device (for MFM)" ];
optional double target_rotational_period_ms = 2
[ default=200, (help) = "rotational period of target disk" ];
optional double gap1_us = 3
[ default = 1200,
(help) = "size of gap 1 (the post-index gap)" ];
optional double gap3_us = 4
[ default = 150,
(help) = "size of gap 3 (the pre-data gap)" ];
optional double gap4_us = 5
[ default = 180,
(help) = "size of gap 4 (the post-data or format gap)" ];
optional uint64 header_marker = 6
[ default = 0xaaaaaaaa44895554,
(help) = "64-bit raw bit pattern of header record marker" ];
optional uint64 data_marker = 7
[ default = 0xaaaaaaaa44895545,
(help) = "64-bit raw bit pattern of data record marker" ];
}

View File

@@ -1,13 +1,14 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "arch/tids990/tids990.h"
#include "lib/crc.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/sector.h"
#include "lib/core/crc.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "lib/data/sector.h"
#include <string.h>
#include <fmt/format.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).
@@ -63,8 +64,8 @@ public:
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();
_sector->logicalHead = br.read_8() >> 3;
_sector->logicalCylinder = br.read_8();
br.read_8(); /* number of sectors per track */
_sector->logicalSector = br.read_8();
br.read_be16(); /* sector size */

View File

@@ -1,13 +1,12 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "tids990.h"
#include "lib/crc.h"
#include "lib/readerwriter.h"
#include "lib/image.h"
#include "arch/tids990/tids990.h"
#include "lib/core/crc.h"
#include "lib/data/image.h"
#include "arch/tids990/tids990.pb.h"
#include "lib/encoders/encoders.pb.h"
#include <fmt/format.h>
#include "fmt/format.h"
static int charToInt(char c)
{
@@ -60,7 +59,7 @@ private:
}
public:
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{
@@ -96,8 +95,8 @@ public:
writeBytes(12, 0x55);
bw.write_8(am1Unencoded);
bw.write_8(sectorData->logicalSide << 3);
bw.write_8(sectorData->logicalTrack);
bw.write_8(sectorData->logicalHead << 3);
bw.write_8(sectorData->logicalCylinder);
bw.write_8(_config.sector_count());
bw.write_8(sectorData->logicalSector);
bw.write_be16(sectorData->data.size());

View File

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

View File

@@ -1,12 +1,13 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "protocol.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "victor9k.h"
#include "lib/crc.h"
#include "lib/bytes.h"
#include "lib/data/sector.h"
#include "arch/victor9k/victor9k.h"
#include "lib/core/crc.h"
#include "lib/core/bytes.h"
#include "fmt/format.h"
#include <string.h>
#include <algorithm>
@@ -79,11 +80,11 @@ public:
_sector->logicalSector = bytes[1];
uint8_t gotChecksum = bytes[2];
_sector->logicalTrack = rawTrack & 0x7f;
_sector->logicalSide = rawTrack >> 7;
_sector->logicalCylinder = rawTrack & 0x7f;
_sector->logicalHead = rawTrack >> 7;
uint8_t wantChecksum = bytes[0] + bytes[1];
if ((_sector->logicalSector > 20) || (_sector->logicalTrack > 85) ||
(_sector->logicalSide > 1))
if ((_sector->logicalSector > 20) || (_sector->logicalCylinder > 85) ||
(_sector->logicalHead > 1))
return;
if (wantChecksum == gotChecksum)

View File

@@ -1,17 +1,17 @@
#include "lib/globals.h"
#include "lib/core/globals.h"
#include "lib/core/utils.h"
#include "lib/decoders/decoders.h"
#include "lib/encoders/encoders.h"
#include "victor9k.h"
#include "lib/crc.h"
#include "lib/sector.h"
#include "lib/readerwriter.h"
#include "lib/image.h"
#include "arch/victor9k/victor9k.h"
#include "lib/core/crc.h"
#include "lib/data/sector.h"
#include "lib/data/image.h"
#include "fmt/format.h"
#include "arch/victor9k/victor9k.pb.h"
#include "lib/encoders/encoders.pb.h"
#include "lib/layout.h"
#include "lib/data/layout.h"
#include <ctype.h>
#include "lib/bytes.h"
#include "lib/core/bytes.h"
static bool lastBit;
@@ -112,7 +112,7 @@ static void write_sector(std::vector<bool>& bits,
write_one_bits(bits, cursor, trackdata.pre_header_sync_bits());
write_bits(bits, cursor, VICTOR9K_SECTOR_RECORD, 10);
uint8_t encodedTrack = sector.logicalTrack | (sector.logicalSide << 7);
uint8_t encodedTrack = sector.logicalCylinder | (sector.logicalHead << 7);
uint8_t encodedSector = sector.logicalSector;
write_bytes(bits,
cursor,
@@ -164,13 +164,12 @@ private:
}
public:
std::unique_ptr<Fluxmap> encode(std::shared_ptr<const TrackInfo>& trackInfo,
std::unique_ptr<Fluxmap> encode(const LogicalTrackLayout& ltl,
const std::vector<std::shared_ptr<const Sector>>& sectors,
const Image& image) override
{
Victor9kEncoderProto::TrackdataProto trackdata;
getTrackFormat(
trackdata, trackInfo->logicalTrack, trackInfo->logicalSide);
getTrackFormat(trackdata, ltl.logicalCylinder, ltl.logicalHead);
unsigned bitsPerRevolution = (trackdata.rotational_period_ms() * 1e3) /
trackdata.clock_period_us();

View File

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

View File

@@ -1,12 +1,13 @@
#include "lib/globals.h"
#include "lib/fluxmap.h"
#include "lib/decoders/fluxmapreader.h"
#include "lib/core/globals.h"
#include "lib/data/fluxmap.h"
#include "lib/data/fluxmapreader.h"
#include "lib/data/fluxpattern.h"
#include "protocol.h"
#include "lib/decoders/decoders.h"
#include "lib/sector.h"
#include "zilogmcz.h"
#include "lib/bytes.h"
#include "lib/crc.h"
#include "lib/data/sector.h"
#include "arch/zilogmcz/zilogmcz.h"
#include "lib/core/bytes.h"
#include "lib/core/crc.h"
#include "fmt/format.h"
#include <string.h>
#include <algorithm>
@@ -33,11 +34,11 @@ public:
ByteReader br(bytes);
_sector->logicalSector = br.read_8() & 0x1f;
_sector->logicalSide = 0;
_sector->logicalTrack = br.read_8() & 0x7f;
_sector->logicalHead = 0;
_sector->logicalCylinder = br.read_8() & 0x7f;
if (_sector->logicalSector > 31)
return;
if (_sector->logicalTrack > 80)
if (_sector->logicalCylinder > 80)
return;
_sector->data = br.read(132);

251
build.py
View File

@@ -7,221 +7,19 @@ from glob import glob
import config
import re
# Hack for building on Fedora/WSL; executables get the .exe extension,
# but the build system detects it as Linux.
import build.toolchain
toolchain.Toolchain.EXE = "$(EXT)"
package(name="protobuf_lib", package="protobuf")
package(name="z_lib", package="zlib")
package(name="fmt_lib", package="fmt")
package(name="fmt_lib", package="fmt", fallback="dep/fmt")
package(name="sqlite3_lib", package="sqlite3")
clibrary(name="protocol", hdrs={"protocol.h": "./protocol.h"})
proto(name="fl2_proto", srcs=["lib/fl2.proto"])
protocc(name="fl2_proto_lib", srcs=["+fl2_proto"])
cxxlibrary(
name="lib",
srcs=[
"./lib/bitmap.cc",
"./lib/bytes.cc",
"./lib/config.cc",
"./lib/crc.cc",
"./lib/csvreader.cc",
"./lib/decoders/decoders.cc",
"./lib/decoders/fluxdecoder.cc",
"./lib/decoders/fluxmapreader.cc",
"./lib/decoders/fmmfm.cc",
"./lib/encoders/encoders.cc",
"./lib/fl2.cc",
"./lib/flags.cc",
"./lib/fluxmap.cc",
"./lib/fluxsink/a2rfluxsink.cc",
"./lib/fluxsink/aufluxsink.cc",
"./lib/fluxsink/fl2fluxsink.cc",
"./lib/fluxsink/fluxsink.cc",
"./lib/fluxsink/hardwarefluxsink.cc",
"./lib/fluxsink/scpfluxsink.cc",
"./lib/fluxsink/vcdfluxsink.cc",
"./lib/fluxsource/a2rfluxsource.cc",
"./lib/fluxsource/catweasel.cc",
"./lib/fluxsource/cwffluxsource.cc",
"./lib/fluxsource/dmkfluxsource.cc",
"./lib/fluxsource/erasefluxsource.cc",
"./lib/fluxsource/fl2fluxsource.cc",
"./lib/fluxsource/fluxsource.cc",
"./lib/fluxsource/flx.cc",
"./lib/fluxsource/flxfluxsource.cc",
"./lib/fluxsource/hardwarefluxsource.cc",
"./lib/fluxsource/kryoflux.cc",
"./lib/fluxsource/kryofluxfluxsource.cc",
"./lib/fluxsource/memoryfluxsource.cc",
"./lib/fluxsource/scpfluxsource.cc",
"./lib/fluxsource/testpatternfluxsource.cc",
"./lib/globals.cc",
"./lib/hexdump.cc",
"./lib/image.cc",
"./lib/imagereader/d64imagereader.cc",
"./lib/imagereader/d88imagereader.cc",
"./lib/imagereader/dimimagereader.cc",
"./lib/imagereader/diskcopyimagereader.cc",
"./lib/imagereader/fdiimagereader.cc",
"./lib/imagereader/imagereader.cc",
"./lib/imagereader/imdimagereader.cc",
"./lib/imagereader/imgimagereader.cc",
"./lib/imagereader/jv3imagereader.cc",
"./lib/imagereader/nfdimagereader.cc",
"./lib/imagereader/nsiimagereader.cc",
"./lib/imagereader/td0imagereader.cc",
"./lib/imagewriter/d64imagewriter.cc",
"./lib/imagewriter/d88imagewriter.cc",
"./lib/imagewriter/diskcopyimagewriter.cc",
"./lib/imagewriter/imagewriter.cc",
"./lib/imagewriter/imdimagewriter.cc",
"./lib/imagewriter/imgimagewriter.cc",
"./lib/imagewriter/ldbsimagewriter.cc",
"./lib/imagewriter/nsiimagewriter.cc",
"./lib/imagewriter/rawimagewriter.cc",
"./lib/layout.cc",
"./lib/ldbs.cc",
"./lib/logger.cc",
"./lib/proto.cc",
"./lib/readerwriter.cc",
"./lib/sector.cc",
"./lib/usb/fluxengineusb.cc",
"./lib/usb/greaseweazle.cc",
"./lib/usb/greaseweazleusb.cc",
"./lib/usb/serial.cc",
"./lib/usb/usb.cc",
"./lib/usb/usbfinder.cc",
"./lib/utils.cc",
"./lib/vfs/acorndfs.cc",
"./lib/vfs/amigaffs.cc",
"./lib/vfs/appledos.cc",
"./lib/vfs/applesingle.cc",
"./lib/vfs/brother120fs.cc",
"./lib/vfs/cbmfs.cc",
"./lib/vfs/cpmfs.cc",
"./lib/vfs/fatfs.cc",
"./lib/vfs/fluxsectorinterface.cc",
"./lib/vfs/imagesectorinterface.cc",
"./lib/vfs/lif.cc",
"./lib/vfs/machfs.cc",
"./lib/vfs/microdos.cc",
"./lib/vfs/philefs.cc",
"./lib/vfs/prodos.cc",
"./lib/vfs/roland.cc",
"./lib/vfs/smaky6fs.cc",
"./lib/vfs/vfs.cc",
"./lib/vfs/zdos.cc",
"./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",
],
hdrs={
"arch/ibm/ibm.h": "./arch/ibm/ibm.h",
"arch/apple2/data_gcr.h": "./arch/apple2/data_gcr.h",
"arch/apple2/apple2.h": "./arch/apple2/apple2.h",
"arch/smaky6/smaky6.h": "./arch/smaky6/smaky6.h",
"arch/tids990/tids990.h": "./arch/tids990/tids990.h",
"arch/zilogmcz/zilogmcz.h": "./arch/zilogmcz/zilogmcz.h",
"arch/amiga/amiga.h": "./arch/amiga/amiga.h",
"arch/f85/data_gcr.h": "./arch/f85/data_gcr.h",
"arch/f85/f85.h": "./arch/f85/f85.h",
"arch/mx/mx.h": "./arch/mx/mx.h",
"arch/aeslanier/aeslanier.h": "./arch/aeslanier/aeslanier.h",
"arch/northstar/northstar.h": "./arch/northstar/northstar.h",
"arch/brother/data_gcr.h": "./arch/brother/data_gcr.h",
"arch/brother/brother.h": "./arch/brother/brother.h",
"arch/brother/header_gcr.h": "./arch/brother/header_gcr.h",
"arch/macintosh/data_gcr.h": "./arch/macintosh/data_gcr.h",
"arch/macintosh/macintosh.h": "./arch/macintosh/macintosh.h",
"arch/agat/agat.h": "./arch/agat/agat.h",
"arch/fb100/fb100.h": "./arch/fb100/fb100.h",
"arch/victor9k/data_gcr.h": "./arch/victor9k/data_gcr.h",
"arch/victor9k/victor9k.h": "./arch/victor9k/victor9k.h",
"arch/rolandd20/rolandd20.h": "./arch/rolandd20/rolandd20.h",
"arch/micropolis/micropolis.h": "./arch/micropolis/micropolis.h",
"arch/c64/data_gcr.h": "./arch/c64/data_gcr.h",
"arch/c64/c64.h": "./arch/c64/c64.h",
"lib/a2r.h": "./lib/a2r.h",
"lib/bitmap.h": "./lib/bitmap.h",
"lib/bytes.h": "./lib/bytes.h",
"lib/config.h": "./lib/config.h",
"lib/crc.h": "./lib/crc.h",
"lib/csvreader.h": "./lib/csvreader.h",
"lib/decoders/decoders.h": "./lib/decoders/decoders.h",
"lib/decoders/fluxdecoder.h": "./lib/decoders/fluxdecoder.h",
"lib/decoders/fluxmapreader.h": "./lib/decoders/fluxmapreader.h",
"lib/decoders/rawbits.h": "./lib/decoders/rawbits.h",
"lib/encoders/encoders.h": "./lib/encoders/encoders.h",
"lib/scp.h": "./lib/scp.h",
"lib/fl2.h": "./lib/fl2.h",
"lib/flags.h": "./lib/flags.h",
"lib/flux.h": "./lib/flux.h",
"lib/fluxmap.h": "./lib/fluxmap.h",
"lib/fluxsink/fluxsink.h": "./lib/fluxsink/fluxsink.h",
"lib/fluxsource/catweasel.h": "lib/fluxsource/catweasel.h",
"lib/fluxsource/fluxsource.h": "lib/fluxsource/fluxsource.h",
"lib/fluxsource/flx.h": "lib/fluxsource/flx.h",
"lib/fluxsource/kryoflux.h": "lib/fluxsource/kryoflux.h",
"lib/globals.h": "./lib/globals.h",
"lib/image.h": "./lib/image.h",
"lib/imagereader/imagereader.h": "./lib/imagereader/imagereader.h",
"lib/imagewriter/imagewriter.h": "./lib/imagewriter/imagewriter.h",
"lib/layout.h": "./lib/layout.h",
"lib/ldbs.h": "./lib/ldbs.h",
"lib/logger.h": "./lib/logger.h",
"lib/proto.h": "./lib/proto.h",
"lib/readerwriter.h": "./lib/readerwriter.h",
"lib/sector.h": "./lib/sector.h",
"lib/usb/greaseweazle.h": "./lib/usb/greaseweazle.h",
"lib/usb/usb.h": "./lib/usb/usb.h",
"lib/usb/usbfinder.h": "./lib/usb/usbfinder.h",
"lib/utils.h": "./lib/utils.h",
"lib/vfs/applesingle.h": "./lib/vfs/applesingle.h",
"lib/vfs/sectorinterface.h": "./lib/vfs/sectorinterface.h",
"lib/vfs/vfs.h": "./lib/vfs/vfs.h",
},
deps=[
"+fl2_proto_lib",
"+protocol",
"lib+config_proto_lib",
"dep/adflib",
"dep/agg",
"dep/fatfs",
"dep/hfsutils",
"dep/libusbp",
"dep/stb",
],
)
corpustests = []
if not glob("../fluxengine-testdata/data"):
print("fluxengine-testdata not found; skipping corpus tests")
@@ -230,7 +28,7 @@ else:
("acorndfs", "", "--200"),
("agat", "", ""),
("amiga", "", ""),
("apple2", "", "--140 40track_drive"),
("apple2", "", "--140 --drivetype=40"),
("atarist", "", "--360"),
("atarist", "", "--370"),
("atarist", "", "--400"),
@@ -240,17 +38,17 @@ else:
("atarist", "", "--800"),
("atarist", "", "--820"),
("bk", "", ""),
("brother", "", "--120 40track_drive"),
("brother", "", "--120 --drivetype=40"),
("brother", "", "--240"),
(
"commodore",
"scripts/commodore1541_test.textpb",
"--171 40track_drive",
"--171 --drivetype=40",
),
(
"commodore",
"scripts/commodore1541_test.textpb",
"--192 40track_drive",
"--192 --drivetype=40",
),
("commodore", "", "--800"),
("commodore", "", "--1620"),
@@ -262,16 +60,18 @@ else:
("ibm", "", "--1232"),
("ibm", "", "--1440"),
("ibm", "", "--1680"),
("ibm", "", "--180 40track_drive"),
("ibm", "", "--160 40track_drive"),
("ibm", "", "--320 40track_drive"),
("ibm", "", "--360 40track_drive"),
("ibm", "", "--180 --drivetype=40"),
("ibm", "", "--160 --drivetype=40"),
("ibm", "", "--320 --drivetype=40"),
("ibm", "", "--360 --drivetype=40"),
("ibm", "", "--720_96"),
("ibm", "", "--720_135"),
("mac", "scripts/mac400_test.textpb", "--400"),
("mac", "scripts/mac800_test.textpb", "--800"),
("n88basic", "", ""),
("rx50", "", ""),
("tartu", "", "--390 --drivetype=40"),
("tartu", "", "--780"),
("tids990", "", ""),
("victor9k", "", "--612"),
("victor9k", "", "--1224"),
@@ -285,15 +85,15 @@ else:
ins=["src+fluxengine"],
deps=["scripts/encodedecodetest.sh"],
commands=[
"{deps[0]} "
"$[deps[0]] "
+ c[0]
+ " "
+ format
+ " {ins[0]} '"
+ " $[ins[0]] '"
+ c[1]
+ "' '"
+ c[2]
+ "' $(dir {outs[0]}) > /dev/null"
+ "' $[dirname(filenameof(outs[0]))] > /dev/null"
],
label="CORPUSTEST",
)
@@ -304,11 +104,18 @@ export(
name="all",
items={
"fluxengine$(EXT)": "src+fluxengine",
"fluxengine-gui$(EXT)": "src/gui",
"fluxengine-gui$(EXT)": "src/gui2",
"brother120tool$(EXT)": "tools+brother120tool",
"brother240tool$(EXT)": "tools+brother240tool",
"upgrade-flux-file$(EXT)": "tools+upgrade-flux-file",
}
| ({"FluxEngine.pkg": "src/gui+fluxengine_pkg"} if config.osx else {}),
| (
{
"FluxEngine.pkg": "src/gui2+fluxengine_pkg",
"FluxEngine.app.zip": "src/gui2+fluxengine_app_zip",
}
if config.osx
else {}
),
deps=["tests", "src/formats+docs", "scripts+mkdocindex"] + corpustests,
)

49
build/_sandbox.py Normal file
View File

@@ -0,0 +1,49 @@
#!/usr/bin/python3
from os.path import *
import argparse
import os
import shutil
def main():
parser = argparse.ArgumentParser()
parser.add_argument("-s", "--sandbox")
parser.add_argument("-v", "--verbose", action="store_true")
parser.add_argument("-l", "--link", action="store_true")
parser.add_argument("-e", "--export", action="store_true")
parser.add_argument("files", nargs="*")
args = parser.parse_args()
assert args.sandbox, "You must specify a sandbox directory"
assert args.link ^ args.export, "You can't link and export at the same time"
if args.link:
os.makedirs(args.sandbox, exist_ok=True)
for f in args.files:
sf = join(args.sandbox, f)
if args.verbose:
print("link", sf)
os.makedirs(dirname(sf), exist_ok=True)
try:
os.symlink(abspath(f), sf)
except PermissionError:
shutil.copy(f, sf)
if args.export:
for f in args.files:
sf = join(args.sandbox, f)
if args.verbose:
print("export", sf)
df = dirname(f)
if df:
os.makedirs(df, exist_ok=True)
try:
os.remove(f)
except FileNotFoundError:
pass
os.rename(sf, f)
main()

25
build/_zip.py Executable file
View File

@@ -0,0 +1,25 @@
#!/usr/bin/python3
from os.path import *
import argparse
import os
from zipfile import ZipFile
def main():
parser = argparse.ArgumentParser()
parser.add_argument("-z", "--zipfile")
parser.add_argument("-v", "--verbose", action="store_true")
parser.add_argument("-f", "--file", nargs=2, action="append")
args = parser.parse_args()
assert args.zipfile, "You must specify a zipfile to create"
with ZipFile(args.zipfile, mode="w") as zf:
for zipname, filename in args.file:
if args.verbose:
print(filename, "->", zipname)
zf.write(filename, arcname=zipname)
main()

View File

@@ -1,24 +1,99 @@
ifeq ($(findstring 4.,$(MAKE_VERSION)),)
MAKENOT4 := $(if $(findstring 3.9999, $(lastword $(sort 3.9999 $(MAKE_VERSION)))),yes,no)
ifeq ($(MAKENOT4),yes)
$(error You need GNU Make 4.x for this (if you're on OSX, use gmake).)
endif
OBJ ?= .obj
PYTHON ?= python3
CC ?= gcc
CXX ?= g++
AR ?= ar
CFLAGS ?= -g -Og
LDFLAGS ?= -g
hide = @
PKG_CONFIG ?= pkg-config
HOST_PKG_CONFIG ?= $(PKG_CONFIG)
ECHO ?= echo
CP ?= cp
HOSTCC ?= gcc
HOSTCXX ?= g++
HOSTAR ?= ar
HOSTCFLAGS ?= -g -Og
HOSTCXXFLAGS ?= $(HOSTCFLAGS)
HOSTLDFLAGS ?= -g
CC ?= $(HOSTCC)
CXX ?= $(HOSTCXX)
AR ?= $(HOSTAR)
CFLAGS ?= $(HOSTCFLAGS)
CXXFLAGS ?= $(CFLAGS)
LDFLAGS ?= $(HOSTLDFLAGS)
NINJA ?= ninja
ifdef VERBOSE
hide =
else
ifdef V
hide =
else
hide = @
endif
endif
# If enabled, shows a nice display of how far through the build you are. This
# doubles Make startup time. Also, on Make 4.3 and above, rebuilds don't show
# correct progress information.
AB_ENABLE_PROGRESS_INFO ?= true
WINDOWS := no
OSX := no
LINUX := no
ifeq ($(OS),Windows_NT)
WINDOWS := yes
else
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
LINUX := yes
endif
ifeq ($(UNAME_S),Darwin)
OSX := yes
endif
endif
ifeq ($(OS), Windows_NT)
EXT ?= .exe
endif
EXT ?=
include $(OBJ)/build.mk
CWD=$(shell pwd)
define newline
endef
define check_for_command
$(shell command -v $1 >/dev/null || (echo "Required command '$1' missing" >&2 && kill $$PPID))
endef
$(call check_for_command,ninja)
$(call check_for_command,cmp)
$(call check_for_command,$(PYTHON))
pkg-config-hash = $(shell ($(PKG_CONFIG) --list-all && $(HOST_PKG_CONFIG) --list-all) | md5sum)
build-files = $(shell find . -name .obj -prune -o \( -name 'build.py' -a -type f \) -print) $(wildcard build/*.py) $(wildcard config.py)
build-file-timestamps = $(shell ls -l $(build-files) | md5sum)
# Wipe the build file (forcing a regeneration) if the make environment is different.
# (Conveniently, this includes the pkg-config hash calculated above.)
ignored-variables = MAKE_RESTARTS .VARIABLES MAKECMDGOALS MAKEFLAGS MFLAGS PAGER _ \
DESKTOP_STARTUP_ID XAUTHORITY ICEAUTHORITY SSH_AUTH_SOCK SESSION_MANAGER \
INVOCATION_ID SYSTEMD_EXEC_PID MANAGER_PID SSH_AGENT_PID JOURNAL_STREAM \
GPG_TTY WINDOWID MANAGERPID MAKE_TERMOUT MAKE_TERMERR OLDPWD
$(shell mkdir -p $(OBJ))
$(file >$(OBJ)/newvars.txt,$(foreach v,$(filter-out $(ignored-variables),$(.VARIABLES)),$(v)=$($(v))$(newline)))
$(shell touch $(OBJ)/vars.txt)
#$(shell diff -u $(OBJ)/vars.txt $(OBJ)/newvars.txt >&2)
$(shell cmp -s $(OBJ)/newvars.txt $(OBJ)/vars.txt || (rm -f $(OBJ)/build.ninja && echo "Environment changed --- regenerating" >&2))
$(shell mv $(OBJ)/newvars.txt $(OBJ)/vars.txt)
.PHONY: update-ab
update-ab:
@@ -30,13 +105,21 @@ update-ab:
.PHONY: clean
clean::
@echo CLEAN
$(hide) rm -rf $(OBJ) bin
$(hide) rm -rf $(OBJ)
compile_commands.json: $(OBJ)/build.ninja
+$(hide) $(NINJA) -f $(OBJ)/build.ninja -t compdb > $@
export PYTHONHASHSEED = 1
build-files = $(shell find . -name 'build.py') build/*.py config.py
$(OBJ)/build.mk: Makefile $(build-files)
$(OBJ)/build.ninja $(OBJ)/build.targets &:
@echo "AB"
@mkdir -p $(OBJ)
$(hide) $(PYTHON) -X pycache_prefix=$(OBJ) build/ab.py -t +all -o $@ \
build.py || rm -f $@
$(hide) $(PYTHON) -X pycache_prefix=$(OBJ)/__pycache__ build/ab.py \
-o $(OBJ) build.py \
-v $(OBJ)/vars.txt \
|| (rm -f $@ && false)
include $(OBJ)/build.targets
.PHONY: $(ninja-targets)
.NOTPARALLEL:
$(ninja-targets): $(OBJ)/build.ninja
+$(hide) $(NINJA) -f $(OBJ)/build.ninja $@

2
build/ab.ninja Normal file
View File

@@ -0,0 +1,2 @@
rule rule
command = $command

View File

File diff suppressed because it is too large Load Diff

View File

@@ -1,30 +1,122 @@
from os.path import basename, join
from build.ab import (
ABException,
Rule,
Targets,
TargetsMap,
filenameof,
flatten,
filenamesof,
normalrule,
stripext,
flatten,
simplerule,
emit,
G,
)
from build.utils import stripext, collectattrs
from build.toolchain import Toolchain, HostToolchain
from os.path import *
from types import SimpleNamespace
if G.OSX != "yes":
G.STARTGROUP = "-Wl,--start-group"
G.ENDGROUP = "-Wl,--end-group"
else:
G.STARTGROUP = ""
G.ENDGROUP = ""
Toolchain.CC = ["$(CC) -c -o $[outs[0]] $[ins[0]] $(CFLAGS) $[cflags]"]
Toolchain.CPP = ["$(CC) -E -P -o $[outs] $[cflags] -x c $[ins]"]
Toolchain.CXX = ["$(CXX) -c -o $[outs[0]] $[ins[0]] $(CXXFLAGS) $[cflags]"]
Toolchain.AR = ["$(AR) cqs $[outs[0]] $[ins]"]
Toolchain.ARXX = ["$(AR) cqs $[outs[0]] $[ins]"]
Toolchain.CLINK = [
"$(CC) -o $[outs[0]] $(STARTGROUP) $[ins] $[ldflags] $(LDFLAGS) $(ENDGROUP)"
]
Toolchain.CXXLINK = [
"$(CXX) -o $[outs[0]] $(STARTGROUP) $[ins] $[ldflags] $(LDFLAGS) $(ENDGROUP)"
]
Toolchain.is_source_file = (
lambda f: f.endswith(".c")
or f.endswith(".cc")
or f.endswith(".cpp")
or f.endswith(".S")
or f.endswith(".s")
or f.endswith(".m")
or f.endswith(".mm")
)
def cfileimpl(self, name, srcs, deps, suffix, commands, label, kind, cflags):
outleaf = stripext(basename(filenameof(srcs[0]))) + suffix
# Given a set of dependencies, finds the set of relevant library targets (i.e.
# contributes *.a files) for compiling C programs. The actual list of libraries
# is in dep.clibrary_files.
def _toolchain_find_library_targets(deps):
lib_deps = []
for d in deps:
lib_deps = _combine(lib_deps, d.args.get("clibrary_deps", []))
return lib_deps
normalrule(
Toolchain.find_c_library_targets = _toolchain_find_library_targets
# Given a set of dependencies, finds the set of relevant header targets (i.e.
# contributes *.h files) for compiling C programs. The actual list of libraries
# is in dep.cheader_files.
def _toolchain_find_header_targets(deps, initial=[]):
hdr_deps = initial
for d in deps:
hdr_deps = _combine(hdr_deps, d.args.get("cheader_deps", []))
return hdr_deps
Toolchain.find_c_header_targets = _toolchain_find_header_targets
HostToolchain.CC = ["$(HOSTCC) -c -o $[outs[0]] $[ins[0]] $(HOSTCFLAGS) $[cflags]"]
HostToolchain.CPP = ["$(HOSTCC) -E -P -o $[outs] $[cflags] -x c $[ins]"]
HostToolchain.CXX = ["$(HOSTCXX) -c -o $[outs[0]] $[ins[0]] $(HOSTCFLAGS) $[cflags]"]
HostToolchain.AR = ["$(HOSTAR) cqs $[outs[0]] $[ins]"]
HostToolchain.ARXX = ["$(HOSTAR) cqs $[outs[0]] $[ins]"]
HostToolchain.CLINK = [
"$(HOSTCC) -o $[outs[0]] $(STARTGROUP) $[ins] $[ldflags] $(HOSTLDFLAGS) $(ENDGROUP)"
]
HostToolchain.CXXLINK = [
"$(HOSTCXX) -o $[outs[0]] $(STARTGROUP) $[ins] $[ldflags] $(HOSTLDFLAGS) $(ENDGROUP)"
]
def _combine(list1, list2):
r = list(list1)
for i in list2:
if i not in r:
r.append(i)
return r
def _indirect(deps, name):
r = []
for d in deps:
r = _combine(r, d.args.get(name, [d]))
return r
def cfileimpl(self, name, srcs, deps, suffix, commands, label, toolchain, cflags):
outleaf = "=" + stripext(basename(filenameof(srcs[0]))) + suffix
hdr_deps = toolchain.find_c_header_targets(deps)
other_deps = [
d
for d in deps
if ("cheader_deps" not in d.args) and ("clibrary_deps" not in d.args)
]
hdr_files = collectattrs(targets=hdr_deps, name="cheader_files")
cflags = collectattrs(targets=hdr_deps, name="caller_cflags", initial=cflags)
t = simplerule(
replaces=self,
ins=srcs,
deps=deps,
deps=other_deps + hdr_files,
outs=[outleaf],
label=label,
commands=commands,
cflags=cflags,
args={"cflags": cflags},
)
@@ -32,145 +124,223 @@ def cfileimpl(self, name, srcs, deps, suffix, commands, label, kind, cflags):
def cfile(
self,
name,
srcs: Targets = [],
deps: Targets = [],
srcs: Targets = None,
deps: Targets = None,
cflags=[],
suffix=".o",
commands=["$(CC) -c -o {outs[0]} {ins[0]} $(CFLAGS) {cflags}"],
toolchain=Toolchain,
label="CC",
):
cfileimpl(self, name, srcs, deps, suffix, commands, label, "cfile", cflags)
cfileimpl(
self,
name,
srcs,
deps,
suffix,
toolchain.CC,
toolchain.PREFIX + label,
toolchain,
cflags,
)
@Rule
def cxxfile(
self,
name,
srcs: Targets = [],
deps: Targets = [],
srcs: Targets = None,
deps: Targets = None,
cflags=[],
suffix=".o",
commands=["$(CXX) -c -o {outs[0]} {ins[0]} $(CFLAGS) {cflags}"],
toolchain=Toolchain,
label="CXX",
):
cfileimpl(
self, name, srcs, deps, suffix, commands, label, "cxxfile", cflags
self,
name,
srcs,
deps,
suffix,
toolchain.CXX,
toolchain.PREFIX + label,
toolchain,
cflags,
)
def findsources(name, srcs, deps, cflags, filerule):
def _removeprefix(self, prefix):
if self.startswith(prefix):
return self[len(prefix) :]
else:
return self[:]
def findsources(self, srcs, deps, cflags, filerule, toolchain, cwd):
for f in filenamesof(srcs):
if not toolchain.is_source_file(f):
cflags = cflags + [f"-I{dirname(f)}"]
deps = deps + [f]
objs = []
for s in flatten(srcs):
objs += [
filerule(
name=join(name, f.removeprefix("$(OBJ)/")),
name=join(self.localname, _removeprefix(f, G.OBJ + "/")),
srcs=[f],
deps=deps,
cflags=cflags,
cflags=sorted(set(cflags)),
toolchain=toolchain,
cwd=cwd,
args=getattr(self, "explicit_args", {}),
)
for f in filenamesof(s)
if f.endswith(".c") or f.endswith(".cc") or f.endswith(".cpp")
for f in filenamesof([s])
if toolchain.is_source_file(f)
]
if any(f.endswith(".o") for f in filenamesof(s)):
if any(f.endswith(".o") for f in filenamesof([s])):
objs += [s]
return objs
def libraryimpl(
self, name, srcs, deps, hdrs, cflags, ldflags, commands, label, kind
self,
name,
srcs,
deps,
hdrs,
caller_cflags,
caller_ldflags,
cflags,
ldflags,
toolchain,
commands,
label,
filerule,
):
if not srcs and not hdrs:
raise ABException(
"clibrary contains no sources and no exported headers"
hdr_deps = toolchain.find_c_header_targets(deps) + [self]
lib_deps = toolchain.find_c_library_targets(deps) + [self]
hr = None
hf = []
ar = None
if hdrs:
cs = []
ins = hdrs.values()
outs = []
i = 0
for dest, src in hdrs.items():
s = filenamesof([src])
assert len(s) == 1, "the target of a header must return exactly one file"
cs += [f"$(CP) $[ins[{i}]] $[outs[{i}]]"]
outs += ["=" + dest]
i = i + 1
hr = simplerule(
name=f"{self.localname}_hdr",
ins=ins,
outs=outs,
commands=cs,
label=toolchain.PREFIX + "CHEADERS",
)
hr.args["cheader_deps"] = [hr]
hr.args["cheader_files"] = [hr]
hf = [f"-I{hr.dir}"]
libraries = [d for d in deps if hasattr(d, "clibrary")]
for library in libraries:
if library.clibrary.cflags:
cflags += library.clibrary.cflags
if library.clibrary.ldflags:
ldflags += library.clibrary.ldflags
for f in filenamesof(srcs):
if f.endswith(".h"):
deps += [f]
hdrcs = []
hdrins = list(hdrs.values())
hdrouts = []
i = 0
for dest, src in hdrs.items():
s = filenamesof(src)
if len(s) != 1:
raise ABException(
"a dependency of an export must have exactly one output file"
)
hdrcs += ["cp {ins[" + str(i) + "]} {outs[" + str(i) + "]}"]
hdrouts += [dest]
i = i + 1
if not hasattr(self, "clibrary"):
self.clibrary = SimpleNamespace()
if srcs:
hr = None
if hdrcs:
hr = normalrule(
name=f"{name}_hdrs",
ins=hdrins,
outs=hdrouts,
label="HEADERS",
commands=hdrcs,
)
hr.materialise()
actualsrcs = findsources(
name,
# Can't depend on the current target to get the library headers, because
# if we do it'll cause a dependency loop.
objs = findsources(
self,
srcs,
deps + ([f"{name}_hdrs"] if hr else []),
cflags + ([f"-I{hr.normalrule.objdir}"] if hr else []),
kind,
deps + ([hr] if hr else []),
cflags + hf,
filerule,
toolchain,
self.cwd,
)
normalrule(
replaces=self,
ins=actualsrcs,
outs=[basename(name) + ".a"],
ar = simplerule(
name=f"{self.localname}_lib",
ins=objs,
outs=[f"={self.localname}.a"],
deps=deps,
label=label,
commands=commands if actualsrcs else [],
commands=commands,
)
ar.materialise()
self.clibrary.ldflags = ldflags
self.clibrary.cflags = ["-I" + hr.normalrule.objdir] if hr else []
else:
r = normalrule(
replaces=self,
ins=hdrins,
outs=hdrouts,
label="HEADERS",
commands=hdrcs,
)
r.materialise()
self.clibrary.ldflags = ldflags
self.clibrary.cflags = ["-I" + r.normalrule.objdir]
self.outs = ([hr] if hr else []) + ([ar] if ar else [])
self.deps = self.outs
self.args["cheader_deps"] = hdr_deps
self.args["clibrary_deps"] = lib_deps
self.args["cheader_files"] = [hr] if hr else []
self.args["clibrary_files"] = [ar] if ar else []
self.args["caller_cflags"] = caller_cflags + hf
self.args["caller_ldflags"] = caller_ldflags
@Rule
def clibrary(
self,
name,
srcs: Targets = [],
deps: Targets = [],
hdrs: TargetsMap = {},
srcs: Targets = None,
deps: Targets = None,
hdrs: TargetsMap = None,
caller_cflags=[],
caller_ldflags=[],
cflags=[],
ldflags=[],
commands=["$(AR) cqs {outs[0]} {ins}"],
toolchain=Toolchain,
label="LIB",
cfilerule=cfile,
):
return libraryimpl(
self, name, srcs, deps, hdrs, cflags, ldflags, commands, label, cfile
libraryimpl(
self,
name,
srcs,
deps,
hdrs,
caller_cflags,
caller_ldflags,
cflags,
ldflags,
toolchain,
toolchain.AR,
toolchain.PREFIX + label,
cfilerule,
)
@Rule
def hostclibrary(
self,
name,
srcs: Targets = None,
deps: Targets = None,
hdrs: TargetsMap = None,
caller_cflags=[],
caller_ldflags=[],
cflags=[],
ldflags=[],
toolchain=HostToolchain,
label="LIB",
cfilerule=cfile,
):
libraryimpl(
self,
name,
srcs,
deps,
hdrs,
caller_cflags,
caller_ldflags,
cflags,
ldflags,
toolchain,
toolchain.AR,
toolchain.PREFIX + label,
cfilerule,
)
@@ -178,40 +348,92 @@ def clibrary(
def cxxlibrary(
self,
name,
srcs: Targets = [],
deps: Targets = [],
hdrs: TargetsMap = {},
srcs: Targets = None,
deps: Targets = None,
hdrs: TargetsMap = None,
caller_cflags=[],
caller_ldflags=[],
cflags=[],
ldflags=[],
commands=["$(AR) cqs {outs[0]} {ins}"],
label="LIB",
toolchain=Toolchain,
label="CXXLIB",
cxxfilerule=cxxfile,
):
return libraryimpl(
self, name, srcs, deps, hdrs, cflags, ldflags, commands, label, cxxfile
libraryimpl(
self,
name,
srcs,
deps,
hdrs,
caller_cflags,
caller_ldflags,
cflags,
ldflags,
toolchain,
toolchain.ARXX,
toolchain.PREFIX + label,
cxxfilerule,
)
@Rule
def hostcxxlibrary(
self,
name,
srcs: Targets = None,
deps: Targets = None,
hdrs: TargetsMap = None,
caller_cflags=[],
caller_ldflags=[],
cflags=[],
ldflags=[],
toolchain=HostToolchain,
label="CXXLIB",
cxxfilerule=cxxfile,
):
libraryimpl(
self,
name,
srcs,
deps,
hdrs,
caller_cflags,
caller_ldflags,
cflags,
ldflags,
toolchain,
toolchain.ARXX,
toolchain.PREFIX + label,
cxxfilerule,
)
def programimpl(
self, name, srcs, deps, cflags, ldflags, commands, label, filerule, kind
self,
name,
srcs,
deps,
cflags,
ldflags,
toolchain,
commands,
label,
filerule,
):
libraries = [d for d in deps if hasattr(d, "clibrary")]
for library in libraries:
if library.clibrary.cflags:
cflags += library.clibrary.cflags
if library.clibrary.ldflags:
ldflags += library.clibrary.ldflags
cfiles = findsources(self, srcs, deps, cflags, filerule, toolchain, self.cwd)
deps += [f for f in filenamesof(srcs) if f.endswith(".h")]
lib_deps = toolchain.find_c_library_targets(deps)
libs = collectattrs(targets=lib_deps, name="clibrary_files")
ldflags = collectattrs(targets=lib_deps, name="caller_ldflags", initial=ldflags)
ars = [f for f in filenamesof(libraries) if f.endswith(".a")]
normalrule(
simplerule(
replaces=self,
ins=(findsources(name, srcs, deps, cflags, filerule) + ars + ars),
outs=[basename(name) + "$(EXT)"],
ins=cfiles + libs,
outs=[f"={self.localname}{toolchain.EXE}"],
deps=deps,
label=label,
commands=commands,
ldflags=ldflags,
args={"ldflags": ldflags},
)
@@ -219,12 +441,13 @@ def programimpl(
def cprogram(
self,
name,
srcs: Targets = [],
deps: Targets = [],
srcs: Targets = None,
deps: Targets = None,
cflags=[],
ldflags=[],
commands=["$(CC) -o {outs[0]} {ins} {ldflags} $(LDFLAGS)"],
toolchain=Toolchain,
label="CLINK",
cfilerule=cfile,
):
programimpl(
self,
@@ -233,10 +456,36 @@ def cprogram(
deps,
cflags,
ldflags,
commands,
label,
cfile,
"cprogram",
toolchain,
toolchain.CLINK,
toolchain.PREFIX + label,
cfilerule,
)
@Rule
def hostcprogram(
self,
name,
srcs: Targets = None,
deps: Targets = None,
cflags=[],
ldflags=[],
toolchain=HostToolchain,
label="CLINK",
cfilerule=cfile,
):
programimpl(
self,
name,
srcs,
deps,
cflags,
ldflags,
toolchain,
toolchain.CLINK,
toolchain.PREFIX + label,
cfilerule,
)
@@ -244,12 +493,13 @@ def cprogram(
def cxxprogram(
self,
name,
srcs: Targets = [],
deps: Targets = [],
srcs: Targets = None,
deps: Targets = None,
cflags=[],
ldflags=[],
commands=["$(CXX) -o {outs[0]} {ins} {ldflags} $(LDFLAGS)"],
toolchain=Toolchain,
label="CXXLINK",
cxxfilerule=cxxfile,
):
programimpl(
self,
@@ -258,8 +508,73 @@ def cxxprogram(
deps,
cflags,
ldflags,
commands,
label,
cxxfile,
"cxxprogram",
toolchain,
toolchain.CXXLINK,
toolchain.PREFIX + label,
cxxfilerule,
)
@Rule
def hostcxxprogram(
self,
name,
srcs: Targets = None,
deps: Targets = None,
cflags=[],
ldflags=[],
toolchain=HostToolchain,
label="CXXLINK",
cxxfilerule=cxxfile,
):
programimpl(
self,
name,
srcs,
deps,
cflags,
ldflags,
toolchain,
toolchain.CXXLINK,
toolchain.PREFIX + label,
cxxfilerule,
)
def _cppfileimpl(self, name, srcs, deps, cflags, toolchain):
hdr_deps = _indirect(deps, "cheader_deps")
cflags = collectattrs(targets=hdr_deps, name="caller_cflags", initial=cflags)
simplerule(
replaces=self,
ins=srcs,
outs=[f"={self.localname}"],
deps=deps,
commands=toolchain.CPP,
args={"cflags": cflags},
label=toolchain.PREFIX + "CPPFILE",
)
@Rule
def cppfile(
self,
name,
srcs: Targets = [],
deps: Targets = [],
cflags=[],
toolchain=Toolchain,
):
_cppfileimpl(self, name, srcs, deps, cflags, toolchain)
@Rule
def hostcppfile(
self,
name,
srcs: Targets = [],
deps: Targets = [],
cflags=[],
toolchain=HostToolchain,
):
_cppfileimpl(self, name, srcs, deps, cflags, toolchain)

View File

@@ -1,38 +1,83 @@
from build.ab import Rule, emit, Target
from types import SimpleNamespace
from build.ab import Rule, Target, G
import os
import subprocess
emit(
"""
PKG_CONFIG ?= pkg-config
PACKAGES := $(shell $(PKG_CONFIG) --list-all | cut -d' ' -f1 | sort)
"""
)
class _PkgConfig:
package_present = set()
package_properties = {}
pkgconfig = None
def __init__(self, cmd):
assert cmd, "no pkg-config environment variable supplied"
self.pkgconfig = cmd
r = subprocess.run(f"{cmd} --list-all", shell=True, capture_output=True)
ps = r.stdout.decode("utf-8")
self.package_present = {l.split(" ", 1)[0] for l in ps.splitlines()}
def has_package(self, name):
return name in self.package_present
def get_property(self, name, flag):
p = f"{name}.{flag}"
if p not in self.package_properties:
r = subprocess.run(
f"{self.pkgconfig} {flag} {name}",
shell=True,
capture_output=True,
)
self.package_properties[p] = r.stdout.decode("utf-8").strip()
return self.package_properties[p]
TargetPkgConfig = _PkgConfig(G.PKG_CONFIG)
HostPkgConfig = _PkgConfig(G.HOST_PKG_CONFIG)
def _package(self, name, package, fallback, pkgconfig):
if pkgconfig.has_package(package):
cflags = pkgconfig.get_property(package, "--cflags")
ldflags = pkgconfig.get_property(package, "--libs")
if cflags:
self.args["caller_cflags"] = [cflags]
if ldflags:
self.args["caller_ldflags"] = [ldflags]
self.args["clibrary_deps"] = [self]
self.args["cheader_deps"] = [self]
self.traits.update({"clibrary", "cxxlibrary"})
return
assert fallback, f"Required package '{package}' not installed"
if "cheader_deps" in fallback.args:
self.args["cheader_deps"] = fallback.args["cheader_deps"]
if "clibrary_deps" in fallback.args:
self.args["clibrary_deps"] = fallback.args["clibrary_deps"]
if "cheader_files" in fallback.args:
self.args["cheader_files"] = fallback.args["cheader_files"]
if "clibrary_files" in fallback.args:
self.args["clibrary_files"] = fallback.args["clibrary_files"]
self.ins = fallback.ins
self.outs = fallback.outs
self.deps = fallback.deps
self.traits = fallback.traits
@Rule
def package(self, name, package=None, fallback: Target = None):
emit("ifeq ($(filter %s, $(PACKAGES)),)" % package)
if fallback:
emit(f"PACKAGE_CFLAGS_{package} :=", fallback.clibrary.cflags)
emit(f"PACKAGE_LDFLAGS_{package} := ", fallback.clibrary.ldflags)
emit(f"PACKAGE_DEP_{package} := ", fallback.name)
else:
emit(f"$(error Required package '{package}' not installed.)")
emit("else")
emit(
f"PACKAGE_CFLAGS_{package} := $(shell $(PKG_CONFIG) --cflags {package})"
)
emit(
f"PACKAGE_LDFLAGS_{package} := $(shell $(PKG_CONFIG) --libs {package})"
)
emit(f"PACKAGE_DEP_{package} := ")
emit("endif")
_package(self, name, package, fallback, TargetPkgConfig)
self.clibrary = SimpleNamespace()
self.clibrary.cflags = [f"$(PACKAGE_CFLAGS_{package})"]
self.clibrary.ldflags = [f"$(PACKAGE_LDFLAGS_{package})"]
self.ins = []
self.outs = [f"$(PACKAGE_DEP_{package})"]
@Rule
def hostpackage(self, name, package=None, fallback: Target = None):
_package(self, name, package, fallback, HostPkgConfig)
def has_package(name):
return TargetPkgConfig.has_package(name)
def has_host_package(name):
return HostPkgConfig.has_package(name)

View File

@@ -1,33 +1,79 @@
from os.path import join
from build.ab import Rule, Targets, emit, normalrule, filenamesof, flatten
from build.c import cxxlibrary
import build.pkg
from types import SimpleNamespace
from build.ab import Rule, Targets, emit, simplerule, filenamesof, G
from build.utils import filenamesmatchingof, collectattrs
from os.path import join, abspath, dirname, relpath
from build.pkg import has_package
emit(
"""
PROTOC ?= protoc
ifeq ($(filter protobuf, $(PACKAGES)),)
$(error Required package 'protobuf' not installed.)"
endif
"""
)
G.setdefault("PROTOC", "protoc")
G.setdefault("PROTOC_SEPARATOR", ":")
G.setdefault("HOSTPROTOC", "hostprotoc")
assert has_package("protobuf"), "required package 'protobuf' not installed"
def _getprotodeps(deps):
r = set()
for d in deps:
r.update(d.args.get("protodeps", {d}))
return sorted(r)
@Rule
def proto(self, name, srcs: Targets = [], deps: Targets = []):
normalrule(
protodeps = _getprotodeps(deps)
descriptorlist = (G.PROTOC_SEPARATOR).join(
[
relpath(f, start=self.dir)
for f in filenamesmatchingof(protodeps, "*.descriptor")
]
)
dirs = sorted({"$[dir]/" + dirname(f) for f in filenamesof(srcs)})
simplerule(
replaces=self,
ins=srcs,
outs=[f"{name}.descriptor"],
deps=deps,
commands=[
"$(PROTOC) --include_source_info --descriptor_set_out={outs[0]} {ins}"
],
outs=[f"={self.localname}.descriptor"],
deps=protodeps,
commands=(
["mkdir -p " + (" ".join(dirs))]
+ [f"$(CP) {f} $[dir]/{f}" for f in filenamesof(srcs)]
+ [
"cd $[dir] && "
+ (
" ".join(
[
"$(PROTOC)",
"--proto_path=.",
"--include_source_info",
f"--descriptor_set_out={self.localname}.descriptor",
]
+ (
[f"--descriptor_set_in='{descriptorlist}'"]
if descriptorlist
else []
)
+ ["$[ins]"]
)
)
]
),
label="PROTO",
args={
"protosrcs": filenamesof(srcs),
"protodeps": set(protodeps) | {self},
},
)
self.proto.srcs = filenamesof(srcs) + flatten(
[s.proto.srcs for s in flatten(deps)]
@Rule
def protolib(self, name, srcs: Targets = []):
simplerule(
replaces=self,
label="PROTOLIB",
args={
"protosrcs": collectattrs(targets=srcs, name="protosrcs"),
"protodeps": set(_getprotodeps(srcs)),
},
)
@@ -35,31 +81,102 @@ def proto(self, name, srcs: Targets = [], deps: Targets = []):
def protocc(self, name, srcs: Targets = [], deps: Targets = []):
outs = []
protos = []
for f in flatten([s.proto.srcs for s in flatten(srcs + deps)]):
if f.endswith(".proto"):
cc = f.replace(".proto", ".pb.cc")
h = f.replace(".proto", ".pb.h")
protos += [f]
srcs += [f]
outs += [cc, h]
r = normalrule(
name=f"{name}_srcs",
ins=protos,
allsrcs = collectattrs(targets=srcs, name="protosrcs")
assert allsrcs, "no sources provided"
for f in filenamesmatchingof(allsrcs, "*.proto"):
cc = f.replace(".proto", ".pb.cc")
h = f.replace(".proto", ".pb.h")
protos += [f]
outs += ["=" + cc, "=" + h]
protodeps = _getprotodeps(deps + srcs)
descriptorlist = G.PROTOC_SEPARATOR.join(
[
relpath(f, start=self.dir)
for f in filenamesmatchingof(protodeps, "*.descriptor")
]
)
r = simplerule(
name=f"{self.localname}_srcs",
cwd=self.cwd,
ins=srcs,
outs=outs,
deps=deps,
commands=["$(PROTOC) --cpp_out={self.normalrule.objdir} {ins}"],
deps=protodeps,
commands=[
"cd $[dir] && "
+ (
" ".join(
[
"$(PROTOC)",
"--proto_path=.",
"--cpp_out=.",
f"--descriptor_set_in='{descriptorlist}'",
]
+ protos
)
)
],
label="PROTOCC",
)
r.materialise()
headers = {
f: join(r.normalrule.objdir, f) for f in outs if f.endswith(".pb.h")
}
headers = {f[1:]: join(r.dir, f[1:]) for f in outs if f.endswith(".pb.h")}
from build.c import cxxlibrary
cxxlibrary(
replaces=self,
srcs=[f"{name}_srcs"],
srcs=[r],
deps=deps,
hdrs=headers,
cflags=[f"-I{r.normalrule.objdir}"],
)
@Rule
def protojava(self, name, srcs: Targets = [], deps: Targets = []):
outs = []
allsrcs = collectattrs(targets=srcs, name="protosrcs")
assert allsrcs, "no sources provided"
protos = []
for f in filenamesmatchingof(allsrcs, "*.proto"):
protos += [f]
srcs += [f]
descriptorlist = ":".join(
[abspath(f) for f in filenamesmatchingof(srcs + deps, "*.descriptor")]
)
r = simplerule(
name=f"{self.localname}_srcs",
cwd=self.cwd,
ins=protos,
outs=[f"={self.localname}.srcjar"],
deps=srcs + deps,
commands=[
"mkdir -p $[dir]/srcs",
"cd $[dir]/srcs && "
+ (
" ".join(
[
"$(PROTOC)",
"--proto_path=.",
"--java_out=.",
f"--descriptor_set_in={descriptorlist}",
]
+ protos
)
),
"$(JAR) cf $[outs[0]] -C $[dir]/srcs .",
],
traits={"srcjar"},
label="PROTOJAVA",
)
from build.java import javalibrary
javalibrary(
replaces=self,
deps=[r] + deps,
)

11
build/toolchain.py Normal file
View File

@@ -0,0 +1,11 @@
import platform
_is_windows = (platform.system() == "Windows")
class Toolchain:
PREFIX = ""
EXE = ".exe" if _is_windows else ""
class HostToolchain(Toolchain):
PREFIX = "HOST"

View File

@@ -1,14 +1,76 @@
from build.ab import Rule, normalrule, Target, filenameof, Targets
from os.path import basename
from build.ab import (
Rule,
Target,
Targets,
filenameof,
filenamesof,
cwdStack,
error,
simplerule,
G
)
from os.path import relpath, splitext, join, basename, isfile
from glob import iglob
import fnmatch
import subprocess
import shutil
def filenamesmatchingof(xs, pattern):
return fnmatch.filter(filenamesof(xs), pattern)
def stripext(path):
return splitext(path)[0]
def targetswithtraitsof(xs, trait):
return [t for t in xs if trait in t.traits]
def collectattrs(*, targets, name, initial=[]):
s = set(initial)
for a in [t.args.get(name, []) for t in targets]:
s.update(a)
return sorted(s)
def itemsof(pattern, root=None, cwd=None):
if not cwd:
cwd = cwdStack[-1]
if not root:
root = "."
pattern = join(cwd, pattern)
root = join(cwd, root)
result = {}
for f in iglob(pattern, recursive=True):
try:
if isfile(f):
result[relpath(f, root)] = f
except ValueError:
error(f"file '{f}' is not in root '{root}'")
return result
def does_command_exist(cmd):
basecmd = cmd.strip().split()[0]
return shutil.which(basecmd)
def shell(cmd):
r = subprocess.check_output([G.SHELL, "-c", cmd])
return r.decode("utf-8").strip()
@Rule
def objectify(self, name, src: Target, symbol):
normalrule(
simplerule(
replaces=self,
ins=["build/_objectify.py", src],
outs=[basename(filenameof(src)) + ".h"],
commands=["$(PYTHON) {ins[0]} {ins[1]} " + symbol + " > {outs}"],
outs=[f"={basename(filenameof(src))}.h"],
commands=["$(PYTHON) $[ins[0]] $[ins[1]] " + symbol + " > $[outs]"],
label="OBJECTIFY",
)
@@ -19,25 +81,25 @@ def test(
name,
command: Target = None,
commands=None,
ins: Targets = [],
deps: Targets = [],
ins: Targets = None,
deps: Targets = None,
label="TEST",
):
if command:
normalrule(
simplerule(
replaces=self,
ins=[command],
outs=["sentinel"],
commands=["{ins[0]}", "touch {outs}"],
outs=["=sentinel"],
commands=["$[ins[0]]", "touch $[outs[0]]"],
deps=deps,
label=label,
)
else:
normalrule(
simplerule(
replaces=self,
ins=ins,
outs=["sentinel"],
commands=commands + ["touch {outs}"],
outs=["=sentinel"],
commands=commands + ["touch $[outs[0]]"],
deps=deps,
label=label,
)

25
build/zip.py Normal file
View File

@@ -0,0 +1,25 @@
from build.ab import (
Rule,
simplerule,
TargetsMap,
filenameof,
)
@Rule
def zip(self, name, flags="", items: TargetsMap = {}, extension="zip", label="ZIP"):
cs = ["$(PYTHON) build/_zip.py -z $[outs]"]
ins = []
for k, v in items.items():
cs += [f"-f {k} {filenameof(v)}"]
ins += [v]
simplerule(
replaces=self,
ins=ins,
deps=["build/_zip.py"],
outs=[f"={self.localname}." + extension],
commands=[" ".join(cs)],
label=label,
)

View File

@@ -1,5 +1,11 @@
import platform
import os
windows = platform.system() == "Windows"
osx = platform.system() == "Darwin"
unix = not windows
if os.getenv("BUILDTYPE") == "windows":
windows = True
osx = False
unix = False
else:
windows = False
osx = platform.system() == "Darwin"
unix = True

View File

@@ -2,33 +2,34 @@
#define ADF_NATIV_H
#ifdef __cplusplus
extern "C" {
extern "C"
{
#endif
#include "adf_str.h"
#define NATIVE_FILE 8001
struct nativeDevice
{
FILE* fd;
};
struct nativeDevice
{
FILE* fd;
};
struct nativeFunctions
{
/* called by adfMount() */
RETCODE (*adfInitDevice)(struct Device*, char*, BOOL);
/* called by adfReadBlock() */
RETCODE (*adfNativeReadSector)(struct Device*, int32_t, int, uint8_t*);
/* called by adfWriteBlock() */
RETCODE (*adfNativeWriteSector)(struct Device*, int32_t, int, uint8_t*);
/* called by adfMount() */
BOOL (*adfIsDevNative)(char*);
/* called by adfUnMount() */
RETCODE (*adfReleaseDevice)(struct Device*);
};
struct nativeFunctions
{
/* called by adfMount() */
RETCODE (*adfInitDevice)(struct Device*, char*, BOOL);
/* called by adfReadBlock() */
RETCODE (*adfNativeReadSector)(struct Device*, int32_t, int, uint8_t*);
/* called by adfWriteBlock() */
RETCODE (*adfNativeWriteSector)(struct Device*, int32_t, int, uint8_t*);
/* called by adfMount() */
BOOL (*adfIsDevNative)(char*);
/* called by adfUnMount() */
RETCODE (*adfReleaseDevice)(struct Device*);
};
extern void adfInitNativeFct();
extern void adfInitNativeFct();
#ifdef __cplusplus
}

View File

@@ -35,7 +35,7 @@ clibrary(
"./config.h",
"./src/adflib.h",
],
cflags=["-Idep/adflib", "-Idep/adflib/src"],
cflags=["-Wno-stringop-overflow"],
hdrs={
"adf_blk.h": "./src/adf_blk.h",
"adf_defs.h": "./src/adf_defs.h",

View File

@@ -1,2 +1 @@
/* empty config.h to keep the source happy */

View File

@@ -27,25 +27,28 @@
*
*/
#include"adf_str.h"
#include"prefix.h"
#include "adf_str.h"
#include "prefix.h"
RETCODE adfReadBitmapBlock(struct Volume*, SECTNUM nSect, struct bBitmapBlock*);
RETCODE adfWriteBitmapBlock(struct Volume*, SECTNUM nSect, struct bBitmapBlock*);
RETCODE adfReadBitmapExtBlock(struct Volume*, SECTNUM nSect, struct bBitmapExtBlock*);
RETCODE adfWriteBitmapExtBlock(struct Volume*, SECTNUM, struct bBitmapExtBlock* );
RETCODE adfWriteBitmapBlock(
struct Volume*, SECTNUM nSect, struct bBitmapBlock*);
RETCODE adfReadBitmapExtBlock(
struct Volume*, SECTNUM nSect, struct bBitmapExtBlock*);
RETCODE adfWriteBitmapExtBlock(
struct Volume*, SECTNUM, struct bBitmapExtBlock*);
SECTNUM adfGet1FreeBlock(struct Volume *vol);
RETCODE adfUpdateBitmap(struct Volume *vol);
SECTNUM adfGet1FreeBlock(struct Volume* vol);
RETCODE adfUpdateBitmap(struct Volume* vol);
PREFIX int32_t adfCountFreeBlocks(struct Volume* vol);
RETCODE adfReadBitmap(struct Volume* , SECTNUM nBlock, struct bRootBlock* root);
RETCODE adfReadBitmap(struct Volume*, SECTNUM nBlock, struct bRootBlock* root);
BOOL adfIsBlockFree(struct Volume* vol, SECTNUM nSect);
void adfSetBlockFree(struct Volume* vol, SECTNUM nSect);
void adfSetBlockUsed(struct Volume* vol, SECTNUM nSect);
BOOL adfGetFreeBlocks(struct Volume* vol, int nbSect, SECTNUM* sectList);
RETCODE adfCreateBitmap(struct Volume *vol);
RETCODE adfWriteNewBitmap(struct Volume *vol);
void adfFreeBitmap(struct Volume *vol);
RETCODE adfCreateBitmap(struct Volume* vol);
RETCODE adfWriteNewBitmap(struct Volume* vol);
void adfFreeBitmap(struct Volume* vol);
#endif /* ADF_BITM_H */

View File

@@ -25,264 +25,255 @@
*
*/
#ifndef ADF_BLK_H
#define ADF_BLK_H 1
#define ULONG uint32_t
#define USHORT uint16_t
#define UCHAR uint8_t
#define ULONG uint32_t
#define USHORT uint16_t
#define UCHAR uint8_t
#define LOGICAL_BLOCK_SIZE 512
#define LOGICAL_BLOCK_SIZE 512
/* ----- FILE SYSTEM ----- */
#define FSMASK_FFS 1
#define FSMASK_INTL 2
#define FSMASK_DIRCACHE 4
#define isFFS(c) ((c)&FSMASK_FFS)
#define isOFS(c) (!((c)&FSMASK_FFS))
#define isINTL(c) ((c)&FSMASK_INTL)
#define isDIRCACHE(c) ((c)&FSMASK_DIRCACHE)
#define FSMASK_FFS 1
#define FSMASK_INTL 2
#define FSMASK_DIRCACHE 4
#define isFFS(c) ((c)&FSMASK_FFS)
#define isOFS(c) (!((c)&FSMASK_FFS))
#define isINTL(c) ((c)&FSMASK_INTL)
#define isDIRCACHE(c) ((c)&FSMASK_DIRCACHE)
/* ----- ENTRIES ----- */
/* access constants */
#define ACCMASK_D (1<<0)
#define ACCMASK_E (1<<1)
#define ACCMASK_W (1<<2)
#define ACCMASK_R (1<<3)
#define ACCMASK_A (1<<4)
#define ACCMASK_P (1<<5)
#define ACCMASK_S (1<<6)
#define ACCMASK_H (1<<7)
#define hasD(c) ((c)&ACCMASK_D)
#define hasE(c) ((c)&ACCMASK_E)
#define hasW(c) ((c)&ACCMASK_W)
#define hasR(c) ((c)&ACCMASK_R)
#define hasA(c) ((c)&ACCMASK_A)
#define hasP(c) ((c)&ACCMASK_P)
#define hasS(c) ((c)&ACCMASK_S)
#define hasH(c) ((c)&ACCMASK_H)
#define ACCMASK_D (1 << 0)
#define ACCMASK_E (1 << 1)
#define ACCMASK_W (1 << 2)
#define ACCMASK_R (1 << 3)
#define ACCMASK_A (1 << 4)
#define ACCMASK_P (1 << 5)
#define ACCMASK_S (1 << 6)
#define ACCMASK_H (1 << 7)
#define hasD(c) ((c)&ACCMASK_D)
#define hasE(c) ((c)&ACCMASK_E)
#define hasW(c) ((c)&ACCMASK_W)
#define hasR(c) ((c)&ACCMASK_R)
#define hasA(c) ((c)&ACCMASK_A)
#define hasP(c) ((c)&ACCMASK_P)
#define hasS(c) ((c)&ACCMASK_S)
#define hasH(c) ((c)&ACCMASK_H)
/* ----- BLOCKS ----- */
/* block constants */
#define BM_VALID -1
#define BM_INVALID 0
#define BM_VALID -1
#define BM_INVALID 0
#define HT_SIZE 72
#define BM_SIZE 25
#define MAX_DATABLK 72
#define MAXNAMELEN 30
#define MAXCMMTLEN 79
#define HT_SIZE 72
#define BM_SIZE 25
#define MAX_DATABLK 72
#define MAXNAMELEN 30
#define MAXCMMTLEN 79
/* block primary and secondary types */
#define T_HEADER 2
#define ST_ROOT 1
#define ST_DIR 2
#define ST_FILE -3
#define ST_LFILE -4
#define ST_LDIR 4
#define ST_LSOFT 3
#define T_LIST 16
#define T_DATA 8
#define T_DIRC 33
#define T_HEADER 2
#define ST_ROOT 1
#define ST_DIR 2
#define ST_FILE -3
#define ST_LFILE -4
#define ST_LDIR 4
#define ST_LSOFT 3
#define T_LIST 16
#define T_DATA 8
#define T_DIRC 33
/*--- blocks structures --- */
struct bBootBlock {
/*000*/ char dosType[4];
/*004*/ ULONG checkSum;
/*008*/ int32_t rootBlock;
/*00c*/ UCHAR data[500+512];
struct bBootBlock
{
/*000*/ char dosType[4];
/*004*/ ULONG checkSum;
/*008*/ int32_t rootBlock;
/*00c*/ UCHAR data[500 + 512];
};
struct bRootBlock {
/*000*/ int32_t type;
int32_t headerKey;
int32_t highSeq;
/*00c*/ int32_t hashTableSize;
int32_t firstData;
/*014*/ ULONG checkSum;
/*018*/ int32_t hashTable[HT_SIZE]; /* hash table */
/*138*/ int32_t bmFlag; /* bitmap flag, -1 means VALID */
/*13c*/ int32_t bmPages[BM_SIZE];
/*1a0*/ int32_t bmExt;
/*1a4*/ int32_t cDays; /* creation date FFS and OFS */
/*1a8*/ int32_t cMins;
/*1ac*/ int32_t cTicks;
/*1b0*/ char nameLen;
/*1b1*/ char diskName[MAXNAMELEN+1];
char r2[8];
/*1d8*/ int32_t days; /* last access : days after 1 jan 1978 */
/*1dc*/ int32_t mins; /* hours and minutes in minutes */
/*1e0*/ int32_t ticks; /* 1/50 seconds */
/*1e4*/ int32_t coDays; /* creation date OFS */
/*1e8*/ int32_t coMins;
/*1ec*/ int32_t coTicks;
int32_t nextSameHash; /* == 0 */
int32_t parent; /* == 0 */
/*1f8*/ int32_t extension; /* FFS: first directory cache block */
/*1fc*/ int32_t secType; /* == 1 */
struct bRootBlock
{
/*000*/ int32_t type;
int32_t headerKey;
int32_t highSeq;
/*00c*/ int32_t hashTableSize;
int32_t firstData;
/*014*/ ULONG checkSum;
/*018*/ int32_t hashTable[HT_SIZE]; /* hash table */
/*138*/ int32_t bmFlag; /* bitmap flag, -1 means VALID */
/*13c*/ int32_t bmPages[BM_SIZE];
/*1a0*/ int32_t bmExt;
/*1a4*/ int32_t cDays; /* creation date FFS and OFS */
/*1a8*/ int32_t cMins;
/*1ac*/ int32_t cTicks;
/*1b0*/ char nameLen;
/*1b1*/ char diskName[MAXNAMELEN + 1];
char r2[8];
/*1d8*/ int32_t days; /* last access : days after 1 jan 1978 */
/*1dc*/ int32_t mins; /* hours and minutes in minutes */
/*1e0*/ int32_t ticks; /* 1/50 seconds */
/*1e4*/ int32_t coDays; /* creation date OFS */
/*1e8*/ int32_t coMins;
/*1ec*/ int32_t coTicks;
int32_t nextSameHash; /* == 0 */
int32_t parent; /* == 0 */
/*1f8*/ int32_t extension; /* FFS: first directory cache block */
/*1fc*/ int32_t secType; /* == 1 */
};
struct bFileHeaderBlock {
/*000*/ int32_t type; /* == 2 */
/*004*/ int32_t headerKey; /* current block number */
/*008*/ int32_t highSeq; /* number of data block in this hdr block */
/*00c*/ int32_t dataSize; /* == 0 */
/*010*/ int32_t firstData;
/*014*/ ULONG checkSum;
/*018*/ int32_t dataBlocks[MAX_DATABLK];
/*138*/ int32_t r1;
/*13c*/ int32_t r2;
/*140*/ int32_t access; /* bit0=del, 1=modif, 2=write, 3=read */
/*144*/ uint32_t byteSize;
/*148*/ char commLen;
/*149*/ char comment[MAXCMMTLEN+1];
char r3[91-(MAXCMMTLEN+1)];
/*1a4*/ int32_t days;
/*1a8*/ int32_t mins;
/*1ac*/ int32_t ticks;
/*1b0*/ char nameLen;
/*1b1*/ char fileName[MAXNAMELEN+1];
int32_t r4;
/*1d4*/ int32_t real; /* unused == 0 */
/*1d8*/ int32_t nextLink; /* link chain */
int32_t r5[5];
/*1f0*/ int32_t nextSameHash; /* next entry with sane hash */
/*1f4*/ int32_t parent; /* parent directory */
/*1f8*/ int32_t extension; /* pointer to extension block */
/*1fc*/ int32_t secType; /* == -3 */
struct bFileHeaderBlock
{
/*000*/ int32_t type; /* == 2 */
/*004*/ int32_t headerKey; /* current block number */
/*008*/ int32_t highSeq; /* number of data block in this hdr block */
/*00c*/ int32_t dataSize; /* == 0 */
/*010*/ int32_t firstData;
/*014*/ ULONG checkSum;
/*018*/ int32_t dataBlocks[MAX_DATABLK];
/*138*/ int32_t r1;
/*13c*/ int32_t r2;
/*140*/ int32_t access; /* bit0=del, 1=modif, 2=write, 3=read */
/*144*/ uint32_t byteSize;
/*148*/ char commLen;
/*149*/ char comment[MAXCMMTLEN + 1];
char r3[91 - (MAXCMMTLEN + 1)];
/*1a4*/ int32_t days;
/*1a8*/ int32_t mins;
/*1ac*/ int32_t ticks;
/*1b0*/ char nameLen;
/*1b1*/ char fileName[MAXNAMELEN + 1];
int32_t r4;
/*1d4*/ int32_t real; /* unused == 0 */
/*1d8*/ int32_t nextLink; /* link chain */
int32_t r5[5];
/*1f0*/ int32_t nextSameHash; /* next entry with sane hash */
/*1f4*/ int32_t parent; /* parent directory */
/*1f8*/ int32_t extension; /* pointer to extension block */
/*1fc*/ int32_t secType; /* == -3 */
};
/*--- file header extension block structure ---*/
struct bFileExtBlock {
/*000*/ int32_t type; /* == 0x10 */
/*004*/ int32_t headerKey;
/*008*/ int32_t highSeq;
/*00c*/ int32_t dataSize; /* == 0 */
/*010*/ int32_t firstData; /* == 0 */
/*014*/ ULONG checkSum;
/*018*/ int32_t dataBlocks[MAX_DATABLK];
int32_t r[45];
int32_t info; /* == 0 */
int32_t nextSameHash; /* == 0 */
/*1f4*/ int32_t parent; /* header block */
/*1f8*/ int32_t extension; /* next header extension block */
/*1fc*/ int32_t secType; /* -3 */
struct bFileExtBlock
{
/*000*/ int32_t type; /* == 0x10 */
/*004*/ int32_t headerKey;
/*008*/ int32_t highSeq;
/*00c*/ int32_t dataSize; /* == 0 */
/*010*/ int32_t firstData; /* == 0 */
/*014*/ ULONG checkSum;
/*018*/ int32_t dataBlocks[MAX_DATABLK];
int32_t r[45];
int32_t info; /* == 0 */
int32_t nextSameHash; /* == 0 */
/*1f4*/ int32_t parent; /* header block */
/*1f8*/ int32_t extension; /* next header extension block */
/*1fc*/ int32_t secType; /* -3 */
};
struct bDirBlock {
/*000*/ int32_t type; /* == 2 */
/*004*/ int32_t headerKey;
/*008*/ int32_t highSeq; /* == 0 */
/*00c*/ int32_t hashTableSize; /* == 0 */
int32_t r1; /* == 0 */
/*014*/ ULONG checkSum;
/*018*/ int32_t hashTable[HT_SIZE]; /* hash table */
int32_t r2[2];
/*140*/ int32_t access;
int32_t r4; /* == 0 */
/*148*/ char commLen;
/*149*/ char comment[MAXCMMTLEN+1];
char r5[91-(MAXCMMTLEN+1)];
/*1a4*/ int32_t days; /* last access */
/*1a8*/ int32_t mins;
/*1ac*/ int32_t ticks;
/*1b0*/ char nameLen;
/*1b1*/ char dirName[MAXNAMELEN+1];
int32_t r6;
/*1d4*/ int32_t real; /* ==0 */
/*1d8*/ int32_t nextLink; /* link list */
int32_t r7[5];
/*1f0*/ int32_t nextSameHash;
/*1f4*/ int32_t parent;
/*1f8*/ int32_t extension; /* FFS : first directory cache */
/*1fc*/ int32_t secType; /* == 2 */
struct bDirBlock
{
/*000*/ int32_t type; /* == 2 */
/*004*/ int32_t headerKey;
/*008*/ int32_t highSeq; /* == 0 */
/*00c*/ int32_t hashTableSize; /* == 0 */
int32_t r1; /* == 0 */
/*014*/ ULONG checkSum;
/*018*/ int32_t hashTable[HT_SIZE]; /* hash table */
int32_t r2[2];
/*140*/ int32_t access;
int32_t r4; /* == 0 */
/*148*/ char commLen;
/*149*/ char comment[MAXCMMTLEN + 1];
char r5[91 - (MAXCMMTLEN + 1)];
/*1a4*/ int32_t days; /* last access */
/*1a8*/ int32_t mins;
/*1ac*/ int32_t ticks;
/*1b0*/ char nameLen;
/*1b1*/ char dirName[MAXNAMELEN + 1];
int32_t r6;
/*1d4*/ int32_t real; /* ==0 */
/*1d8*/ int32_t nextLink; /* link list */
int32_t r7[5];
/*1f0*/ int32_t nextSameHash;
/*1f4*/ int32_t parent;
/*1f8*/ int32_t extension; /* FFS : first directory cache */
/*1fc*/ int32_t secType; /* == 2 */
};
struct bOFSDataBlock{
/*000*/ int32_t type; /* == 8 */
/*004*/ int32_t headerKey; /* pointer to file_hdr block */
/*008*/ int32_t seqNum; /* file data block number */
/*00c*/ int32_t dataSize; /* <= 0x1e8 */
/*010*/ int32_t nextData; /* next data block */
/*014*/ ULONG checkSum;
/*018*/ UCHAR data[488];
struct bOFSDataBlock
{
/*000*/ int32_t type; /* == 8 */
/*004*/ int32_t headerKey; /* pointer to file_hdr block */
/*008*/ int32_t seqNum; /* file data block number */
/*00c*/ int32_t dataSize; /* <= 0x1e8 */
/*010*/ int32_t nextData; /* next data block */
/*014*/ ULONG checkSum;
/*018*/ UCHAR data[488];
/*200*/ };
/* --- bitmap --- */
struct bBitmapBlock {
/*000*/ ULONG checkSum;
/*004*/ ULONG map[127];
};
struct bBitmapExtBlock {
/*000*/ int32_t bmPages[127];
/*1fc*/ int32_t nextBlock;
};
struct bLinkBlock {
/*000*/ int32_t type; /* == 2 */
/*004*/ int32_t headerKey; /* self pointer */
int32_t r1[3];
/*014*/ ULONG checkSum;
/*018*/ char realName[64];
int32_t r2[83];
/*1a4*/ int32_t days; /* last access */
/*1a8*/ int32_t mins;
/*1ac*/ int32_t ticks;
/*1b0*/ char nameLen;
/*1b1*/ char name[MAXNAMELEN+1];
int32_t r3;
/*1d4*/ int32_t realEntry;
/*1d8*/ int32_t nextLink;
int32_t r4[5];
/*1f0*/ int32_t nextSameHash;
/*1f4*/ int32_t parent;
int32_t r5;
/*1fc*/ int32_t secType; /* == -4, 4, 3 */
};
struct bBitmapBlock
{
/*000*/ ULONG checkSum;
/*004*/ ULONG map[127];
};
struct bBitmapExtBlock
{
/*000*/ int32_t bmPages[127];
/*1fc*/ int32_t nextBlock;
};
struct bLinkBlock
{
/*000*/ int32_t type; /* == 2 */
/*004*/ int32_t headerKey; /* self pointer */
int32_t r1[3];
/*014*/ ULONG checkSum;
/*018*/ char realName[64];
int32_t r2[83];
/*1a4*/ int32_t days; /* last access */
/*1a8*/ int32_t mins;
/*1ac*/ int32_t ticks;
/*1b0*/ char nameLen;
/*1b1*/ char name[MAXNAMELEN + 1];
int32_t r3;
/*1d4*/ int32_t realEntry;
/*1d8*/ int32_t nextLink;
int32_t r4[5];
/*1f0*/ int32_t nextSameHash;
/*1f4*/ int32_t parent;
int32_t r5;
/*1fc*/ int32_t secType; /* == -4, 4, 3 */
};
/*--- directory cache block structure ---*/
struct bDirCacheBlock {
/*000*/ int32_t type; /* == 33 */
/*004*/ int32_t headerKey;
/*008*/ int32_t parent;
/*00c*/ int32_t recordsNb;
/*010*/ int32_t nextDirC;
/*014*/ ULONG checkSum;
/*018*/ uint8_t records[488];
};
struct bDirCacheBlock
{
/*000*/ int32_t type; /* == 33 */
/*004*/ int32_t headerKey;
/*008*/ int32_t parent;
/*00c*/ int32_t recordsNb;
/*010*/ int32_t nextDirC;
/*014*/ ULONG checkSum;
/*018*/ uint8_t records[488];
};
#endif /* ADF_BLK_H */
/*##########################################################################*/

View File

@@ -27,20 +27,28 @@
*
*/
#include "adf_str.h"
void adfGetCacheEntry(struct bDirCacheBlock *dirc, int *p, struct CacheEntry *cEntry);
int adfPutCacheEntry( struct bDirCacheBlock *dirc, int *p, struct CacheEntry *cEntry);
void adfGetCacheEntry(
struct bDirCacheBlock* dirc, int* p, struct CacheEntry* cEntry);
int adfPutCacheEntry(
struct bDirCacheBlock* dirc, int* p, struct CacheEntry* cEntry);
struct List* adfGetDirEntCache(struct Volume *vol, SECTNUM dir, BOOL recurs);
struct List* adfGetDirEntCache(struct Volume* vol, SECTNUM dir, BOOL recurs);
RETCODE adfCreateEmptyCache(struct Volume *vol, struct bEntryBlock *parent, SECTNUM nSect);
RETCODE adfAddInCache(struct Volume *vol, struct bEntryBlock *parent, struct bEntryBlock *entry);
RETCODE adfUpdateCache(struct Volume *vol, struct bEntryBlock *parent, struct bEntryBlock *entry, BOOL);
RETCODE adfDelFromCache(struct Volume *vol, struct bEntryBlock *parent, SECTNUM);
RETCODE adfCreateEmptyCache(
struct Volume* vol, struct bEntryBlock* parent, SECTNUM nSect);
RETCODE adfAddInCache(
struct Volume* vol, struct bEntryBlock* parent, struct bEntryBlock* entry);
RETCODE adfUpdateCache(struct Volume* vol,
struct bEntryBlock* parent,
struct bEntryBlock* entry,
BOOL);
RETCODE adfDelFromCache(
struct Volume* vol, struct bEntryBlock* parent, SECTNUM);
RETCODE adfReadDirCBlock(struct Volume *vol, SECTNUM nSect, struct bDirCacheBlock *dirc);
RETCODE adfReadDirCBlock(
struct Volume* vol, SECTNUM nSect, struct bDirCacheBlock* dirc);
RETCODE adfWriteDirCBlock(struct Volume*, int32_t, struct bDirCacheBlock* dirc);
#endif /* _ADF_CACHE_H */

View File

@@ -24,7 +24,6 @@
*
*/
#ifndef _ADF_DEFS_H
#define _ADF_DEFS_H 1
@@ -34,38 +33,33 @@
#define SECTNUM int32_t
#define RETCODE int32_t
#define TRUE 1
#define FALSE 0
#define TRUE 1
#define FALSE 0
#include <stdint.h>
#define ULONG uint32_t
#define USHORT uint16_t
#define UCHAR uint8_t
#define BOOL int
#define ULONG uint32_t
#define USHORT uint16_t
#define UCHAR uint8_t
#define BOOL int
/* defines max and min */
#ifndef max
#define max(a,b) (a)>(b) ? (a) : (b)
#define max(a, b) (a) > (b) ? (a) : (b)
#endif
#ifndef min
#define min(a,b) (a)<(b) ? (a) : (b)
#define min(a, b) (a) < (b) ? (a) : (b)
#endif
/* (*byte) to (*short) and (*byte) to (*long) conversion */
#define Short(p) ((p)[0]<<8 | (p)[1])
#define Long(p) (Short(p)<<16 | Short(p+2))
#define Short(p) ((p)[0] << 8 | (p)[1])
#define Long(p) (Short(p) << 16 | Short(p + 2))
/* swap short and swap long macros for little endian machines */
#define swapShort(p) ((p)[0]<<8 | (p)[1])
#define swapLong(p) (swapShort(p)<<16 | swapShort(p+2))
#define swapShort(p) ((p)[0] << 8 | (p)[1])
#define swapLong(p) (swapShort(p) << 16 | swapShort(p + 2))
#endif /* _ADF_DEFS_H */
/*##########################################################################*/

View File

@@ -26,45 +26,54 @@
*
*/
#include"adf_str.h"
#include"adf_err.h"
#include"adf_defs.h"
#include "adf_str.h"
#include "adf_err.h"
#include "adf_defs.h"
#include"prefix.h"
#include "prefix.h"
PREFIX RETCODE adfToRootDir(struct Volume *vol);
BOOL isDirEmpty(struct bDirBlock *dir);
PREFIX RETCODE adfRemoveEntry(struct Volume *vol, SECTNUM pSect, char *name);
PREFIX struct List* adfGetDirEnt(struct Volume* vol, SECTNUM nSect );
PREFIX struct List* adfGetRDirEnt(struct Volume* vol, SECTNUM nSect, BOOL recurs );
PREFIX RETCODE adfToRootDir(struct Volume* vol);
BOOL isDirEmpty(struct bDirBlock* dir);
PREFIX RETCODE adfRemoveEntry(struct Volume* vol, SECTNUM pSect, char* name);
PREFIX struct List* adfGetDirEnt(struct Volume* vol, SECTNUM nSect);
PREFIX struct List* adfGetRDirEnt(
struct Volume* vol, SECTNUM nSect, BOOL recurs);
PREFIX void adfFreeDirList(struct List* list);
RETCODE adfEntBlock2Entry(struct bEntryBlock *entryBlk, struct Entry *entry);
PREFIX void adfFreeEntry(struct Entry *entry);
RETCODE adfCreateFile(struct Volume* vol, SECTNUM parent, char *name,
struct bFileHeaderBlock *fhdr);
RETCODE adfEntBlock2Entry(struct bEntryBlock* entryBlk, struct Entry* entry);
PREFIX void adfFreeEntry(struct Entry* entry);
RETCODE adfCreateFile(struct Volume* vol,
SECTNUM parent,
char* name,
struct bFileHeaderBlock* fhdr);
PREFIX RETCODE adfCreateDir(struct Volume* vol, SECTNUM parent, char* name);
SECTNUM adfCreateEntry(struct Volume *vol, struct bEntryBlock *dir, char *name, SECTNUM );
PREFIX RETCODE adfRenameEntry(struct Volume *vol, SECTNUM, char *old,SECTNUM,char *new);
SECTNUM adfCreateEntry(
struct Volume* vol, struct bEntryBlock* dir, char* name, SECTNUM);
PREFIX RETCODE adfRenameEntry(
struct Volume* vol, SECTNUM, char* old, SECTNUM, char* new);
RETCODE adfReadEntryBlock(struct Volume* vol, SECTNUM nSect, struct bEntryBlock* ent);
RETCODE adfWriteDirBlock(struct Volume* vol, SECTNUM nSect, struct bDirBlock *dir);
RETCODE adfWriteEntryBlock(struct Volume* vol, SECTNUM nSect, struct bEntryBlock *ent);
RETCODE adfReadEntryBlock(
struct Volume* vol, SECTNUM nSect, struct bEntryBlock* ent);
RETCODE adfWriteDirBlock(
struct Volume* vol, SECTNUM nSect, struct bDirBlock* dir);
RETCODE adfWriteEntryBlock(
struct Volume* vol, SECTNUM nSect, struct bEntryBlock* ent);
char* adfAccess2String(int32_t acc);
uint8_t adfIntlToUpper(uint8_t c);
int adfGetHashValue(uint8_t *name, BOOL intl);
void myToUpper( uint8_t *ostr, uint8_t *nstr, int,BOOL intl );
PREFIX RETCODE adfChangeDir(struct Volume* vol, char *name);
int adfGetHashValue(uint8_t* name, BOOL intl);
void myToUpper(uint8_t* ostr, uint8_t* nstr, int, BOOL intl);
PREFIX RETCODE adfChangeDir(struct Volume* vol, char* name);
PREFIX RETCODE adfParentDir(struct Volume* vol);
PREFIX RETCODE adfSetEntryAccess(struct Volume*, SECTNUM, char*, int32_t);
PREFIX RETCODE adfSetEntryComment(struct Volume*, SECTNUM, char*, char*);
SECTNUM adfNameToEntryBlk(struct Volume *vol, int32_t ht[], char* name,
struct bEntryBlock *entry, SECTNUM *);
SECTNUM adfNameToEntryBlk(struct Volume* vol,
int32_t ht[],
char* name,
struct bEntryBlock* entry,
SECTNUM*);
PREFIX void printEntry(struct Entry* entry);
void adfFreeDirList(struct List* list);
#endif /* ADF_DIR_H */

View File

@@ -31,21 +31,21 @@
#include "adf_str.h"
#include "adf_defs.h"
PREFIX RETCODE adfInstallBootBlock(struct Volume *vol,uint8_t*);
PREFIX RETCODE adfInstallBootBlock(struct Volume* vol, uint8_t*);
PREFIX BOOL isSectNumValid(struct Volume *vol, SECTNUM nSect);
PREFIX BOOL isSectNumValid(struct Volume* vol, SECTNUM nSect);
PREFIX struct Volume* adfMount( struct Device *dev, int nPart, BOOL readOnly );
PREFIX void adfUnMount(struct Volume *vol);
PREFIX void adfVolumeInfo(struct Volume *vol);
struct Volume* adfCreateVol( struct Device* dev, int32_t start, int32_t len,
char* volName, int volType );
PREFIX struct Volume* adfMount(struct Device* dev, int nPart, BOOL readOnly);
PREFIX void adfUnMount(struct Volume* vol);
PREFIX void adfVolumeInfo(struct Volume* vol);
struct Volume* adfCreateVol(
struct Device* dev, int32_t start, int32_t len, char* volName, int volType);
/*void adfReadBitmap(struct Volume* , int32_t nBlock, struct bRootBlock* root);
void adfUpdateBitmap(struct Volume*);
*/
PREFIX RETCODE adfReadBlock(struct Volume* , int32_t nSect, uint8_t* buf);
PREFIX RETCODE adfWriteBlock(struct Volume* , int32_t nSect, uint8_t* buf);
PREFIX RETCODE adfReadBlock(struct Volume*, int32_t nSect, uint8_t* buf);
PREFIX RETCODE adfWriteBlock(struct Volume*, int32_t nSect, uint8_t* buf);
#endif /* _ADF_DISK_H */

View File

@@ -7,7 +7,7 @@
* adf_dump.h
*
* $Id$
*
*
* This file is part of ADFLib.
*
* ADFLib is free software; you can redistribute it and/or modify
@@ -26,14 +26,13 @@
*
*/
PREFIX struct Device*
adfCreateDumpDevice(char* filename, int32_t cyl, int32_t heads, int32_t sec);
PREFIX struct Device* adfCreateDumpDevice(
char* filename, int32_t cyl, int32_t heads, int32_t sec);
PREFIX RETCODE adfCreateHdFile(struct Device* dev, char* volName, int volType);
BOOL adfInitDumpDevice(struct Device* dev, char* name,BOOL);
BOOL adfReadDumpSector(struct Device *dev, int32_t n, int size, uint8_t* buf);
BOOL adfWriteDumpSector(struct Device *dev, int32_t n, int size, uint8_t* buf);
RETCODE adfReleaseDumpDevice(struct Device *dev);
BOOL adfInitDumpDevice(struct Device* dev, char* name, BOOL);
BOOL adfReadDumpSector(struct Device* dev, int32_t n, int size, uint8_t* buf);
BOOL adfWriteDumpSector(struct Device* dev, int32_t n, int size, uint8_t* buf);
RETCODE adfReleaseDumpDevice(struct Device* dev);
#endif /* ADF_DUMP_H */
/*##########################################################################*/

View File

@@ -7,7 +7,7 @@
* adf_env.h
*
* $Id$
*
*
* This file is part of ADFLib.
*
* ADFLib is free software; you can redistribute it and/or modify
@@ -26,13 +26,15 @@
*
*/
#include"prefix.h"
#include "prefix.h"
PREFIX void adfEnvInitDefault();
PREFIX void adfSetEnvFct( void(*e)(char*), void(*w)(char*), void(*v)(char*),
void(*n)(SECTNUM,int) );
PREFIX void adfSetEnvFct(void (*e)(char*),
void (*w)(char*),
void (*v)(char*),
void (*n)(SECTNUM, int));
PREFIX void adfEnvCleanUp();
PREFIX void adfChgEnvProp(int prop, void *new);
PREFIX void adfChgEnvProp(int prop, void* new);
PREFIX char* adfGetVersionNumber();
PREFIX char* adfGetVersionDate();

View File

@@ -26,39 +26,36 @@
*
*/
#define hasRC(rc, c) ((rc) & (c))
#define hasRC(rc,c) ((rc)&(c))
#define RC_OK 0
#define RC_ERROR -1
#define RC_OK 0
#define RC_ERROR -1
#define RC_MALLOC 1
#define RC_VOLFULL 2
#define RC_MALLOC 1
#define RC_VOLFULL 2
#define RC_FOPEN 1<<10
#define RC_NULLPTR 1<<12
#define RC_FOPEN 1 << 10
#define RC_NULLPTR 1 << 12
/* adfRead*Block() */
#define RC_BLOCKTYPE 1
#define RC_BLOCKSTYPE 1<<1
#define RC_BLOCKSUM 1<<2
#define RC_HEADERKEY 1<<3
#define RC_BLOCKREAD 1<<4
#define RC_BLOCKTYPE 1
#define RC_BLOCKSTYPE 1 << 1
#define RC_BLOCKSUM 1 << 2
#define RC_HEADERKEY 1 << 3
#define RC_BLOCKREAD 1 << 4
/* adfWrite*Block */
#define RC_BLOCKWRITE 1<<4
#define RC_BLOCKWRITE 1 << 4
/* adfReadBlock() */
#define RC_BLOCKOUTOFRANGE 1
#define RC_BLOCKNATREAD 1<<1
#define RC_BLOCKOUTOFRANGE 1
#define RC_BLOCKNATREAD 1 << 1
/* adfWriteBlock() */
/* RC_BLOCKOUTOFRANGE */
#define RC_BLOCKNATWRITE 1<<1
#define RC_BLOCKREADONLY 1<<2
#define RC_BLOCKNATWRITE 1 << 1
#define RC_BLOCKREADONLY 1 << 2
/* adfInitDumpDevice() */
/* RC_FOPEN */
@@ -66,17 +63,16 @@
/* adfNativeReadBlock(), adfReadDumpSector() */
#define RC_BLOCKSHORTREAD 1
#define RC_BLOCKFSEEK 1<<1
#define RC_BLOCKSHORTREAD 1
#define RC_BLOCKFSEEK 1 << 1
/* adfNativeWriteBlock(), adfWriteDumpSector() */
#define RC_BLOCKSHORTWRITE 1
#define RC_BLOCKSHORTWRITE 1
/* RC_BLOCKFSEEK */
/*-- adfReadRDSKblock --*/
#define RC_BLOCKID 1<<5
#define RC_BLOCKID 1 << 5
/*-- adfWriteRDSKblock() --*/
/*RC_BLOCKREADONLY*/

View File

@@ -26,35 +26,40 @@
*
*/
#include"prefix.h"
#include "prefix.h"
#include"adf_str.h"
#include "adf_str.h"
RETCODE adfGetFileBlocks(struct Volume* vol, struct bFileHeaderBlock* entry,
struct FileBlocks* );
RETCODE adfFreeFileBlocks(struct Volume* vol, struct bFileHeaderBlock *entry);
PREFIX int32_t adfFileRealSize(uint32_t size, int blockSize, int32_t *dataN, int32_t *extN);
RETCODE adfGetFileBlocks(
struct Volume* vol, struct bFileHeaderBlock* entry, struct FileBlocks*);
RETCODE adfFreeFileBlocks(struct Volume* vol, struct bFileHeaderBlock* entry);
PREFIX int32_t adfFileRealSize(
uint32_t size, int blockSize, int32_t* dataN, int32_t* extN);
int32_t adfPos2DataBlock(int32_t pos, int blockSize, int *posInExtBlk, int *posInDataBlk, int32_t *curDataN );
int32_t adfPos2DataBlock(int32_t pos,
int blockSize,
int* posInExtBlk,
int* posInDataBlk,
int32_t* curDataN);
RETCODE adfWriteFileHdrBlock(struct Volume *vol, SECTNUM nSect, struct bFileHeaderBlock* fhdr);
RETCODE adfWriteFileHdrBlock(
struct Volume* vol, SECTNUM nSect, struct bFileHeaderBlock* fhdr);
RETCODE adfReadDataBlock(struct Volume *vol, SECTNUM nSect, void *data);
RETCODE adfWriteDataBlock(struct Volume *vol, SECTNUM nSect, void *data);
RETCODE adfReadFileExtBlock(struct Volume *vol, SECTNUM nSect, struct bFileExtBlock* fext);
RETCODE adfWriteFileExtBlock(struct Volume *vol, SECTNUM nSect, struct bFileExtBlock* fext);
RETCODE adfReadDataBlock(struct Volume* vol, SECTNUM nSect, void* data);
RETCODE adfWriteDataBlock(struct Volume* vol, SECTNUM nSect, void* data);
RETCODE adfReadFileExtBlock(
struct Volume* vol, SECTNUM nSect, struct bFileExtBlock* fext);
RETCODE adfWriteFileExtBlock(
struct Volume* vol, SECTNUM nSect, struct bFileExtBlock* fext);
PREFIX struct File* adfOpenFile(struct Volume *vol, char* name, char *mode);
PREFIX void adfCloseFile(struct File *file);
PREFIX int32_t adfReadFile(struct File* file, int32_t n, uint8_t *buffer);
PREFIX struct File* adfOpenFile(struct Volume* vol, char* name, char* mode);
PREFIX void adfCloseFile(struct File* file);
PREFIX int32_t adfReadFile(struct File* file, int32_t n, uint8_t* buffer);
PREFIX BOOL adfEndOfFile(struct File* file);
PREFIX void adfFileSeek(struct File *file, uint32_t pos); /* BV */
PREFIX void adfFileSeek(struct File* file, uint32_t pos); /* BV */
RETCODE adfReadNextFileBlock(struct File* file);
PREFIX int32_t adfWriteFile(struct File *file, int32_t n, uint8_t *buffer);
PREFIX int32_t adfWriteFile(struct File* file, int32_t n, uint8_t* buffer);
SECTNUM adfCreateNextFileBlock(struct File* file);
PREFIX void adfFlushFile(struct File *file);
PREFIX void adfFlushFile(struct File* file);
#endif /* ADF_FILE_H */

View File

@@ -28,38 +28,48 @@
*
*/
#include"prefix.h"
#include "prefix.h"
#include "adf_str.h"
#include "hd_blk.h"
#include "adf_err.h"
int adfDevType(struct Device *dev);
PREFIX void adfDeviceInfo(struct Device *dev);
int adfDevType(struct Device* dev);
PREFIX void adfDeviceInfo(struct Device* dev);
RETCODE adfMountHd(struct Device *dev);
RETCODE adfMountHd(struct Device* dev);
RETCODE adfMountFlop(struct Device* dev);
PREFIX struct Device* adfMountDev( char* filename,BOOL);
PREFIX void adfUnMountDev( struct Device* dev);
PREFIX struct Device* adfMountDev(char* filename, BOOL);
PREFIX void adfUnMountDev(struct Device* dev);
RETCODE adfCreateHdHeader(struct Device* dev, int n, struct Partition** partList );
PREFIX RETCODE adfCreateFlop(struct Device* dev, char* volName, int volType );
PREFIX RETCODE adfCreateHd(struct Device* dev, int n, struct Partition** partList );
RETCODE adfCreateHdHeader(
struct Device* dev, int n, struct Partition** partList);
PREFIX RETCODE adfCreateFlop(struct Device* dev, char* volName, int volType);
PREFIX RETCODE adfCreateHd(
struct Device* dev, int n, struct Partition** partList);
PREFIX RETCODE adfCreateHdFile(struct Device* dev, char* volName, int volType);
struct Device* adfCreateDev(char* filename, int32_t cylinders, int32_t heads, int32_t sectors);
RETCODE adfReadBlockDev( struct Device* dev, int32_t nSect, int32_t size, uint8_t* buf );
RETCODE adfWriteBlockDev(struct Device* dev, int32_t nSect, int32_t size, uint8_t* buf );
RETCODE adfReadRDSKblock( struct Device* dev, struct bRDSKblock* blk );
RETCODE adfWriteRDSKblock(struct Device *dev, struct bRDSKblock* rdsk);
RETCODE adfReadPARTblock( struct Device* dev, int32_t nSect, struct bPARTblock* blk );
RETCODE adfWritePARTblock(struct Device *dev, int32_t nSect, struct bPARTblock* part);
RETCODE adfReadFSHDblock( struct Device* dev, int32_t nSect, struct bFSHDblock* blk);
RETCODE adfWriteFSHDblock(struct Device *dev, int32_t nSect, struct bFSHDblock* fshd);
RETCODE adfReadLSEGblock(struct Device* dev, int32_t nSect, struct bLSEGblock* blk);
RETCODE adfWriteLSEGblock(struct Device *dev, int32_t nSect, struct bLSEGblock* lseg);
struct Device* adfCreateDev(
char* filename, int32_t cylinders, int32_t heads, int32_t sectors);
RETCODE adfReadBlockDev(
struct Device* dev, int32_t nSect, int32_t size, uint8_t* buf);
RETCODE adfWriteBlockDev(
struct Device* dev, int32_t nSect, int32_t size, uint8_t* buf);
RETCODE adfReadRDSKblock(struct Device* dev, struct bRDSKblock* blk);
RETCODE adfWriteRDSKblock(struct Device* dev, struct bRDSKblock* rdsk);
RETCODE adfReadPARTblock(
struct Device* dev, int32_t nSect, struct bPARTblock* blk);
RETCODE adfWritePARTblock(
struct Device* dev, int32_t nSect, struct bPARTblock* part);
RETCODE adfReadFSHDblock(
struct Device* dev, int32_t nSect, struct bFSHDblock* blk);
RETCODE adfWriteFSHDblock(
struct Device* dev, int32_t nSect, struct bFSHDblock* fshd);
RETCODE adfReadLSEGblock(
struct Device* dev, int32_t nSect, struct bLSEGblock* blk);
RETCODE adfWriteLSEGblock(
struct Device* dev, int32_t nSect, struct bLSEGblock* lseg);
#endif /* _ADF_HD_H */

View File

@@ -7,7 +7,7 @@
* adf_link.h
*
* $Id$
*
*
* This file is part of ADFLib.
*
* ADFLib is free software; you can redistribute it and/or modify
@@ -26,11 +26,13 @@
*
*/
#include"prefix.h"
#include "prefix.h"
#include <stdint.h>
PREFIX RETCODE adfBlockPtr2EntryName(struct Volume *vol, SECTNUM nSect, SECTNUM lPar,
char **name, int32_t *size);
PREFIX RETCODE adfBlockPtr2EntryName(struct Volume* vol,
SECTNUM nSect,
SECTNUM lPar,
char** name,
int32_t* size);
#endif /* ADF_LINK_H */
/*##########################################################################*/

View File

@@ -30,38 +30,40 @@
#include "adf_str.h"
#define SW_LONG 4
#define SW_LONG 4
#define SW_SHORT 2
#define SW_CHAR 1
#define SW_CHAR 1
#define MAX_SWTYPE 11
#define SWBL_BOOT 0
#define SWBL_ROOT 1
#define SWBL_DATA 2
#define SWBL_FILE 3
#define SWBL_ENTRY 3
#define SWBL_DIR 3
#define SWBL_CACHE 4
#define SWBL_BITMAP 5
#define SWBL_FEXT 5
#define SWBL_LINK 6
#define SWBL_BITMAPE 5
#define SWBL_RDSK 7
#define SWBL_BADB 8
#define SWBL_PART 9
#define SWBL_FSHD 10
#define SWBL_LSEG 11
#define SWBL_BOOT 0
#define SWBL_ROOT 1
#define SWBL_DATA 2
#define SWBL_FILE 3
#define SWBL_ENTRY 3
#define SWBL_DIR 3
#define SWBL_CACHE 4
#define SWBL_BITMAP 5
#define SWBL_FEXT 5
#define SWBL_LINK 6
#define SWBL_BITMAPE 5
#define SWBL_RDSK 7
#define SWBL_BADB 8
#define SWBL_PART 9
#define SWBL_FSHD 10
#define SWBL_LSEG 11
RETCODE adfReadRootBlock(struct Volume*, int32_t nSect, struct bRootBlock* root);
RETCODE adfWriteRootBlock(struct Volume* vol, int32_t nSect, struct bRootBlock* root);
RETCODE adfReadRootBlock(
struct Volume*, int32_t nSect, struct bRootBlock* root);
RETCODE adfWriteRootBlock(
struct Volume* vol, int32_t nSect, struct bRootBlock* root);
RETCODE adfReadBootBlock(struct Volume*, struct bBootBlock* boot);
RETCODE adfWriteBootBlock(struct Volume* vol, struct bBootBlock* boot);
uint32_t adfBootSum(uint8_t *buf);
uint32_t adfNormalSum( uint8_t *buf, int offset, int bufLen );
uint32_t adfBootSum(uint8_t* buf);
uint32_t adfNormalSum(uint8_t* buf, int offset, int bufLen);
void swapEndian( uint8_t *buf, int type );
void swapEndian(uint8_t* buf, int type);
#endif /* _ADF_RAW_H */

View File

@@ -26,17 +26,16 @@
*
*/
#include"prefix.h"
#include "prefix.h"
#include "adf_str.h"
RETCODE adfReadGenBlock(struct Volume *vol, SECTNUM nSect, struct GenBlock *block);
RETCODE adfReadGenBlock(
struct Volume* vol, SECTNUM nSect, struct GenBlock* block);
PREFIX RETCODE adfCheckEntry(struct Volume* vol, SECTNUM nSect, int level);
PREFIX RETCODE adfUndelEntry(struct Volume* vol, SECTNUM parent, SECTNUM nSect);
PREFIX struct List* adfGetDelEnt(struct Volume *vol);
PREFIX struct List* adfGetDelEnt(struct Volume* vol);
PREFIX void adfFreeDelList(struct List* list);
/*##########################################################################*/
#endif /* _ADF_SALV_H */

View File

@@ -28,41 +28,43 @@
*
*/
#include<stdio.h>
#include <stdio.h>
#include"adf_defs.h"
#include"adf_blk.h"
#include"adf_err.h"
#include "adf_defs.h"
#include "adf_blk.h"
#include "adf_err.h"
/* ----- VOLUME ----- */
struct Volume {
struct Volume
{
struct Device* dev;
SECTNUM firstBlock; /* first block of data area (from beginning of device) */
SECTNUM lastBlock; /* last block of data area (from beginning of device) */
SECTNUM rootBlock; /* root block (from firstBlock) */
SECTNUM
firstBlock; /* first block of data area (from beginning of device) */
SECTNUM lastBlock; /* last block of data area (from beginning of device) */
SECTNUM rootBlock; /* root block (from firstBlock) */
char dosType; /* FFS/OFS, DIRCACHE, INTERNATIONAL */
char dosType; /* FFS/OFS, DIRCACHE, INTERNATIONAL */
BOOL bootCode;
BOOL readOnly;
int datablockSize; /* 488 or 512 */
int blockSize; /* 512 */
int datablockSize; /* 488 or 512 */
int blockSize; /* 512 */
char *volName;
char* volName;
BOOL mounted;
int32_t bitmapSize; /* in blocks */
SECTNUM *bitmapBlocks; /* bitmap blocks pointers */
struct bBitmapBlock **bitmapTable;
BOOL *bitmapBlocksChg;
int32_t bitmapSize; /* in blocks */
SECTNUM* bitmapBlocks; /* bitmap blocks pointers */
struct bBitmapBlock** bitmapTable;
BOOL* bitmapBlocksChg;
SECTNUM curDirPtr;
};
struct Partition {
struct Partition
{
int32_t startCyl;
int32_t lenCyl;
char* volName;
@@ -71,35 +73,36 @@ struct Partition {
/* ----- DEVICES ----- */
#define DEVTYPE_FLOPDD 1
#define DEVTYPE_FLOPHD 2
#define DEVTYPE_HARDDISK 3
#define DEVTYPE_HARDFILE 4
#define DEVTYPE_FLOPDD 1
#define DEVTYPE_FLOPHD 2
#define DEVTYPE_HARDDISK 3
#define DEVTYPE_HARDFILE 4
struct Device {
int devType; /* see below */
struct Device
{
int devType; /* see below */
BOOL readOnly;
int32_t size; /* in bytes */
int32_t size; /* in bytes */
int nVol; /* partitions */
struct Volume** volList;
int32_t cylinders; /* geometry */
int nVol; /* partitions */
struct Volume** volList;
int32_t cylinders; /* geometry */
int32_t heads;
int32_t sectors;
BOOL isNativeDev;
void *nativeDev;
void* nativeDev;
};
/* ----- FILE ----- */
struct File {
struct Volume *volume;
struct File
{
struct Volume* volume;
struct bFileHeaderBlock* fileHdr;
void *currentData;
void* currentData;
struct bFileExtBlock* currentExt;
int32_t nDataBlock;
@@ -109,12 +112,12 @@ struct File {
int posInDataBlk;
int posInExtBlk;
BOOL eof, writeMode;
};
};
/* ----- ENTRY ---- */
struct Entry{
struct Entry
{
int type;
char* name;
SECTNUM sector;
@@ -127,72 +130,72 @@ struct Entry{
int hour, mins, secs;
};
struct CacheEntry{
struct CacheEntry
{
int32_t header, size, protect;
short days, mins, ticks;
signed char type;
char nLen, cLen;
char name[MAXNAMELEN+1], comm[MAXCMMTLEN+1];
/* char *name, *comm;*/
char name[MAXNAMELEN + 1], comm[MAXCMMTLEN + 1];
/* char *name, *comm;*/
};
struct DateTime{
int year,mon,day,hour,min,sec;
struct DateTime
{
int year, mon, day, hour, min, sec;
};
/* ----- ENVIRONMENT ----- */
#define PR_VFCT 1
#define PR_WFCT 2
#define PR_EFCT 3
#define PR_NOTFCT 4
#define PR_USEDIRC 5
#define PR_USE_NOTFCT 6
#define PR_PROGBAR 7
#define PR_USE_PROGBAR 8
#define PR_RWACCESS 9
#define PR_VFCT 1
#define PR_WFCT 2
#define PR_EFCT 3
#define PR_NOTFCT 4
#define PR_USEDIRC 5
#define PR_USE_NOTFCT 6
#define PR_PROGBAR 7
#define PR_USE_PROGBAR 8
#define PR_RWACCESS 9
#define PR_USE_RWACCESS 10
struct Env{
void (*vFct)(char*); /* verbose callback function */
void (*wFct)(char*); /* warning callback function */
void (*eFct)(char*); /* error callback function */
struct Env
{
void (*vFct)(char*); /* verbose callback function */
void (*wFct)(char*); /* warning callback function */
void (*eFct)(char*); /* error callback function */
void (*notifyFct)(SECTNUM, int);
BOOL useNotify;
void (*rwhAccess)(SECTNUM,SECTNUM,BOOL);
void (*rwhAccess)(SECTNUM, SECTNUM, BOOL);
BOOL useRWAccess;
void (*progressBar)(int);
BOOL useProgressBar;
BOOL useDirCache;
void *nativeFct;
void* nativeFct;
};
struct List{ /* generic linked tree */
void *content;
struct List
{ /* generic linked tree */
void* content;
struct List* subdir;
struct List* next;
};
struct GenBlock{
struct GenBlock
{
SECTNUM sect;
SECTNUM parent;
int type;
int secType;
char *name; /* if (type == 2 and (secType==2 or secType==-3)) */
char* name; /* if (type == 2 and (secType==2 or secType==-3)) */
};
struct FileBlocks{
struct FileBlocks
{
SECTNUM header;
int32_t nbExtens;
SECTNUM* extens;
@@ -200,36 +203,35 @@ struct FileBlocks{
SECTNUM* data;
};
struct bEntryBlock {
/*000*/ int32_t type; /* T_HEADER == 2 */
/*004*/ int32_t headerKey; /* current block number */
int32_t r1[3];
/*014*/ uint32_t checkSum;
/*018*/ int32_t hashTable[HT_SIZE];
int32_t r2[2];
/*140*/ int32_t access; /* bit0=del, 1=modif, 2=write, 3=read */
/*144*/ int32_t byteSize;
/*148*/ char commLen;
/*149*/ char comment[MAXCMMTLEN+1];
char r3[91-(MAXCMMTLEN+1)];
/*1a4*/ int32_t days;
/*1a8*/ int32_t mins;
/*1ac*/ int32_t ticks;
/*1b0*/ char nameLen;
/*1b1*/ char name[MAXNAMELEN+1];
int32_t r4;
/*1d4*/ int32_t realEntry;
/*1d8*/ int32_t nextLink;
int32_t r5[5];
/*1f0*/ int32_t nextSameHash;
/*1f4*/ int32_t parent;
/*1f8*/ int32_t extension;
/*1fc*/ int32_t secType;
};
struct bEntryBlock
{
/*000*/ int32_t type; /* T_HEADER == 2 */
/*004*/ int32_t headerKey; /* current block number */
int32_t r1[3];
/*014*/ uint32_t checkSum;
/*018*/ int32_t hashTable[HT_SIZE];
int32_t r2[2];
/*140*/ int32_t access; /* bit0=del, 1=modif, 2=write, 3=read */
/*144*/ int32_t byteSize;
/*148*/ char commLen;
/*149*/ char comment[MAXCMMTLEN + 1];
char r3[91 - (MAXCMMTLEN + 1)];
/*1a4*/ int32_t days;
/*1a8*/ int32_t mins;
/*1ac*/ int32_t ticks;
/*1b0*/ char nameLen;
/*1b1*/ char name[MAXNAMELEN + 1];
int32_t r4;
/*1d4*/ int32_t realEntry;
/*1d8*/ int32_t nextLink;
int32_t r5[5];
/*1f0*/ int32_t nextSameHash;
/*1f4*/ int32_t parent;
/*1f8*/ int32_t extension;
/*1fc*/ int32_t secType;
};
#define ENV_DECLARATION struct Env adfEnv
#endif /* _ADF_STR_H */
/*##########################################################################*/

View File

@@ -26,25 +26,22 @@
*
*/
#include"prefix.h"
#include "prefix.h"
#include "adf_str.h"
void swLong(uint8_t* buf, uint32_t val);
void swShort(uint8_t* buf, uint16_t val);
PREFIX struct List* newCell(struct List* list, void* content);
PREFIX void freeList(struct List* list);
void adfDays2Date(int32_t days, int *yy, int *mm, int *dd);
void adfDays2Date(int32_t days, int* yy, int* mm, int* dd);
BOOL adfIsLeap(int y);
void
adfTime2AmigaTime(struct DateTime dt, int32_t *day, int32_t *min, int32_t *ticks );
struct DateTime
adfGiveCurrentTime( void );
void adfTime2AmigaTime(
struct DateTime dt, int32_t* day, int32_t* min, int32_t* ticks);
struct DateTime adfGiveCurrentTime(void);
void dumpBlock(uint8_t *buf);
void dumpBlock(uint8_t* buf);
/*##########################################################################*/
#endif /* _ADF_UTIL_H */

View File

@@ -29,96 +29,107 @@
*/
#ifdef __cplusplus
extern "C" {
extern "C"
{
#endif /* __cplusplus */
/* Visual C++ DLL specific, define WIN32DLL or not in the makefile */
/* Visual C++ DLL specific, define WIN32DLL or not in the makefile */
#ifdef WIN32DLL
#define PREFIX __declspec(dllimport)
#else
#define PREFIX
#define PREFIX
#endif /* WIN32DLL */
#include "adf_defs.h"
#include "adf_str.h"
/* util */
PREFIX struct List* newCell(struct List* list, void* content);
PREFIX void freeList(struct List* list);
/* util */
PREFIX struct List* newCell(struct List* list, void* content);
PREFIX void freeList(struct List* list);
/* dir */
PREFIX struct Entry* adfFindEntry(struct Volume *vol, char* name);
PREFIX RETCODE adfToRootDir(struct Volume *vol);
PREFIX RETCODE adfCreateDir(struct Volume* vol, SECTNUM parent, char* name);
PREFIX RETCODE adfChangeDir(struct Volume* vol, char *name);
PREFIX RETCODE adfParentDir(struct Volume* vol);
PREFIX RETCODE adfRemoveEntry(struct Volume *vol, SECTNUM pSect, char *name);
PREFIX struct List* adfGetDirEnt(struct Volume* vol, SECTNUM nSect );
PREFIX struct List* adfGetRDirEnt(struct Volume* vol, SECTNUM nSect, BOOL recurs );
PREFIX void printEntry(struct Entry* entry);
PREFIX void adfFreeDirList(struct List* list);
PREFIX void adfFreeEntry(struct Entry *);
PREFIX RETCODE adfRenameEntry(struct Volume *vol, SECTNUM, char *old,SECTNUM,char *pNew); /* BV */
PREFIX RETCODE adfSetEntryAccess(struct Volume*, SECTNUM, char*, int32_t);
PREFIX RETCODE adfSetEntryComment(struct Volume*, SECTNUM, char*, char*);
/* dir */
PREFIX struct Entry* adfFindEntry(struct Volume* vol, char* name);
PREFIX RETCODE adfToRootDir(struct Volume* vol);
PREFIX RETCODE adfCreateDir(struct Volume* vol, SECTNUM parent, char* name);
PREFIX RETCODE adfChangeDir(struct Volume* vol, char* name);
PREFIX RETCODE adfParentDir(struct Volume* vol);
PREFIX RETCODE adfRemoveEntry(
struct Volume* vol, SECTNUM pSect, char* name);
PREFIX struct List* adfGetDirEnt(struct Volume* vol, SECTNUM nSect);
PREFIX struct List* adfGetRDirEnt(
struct Volume* vol, SECTNUM nSect, BOOL recurs);
PREFIX void printEntry(struct Entry* entry);
PREFIX void adfFreeDirList(struct List* list);
PREFIX void adfFreeEntry(struct Entry*);
PREFIX RETCODE adfRenameEntry(
struct Volume* vol, SECTNUM, char* old, SECTNUM, char* pNew); /* BV */
PREFIX RETCODE adfSetEntryAccess(struct Volume*, SECTNUM, char*, int32_t);
PREFIX RETCODE adfSetEntryComment(struct Volume*, SECTNUM, char*, char*);
/* file */
PREFIX int32_t adfFileRealSize(uint32_t size, int blockSize, int32_t *dataN, int32_t *extN);
PREFIX struct File* adfOpenFile(struct Volume *vol, char* name, char *mode);
PREFIX void adfCloseFile(struct File *file);
PREFIX int32_t adfReadFile(struct File* file, int32_t n, uint8_t *buffer);
PREFIX BOOL adfEndOfFile(struct File* file);
PREFIX int32_t adfWriteFile(struct File *file, int32_t n, uint8_t *buffer);
PREFIX void adfFlushFile(struct File *file);
PREFIX void adfFileSeek(struct File *file, uint32_t pos);
/* file */
PREFIX int32_t adfFileRealSize(
uint32_t size, int blockSize, int32_t* dataN, int32_t* extN);
PREFIX struct File* adfOpenFile(struct Volume* vol, char* name, char* mode);
PREFIX void adfCloseFile(struct File* file);
PREFIX int32_t adfReadFile(struct File* file, int32_t n, uint8_t* buffer);
PREFIX BOOL adfEndOfFile(struct File* file);
PREFIX int32_t adfWriteFile(struct File* file, int32_t n, uint8_t* buffer);
PREFIX void adfFlushFile(struct File* file);
PREFIX void adfFileSeek(struct File* file, uint32_t pos);
/* volume */
PREFIX RETCODE adfInstallBootBlock(struct Volume *vol,uint8_t*);
PREFIX struct Volume* adfMount( struct Device *dev, int nPart, BOOL readOnly );
PREFIX void adfUnMount(struct Volume *vol);
PREFIX void adfVolumeInfo(struct Volume *vol);
/* volume */
PREFIX RETCODE adfInstallBootBlock(struct Volume* vol, uint8_t*);
PREFIX struct Volume* adfMount(
struct Device* dev, int nPart, BOOL readOnly);
PREFIX void adfUnMount(struct Volume* vol);
PREFIX void adfVolumeInfo(struct Volume* vol);
/* device */
PREFIX void adfDeviceInfo(struct Device *dev);
PREFIX struct Device* adfMountDev( char* filename,BOOL ro);
PREFIX void adfUnMountDev( struct Device* dev);
PREFIX RETCODE adfCreateHd(struct Device* dev, int n, struct Partition** partList );
PREFIX RETCODE adfCreateFlop(struct Device* dev, char* volName, int volType );
PREFIX RETCODE adfCreateHdFile(struct Device* dev, char* volName, int volType);
/* device */
PREFIX void adfDeviceInfo(struct Device* dev);
PREFIX struct Device* adfMountDev(char* filename, BOOL ro);
PREFIX void adfUnMountDev(struct Device* dev);
PREFIX RETCODE adfCreateHd(
struct Device* dev, int n, struct Partition** partList);
PREFIX RETCODE adfCreateFlop(
struct Device* dev, char* volName, int volType);
PREFIX RETCODE adfCreateHdFile(
struct Device* dev, char* volName, int volType);
/* dump device */
PREFIX struct Device* adfCreateDumpDevice(char* filename, int32_t cyl, int32_t heads, int32_t sec);
/* dump device */
PREFIX struct Device* adfCreateDumpDevice(
char* filename, int32_t cyl, int32_t heads, int32_t sec);
/* env */
PREFIX void adfEnvInitDefault();
PREFIX void adfEnvCleanUp();
PREFIX void adfChgEnvProp(int prop, void *pNew); /* BV */
PREFIX char* adfGetVersionNumber();
PREFIX char* adfGetVersionDate();
/* obsolete */
PREFIX void adfSetEnvFct( void(*e)(char*), void(*w)(char*), void(*v)(char*) );
/* env */
PREFIX void adfEnvInitDefault();
PREFIX void adfEnvCleanUp();
PREFIX void adfChgEnvProp(int prop, void* pNew); /* BV */
PREFIX char* adfGetVersionNumber();
PREFIX char* adfGetVersionDate();
/* obsolete */
PREFIX void adfSetEnvFct(
void (*e)(char*), void (*w)(char*), void (*v)(char*));
/* link */
PREFIX RETCODE adfBlockPtr2EntryName(struct Volume *, SECTNUM, SECTNUM,char **, int32_t *);
/* link */
PREFIX RETCODE adfBlockPtr2EntryName(
struct Volume*, SECTNUM, SECTNUM, char**, int32_t*);
/* salv */
PREFIX struct List* adfGetDelEnt(struct Volume *vol);
PREFIX RETCODE adfUndelEntry(struct Volume* vol, SECTNUM parent, SECTNUM nSect);
PREFIX void adfFreeDelList(struct List* list);
PREFIX RETCODE adfCheckEntry(struct Volume* vol, SECTNUM nSect, int level);
/* salv */
PREFIX struct List* adfGetDelEnt(struct Volume* vol);
PREFIX RETCODE adfUndelEntry(
struct Volume* vol, SECTNUM parent, SECTNUM nSect);
PREFIX void adfFreeDelList(struct List* list);
PREFIX RETCODE adfCheckEntry(struct Volume* vol, SECTNUM nSect, int level);
/* middle level API */
/* middle level API */
PREFIX BOOL isSectNumValid(struct Volume *vol, SECTNUM nSect);
PREFIX BOOL isSectNumValid(struct Volume* vol, SECTNUM nSect);
/* low level API */
PREFIX RETCODE adfReadBlock(struct Volume* , int32_t nSect, uint8_t* buf);
PREFIX RETCODE adfWriteBlock(struct Volume* , int32_t nSect, uint8_t* buf);
PREFIX int32_t adfCountFreeBlocks(struct Volume* vol);
/* low level API */
PREFIX RETCODE adfReadBlock(struct Volume*, int32_t nSect, uint8_t* buf);
PREFIX RETCODE adfWriteBlock(struct Volume*, int32_t nSect, uint8_t* buf);
PREFIX int32_t adfCountFreeBlocks(struct Volume* vol);
#ifdef __cplusplus
}

View File

@@ -1,13 +1,11 @@
#include "config.h"
#ifndef LITT_ENDIAN
#if defined(__hppa__) || \
defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
(defined(__MIPS__) && defined(__MISPEB__)) || \
defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \
defined(__sparc__)
#else
#define LITT_ENDIAN 1
#endif
#if defined(__hppa__) || defined(__m68k__) || defined(mc68000) || \
defined(_M_M68K) || (defined(__MIPS__) && defined(__MISPEB__)) || \
defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \
defined(__sparc__)
#else
#define LITT_ENDIAN 1
#endif
#endif

View File

@@ -25,7 +25,6 @@
*
*/
#ifndef _HD_BLK_H
#define _HD_BLK_H 1
@@ -33,135 +32,134 @@
/* ------- RDSK ---------*/
struct bRDSKblock {
/*000*/ char id[4]; /* RDSK */
/*004*/ int32_t size; /* 64 int32_ts */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t blockSize; /* 512 bytes */
/*014*/ int32_t flags; /* 0x17 */
/*018*/ int32_t badBlockList;
/*01c*/ int32_t partitionList;
/*020*/ int32_t fileSysHdrList;
/*024*/ int32_t driveInit;
/*028*/ int32_t r1[6]; /* -1 */
/*040*/ int32_t cylinders;
/*044*/ int32_t sectors;
/*048*/ int32_t heads;
/*04c*/ int32_t interleave;
/*050*/ int32_t parkingZone;
/*054*/ int32_t r2[3]; /* 0 */
/*060*/ int32_t writePreComp;
/*064*/ int32_t reducedWrite;
/*068*/ int32_t stepRate;
/*06c*/ int32_t r3[5]; /* 0 */
/*080*/ int32_t rdbBlockLo;
/*084*/ int32_t rdbBlockHi;
/*088*/ int32_t loCylinder;
/*08c*/ int32_t hiCylinder;
/*090*/ int32_t cylBlocks;
/*094*/ int32_t autoParkSeconds;
/*098*/ int32_t highRDSKBlock;
/*09c*/ int32_t r4; /* 0 */
/*0a0*/ char diskVendor[8];
/*0a8*/ char diskProduct[16];
/*0b8*/ char diskRevision[4];
/*0bc*/ char controllerVendor[8];
/*0c4*/ char controllerProduct[16];
/*0d4*/ char controllerRevision[4];
/*0d8*/ int32_t r5[10]; /* 0 */
/*100*/
struct bRDSKblock
{
/*000*/ char id[4]; /* RDSK */
/*004*/ int32_t size; /* 64 int32_ts */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t blockSize; /* 512 bytes */
/*014*/ int32_t flags; /* 0x17 */
/*018*/ int32_t badBlockList;
/*01c*/ int32_t partitionList;
/*020*/ int32_t fileSysHdrList;
/*024*/ int32_t driveInit;
/*028*/ int32_t r1[6]; /* -1 */
/*040*/ int32_t cylinders;
/*044*/ int32_t sectors;
/*048*/ int32_t heads;
/*04c*/ int32_t interleave;
/*050*/ int32_t parkingZone;
/*054*/ int32_t r2[3]; /* 0 */
/*060*/ int32_t writePreComp;
/*064*/ int32_t reducedWrite;
/*068*/ int32_t stepRate;
/*06c*/ int32_t r3[5]; /* 0 */
/*080*/ int32_t rdbBlockLo;
/*084*/ int32_t rdbBlockHi;
/*088*/ int32_t loCylinder;
/*08c*/ int32_t hiCylinder;
/*090*/ int32_t cylBlocks;
/*094*/ int32_t autoParkSeconds;
/*098*/ int32_t highRDSKBlock;
/*09c*/ int32_t r4; /* 0 */
/*0a0*/ char diskVendor[8];
/*0a8*/ char diskProduct[16];
/*0b8*/ char diskRevision[4];
/*0bc*/ char controllerVendor[8];
/*0c4*/ char controllerProduct[16];
/*0d4*/ char controllerRevision[4];
/*0d8*/ int32_t r5[10]; /* 0 */
/*100*/
};
struct bBADBentry {
/*000*/ int32_t badBlock;
/*004*/ int32_t goodBlock;
struct bBADBentry
{
/*000*/ int32_t badBlock;
/*004*/ int32_t goodBlock;
};
struct bBADBblock {
/*000*/ char id[4]; /* BADB */
/*004*/ int32_t size; /* 128 int32_ts */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t next;
/*014*/ int32_t r1;
/*018*/ struct bBADBentry blockPairs[61];
struct bBADBblock
{
/*000*/ char id[4]; /* BADB */
/*004*/ int32_t size; /* 128 int32_ts */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t next;
/*014*/ int32_t r1;
/*018*/ struct bBADBentry blockPairs[61];
};
struct bPARTblock
{
/*000*/ char id[4]; /* PART */
/*004*/ int32_t size; /* 64 int32_ts */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t next;
/*014*/ int32_t flags;
/*018*/ int32_t r1[2];
/*020*/ int32_t devFlags;
/*024*/ char nameLen;
/*025*/ char name[31];
/*044*/ int32_t r2[15];
struct bPARTblock {
/*000*/ char id[4]; /* PART */
/*004*/ int32_t size; /* 64 int32_ts */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t next;
/*014*/ int32_t flags;
/*018*/ int32_t r1[2];
/*020*/ int32_t devFlags;
/*024*/ char nameLen;
/*025*/ char name[31];
/*044*/ int32_t r2[15];
/*080*/ int32_t vectorSize; /* often 16 int32_ts */
/*084*/ int32_t blockSize; /* 128 int32_ts */
/*088*/ int32_t secOrg;
/*08c*/ int32_t surfaces;
/*090*/ int32_t sectorsPerBlock; /* == 1 */
/*094*/ int32_t blocksPerTrack;
/*098*/ int32_t dosReserved;
/*09c*/ int32_t dosPreAlloc;
/*0a0*/ int32_t interleave;
/*0a4*/ int32_t lowCyl;
/*0a8*/ int32_t highCyl;
/*0ac*/ int32_t numBuffer;
/*0b0*/ int32_t bufMemType;
/*0b4*/ int32_t maxTransfer;
/*0b8*/ int32_t mask;
/*0bc*/ int32_t bootPri;
/*0c0*/ char dosType[4];
/*0c4*/ int32_t r3[15];
/*080*/ int32_t vectorSize; /* often 16 int32_ts */
/*084*/ int32_t blockSize; /* 128 int32_ts */
/*088*/ int32_t secOrg;
/*08c*/ int32_t surfaces;
/*090*/ int32_t sectorsPerBlock; /* == 1 */
/*094*/ int32_t blocksPerTrack;
/*098*/ int32_t dosReserved;
/*09c*/ int32_t dosPreAlloc;
/*0a0*/ int32_t interleave;
/*0a4*/ int32_t lowCyl;
/*0a8*/ int32_t highCyl;
/*0ac*/ int32_t numBuffer;
/*0b0*/ int32_t bufMemType;
/*0b4*/ int32_t maxTransfer;
/*0b8*/ int32_t mask;
/*0bc*/ int32_t bootPri;
/*0c0*/ char dosType[4];
/*0c4*/ int32_t r3[15];
};
struct bLSEGblock {
/*000*/ char id[4]; /* LSEG */
/*004*/ int32_t size; /* 128 int32_ts */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t next;
/*014*/ char loadData[123*4];
struct bLSEGblock
{
/*000*/ char id[4]; /* LSEG */
/*004*/ int32_t size; /* 128 int32_ts */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t next;
/*014*/ char loadData[123 * 4];
};
struct bFSHDblock
{
/*000*/ char id[4]; /* FSHD */
/*004*/ int32_t size; /* 64 */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t next;
/*014*/ int32_t flags;
/*018*/ int32_t r1[2];
/*020*/ char dosType[4];
/*024*/ short majVersion;
/*026*/ short minVersion;
/*028*/ int32_t patchFlags;
struct bFSHDblock {
/*000*/ char id[4]; /* FSHD */
/*004*/ int32_t size; /* 64 */
/*008*/ ULONG checksum;
/*00c*/ int32_t hostID; /* 7 */
/*010*/ int32_t next;
/*014*/ int32_t flags;
/*018*/ int32_t r1[2];
/*020*/ char dosType[4];
/*024*/ short majVersion;
/*026*/ short minVersion;
/*028*/ int32_t patchFlags;
/*02c*/ int32_t type;
/*030*/ int32_t task;
/*034*/ int32_t lock;
/*038*/ int32_t handler;
/*03c*/ int32_t stackSize;
/*040*/ int32_t priority;
/*044*/ int32_t startup;
/*048*/ int32_t segListBlock;
/*04c*/ int32_t globalVec;
/*050*/ int32_t r2[23];
/*0ac*/ int32_t r3[21];
/*02c*/ int32_t type;
/*030*/ int32_t task;
/*034*/ int32_t lock;
/*038*/ int32_t handler;
/*03c*/ int32_t stackSize;
/*040*/ int32_t priority;
/*044*/ int32_t startup;
/*048*/ int32_t segListBlock;
/*04c*/ int32_t globalVec;
/*050*/ int32_t r2[23];
/*0ac*/ int32_t r3[21];
};
#endif /* _HD_BLK_H */
/*##########################################################################*/

View File

@@ -25,12 +25,12 @@
* along with Foobar; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
*/
#ifdef WIN32DLL
#define PREFIX __declspec(dllexport)
#else
#define PREFIX
#define PREFIX
#endif /* WIN32DLL */
#endif /* _PREFIX_H */

View File

@@ -23,7 +23,7 @@
#define AGG2D_INCLUDED
// With this define uncommented you can use floating-point pixel format
//#define AGG2D_USE_FLOAT_FORMAT
// #define AGG2D_USE_FLOAT_FORMAT
#include "agg_basics.h"
#include "agg_trans_affine.h"
@@ -56,37 +56,50 @@ class Agg2D
#ifdef AGG2D_USE_FLOAT_FORMAT
typedef agg::rgba32 ColorType;
#else
typedef agg::rgba8 ColorType;
typedef agg::rgba8 ColorType;
#endif
typedef agg::order_bgra ComponentOrder; // Platform dependent!
typedef agg::blender_rgba<ColorType, ComponentOrder> Blender;
typedef agg::comp_op_adaptor_rgba<ColorType, ComponentOrder> BlenderComp;
typedef agg::blender_rgba_pre<ColorType, ComponentOrder> BlenderPre;
typedef agg::comp_op_adaptor_rgba_pre<ColorType, ComponentOrder> BlenderCompPre;
typedef agg::blender_rgba<ColorType, ComponentOrder> Blender;
typedef agg::comp_op_adaptor_rgba<ColorType, ComponentOrder> BlenderComp;
typedef agg::blender_rgba_pre<ColorType, ComponentOrder> BlenderPre;
typedef agg::comp_op_adaptor_rgba_pre<ColorType, ComponentOrder>
BlenderCompPre;
typedef agg::pixfmt_alpha_blend_rgba<Blender, agg::rendering_buffer> PixFormat;
typedef agg::pixfmt_custom_blend_rgba<BlenderComp, agg::rendering_buffer> PixFormatComp;
typedef agg::pixfmt_alpha_blend_rgba<BlenderPre, agg::rendering_buffer> PixFormatPre;
typedef agg::pixfmt_custom_blend_rgba<BlenderCompPre, agg::rendering_buffer> PixFormatCompPre;
typedef agg::pixfmt_alpha_blend_rgba<Blender, agg::rendering_buffer>
PixFormat;
typedef agg::pixfmt_custom_blend_rgba<BlenderComp, agg::rendering_buffer>
PixFormatComp;
typedef agg::pixfmt_alpha_blend_rgba<BlenderPre, agg::rendering_buffer>
PixFormatPre;
typedef agg::pixfmt_custom_blend_rgba<BlenderCompPre, agg::rendering_buffer>
PixFormatCompPre;
typedef agg::renderer_base<PixFormat> RendererBase;
typedef agg::renderer_base<PixFormatComp> RendererBaseComp;
typedef agg::renderer_base<PixFormatPre> RendererBasePre;
typedef agg::renderer_base<PixFormat> RendererBase;
typedef agg::renderer_base<PixFormatComp> RendererBaseComp;
typedef agg::renderer_base<PixFormatPre> RendererBasePre;
typedef agg::renderer_base<PixFormatCompPre> RendererBaseCompPre;
typedef agg::renderer_scanline_aa_solid<RendererBase> RendererSolid;
typedef agg::renderer_scanline_aa_solid<RendererBase> RendererSolid;
typedef agg::renderer_scanline_aa_solid<RendererBaseComp> RendererSolidComp;
typedef agg::span_allocator<ColorType> SpanAllocator;
typedef agg::pod_auto_array<ColorType, 256> GradientArray;
typedef agg::span_gradient<ColorType, agg::span_interpolator_linear<>, agg::gradient_x, GradientArray> LinearGradientSpan;
typedef agg::span_gradient<ColorType, agg::span_interpolator_linear<>, agg::gradient_circle, GradientArray> RadialGradientSpan;
typedef agg::span_gradient<ColorType,
agg::span_interpolator_linear<>,
agg::gradient_x,
GradientArray>
LinearGradientSpan;
typedef agg::span_gradient<ColorType,
agg::span_interpolator_linear<>,
agg::gradient_circle,
GradientArray>
RadialGradientSpan;
typedef agg::conv_curve<agg::path_storage> ConvCurve;
typedef agg::conv_stroke<ConvCurve> ConvStroke;
typedef agg::conv_transform<ConvCurve> PathTransform;
typedef agg::conv_transform<ConvStroke> StrokeTransform;
typedef agg::conv_curve<agg::path_storage> ConvCurve;
typedef agg::conv_stroke<ConvCurve> ConvStroke;
typedef agg::conv_transform<ConvCurve> PathTransform;
typedef agg::conv_transform<ConvStroke> StrokeTransform;
enum Gradient
{
@@ -98,12 +111,12 @@ class Agg2D
public:
friend class Agg2DRenderer;
// Use srgba8 as the "user" color type, even though the underlying color type
// might be something else, such as rgba32. This allows code based on
// Use srgba8 as the "user" color type, even though the underlying color
// type might be something else, such as rgba32. This allows code based on
// 8-bit sRGB values to carry on working as before.
typedef agg::srgba8 Color;
typedef agg::rect_i Rect;
typedef agg::rect_d RectD;
typedef agg::srgba8 Color;
typedef agg::rect_i Rect;
typedef agg::rect_d RectD;
typedef agg::trans_affine Affine;
enum LineJoin
@@ -115,9 +128,9 @@ public:
enum LineCap
{
CapButt = agg::butt_cap,
CapButt = agg::butt_cap,
CapSquare = agg::square_cap,
CapRound = agg::round_cap
CapRound = agg::round_cap
};
enum TextAlignment
@@ -127,7 +140,6 @@ public:
AlignCenter,
};
enum DrawPathFlag
{
FillOnly,
@@ -155,20 +167,28 @@ public:
double affineMatrix[6];
};
struct Image
{
agg::rendering_buffer renBuf;
Image() {}
Image(unsigned char* buf, unsigned width, unsigned height, int stride) :
renBuf(buf, width, height, stride) {}
void attach(unsigned char* buf, unsigned width, unsigned height, int stride)
Image(unsigned char* buf, unsigned width, unsigned height, int stride):
renBuf(buf, width, height, stride)
{
}
void attach(
unsigned char* buf, unsigned width, unsigned height, int stride)
{
renBuf.attach(buf, width, height, stride);
}
int width() const { return renBuf.width(); }
int height() const { return renBuf.height(); }
int width() const
{
return renBuf.width();
}
int height() const
{
return renBuf.height();
}
void premultiply();
void demultiply();
};
@@ -202,36 +222,37 @@ public:
enum BlendMode
{
BlendAlpha = agg::end_of_comp_op_e,
BlendClear = agg::comp_op_clear,
BlendSrc = agg::comp_op_src,
BlendDst = agg::comp_op_dst,
BlendSrcOver = agg::comp_op_src_over,
BlendDstOver = agg::comp_op_dst_over,
BlendSrcIn = agg::comp_op_src_in,
BlendDstIn = agg::comp_op_dst_in,
BlendSrcOut = agg::comp_op_src_out,
BlendDstOut = agg::comp_op_dst_out,
BlendSrcAtop = agg::comp_op_src_atop,
BlendDstAtop = agg::comp_op_dst_atop,
BlendXor = agg::comp_op_xor,
BlendAdd = agg::comp_op_plus,
BlendMultiply = agg::comp_op_multiply,
BlendScreen = agg::comp_op_screen,
BlendOverlay = agg::comp_op_overlay,
BlendDarken = agg::comp_op_darken,
BlendLighten = agg::comp_op_lighten,
BlendAlpha = agg::end_of_comp_op_e,
BlendClear = agg::comp_op_clear,
BlendSrc = agg::comp_op_src,
BlendDst = agg::comp_op_dst,
BlendSrcOver = agg::comp_op_src_over,
BlendDstOver = agg::comp_op_dst_over,
BlendSrcIn = agg::comp_op_src_in,
BlendDstIn = agg::comp_op_dst_in,
BlendSrcOut = agg::comp_op_src_out,
BlendDstOut = agg::comp_op_dst_out,
BlendSrcAtop = agg::comp_op_src_atop,
BlendDstAtop = agg::comp_op_dst_atop,
BlendXor = agg::comp_op_xor,
BlendAdd = agg::comp_op_plus,
BlendMultiply = agg::comp_op_multiply,
BlendScreen = agg::comp_op_screen,
BlendOverlay = agg::comp_op_overlay,
BlendDarken = agg::comp_op_darken,
BlendLighten = agg::comp_op_lighten,
BlendColorDodge = agg::comp_op_color_dodge,
BlendColorBurn = agg::comp_op_color_burn,
BlendHardLight = agg::comp_op_hard_light,
BlendSoftLight = agg::comp_op_soft_light,
BlendColorBurn = agg::comp_op_color_burn,
BlendHardLight = agg::comp_op_hard_light,
BlendSoftLight = agg::comp_op_soft_light,
BlendDifference = agg::comp_op_difference,
BlendExclusion = agg::comp_op_exclusion,
BlendExclusion = agg::comp_op_exclusion,
};
enum Direction
{
CW, CCW
CW,
CCW
};
~Agg2D();
@@ -239,26 +260,27 @@ public:
// Setup
//-----------------------
void attach(unsigned char* buf, unsigned width, unsigned height, int stride);
void attach(Image& img);
void attach(
unsigned char* buf, unsigned width, unsigned height, int stride);
void attach(Image& img);
void clipBox(double x1, double y1, double x2, double y2);
void clipBox(double x1, double y1, double x2, double y2);
RectD clipBox() const;
void clearAll(Color c);
void clearAll(unsigned r, unsigned g, unsigned b, unsigned a = 255);
void clearAll(Color c);
void clearAll(unsigned r, unsigned g, unsigned b, unsigned a = 255);
void clearClipBox(Color c);
void clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a = 255);
void clearClipBox(Color c);
void clearClipBox(unsigned r, unsigned g, unsigned b, unsigned a = 255);
// Conversions
//-----------------------
void worldToScreen(double& x, double& y) const;
void screenToWorld(double& x, double& y) const;
void worldToScreen(double& x, double& y) const;
void screenToWorld(double& x, double& y) const;
double worldToScreen(double scalar) const;
double screenToWorld(double scalar) const;
void alignPoint(double& x, double& y) const;
bool inBox(double worldX, double worldY) const;
void alignPoint(double& x, double& y) const;
bool inBox(double worldX, double worldY) const;
// General Attributes
//-----------------------
@@ -289,14 +311,30 @@ public:
Color fillColor() const;
Color lineColor() const;
void fillLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile=1.0);
void lineLinearGradient(double x1, double y1, double x2, double y2, Color c1, Color c2, double profile=1.0);
void fillLinearGradient(double x1,
double y1,
double x2,
double y2,
Color c1,
Color c2,
double profile = 1.0);
void lineLinearGradient(double x1,
double y1,
double x2,
double y2,
Color c1,
Color c2,
double profile = 1.0);
void fillRadialGradient(double x, double y, double r, Color c1, Color c2, double profile=1.0);
void lineRadialGradient(double x, double y, double r, Color c1, Color c2, double profile=1.0);
void fillRadialGradient(
double x, double y, double r, Color c1, Color c2, double profile = 1.0);
void lineRadialGradient(
double x, double y, double r, Color c1, Color c2, double profile = 1.0);
void fillRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3);
void lineRadialGradient(double x, double y, double r, Color c1, Color c2, Color c3);
void fillRadialGradient(
double x, double y, double r, Color c1, Color c2, Color c3);
void lineRadialGradient(
double x, double y, double r, Color c1, Color c2, Color c3);
void fillRadialGradient(double x, double y, double r);
void lineRadialGradient(double x, double y, double r);
@@ -313,9 +351,12 @@ public:
void fillEvenOdd(bool evenOddFlag);
bool fillEvenOdd() const;
void textAlignment(TextAlignment alignment);
void textSize(double sizeX, double sizeY);
inline void textSize(double size) { textSize(size, size); }
void textAlignment(TextAlignment alignment);
void textSize(double sizeX, double sizeY);
inline void textSize(double size)
{
textSize(size, size);
}
// Transformations
//-----------------------
@@ -328,26 +369,54 @@ public:
void scale(double sx, double sy);
void skew(double sx, double sy);
void translate(double x, double y);
void parallelogram(double x1, double y1, double x2, double y2, const double* para);
void viewport(double worldX1, double worldY1, double worldX2, double worldY2,
double screenX1, double screenY1, double screenX2, double screenY2,
ViewportOption opt=XMidYMid);
void parallelogram(
double x1, double y1, double x2, double y2, const double* para);
void viewport(double worldX1,
double worldY1,
double worldX2,
double worldY2,
double screenX1,
double screenY1,
double screenX2,
double screenY2,
ViewportOption opt = XMidYMid);
// Basic Shapes
//-----------------------
void line(double x1, double y1, double x2, double y2);
void triangle(double x1, double y1, double x2, double y2, double x3, double y3);
void triangle(
double x1, double y1, double x2, double y2, double x3, double y3);
void rectangle(double x1, double y1, double x2, double y2);
void roundedRect(double x1, double y1, double x2, double y2, double r);
void roundedRect(double x1, double y1, double x2, double y2, double rx, double ry);
void roundedRect(double x1, double y1, double x2, double y2,
double rxBottom, double ryBottom,
double rxTop, double ryTop);
void roundedRect(
double x1, double y1, double x2, double y2, double rx, double ry);
void roundedRect(double x1,
double y1,
double x2,
double y2,
double rxBottom,
double ryBottom,
double rxTop,
double ryTop);
void ellipse(double cx, double cy, double rx, double ry);
void arc(double cx, double cy, double rx, double ry, double start, double sweep);
void star(double cx, double cy, double r1, double r2, double startAngle, int numRays);
void curve(double x1, double y1, double x2, double y2, double x3, double y3);
void curve(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4);
void arc(
double cx, double cy, double rx, double ry, double start, double sweep);
void star(double cx,
double cy,
double r1,
double r2,
double startAngle,
int numRays);
void curve(
double x1, double y1, double x2, double y2, double x3, double y3);
void curve(double x1,
double y1,
double x2,
double y2,
double x3,
double y3,
double x4,
double y4);
void polygon(double* xy, int numPoints);
void polyline(double* xy, int numPoints);
@@ -367,47 +436,53 @@ public:
void verLineTo(double y);
void verLineRel(double dy);
void arcTo(double rx, double ry,
double angle,
bool largeArcFlag,
bool sweepFlag,
double x, double y);
void arcTo(double rx,
double ry,
double angle,
bool largeArcFlag,
bool sweepFlag,
double x,
double y);
void arcRel(double rx, double ry,
double angle,
bool largeArcFlag,
bool sweepFlag,
double dx, double dy);
void arcRel(double rx,
double ry,
double angle,
bool largeArcFlag,
bool sweepFlag,
double dx,
double dy);
void quadricCurveTo(double xCtrl, double yCtrl,
double xTo, double yTo);
void quadricCurveRel(double dxCtrl, double dyCtrl,
double dxTo, double dyTo);
void quadricCurveTo(double xCtrl, double yCtrl, double xTo, double yTo);
void quadricCurveRel(
double dxCtrl, double dyCtrl, double dxTo, double dyTo);
void quadricCurveTo(double xTo, double yTo);
void quadricCurveRel(double dxTo, double dyTo);
void cubicCurveTo(double xCtrl1, double yCtrl1,
double xCtrl2, double yCtrl2,
double xTo, double yTo);
void cubicCurveTo(double xCtrl1,
double yCtrl1,
double xCtrl2,
double yCtrl2,
double xTo,
double yTo);
void cubicCurveRel(double dxCtrl1, double dyCtrl1,
double dxCtrl2, double dyCtrl2,
double dxTo, double dyTo);
void cubicCurveRel(double dxCtrl1,
double dyCtrl1,
double dxCtrl2,
double dyCtrl2,
double dxTo,
double dyTo);
void cubicCurveTo(double xCtrl2, double yCtrl2,
double xTo, double yTo);
void cubicCurveTo(double xCtrl2, double yCtrl2, double xTo, double yTo);
void cubicCurveRel(double xCtrl2, double yCtrl2,
double xTo, double yTo);
void cubicCurveRel(double xCtrl2, double yCtrl2, double xTo, double yTo);
void addEllipse(double cx, double cy, double rx, double ry, Direction dir);
void text(double x, double y, const std::string& text);
void text(double x, double y, const std::string& text);
void closePolygon();
void drawPath(DrawPathFlag flag = FillAndStroke);
void drawPathNoTransform(DrawPathFlag flag = FillAndStroke);
// Image Transformations
//-----------------------
void imageFilter(ImageFilter f);
@@ -417,52 +492,90 @@ public:
ImageResample imageResample() const;
void transformImage(const Image& img,
int imgX1, int imgY1, int imgX2, int imgY2,
double dstX1, double dstY1, double dstX2, double dstY2);
int imgX1,
int imgY1,
int imgX2,
int imgY2,
double dstX1,
double dstY1,
double dstX2,
double dstY2);
void transformImage(const Image& img,
double dstX1, double dstY1, double dstX2, double dstY2);
double dstX1,
double dstY1,
double dstX2,
double dstY2);
void transformImage(const Image& img,
int imgX1, int imgY1, int imgX2, int imgY2,
const double* parallelogram);
int imgX1,
int imgY1,
int imgX2,
int imgY2,
const double* parallelogram);
void transformImage(const Image& img, const double* parallelogram);
void transformImagePath(const Image& img,
int imgX1,
int imgY1,
int imgX2,
int imgY2,
double dstX1,
double dstY1,
double dstX2,
double dstY2);
void transformImagePath(const Image& img,
int imgX1, int imgY1, int imgX2, int imgY2,
double dstX1, double dstY1, double dstX2, double dstY2);
double dstX1,
double dstY1,
double dstX2,
double dstY2);
void transformImagePath(const Image& img,
double dstX1, double dstY1, double dstX2, double dstY2);
void transformImagePath(const Image& img,
int imgX1, int imgY1, int imgX2, int imgY2,
const double* parallelogram);
int imgX1,
int imgY1,
int imgX2,
int imgY2,
const double* parallelogram);
void transformImagePath(const Image& img, const double* parallelogram);
// Image Blending (no transformations available)
void blendImage(Image& img,
int imgX1, int imgY1, int imgX2, int imgY2,
double dstX, double dstY, unsigned alpha=255);
void blendImage(Image& img, double dstX, double dstY, unsigned alpha=255);
int imgX1,
int imgY1,
int imgX2,
int imgY2,
double dstX,
double dstY,
unsigned alpha = 255);
void blendImage(Image& img, double dstX, double dstY, unsigned alpha = 255);
// Copy image directly, together with alpha-channel
void copyImage(Image& img,
int imgX1, int imgY1, int imgX2, int imgY2,
double dstX, double dstY);
int imgX1,
int imgY1,
int imgX2,
int imgY2,
double dstX,
double dstY);
void copyImage(Image& img, double dstX, double dstY);
// Auxiliary
//-----------------------
static double pi() { return agg::pi; }
static double deg2Rad(double v) { return v * agg::pi / 180.0; }
static double rad2Deg(double v) { return v * 180.0 / agg::pi; }
static double pi()
{
return agg::pi;
}
static double deg2Rad(double v)
{
return v * agg::pi / 180.0;
}
static double rad2Deg(double v)
{
return v * 180.0 / agg::pi;
}
private:
void render(bool fillColor);
@@ -472,97 +585,94 @@ private:
void addLine(double x1, double y1, double x2, double y2);
void updateRasterizerGamma();
void renderImage(const Image& img, int x1, int y1, int x2, int y2, const double* parl);
void renderImage(
const Image& img, int x1, int y1, int x2, int y2, const double* parl);
agg::rendering_buffer m_rbuf;
PixFormat m_pixFormat;
PixFormatComp m_pixFormatComp;
PixFormatPre m_pixFormatPre;
PixFormatCompPre m_pixFormatCompPre;
RendererBase m_renBase;
RendererBaseComp m_renBaseComp;
RendererBasePre m_renBasePre;
RendererBaseCompPre m_renBaseCompPre;
RendererSolid m_renSolid;
RendererSolidComp m_renSolidComp;
agg::rendering_buffer m_rbuf;
PixFormat m_pixFormat;
PixFormatComp m_pixFormatComp;
PixFormatPre m_pixFormatPre;
PixFormatCompPre m_pixFormatCompPre;
RendererBase m_renBase;
RendererBaseComp m_renBaseComp;
RendererBasePre m_renBasePre;
RendererBaseCompPre m_renBaseCompPre;
RendererSolid m_renSolid;
RendererSolidComp m_renSolidComp;
SpanAllocator m_allocator;
RectD m_clipBox;
SpanAllocator m_allocator;
RectD m_clipBox;
BlendMode m_blendMode;
BlendMode m_imageBlendMode;
Color m_imageBlendColor;
BlendMode m_blendMode;
BlendMode m_imageBlendMode;
Color m_imageBlendColor;
agg::scanline_u8 m_scanline;
agg::rasterizer_scanline_aa<> m_rasterizer;
agg::scanline_u8 m_scanline;
agg::rasterizer_scanline_aa<> m_rasterizer;
double m_masterAlpha;
double m_antiAliasGamma;
double m_masterAlpha;
double m_antiAliasGamma;
Color m_fillColor;
Color m_lineColor;
GradientArray m_fillGradient;
GradientArray m_lineGradient;
Color m_fillColor;
Color m_lineColor;
GradientArray m_fillGradient;
GradientArray m_lineGradient;
LineCap m_lineCap;
LineJoin m_lineJoin;
LineCap m_lineCap;
LineJoin m_lineJoin;
Gradient m_fillGradientFlag;
Gradient m_lineGradientFlag;
agg::trans_affine m_fillGradientMatrix;
agg::trans_affine m_lineGradientMatrix;
double m_fillGradientD1;
double m_lineGradientD1;
double m_fillGradientD2;
double m_lineGradientD2;
Gradient m_fillGradientFlag;
Gradient m_lineGradientFlag;
agg::trans_affine m_fillGradientMatrix;
agg::trans_affine m_lineGradientMatrix;
double m_fillGradientD1;
double m_lineGradientD1;
double m_fillGradientD2;
double m_lineGradientD2;
TextAlignment m_textAlignment;
double m_textSizeX;
double m_textSizeY;
TextAlignment m_textAlignment;
double m_textSizeX;
double m_textSizeY;
ImageFilter m_imageFilter;
ImageResample m_imageResample;
agg::image_filter_lut m_imageFilterLut;
ImageFilter m_imageFilter;
ImageResample m_imageResample;
agg::image_filter_lut m_imageFilterLut;
agg::span_interpolator_linear<> m_fillGradientInterpolator;
agg::span_interpolator_linear<> m_lineGradientInterpolator;
agg::gradient_x m_linearGradientFunction;
agg::gradient_circle m_radialGradientFunction;
agg::gradient_x m_linearGradientFunction;
agg::gradient_circle m_radialGradientFunction;
double m_lineWidth;
bool m_evenOddFlag;
double m_lineWidth;
bool m_evenOddFlag;
agg::path_storage m_path;
agg::trans_affine m_transform;
agg::path_storage m_path;
agg::trans_affine m_transform;
ConvCurve m_convCurve;
ConvStroke m_convStroke;
ConvCurve m_convCurve;
ConvStroke m_convStroke;
PathTransform m_pathTransform;
StrokeTransform m_strokeTransform;
PathTransform m_pathTransform;
StrokeTransform m_strokeTransform;
#ifdef AGG_USE_FONTS
#ifndef AGG2D_USE_FREETYPE
HDC m_fontDC;
HDC m_fontDC;
#endif
FontEngine m_fontEngine;
FontCacheManager m_fontCacheManager;
FontEngine m_fontEngine;
FontCacheManager m_fontCacheManager;
#endif
};
inline bool operator == (const Agg2D::Color& c1, const Agg2D::Color& c2)
inline bool operator==(const Agg2D::Color& c1, const Agg2D::Color& c2)
{
return c1.r == c2.r && c1.g == c2.g && c1.b == c2.b && c1.a == c2.a;
return c1.r == c2.r && c1.g == c2.g && c1.b == c2.b && c1.a == c2.a;
}
inline bool operator != (const Agg2D::Color& c1, const Agg2D::Color& c2)
inline bool operator!=(const Agg2D::Color& c1, const Agg2D::Color& c2)
{
return !(c1 == c2);
return !(c1 == c2);
}
#endif

View File

@@ -2,8 +2,8 @@
// Anti-Grain Geometry - Version 2.4
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
@@ -28,52 +28,63 @@ namespace agg
//===================================================one_component_mask_u8
struct one_component_mask_u8
{
static unsigned calculate(const int8u* p) { return *p; }
static unsigned calculate(const int8u* p)
{
return *p;
}
};
//=====================================================rgb_to_gray_mask_u8
template<unsigned R, unsigned G, unsigned B>
template <unsigned R, unsigned G, unsigned B>
struct rgb_to_gray_mask_u8
{
static unsigned calculate(const int8u* p)
{
return (p[R]*77 + p[G]*150 + p[B]*29) >> 8;
static unsigned calculate(const int8u* p)
{
return (p[R] * 77 + p[G] * 150 + p[B] * 29) >> 8;
}
};
//==========================================================alpha_mask_u8
template<unsigned Step=1, unsigned Offset=0, class MaskF=one_component_mask_u8>
template <unsigned Step = 1,
unsigned Offset = 0,
class MaskF = one_component_mask_u8>
class alpha_mask_u8
{
public:
typedef int8u cover_type;
typedef alpha_mask_u8<Step, Offset, MaskF> self_type;
enum cover_scale_e
{
{
cover_shift = 8,
cover_none = 0,
cover_full = 255
cover_none = 0,
cover_full = 255
};
alpha_mask_u8() : m_rbuf(0) {}
explicit alpha_mask_u8(rendering_buffer& rbuf) : m_rbuf(&rbuf) {}
alpha_mask_u8(): m_rbuf(0) {}
explicit alpha_mask_u8(rendering_buffer& rbuf): m_rbuf(&rbuf) {}
void attach(rendering_buffer& rbuf) { m_rbuf = &rbuf; }
void attach(rendering_buffer& rbuf)
{
m_rbuf = &rbuf;
}
MaskF& mask_function() { return m_mask_function; }
const MaskF& mask_function() const { return m_mask_function; }
MaskF& mask_function()
{
return m_mask_function;
}
const MaskF& mask_function() const
{
return m_mask_function;
}
//--------------------------------------------------------------------
cover_type pixel(int x, int y) const
{
if(x >= 0 && y >= 0 &&
x < (int)m_rbuf->width() &&
y < (int)m_rbuf->height())
if (x >= 0 && y >= 0 && x < (int)m_rbuf->width() &&
y < (int)m_rbuf->height())
{
return (cover_type)m_mask_function.calculate(
m_rbuf->row_ptr(y) + x * Step + Offset);
m_rbuf->row_ptr(y) + x * Step + Offset);
}
return 0;
}
@@ -81,19 +92,18 @@ namespace agg
//--------------------------------------------------------------------
cover_type combine_pixel(int x, int y, cover_type val) const
{
if(x >= 0 && y >= 0 &&
x < (int)m_rbuf->width() &&
y < (int)m_rbuf->height())
if (x >= 0 && y >= 0 && x < (int)m_rbuf->width() &&
y < (int)m_rbuf->height())
{
return (cover_type)((cover_full + val *
m_mask_function.calculate(
m_rbuf->row_ptr(y) + x * Step + Offset)) >>
cover_shift);
return (
cover_type)((cover_full + val * m_mask_function.calculate(
m_rbuf->row_ptr(y) +
x * Step + Offset)) >>
cover_shift);
}
return 0;
}
//--------------------------------------------------------------------
void fill_hspan(int x, int y, cover_type* dst, int num_pix) const
{
@@ -103,16 +113,16 @@ namespace agg
int count = num_pix;
cover_type* covers = dst;
if(y < 0 || y > ymax)
if (y < 0 || y > ymax)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
}
if(x < 0)
if (x < 0)
{
count += x;
if(count <= 0)
if (count <= 0)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
@@ -122,11 +132,11 @@ namespace agg
x = 0;
}
if(x + count > xmax)
if (x + count > xmax)
{
int rest = x + count - xmax - 1;
count -= rest;
if(count <= 0)
if (count <= 0)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
@@ -139,11 +149,9 @@ namespace agg
{
*covers++ = (cover_type)m_mask_function.calculate(mask);
mask += Step;
}
while(--count);
} while (--count);
}
//--------------------------------------------------------------------
void combine_hspan(int x, int y, cover_type* dst, int num_pix) const
{
@@ -153,16 +161,16 @@ namespace agg
int count = num_pix;
cover_type* covers = dst;
if(y < 0 || y > ymax)
if (y < 0 || y > ymax)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
}
if(x < 0)
if (x < 0)
{
count += x;
if(count <= 0)
if (count <= 0)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
@@ -172,11 +180,11 @@ namespace agg
x = 0;
}
if(x + count > xmax)
if (x + count > xmax)
{
int rest = x + count - xmax - 1;
count -= rest;
if(count <= 0)
if (count <= 0)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
@@ -187,13 +195,14 @@ namespace agg
const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset;
do
{
*covers = (cover_type)((cover_full + (*covers) *
m_mask_function.calculate(mask)) >>
cover_shift);
*covers =
(cover_type)((cover_full +
(*covers) *
m_mask_function.calculate(mask)) >>
cover_shift);
++covers;
mask += Step;
}
while(--count);
} while (--count);
}
//--------------------------------------------------------------------
@@ -205,16 +214,16 @@ namespace agg
int count = num_pix;
cover_type* covers = dst;
if(x < 0 || x > xmax)
if (x < 0 || x > xmax)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
}
if(y < 0)
if (y < 0)
{
count += y;
if(count <= 0)
if (count <= 0)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
@@ -224,11 +233,11 @@ namespace agg
y = 0;
}
if(y + count > ymax)
if (y + count > ymax)
{
int rest = y + count - ymax - 1;
count -= rest;
if(count <= 0)
if (count <= 0)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
@@ -241,8 +250,7 @@ namespace agg
{
*covers++ = (cover_type)m_mask_function.calculate(mask);
mask += m_rbuf->stride();
}
while(--count);
} while (--count);
}
//--------------------------------------------------------------------
@@ -254,16 +262,16 @@ namespace agg
int count = num_pix;
cover_type* covers = dst;
if(x < 0 || x > xmax)
if (x < 0 || x > xmax)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
}
if(y < 0)
if (y < 0)
{
count += y;
if(count <= 0)
if (count <= 0)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
@@ -273,11 +281,11 @@ namespace agg
y = 0;
}
if(y + count > ymax)
if (y + count > ymax)
{
int rest = y + count - ymax - 1;
count -= rest;
if(count <= 0)
if (count <= 0)
{
std::memset(dst, 0, num_pix * sizeof(cover_type));
return;
@@ -288,34 +296,33 @@ namespace agg
const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset;
do
{
*covers = (cover_type)((cover_full + (*covers) *
m_mask_function.calculate(mask)) >>
cover_shift);
*covers =
(cover_type)((cover_full +
(*covers) *
m_mask_function.calculate(mask)) >>
cover_shift);
++covers;
mask += m_rbuf->stride();
}
while(--count);
} while (--count);
}
private:
alpha_mask_u8(const self_type&);
const self_type& operator = (const self_type&);
const self_type& operator=(const self_type&);
rendering_buffer* m_rbuf;
MaskF m_mask_function;
MaskF m_mask_function;
};
typedef alpha_mask_u8<1, 0> alpha_mask_gray8; //----alpha_mask_gray8
typedef alpha_mask_u8<1, 0> alpha_mask_gray8; //----alpha_mask_gray8
typedef alpha_mask_u8<3, 0> alpha_mask_rgb24r; //----alpha_mask_rgb24r
typedef alpha_mask_u8<3, 1> alpha_mask_rgb24g; //----alpha_mask_rgb24g
typedef alpha_mask_u8<3, 2> alpha_mask_rgb24b; //----alpha_mask_rgb24b
typedef alpha_mask_u8<3, 0> alpha_mask_rgb24r; //----alpha_mask_rgb24r
typedef alpha_mask_u8<3, 1> alpha_mask_rgb24g; //----alpha_mask_rgb24g
typedef alpha_mask_u8<3, 2> alpha_mask_rgb24b; //----alpha_mask_rgb24b
typedef alpha_mask_u8<3, 2> alpha_mask_bgr24r; //----alpha_mask_bgr24r
typedef alpha_mask_u8<3, 1> alpha_mask_bgr24g; //----alpha_mask_bgr24g
typedef alpha_mask_u8<3, 0> alpha_mask_bgr24b; //----alpha_mask_bgr24b
typedef alpha_mask_u8<3, 2> alpha_mask_bgr24r; //----alpha_mask_bgr24r
typedef alpha_mask_u8<3, 1> alpha_mask_bgr24g; //----alpha_mask_bgr24g
typedef alpha_mask_u8<3, 0> alpha_mask_bgr24b; //----alpha_mask_bgr24b
typedef alpha_mask_u8<4, 0> alpha_mask_rgba32r; //----alpha_mask_rgba32r
typedef alpha_mask_u8<4, 1> alpha_mask_rgba32g; //----alpha_mask_rgba32g
@@ -337,56 +344,68 @@ namespace agg
typedef alpha_mask_u8<4, 1> alpha_mask_abgr32b; //----alpha_mask_abgr32b
typedef alpha_mask_u8<4, 0> alpha_mask_abgr32a; //----alpha_mask_abgr32a
typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2> > alpha_mask_rgb24gray; //----alpha_mask_rgb24gray
typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0> > alpha_mask_bgr24gray; //----alpha_mask_bgr24gray
typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2> > alpha_mask_rgba32gray; //----alpha_mask_rgba32gray
typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2> > alpha_mask_argb32gray; //----alpha_mask_argb32gray
typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0> > alpha_mask_bgra32gray; //----alpha_mask_bgra32gray
typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0> > alpha_mask_abgr32gray; //----alpha_mask_abgr32gray
typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2>>
alpha_mask_rgb24gray; //----alpha_mask_rgb24gray
typedef alpha_mask_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0>>
alpha_mask_bgr24gray; //----alpha_mask_bgr24gray
typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2>>
alpha_mask_rgba32gray; //----alpha_mask_rgba32gray
typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2>>
alpha_mask_argb32gray; //----alpha_mask_argb32gray
typedef alpha_mask_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0>>
alpha_mask_bgra32gray; //----alpha_mask_bgra32gray
typedef alpha_mask_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0>>
alpha_mask_abgr32gray; //----alpha_mask_abgr32gray
//==========================================================amask_no_clip_u8
template<unsigned Step=1, unsigned Offset=0, class MaskF=one_component_mask_u8>
template <unsigned Step = 1,
unsigned Offset = 0,
class MaskF = one_component_mask_u8>
class amask_no_clip_u8
{
public:
typedef int8u cover_type;
typedef amask_no_clip_u8<Step, Offset, MaskF> self_type;
enum cover_scale_e
{
{
cover_shift = 8,
cover_none = 0,
cover_full = 255
cover_none = 0,
cover_full = 255
};
amask_no_clip_u8() : m_rbuf(0) {}
explicit amask_no_clip_u8(rendering_buffer& rbuf) : m_rbuf(&rbuf) {}
amask_no_clip_u8(): m_rbuf(0) {}
explicit amask_no_clip_u8(rendering_buffer& rbuf): m_rbuf(&rbuf) {}
void attach(rendering_buffer& rbuf) { m_rbuf = &rbuf; }
MaskF& mask_function() { return m_mask_function; }
const MaskF& mask_function() const { return m_mask_function; }
void attach(rendering_buffer& rbuf)
{
m_rbuf = &rbuf;
}
MaskF& mask_function()
{
return m_mask_function;
}
const MaskF& mask_function() const
{
return m_mask_function;
}
//--------------------------------------------------------------------
cover_type pixel(int x, int y) const
{
return (cover_type)m_mask_function.calculate(
m_rbuf->row_ptr(y) + x * Step + Offset);
m_rbuf->row_ptr(y) + x * Step + Offset);
}
//--------------------------------------------------------------------
cover_type combine_pixel(int x, int y, cover_type val) const
{
return (cover_type)((cover_full + val *
m_mask_function.calculate(
m_rbuf->row_ptr(y) + x * Step + Offset)) >>
cover_shift);
return (cover_type)((cover_full + val * m_mask_function.calculate(
m_rbuf->row_ptr(y) +
x * Step + Offset)) >>
cover_shift);
}
//--------------------------------------------------------------------
void fill_hspan(int x, int y, cover_type* dst, int num_pix) const
{
@@ -395,28 +414,24 @@ namespace agg
{
*dst++ = (cover_type)m_mask_function.calculate(mask);
mask += Step;
}
while(--num_pix);
} while (--num_pix);
}
//--------------------------------------------------------------------
void combine_hspan(int x, int y, cover_type* dst, int num_pix) const
{
const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset;
do
{
*dst = (cover_type)((cover_full + (*dst) *
m_mask_function.calculate(mask)) >>
*dst = (cover_type)((cover_full +
(*dst) *
m_mask_function.calculate(mask)) >>
cover_shift);
++dst;
mask += Step;
}
while(--num_pix);
} while (--num_pix);
}
//--------------------------------------------------------------------
void fill_vspan(int x, int y, cover_type* dst, int num_pix) const
{
@@ -425,75 +440,98 @@ namespace agg
{
*dst++ = (cover_type)m_mask_function.calculate(mask);
mask += m_rbuf->stride();
}
while(--num_pix);
} while (--num_pix);
}
//--------------------------------------------------------------------
void combine_vspan(int x, int y, cover_type* dst, int num_pix) const
{
const int8u* mask = m_rbuf->row_ptr(y) + x * Step + Offset;
do
{
*dst = (cover_type)((cover_full + (*dst) *
m_mask_function.calculate(mask)) >>
*dst = (cover_type)((cover_full +
(*dst) *
m_mask_function.calculate(mask)) >>
cover_shift);
++dst;
mask += m_rbuf->stride();
}
while(--num_pix);
} while (--num_pix);
}
private:
amask_no_clip_u8(const self_type&);
const self_type& operator = (const self_type&);
const self_type& operator=(const self_type&);
rendering_buffer* m_rbuf;
MaskF m_mask_function;
MaskF m_mask_function;
};
typedef amask_no_clip_u8<1, 0> amask_no_clip_gray8; //----amask_no_clip_gray8
typedef amask_no_clip_u8<1, 0>
amask_no_clip_gray8; //----amask_no_clip_gray8
typedef amask_no_clip_u8<3, 0> amask_no_clip_rgb24r; //----amask_no_clip_rgb24r
typedef amask_no_clip_u8<3, 1> amask_no_clip_rgb24g; //----amask_no_clip_rgb24g
typedef amask_no_clip_u8<3, 2> amask_no_clip_rgb24b; //----amask_no_clip_rgb24b
typedef amask_no_clip_u8<3, 0>
amask_no_clip_rgb24r; //----amask_no_clip_rgb24r
typedef amask_no_clip_u8<3, 1>
amask_no_clip_rgb24g; //----amask_no_clip_rgb24g
typedef amask_no_clip_u8<3, 2>
amask_no_clip_rgb24b; //----amask_no_clip_rgb24b
typedef amask_no_clip_u8<3, 2> amask_no_clip_bgr24r; //----amask_no_clip_bgr24r
typedef amask_no_clip_u8<3, 1> amask_no_clip_bgr24g; //----amask_no_clip_bgr24g
typedef amask_no_clip_u8<3, 0> amask_no_clip_bgr24b; //----amask_no_clip_bgr24b
typedef amask_no_clip_u8<3, 2>
amask_no_clip_bgr24r; //----amask_no_clip_bgr24r
typedef amask_no_clip_u8<3, 1>
amask_no_clip_bgr24g; //----amask_no_clip_bgr24g
typedef amask_no_clip_u8<3, 0>
amask_no_clip_bgr24b; //----amask_no_clip_bgr24b
typedef amask_no_clip_u8<4, 0> amask_no_clip_rgba32r; //----amask_no_clip_rgba32r
typedef amask_no_clip_u8<4, 1> amask_no_clip_rgba32g; //----amask_no_clip_rgba32g
typedef amask_no_clip_u8<4, 2> amask_no_clip_rgba32b; //----amask_no_clip_rgba32b
typedef amask_no_clip_u8<4, 3> amask_no_clip_rgba32a; //----amask_no_clip_rgba32a
typedef amask_no_clip_u8<4, 0>
amask_no_clip_rgba32r; //----amask_no_clip_rgba32r
typedef amask_no_clip_u8<4, 1>
amask_no_clip_rgba32g; //----amask_no_clip_rgba32g
typedef amask_no_clip_u8<4, 2>
amask_no_clip_rgba32b; //----amask_no_clip_rgba32b
typedef amask_no_clip_u8<4, 3>
amask_no_clip_rgba32a; //----amask_no_clip_rgba32a
typedef amask_no_clip_u8<4, 1> amask_no_clip_argb32r; //----amask_no_clip_argb32r
typedef amask_no_clip_u8<4, 2> amask_no_clip_argb32g; //----amask_no_clip_argb32g
typedef amask_no_clip_u8<4, 3> amask_no_clip_argb32b; //----amask_no_clip_argb32b
typedef amask_no_clip_u8<4, 0> amask_no_clip_argb32a; //----amask_no_clip_argb32a
typedef amask_no_clip_u8<4, 1>
amask_no_clip_argb32r; //----amask_no_clip_argb32r
typedef amask_no_clip_u8<4, 2>
amask_no_clip_argb32g; //----amask_no_clip_argb32g
typedef amask_no_clip_u8<4, 3>
amask_no_clip_argb32b; //----amask_no_clip_argb32b
typedef amask_no_clip_u8<4, 0>
amask_no_clip_argb32a; //----amask_no_clip_argb32a
typedef amask_no_clip_u8<4, 2> amask_no_clip_bgra32r; //----amask_no_clip_bgra32r
typedef amask_no_clip_u8<4, 1> amask_no_clip_bgra32g; //----amask_no_clip_bgra32g
typedef amask_no_clip_u8<4, 0> amask_no_clip_bgra32b; //----amask_no_clip_bgra32b
typedef amask_no_clip_u8<4, 3> amask_no_clip_bgra32a; //----amask_no_clip_bgra32a
typedef amask_no_clip_u8<4, 2>
amask_no_clip_bgra32r; //----amask_no_clip_bgra32r
typedef amask_no_clip_u8<4, 1>
amask_no_clip_bgra32g; //----amask_no_clip_bgra32g
typedef amask_no_clip_u8<4, 0>
amask_no_clip_bgra32b; //----amask_no_clip_bgra32b
typedef amask_no_clip_u8<4, 3>
amask_no_clip_bgra32a; //----amask_no_clip_bgra32a
typedef amask_no_clip_u8<4, 3> amask_no_clip_abgr32r; //----amask_no_clip_abgr32r
typedef amask_no_clip_u8<4, 2> amask_no_clip_abgr32g; //----amask_no_clip_abgr32g
typedef amask_no_clip_u8<4, 1> amask_no_clip_abgr32b; //----amask_no_clip_abgr32b
typedef amask_no_clip_u8<4, 0> amask_no_clip_abgr32a; //----amask_no_clip_abgr32a
typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2> > amask_no_clip_rgb24gray; //----amask_no_clip_rgb24gray
typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0> > amask_no_clip_bgr24gray; //----amask_no_clip_bgr24gray
typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2> > amask_no_clip_rgba32gray; //----amask_no_clip_rgba32gray
typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2> > amask_no_clip_argb32gray; //----amask_no_clip_argb32gray
typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0> > amask_no_clip_bgra32gray; //----amask_no_clip_bgra32gray
typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0> > amask_no_clip_abgr32gray; //----amask_no_clip_abgr32gray
typedef amask_no_clip_u8<4, 3>
amask_no_clip_abgr32r; //----amask_no_clip_abgr32r
typedef amask_no_clip_u8<4, 2>
amask_no_clip_abgr32g; //----amask_no_clip_abgr32g
typedef amask_no_clip_u8<4, 1>
amask_no_clip_abgr32b; //----amask_no_clip_abgr32b
typedef amask_no_clip_u8<4, 0>
amask_no_clip_abgr32a; //----amask_no_clip_abgr32a
typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<0, 1, 2>>
amask_no_clip_rgb24gray; //----amask_no_clip_rgb24gray
typedef amask_no_clip_u8<3, 0, rgb_to_gray_mask_u8<2, 1, 0>>
amask_no_clip_bgr24gray; //----amask_no_clip_bgr24gray
typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<0, 1, 2>>
amask_no_clip_rgba32gray; //----amask_no_clip_rgba32gray
typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<0, 1, 2>>
amask_no_clip_argb32gray; //----amask_no_clip_argb32gray
typedef amask_no_clip_u8<4, 0, rgb_to_gray_mask_u8<2, 1, 0>>
amask_no_clip_bgra32gray; //----amask_no_clip_bgra32gray
typedef amask_no_clip_u8<4, 1, rgb_to_gray_mask_u8<2, 1, 0>>
amask_no_clip_abgr32gray; //----amask_no_clip_abgr32gray
}
#endif

View File

@@ -2,8 +2,8 @@
// Anti-Grain Geometry - Version 2.4
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
@@ -27,24 +27,33 @@ namespace agg
//=====================================================================arc
//
// See Implementation agg_arc.cpp
// See Implementation agg_arc.cpp
//
class arc
{
public:
arc() : m_scale(1.0), m_initialized(false) {}
arc(double x, double y,
double rx, double ry,
double a1, double a2,
bool ccw=true);
arc(): m_scale(1.0), m_initialized(false) {}
arc(double x,
double y,
double rx,
double ry,
double a1,
double a2,
bool ccw = true);
void init(double x, double y,
double rx, double ry,
double a1, double a2,
bool ccw=true);
void init(double x,
double y,
double rx,
double ry,
double a1,
double a2,
bool ccw = true);
void approximation_scale(double s);
double approximation_scale() const { return m_scale; }
double approximation_scale() const
{
return m_scale;
}
void rewind(unsigned);
unsigned vertex(double* x, double* y);
@@ -52,22 +61,20 @@ namespace agg
private:
void normalize(double a1, double a2, bool ccw);
double m_x;
double m_y;
double m_rx;
double m_ry;
double m_angle;
double m_start;
double m_end;
double m_scale;
double m_da;
bool m_ccw;
bool m_initialized;
double m_x;
double m_y;
double m_rx;
double m_ry;
double m_angle;
double m_start;
double m_end;
double m_scale;
double m_da;
bool m_ccw;
bool m_initialized;
unsigned m_path_cmd;
};
}
#endif

View File

File diff suppressed because it is too large Load Diff

View File

@@ -2,8 +2,8 @@
// Anti-Grain Geometry - Version 2.4
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
@@ -13,7 +13,7 @@
// http://www.antigrain.com
//----------------------------------------------------------------------------
//
// Simple arrowhead/arrowtail generator
// Simple arrowhead/arrowtail generator
//
//----------------------------------------------------------------------------
#ifndef AGG_ARROWHEAD_INCLUDED
@@ -26,7 +26,7 @@ namespace agg
//===============================================================arrowhead
//
// See implementation agg_arrowhead.cpp
// See implementation agg_arrowhead.cpp
//
class arrowhead
{
@@ -42,8 +42,14 @@ namespace agg
m_head_flag = true;
}
void head() { m_head_flag = true; }
void no_head() { m_head_flag = false; }
void head()
{
m_head_flag = true;
}
void no_head()
{
m_head_flag = false;
}
void tail(double d1, double d2, double d3, double d4)
{
@@ -54,24 +60,30 @@ namespace agg
m_tail_flag = true;
}
void tail() { m_tail_flag = true; }
void no_tail() { m_tail_flag = false; }
void tail()
{
m_tail_flag = true;
}
void no_tail()
{
m_tail_flag = false;
}
void rewind(unsigned path_id);
unsigned vertex(double* x, double* y);
private:
double m_head_d1;
double m_head_d2;
double m_head_d3;
double m_head_d4;
double m_tail_d1;
double m_tail_d2;
double m_tail_d3;
double m_tail_d4;
bool m_head_flag;
bool m_tail_flag;
double m_coord[16];
double m_head_d1;
double m_head_d2;
double m_head_d3;
double m_head_d4;
double m_tail_d1;
double m_tail_d2;
double m_tail_d3;
double m_tail_d4;
bool m_head_flag;
bool m_tail_flag;
double m_coord[16];
unsigned m_cmd[8];
unsigned m_curr_id;
unsigned m_curr_coord;

View File

@@ -2,8 +2,8 @@
// Anti-Grain Geometry - Version 2.4
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
@@ -25,37 +25,50 @@
#else
namespace agg
{
// The policy of all AGG containers and memory allocation strategy
// The policy of all AGG containers and memory allocation strategy
// in general is that no allocated data requires explicit construction.
// It means that the allocator can be really simple; you can even
// replace new/delete to malloc/free. The constructors and destructors
// won't be called in this case, however everything will remain working.
// The second argument of deallocate() is the size of the allocated
// replace new/delete to malloc/free. The constructors and destructors
// won't be called in this case, however everything will remain working.
// The second argument of deallocate() is the size of the allocated
// block. You can use this information if you wish.
//------------------------------------------------------------pod_allocator
template<class T> struct pod_allocator
template <class T>
struct pod_allocator
{
static T* allocate(unsigned num) { return new T [num]; }
static void deallocate(T* ptr, unsigned) { delete [] ptr; }
static T* allocate(unsigned num)
{
return new T[num];
}
static void deallocate(T* ptr, unsigned)
{
delete[] ptr;
}
};
// Single object allocator. It's also can be replaced with your custom
// allocator. The difference is that it can only allocate a single
// object and the constructor and destructor must be called.
// allocator. The difference is that it can only allocate a single
// object and the constructor and destructor must be called.
// In AGG there is no need to allocate an array of objects with
// calling their constructors (only single ones). So that, if you
// replace these new/delete to malloc/free make sure that the in-place
// new is called and take care of calling the destructor too.
//------------------------------------------------------------obj_allocator
template<class T> struct obj_allocator
template <class T>
struct obj_allocator
{
static T* allocate() { return new T; }
static void deallocate(T* ptr) { delete ptr; }
static T* allocate()
{
return new T;
}
static void deallocate(T* ptr)
{
delete ptr;
}
};
}
#endif
//-------------------------------------------------------- Default basic types
//
// If the compiler has different capacity of the basic types you can redefine
@@ -104,7 +117,7 @@ namespace agg
//------------------------------------------------ Some fixes for MS Visual C++
#if defined(_MSC_VER)
#pragma warning(disable:4786) // Identifier was truncated...
#pragma warning(disable : 4786) // Identifier was truncated...
#endif
#if defined(_MSC_VER)
@@ -116,38 +129,36 @@ namespace agg
namespace agg
{
//-------------------------------------------------------------------------
typedef AGG_INT8 int8; //----int8
typedef AGG_INT8U int8u; //----int8u
typedef AGG_INT16 int16; //----int16
typedef AGG_INT16U int16u; //----int16u
typedef AGG_INT32 int32; //----int32
typedef AGG_INT32U int32u; //----int32u
typedef AGG_INT64 int64; //----int64
typedef AGG_INT64U int64u; //----int64u
typedef AGG_INT8 int8; //----int8
typedef AGG_INT8U int8u; //----int8u
typedef AGG_INT16 int16; //----int16
typedef AGG_INT16U int16u; //----int16u
typedef AGG_INT32 int32; //----int32
typedef AGG_INT32U int32u; //----int32u
typedef AGG_INT64 int64; //----int64
typedef AGG_INT64U int64u; //----int64u
#if defined(AGG_FISTP)
#pragma warning(push)
#pragma warning(disable : 4035) //Disable warning "no return value"
AGG_INLINE int iround(double v) //-------iround
#pragma warning(disable : 4035) // Disable warning "no return value"
AGG_INLINE int iround(double v) //-------iround
{
int t;
__asm fld qword ptr [v]
__asm fistp dword ptr [t]
__asm mov eax, dword ptr [t]
__asm fld qword ptr[v] __asm fistp dword ptr[t] __asm mov eax,
dword ptr[t]
}
AGG_INLINE unsigned uround(double v) //-------uround
AGG_INLINE unsigned uround(double v) //-------uround
{
unsigned t;
__asm fld qword ptr [v]
__asm fistp dword ptr [t]
__asm mov eax, dword ptr [t]
__asm fld qword ptr[v] __asm fistp dword ptr[t] __asm mov eax,
dword ptr[t]
}
#pragma warning(pop)
AGG_INLINE int ifloor(double v)
{
return int(floor(v));
}
AGG_INLINE unsigned ufloor(double v) //-------ufloor
AGG_INLINE unsigned ufloor(double v) //-------ufloor
{
return unsigned(floor(v));
}
@@ -155,7 +166,7 @@ namespace agg
{
return int(ceil(v));
}
AGG_INLINE unsigned uceil(double v) //--------uceil
AGG_INLINE unsigned uceil(double v) //--------uceil
{
return unsigned(ceil(v));
}
@@ -213,48 +224,53 @@ namespace agg
#endif
//---------------------------------------------------------------saturation
template<int Limit> struct saturation
template <int Limit>
struct saturation
{
AGG_INLINE static int iround(double v)
{
if(v < double(-Limit)) return -Limit;
if(v > double( Limit)) return Limit;
if (v < double(-Limit))
return -Limit;
if (v > double(Limit))
return Limit;
return agg::iround(v);
}
};
//------------------------------------------------------------------mul_one
template<unsigned Shift> struct mul_one
template <unsigned Shift>
struct mul_one
{
AGG_INLINE static unsigned mul(unsigned a, unsigned b)
{
unsigned q = a * b + (1 << (Shift-1));
unsigned q = a * b + (1 << (Shift - 1));
return (q + (q >> Shift)) >> Shift;
}
};
//-------------------------------------------------------------------------
typedef unsigned char cover_type; //----cover_type
typedef unsigned char cover_type; //----cover_type
enum cover_scale_e
{
cover_shift = 8, //----cover_shift
cover_size = 1 << cover_shift, //----cover_size
cover_mask = cover_size - 1, //----cover_mask
cover_none = 0, //----cover_none
cover_full = cover_mask //----cover_full
cover_shift = 8, //----cover_shift
cover_size = 1 << cover_shift, //----cover_size
cover_mask = cover_size - 1, //----cover_mask
cover_none = 0, //----cover_none
cover_full = cover_mask //----cover_full
};
//----------------------------------------------------poly_subpixel_scale_e
// These constants determine the subpixel accuracy, to be more precise,
// the number of bits of the fractional part of the coordinates.
// These constants determine the subpixel accuracy, to be more precise,
// the number of bits of the fractional part of the coordinates.
// The possible coordinate capacity in bits can be calculated by formula:
// sizeof(int) * 8 - poly_subpixel_shift, i.e, for 32-bit integers and
// 8-bits fractional part the capacity is 24 bits.
enum poly_subpixel_scale_e
{
poly_subpixel_shift = 8, //----poly_subpixel_shift
poly_subpixel_scale = 1<<poly_subpixel_shift, //----poly_subpixel_scale
poly_subpixel_mask = poly_subpixel_scale-1 //----poly_subpixel_mask
poly_subpixel_shift = 8, //----poly_subpixel_shift
poly_subpixel_scale = 1
<< poly_subpixel_shift, //----poly_subpixel_scale
poly_subpixel_mask = poly_subpixel_scale - 1 //----poly_subpixel_mask
};
//----------------------------------------------------------filling_rule_e
@@ -278,37 +294,60 @@ namespace agg
{
return rad * 180.0 / pi;
}
//----------------------------------------------------------------rect_base
template<class T> struct rect_base
template <class T>
struct rect_base
{
typedef T value_type;
typedef T value_type;
typedef rect_base<T> self_type;
T x1, y1, x2, y2;
rect_base() {}
rect_base(T x1_, T y1_, T x2_, T y2_) :
x1(x1_), y1(y1_), x2(x2_), y2(y2_) {}
void init(T x1_, T y1_, T x2_, T y2_)
rect_base(T x1_, T y1_, T x2_, T y2_):
x1(x1_),
y1(y1_),
x2(x2_),
y2(y2_)
{
x1 = x1_; y1 = y1_; x2 = x2_; y2 = y2_;
}
void init(T x1_, T y1_, T x2_, T y2_)
{
x1 = x1_;
y1 = y1_;
x2 = x2_;
y2 = y2_;
}
const self_type& normalize()
{
T t;
if(x1 > x2) { t = x1; x1 = x2; x2 = t; }
if(y1 > y2) { t = y1; y1 = y2; y2 = t; }
if (x1 > x2)
{
t = x1;
x1 = x2;
x2 = t;
}
if (y1 > y2)
{
t = y1;
y1 = y2;
y2 = t;
}
return *this;
}
bool clip(const self_type& r)
{
if(x2 > r.x2) x2 = r.x2;
if(y2 > r.y2) y2 = r.y2;
if(x1 < r.x1) x1 = r.x1;
if(y1 < r.y1) y1 = r.y1;
if (x2 > r.x2)
x2 = r.x2;
if (y2 > r.y2)
y2 = r.y2;
if (x1 < r.x1)
x1 = r.x1;
if (y1 < r.y1)
y1 = r.y1;
return x1 <= x2 && y1 <= y2;
}
@@ -321,72 +360,78 @@ namespace agg
{
return (x >= x1 && x <= x2 && y >= y1 && y <= y2);
}
bool overlaps(const self_type& r) const
{
return !(r.x1 > x2 || r.x2 < x1
|| r.y1 > y2 || r.y2 < y1);
return !(r.x1 > x2 || r.x2 < x1 || r.y1 > y2 || r.y2 < y1);
}
};
//-----------------------------------------------------intersect_rectangles
template<class Rect>
template <class Rect>
inline Rect intersect_rectangles(const Rect& r1, const Rect& r2)
{
Rect r = r1;
// First process x2,y2 because the other order
// results in Internal Compiler Error under
// Microsoft Visual C++ .NET 2003 69462-335-0000007-18038 in
// First process x2,y2 because the other order
// results in Internal Compiler Error under
// Microsoft Visual C++ .NET 2003 69462-335-0000007-18038 in
// case of "Maximize Speed" optimization option.
//-----------------
if(r.x2 > r2.x2) r.x2 = r2.x2;
if(r.y2 > r2.y2) r.y2 = r2.y2;
if(r.x1 < r2.x1) r.x1 = r2.x1;
if(r.y1 < r2.y1) r.y1 = r2.y1;
if (r.x2 > r2.x2)
r.x2 = r2.x2;
if (r.y2 > r2.y2)
r.y2 = r2.y2;
if (r.x1 < r2.x1)
r.x1 = r2.x1;
if (r.y1 < r2.y1)
r.y1 = r2.y1;
return r;
}
//---------------------------------------------------------unite_rectangles
template<class Rect>
template <class Rect>
inline Rect unite_rectangles(const Rect& r1, const Rect& r2)
{
Rect r = r1;
if(r.x2 < r2.x2) r.x2 = r2.x2;
if(r.y2 < r2.y2) r.y2 = r2.y2;
if(r.x1 > r2.x1) r.x1 = r2.x1;
if(r.y1 > r2.y1) r.y1 = r2.y1;
if (r.x2 < r2.x2)
r.x2 = r2.x2;
if (r.y2 < r2.y2)
r.y2 = r2.y2;
if (r.x1 > r2.x1)
r.x1 = r2.x1;
if (r.y1 > r2.y1)
r.y1 = r2.y1;
return r;
}
typedef rect_base<int> rect_i; //----rect_i
typedef rect_base<float> rect_f; //----rect_f
typedef rect_base<int> rect_i; //----rect_i
typedef rect_base<float> rect_f; //----rect_f
typedef rect_base<double> rect_d; //----rect_d
//---------------------------------------------------------path_commands_e
enum path_commands_e
{
path_cmd_stop = 0, //----path_cmd_stop
path_cmd_move_to = 1, //----path_cmd_move_to
path_cmd_line_to = 2, //----path_cmd_line_to
path_cmd_curve3 = 3, //----path_cmd_curve3
path_cmd_curve4 = 4, //----path_cmd_curve4
path_cmd_curveN = 5, //----path_cmd_curveN
path_cmd_catrom = 6, //----path_cmd_catrom
path_cmd_ubspline = 7, //----path_cmd_ubspline
path_cmd_end_poly = 0x0F, //----path_cmd_end_poly
path_cmd_mask = 0x0F //----path_cmd_mask
path_cmd_stop = 0, //----path_cmd_stop
path_cmd_move_to = 1, //----path_cmd_move_to
path_cmd_line_to = 2, //----path_cmd_line_to
path_cmd_curve3 = 3, //----path_cmd_curve3
path_cmd_curve4 = 4, //----path_cmd_curve4
path_cmd_curveN = 5, //----path_cmd_curveN
path_cmd_catrom = 6, //----path_cmd_catrom
path_cmd_ubspline = 7, //----path_cmd_ubspline
path_cmd_end_poly = 0x0F, //----path_cmd_end_poly
path_cmd_mask = 0x0F //----path_cmd_mask
};
//------------------------------------------------------------path_flags_e
enum path_flags_e
{
path_flags_none = 0, //----path_flags_none
path_flags_ccw = 0x10, //----path_flags_ccw
path_flags_cw = 0x20, //----path_flags_cw
path_flags_close = 0x40, //----path_flags_close
path_flags_mask = 0xF0 //----path_flags_mask
path_flags_none = 0, //----path_flags_none
path_flags_ccw = 0x10, //----path_flags_ccw
path_flags_cw = 0x20, //----path_flags_cw
path_flags_close = 0x40, //----path_flags_close
path_flags_mask = 0xF0 //----path_flags_mask
};
//---------------------------------------------------------------is_vertex
@@ -403,7 +448,7 @@ namespace agg
//-----------------------------------------------------------------is_stop
inline bool is_stop(unsigned c)
{
{
return c == path_cmd_stop;
}
@@ -447,7 +492,7 @@ namespace agg
inline bool is_close(unsigned c)
{
return (c & ~(path_flags_cw | path_flags_ccw)) ==
(path_cmd_end_poly | path_flags_close);
(path_cmd_end_poly | path_flags_close);
}
//------------------------------------------------------------is_next_poly
@@ -471,19 +516,19 @@ namespace agg
//-------------------------------------------------------------is_oriented
inline bool is_oriented(unsigned c)
{
return (c & (path_flags_cw | path_flags_ccw)) != 0;
return (c & (path_flags_cw | path_flags_ccw)) != 0;
}
//---------------------------------------------------------------is_closed
inline bool is_closed(unsigned c)
{
return (c & path_flags_close) != 0;
return (c & path_flags_close) != 0;
}
//----------------------------------------------------------get_close_flag
inline unsigned get_close_flag(unsigned c)
{
return c & path_flags_close;
return c & path_flags_close;
}
//-------------------------------------------------------clear_orientation
@@ -505,70 +550,77 @@ namespace agg
}
//--------------------------------------------------------------point_base
template<class T> struct point_base
template <class T>
struct point_base
{
typedef T value_type;
T x,y;
T x, y;
point_base() {}
point_base(T x_, T y_) : x(x_), y(y_) {}
point_base(T x_, T y_): x(x_), y(y_) {}
};
typedef point_base<int> point_i; //-----point_i
typedef point_base<float> point_f; //-----point_f
typedef point_base<int> point_i; //-----point_i
typedef point_base<float> point_f; //-----point_f
typedef point_base<double> point_d; //-----point_d
//-------------------------------------------------------------vertex_base
template<class T> struct vertex_base
template <class T>
struct vertex_base
{
typedef T value_type;
T x,y;
T x, y;
unsigned cmd;
vertex_base() {}
vertex_base(T x_, T y_, unsigned cmd_) : x(x_), y(y_), cmd(cmd_) {}
vertex_base(T x_, T y_, unsigned cmd_): x(x_), y(y_), cmd(cmd_) {}
};
typedef vertex_base<int> vertex_i; //-----vertex_i
typedef vertex_base<float> vertex_f; //-----vertex_f
typedef vertex_base<int> vertex_i; //-----vertex_i
typedef vertex_base<float> vertex_f; //-----vertex_f
typedef vertex_base<double> vertex_d; //-----vertex_d
//----------------------------------------------------------------row_info
template<class T> struct row_info
template <class T>
struct row_info
{
int x1, x2;
T* ptr;
row_info() {}
row_info(int x1_, int x2_, T* ptr_) : x1(x1_), x2(x2_), ptr(ptr_) {}
row_info(int x1_, int x2_, T* ptr_): x1(x1_), x2(x2_), ptr(ptr_) {}
};
//----------------------------------------------------------const_row_info
template<class T> struct const_row_info
template <class T>
struct const_row_info
{
int x1, x2;
const T* ptr;
const_row_info() {}
const_row_info(int x1_, int x2_, const T* ptr_) :
x1(x1_), x2(x2_), ptr(ptr_) {}
const_row_info(int x1_, int x2_, const T* ptr_):
x1(x1_),
x2(x2_),
ptr(ptr_)
{
}
};
//------------------------------------------------------------is_equal_eps
template<class T> inline bool is_equal_eps(T v1, T v2, T epsilon)
template <class T>
inline bool is_equal_eps(T v1, T v2, T epsilon)
{
bool neg1 = v1 < 0.0;
bool neg2 = v2 < 0.0;
bool neg1 = v1 < 0.0;
bool neg2 = v2 < 0.0;
if (neg1 != neg2)
return std::fabs(v1) < epsilon && std::fabs(v2) < epsilon;
if (neg1 != neg2)
return std::fabs(v1) < epsilon && std::fabs(v2) < epsilon;
int int1, int2;
std::frexp(v1, &int1);
std::frexp(v2, &int2);
int min12 = int1 < int2 ? int1 : int2;
std::frexp(v1, &int1);
std::frexp(v2, &int2);
int min12 = int1 < int2 ? int1 : int2;
v1 = std::ldexp(v1, -min12);
v2 = std::ldexp(v2, -min12);
v1 = std::ldexp(v1, -min12);
v2 = std::ldexp(v2, -min12);
return std::fabs(v1 - v2) < epsilon;
return std::fabs(v1 - v2) < epsilon;
}
}
#endif

View File

@@ -2,8 +2,8 @@
// Anti-Grain Geometry - Version 2.4
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
@@ -13,7 +13,7 @@
// http://www.antigrain.com
//----------------------------------------------------------------------------
//
// Arc generator. Produces at most 4 consecutive cubic bezier curves, i.e.,
// Arc generator. Produces at most 4 consecutive cubic bezier curves, i.e.,
// 4, 7, 10, or 13 vertices.
//
//----------------------------------------------------------------------------
@@ -27,33 +27,42 @@ namespace agg
{
//-----------------------------------------------------------------------
void arc_to_bezier(double cx, double cy, double rx, double ry,
double start_angle, double sweep_angle,
double* curve);
void arc_to_bezier(double cx,
double cy,
double rx,
double ry,
double start_angle,
double sweep_angle,
double* curve);
//==============================================================bezier_arc
//
//
// See implemantaion agg_bezier_arc.cpp
//
class bezier_arc
{
public:
//--------------------------------------------------------------------
bezier_arc() : m_vertex(26), m_num_vertices(0), m_cmd(path_cmd_line_to) {}
bezier_arc(double x, double y,
double rx, double ry,
double start_angle,
double sweep_angle)
bezier_arc(): m_vertex(26), m_num_vertices(0), m_cmd(path_cmd_line_to)
{
}
bezier_arc(double x,
double y,
double rx,
double ry,
double start_angle,
double sweep_angle)
{
init(x, y, rx, ry, start_angle, sweep_angle);
}
//--------------------------------------------------------------------
void init(double x, double y,
double rx, double ry,
double start_angle,
double sweep_angle);
void init(double x,
double y,
double rx,
double ry,
double start_angle,
double sweep_angle);
//--------------------------------------------------------------------
void rewind(unsigned)
@@ -64,67 +73,85 @@ namespace agg
//--------------------------------------------------------------------
unsigned vertex(double* x, double* y)
{
if(m_vertex >= m_num_vertices) return path_cmd_stop;
if (m_vertex >= m_num_vertices)
return path_cmd_stop;
*x = m_vertices[m_vertex];
*y = m_vertices[m_vertex + 1];
m_vertex += 2;
return (m_vertex == 2) ? unsigned(path_cmd_move_to) : m_cmd;
}
// Supplemantary functions. num_vertices() actually returns doubled
// Supplemantary functions. num_vertices() actually returns doubled
// number of vertices. That is, for 1 vertex it returns 2.
//--------------------------------------------------------------------
unsigned num_vertices() const { return m_num_vertices; }
const double* vertices() const { return m_vertices; }
double* vertices() { return m_vertices; }
unsigned num_vertices() const
{
return m_num_vertices;
}
const double* vertices() const
{
return m_vertices;
}
double* vertices()
{
return m_vertices;
}
private:
unsigned m_vertex;
unsigned m_num_vertices;
double m_vertices[26];
double m_vertices[26];
unsigned m_cmd;
};
//==========================================================bezier_arc_svg
// Compute an SVG-style bezier arc.
// Compute an SVG-style bezier arc.
//
// Computes an elliptical arc from (x1, y1) to (x2, y2). The size and
// orientation of the ellipse are defined by two radii (rx, ry)
// and an x-axis-rotation, which indicates how the ellipse as a whole
// is rotated relative to the current coordinate system. The center
// (cx, cy) of the ellipse is calculated automatically to satisfy the
// constraints imposed by the other parameters.
// large-arc-flag and sweep-flag contribute to the automatic calculations
// Computes an elliptical arc from (x1, y1) to (x2, y2). The size and
// orientation of the ellipse are defined by two radii (rx, ry)
// and an x-axis-rotation, which indicates how the ellipse as a whole
// is rotated relative to the current coordinate system. The center
// (cx, cy) of the ellipse is calculated automatically to satisfy the
// constraints imposed by the other parameters.
// large-arc-flag and sweep-flag contribute to the automatic calculations
// and help determine how the arc is drawn.
class bezier_arc_svg
{
public:
//--------------------------------------------------------------------
bezier_arc_svg() : m_arc(), m_radii_ok(false) {}
bezier_arc_svg(): m_arc(), m_radii_ok(false) {}
bezier_arc_svg(double x1, double y1,
double rx, double ry,
double angle,
bool large_arc_flag,
bool sweep_flag,
double x2, double y2) :
m_arc(), m_radii_ok(false)
bezier_arc_svg(double x1,
double y1,
double rx,
double ry,
double angle,
bool large_arc_flag,
bool sweep_flag,
double x2,
double y2):
m_arc(),
m_radii_ok(false)
{
init(x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2);
}
//--------------------------------------------------------------------
void init(double x1, double y1,
double rx, double ry,
double angle,
bool large_arc_flag,
bool sweep_flag,
double x2, double y2);
void init(double x1,
double y1,
double rx,
double ry,
double angle,
bool large_arc_flag,
bool sweep_flag,
double x2,
double y2);
//--------------------------------------------------------------------
bool radii_ok() const { return m_radii_ok; }
bool radii_ok() const
{
return m_radii_ok;
}
//--------------------------------------------------------------------
void rewind(unsigned)
@@ -138,22 +165,27 @@ namespace agg
return m_arc.vertex(x, y);
}
// Supplemantary functions. num_vertices() actually returns doubled
// Supplemantary functions. num_vertices() actually returns doubled
// number of vertices. That is, for 1 vertex it returns 2.
//--------------------------------------------------------------------
unsigned num_vertices() const { return m_arc.num_vertices(); }
const double* vertices() const { return m_arc.vertices(); }
double* vertices() { return m_arc.vertices(); }
unsigned num_vertices() const
{
return m_arc.num_vertices();
}
const double* vertices() const
{
return m_arc.vertices();
}
double* vertices()
{
return m_arc.vertices();
}
private:
bezier_arc m_arc;
bool m_radii_ok;
bool m_radii_ok;
};
}
#endif

View File

@@ -2,8 +2,8 @@
// Anti-Grain Geometry - Version 2.4
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
@@ -20,19 +20,20 @@
namespace agg
{
class bitset_iterator
{
public:
bitset_iterator(const int8u* bits, unsigned offset = 0) :
bitset_iterator(const int8u* bits, unsigned offset = 0):
m_bits(bits + (offset >> 3)),
m_mask(0x80 >> (offset & 7))
{}
{
}
void operator ++ ()
void operator++()
{
m_mask >>= 1;
if(m_mask == 0)
if (m_mask == 0)
{
++m_bits;
m_mask = 0x80;
@@ -46,7 +47,7 @@ namespace agg
private:
const int8u* m_bits;
int8u m_mask;
int8u m_mask;
};
}

View File

File diff suppressed because it is too large Load Diff

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