mirror of
				https://github.com/davidgiven/fluxengine.git
				synced 2025-10-24 11:11:02 -07:00 
			
		
		
		
	Compare commits
	
		
			126 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | bb82dc864a | ||
|  | df83b558bf | ||
|  | 7c2b5f116d | ||
|  | 30fe75f9bf | ||
|  | 401e7a9edb | ||
|  | fd4ddc56f2 | ||
|  | 83d907bf71 | ||
|  | 327bc76c6e | ||
|  | fdd39fb2d8 | ||
|  | bfcfa8eb19 | ||
|  | 7095c03e28 | ||
|  | 45e796f15f | ||
|  | 3d1dcd6874 | ||
|  | 0033d0759f | ||
|  | 53f7dfe6c9 | ||
|  | 75446de29b | ||
|  | 1d119d6921 | ||
|  | 7462bd995f | ||
|  | 0dd99efad3 | ||
|  | 1234e81463 | ||
|  | ea13d66e6b | ||
|  | a7cb7eb995 | ||
|  | 29f5feb34d | ||
|  | 5dc60db7b6 | ||
|  | fb9f7fe445 | ||
|  | a548471652 | ||
|  | 3e47d66644 | ||
|  | 3bfa45a80c | ||
|  | 2d717af4db | ||
|  | 533b217c8f | ||
|  | ff1fb761f2 | ||
|  | 95d49add2c | ||
|  | 8b75609b70 | ||
|  | b8929dd589 | ||
|  | 2fd29f8786 | ||
|  | 38408820ca | ||
|  | 43e6840e78 | ||
|  | 15908c52bd | ||
|  | c90b0e7dc2 | ||
|  | d2ff9806bd | ||
|  | 1e6993c12d | ||
|  | 1122344016 | ||
|  | 0dbce00fe4 | ||
|  | 5af0b68e06 | ||
|  | 6038a11671 | ||
|  | dcb92db519 | ||
|  | dcaeabacc6 | ||
|  | a2a5c7eff0 | ||
|  | e1cf927bf3 | ||
|  | 8fd98d674a | ||
|  | fd884027c0 | ||
|  | 26bd467f79 | ||
|  | c7f22c0dab | ||
|  | 92d44f6ae3 | ||
|  | 9143f477b2 | ||
|  | 1a519bf837 | ||
|  | ca6b90f8c1 | ||
|  | 44fc532d63 | ||
|  | 6a6cd025c0 | ||
|  | d769f90704 | ||
|  | 9d8e3b21ba | ||
|  | dabdfec3e7 | ||
|  | 6a00653d1e | ||
|  | 8fb786094f | ||
|  | 87e978c817 | ||
|  | 4a31046c9c | ||
|  | db420b3495 | ||
|  | c81dc166bc | ||
|  | 07aa416975 | ||
|  | 627820cddc | ||
|  | a24fe420c4 | ||
|  | 986be921f4 | ||
|  | f5f223f622 | ||
|  | bbdfa0d651 | ||
|  | e6bb0cb463 | ||
|  | 9e61670116 | ||
|  | 3876c07164 | ||
|  | ed315eade9 | ||
|  | 7456fd0c90 | ||
|  | 44160e66ac | ||
|  | 9bd969a57b | ||
|  | 0b585078d8 | ||
|  | 0d495ed934 | ||
|  | 95b703b1ea | ||
|  | 688061397b | ||
|  | 1f00176455 | ||
|  | 90da6b1e72 | ||
|  | 4deb45dc3f | ||
|  | eeec5d106a | ||
|  | 4e42d1d197 | ||
|  | 495d08c447 | ||
|  | 1b859015ae | ||
|  | 3db2109e01 | ||
|  | 294ac87503 | ||
|  | c297adb0c7 | ||
|  | 446b965794 | ||
|  | 96d4df296d | ||
|  | a149aac0e9 | ||
|  | aacc7be9f3 | ||
|  | 7409955701 | ||
|  | c623d95a80 | ||
|  | 1927cc7fe1 | ||
|  | 4eca254daf | ||
|  | c7d4fee3f6 | ||
|  | a6f798ae5b | ||
|  | c9ae836e52 | ||
|  | e3ffa63f7f | ||
|  | 4ffc2cc1dc | ||
|  | 7f9ba14687 | ||
|  | a24933e272 | ||
|  | 20bdacbecf | ||
|  | ab9d6cf5ed | ||
|  | 977b6831a0 | ||
|  | 60a73c8d1e | ||
|  | 37595bf73c | ||
|  | 952aea46ba | ||
|  | 6a6536cf27 | ||
|  | 696368c92a | ||
|  | e3edc9327e | ||
|  | 8d2e6a664d | ||
|  | ba1f8b8ed8 | ||
|  | 10605b3908 | ||
|  | e31e547322 | ||
|  | 9484a1b870 | ||
|  | 0a5a814a88 | ||
|  | 08ce455d1d | 
							
								
								
									
										18
									
								
								.github/workflows/ccpp.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								.github/workflows/ccpp.yml
									
									
									
									
										vendored
									
									
								
							| @@ -19,9 +19,10 @@ jobs: | ||||
|         repository: 'davidgiven/fluxengine-testdata' | ||||
|         path: 'fluxengine-testdata' | ||||
|     - name: apt | ||||
|       run: sudo apt update && sudo apt install libudev-dev libsqlite3-dev protobuf-compiler libwxgtk3.0-gtk3-dev libfmt-dev | ||||
|       run: | | ||||
|         sudo apt install libudev-dev libsqlite3-dev protobuf-compiler libwxgtk3.0-gtk3-dev libfmt-dev libprotobuf-dev wx-common | ||||
|     - name: make | ||||
|       run: CXXFLAGS="-Wp,-D_GLIBCXX_ASSERTIONS" make -j2 -C fluxengine | ||||
|       run: CXXFLAGS="-Wp,-D_GLIBCXX_ASSERTIONS" make -j`nproc` -C fluxengine | ||||
|  | ||||
|   build-macos-current: | ||||
|     runs-on: macos-latest | ||||
| @@ -37,13 +38,13 @@ jobs: | ||||
|     - name: brew | ||||
|       run: brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg | ||||
|     - name: make | ||||
|       run: gmake -j2 -C fluxengine | ||||
|       run: gmake -j`nproc` -C fluxengine | ||||
|  | ||||
|     - name: Upload build artifacts | ||||
|       uses: actions/upload-artifact@v2 | ||||
|       with: | ||||
|         name: ${{ github.event.repository.name }}.${{ github.sha }} | ||||
|         path: fluxengine.FluxEngine.pkg | ||||
|         path: fluxengine/FluxEngine.pkg | ||||
|  | ||||
|   build-windows: | ||||
|     runs-on: windows-latest | ||||
| @@ -58,17 +59,20 @@ jobs: | ||||
|         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-nsis | ||||
|           zip | ||||
|           mingw-w64-i686-png2ico | ||||
|           vim | ||||
|           zip | ||||
|     - name: update-protobuf | ||||
|       run: | | ||||
|          pacman -U --noconfirm https://repo.msys2.org/mingw/mingw32/mingw-w64-i686-protobuf-21.9-1-any.pkg.tar.zst | ||||
| @@ -81,7 +85,7 @@ jobs: | ||||
|         repository: 'davidgiven/fluxengine-testdata' | ||||
|         path: 'fluxengine-testdata' | ||||
|     - name: build | ||||
|       run: make -j2 -C fluxengine | ||||
|       run: MAGICK_TIME_LIMIT=100 make -j`nproc` -C fluxengine | ||||
|  | ||||
|     - name: nsis | ||||
|       run: | | ||||
|   | ||||
							
								
								
									
										15
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,7 +1,7 @@ | ||||
| name: Autorelease | ||||
|  | ||||
| concurrency:  | ||||
|   group: environment-${{ github.head_ref }} | ||||
|   group: environment-release-${{ github.head_ref }} | ||||
|   cancel-in-progress: true | ||||
|  | ||||
| on: | ||||
| @@ -23,17 +23,20 @@ jobs: | ||||
|         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-nsis | ||||
|           zip | ||||
|           mingw-w64-i686-png2ico | ||||
|           vim | ||||
|           zip | ||||
|     - uses: actions/checkout@v3 | ||||
|  | ||||
|     - name: update-protobuf | ||||
| @@ -42,7 +45,7 @@ jobs: | ||||
|  | ||||
|     - name: build | ||||
|       run: | | ||||
|         make -j2 | ||||
|         MAGICK_TIME_LIMIT=100 make -j`nproc` | ||||
|  | ||||
|     - name: nsis | ||||
|       run: | | ||||
| @@ -91,10 +94,12 @@ jobs: | ||||
|     runs-on: macos-latest | ||||
|     steps: | ||||
|     - uses: actions/checkout@v2 | ||||
|  | ||||
|     - name: brew | ||||
|       run: brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg | ||||
|  | ||||
|     - name: make | ||||
|       run: gmake | ||||
|       run: gmake -j`nproc` | ||||
|  | ||||
|     - name: tag | ||||
|       uses: EndBug/latest-tag@latest | ||||
|   | ||||
							
								
								
									
										330
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										330
									
								
								Makefile
									
									
									
									
									
								
							| @@ -1,299 +1,65 @@ | ||||
| #Special Windows settings. | ||||
| CC = gcc | ||||
| CXX = g++ -std=c++17 | ||||
| CFLAGS = -g -O3 | ||||
| LDFLAGS = | ||||
|  | ||||
| ifeq ($(OS), Windows_NT) | ||||
| 	MINGWBIN = /mingw32/bin | ||||
| 	CCPREFIX = $(MINGWBIN)/ | ||||
| 	LUA = $(MINGWBIN)/lua | ||||
| 	PKG_CONFIG = $(MINGWBIN)/pkg-config | ||||
| 	WX_CONFIG = /usr/bin/sh $(MINGWBIN)/wx-config --static=yes | ||||
| 	PROTOC = $(MINGWBIN)/protoc | ||||
| 	PLATFORM = WINDOWS | ||||
| 	LDFLAGS += \ | ||||
| 		-static | ||||
| 	CXXFLAGS += \ | ||||
| 		-std=c++17 \ | ||||
| 		-fext-numeric-literals \ | ||||
| 		-Wno-deprecated-enum-float-conversion \ | ||||
| 		-Wno-deprecated-enum-enum-conversion | ||||
|  | ||||
| #Required to get the gcc run - time libraries on the path. | ||||
| 	export PATH := $(PATH):$(MINGWBIN) | ||||
| 	EXT ?= .exe | ||||
| endif | ||||
|  | ||||
| #Special OSX settings. | ||||
|  | ||||
| ifeq ($(shell uname),Darwin) | ||||
| 	PLATFORM = OSX | ||||
| 	LDFLAGS += \ | ||||
| 		-framework IOKit \ | ||||
| 		-framework Foundation | ||||
| endif | ||||
|  | ||||
| #Check the Make version. | ||||
|  | ||||
|  | ||||
| ifeq ($(findstring 4.,$(MAKE_VERSION)),) | ||||
| $(error You need GNU Make 4.x for this (if you're on OSX, use gmake).) | ||||
| endif | ||||
|  | ||||
| #Normal settings. | ||||
|  | ||||
| OBJDIR ?= .obj | ||||
| CCPREFIX ?= | ||||
| LUA ?= lua | ||||
| CC ?= $(CCPREFIX)gcc | ||||
| CXX ?= $(CCPREFIX)g++ | ||||
| AR ?= $(CCPREFIX)ar | ||||
| PKG_CONFIG ?= pkg-config | ||||
| WX_CONFIG ?= wx-config | ||||
| PROTOC ?= protoc | ||||
| CFLAGS ?= -g -O3 | ||||
| CXXFLAGS += -std=c++17 | ||||
| LDFLAGS ?= | ||||
| PLATFORM ?= UNIX | ||||
| TESTS ?= yes | ||||
| EXT ?= | ||||
| OBJ = .obj | ||||
| DESTDIR ?= | ||||
| PREFIX ?= /usr/local | ||||
| BINDIR ?= $(PREFIX)/bin | ||||
|  | ||||
| CFLAGS += \ | ||||
| 	-Iarch \ | ||||
| 	-Ilib \ | ||||
| 	-I. \ | ||||
| 	-I$(OBJDIR)/arch \ | ||||
| 	-I$(OBJDIR)/lib \ | ||||
| 	-I$(OBJDIR) \ | ||||
| 	-Wno-deprecated-declarations \ | ||||
| # Special Windows settings. | ||||
|  | ||||
| LDFLAGS += \ | ||||
| 	-lz \ | ||||
| 	-lfmt | ||||
| 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 | ||||
|  | ||||
| .SUFFIXES: | ||||
| .DELETE_ON_ERROR: | ||||
|  | ||||
| define nl | ||||
|  | ||||
| endef | ||||
|  | ||||
| empty := | ||||
| space := $(empty) $(empty) | ||||
|  | ||||
| use-library = $(eval $(use-library-impl)) | ||||
| define use-library-impl | ||||
| $1: $(call $3_LIB) | ||||
| $1: private LDFLAGS += $(call $3_LDFLAGS) | ||||
| $2: private CFLAGS += $(call $3_CFLAGS) | ||||
| endef | ||||
|  | ||||
| use-pkgconfig = $(eval $(use-pkgconfig-impl)) | ||||
| define use-pkgconfig-impl | ||||
| ifneq ($(strip $(shell $(PKG_CONFIG) $3; echo $$?)),0) | ||||
| $$(error Missing required pkg-config dependency: $3) | ||||
| 	# Required to get the gcc run - time libraries on the path. | ||||
| 	export PATH := $(PATH):$(MINGWBIN) | ||||
| endif | ||||
|  | ||||
| $(1): private LDFLAGS += $(shell $(PKG_CONFIG) --libs $(3)) | ||||
| $(2): private CFLAGS += $(shell $(PKG_CONFIG) --cflags $(3)) | ||||
| endef | ||||
|  | ||||
| .PHONY: all binaries tests clean install install-bin | ||||
| all: binaries tests docs | ||||
|  | ||||
| PROTOS = \ | ||||
| 	arch/aeslanier/aeslanier.proto \ | ||||
| 	arch/agat/agat.proto \ | ||||
| 	arch/amiga/amiga.proto \ | ||||
| 	arch/apple2/apple2.proto \ | ||||
| 	arch/brother/brother.proto \ | ||||
| 	arch/c64/c64.proto \ | ||||
| 	arch/f85/f85.proto \ | ||||
| 	arch/fb100/fb100.proto \ | ||||
| 	arch/ibm/ibm.proto \ | ||||
| 	arch/macintosh/macintosh.proto \ | ||||
| 	arch/micropolis/micropolis.proto \ | ||||
| 	arch/mx/mx.proto \ | ||||
| 	arch/northstar/northstar.proto \ | ||||
| 	arch/rolandd20/rolandd20.proto \ | ||||
| 	arch/smaky6/smaky6.proto \ | ||||
| 	arch/tids990/tids990.proto \ | ||||
| 	arch/victor9k/victor9k.proto \ | ||||
| 	arch/zilogmcz/zilogmcz.proto \ | ||||
| 	lib/common.proto \ | ||||
| 	lib/config.proto \ | ||||
| 	lib/decoders/decoders.proto \ | ||||
| 	lib/drive.proto \ | ||||
| 	lib/encoders/encoders.proto \ | ||||
| 	lib/fl2.proto \ | ||||
| 	lib/fluxsink/fluxsink.proto \ | ||||
| 	lib/fluxsource/fluxsource.proto \ | ||||
| 	lib/imagereader/imagereader.proto \ | ||||
| 	lib/imagewriter/imagewriter.proto \ | ||||
| 	lib/layout.proto \ | ||||
| 	lib/usb/usb.proto \ | ||||
| 	lib/vfs/vfs.proto \ | ||||
| 	tests/testproto.proto \ | ||||
|  | ||||
| PROTO_HDRS = $(patsubst %.proto, $(OBJDIR)/%.pb.h, $(PROTOS)) | ||||
| PROTO_SRCS = $(patsubst %.proto, $(OBJDIR)/%.pb.cc, $(PROTOS)) | ||||
| PROTO_OBJS = $(patsubst %.cc, %.o, $(PROTO_SRCS)) | ||||
| PROTO_CFLAGS = $(shell $(PKG_CONFIG) --cflags protobuf) | ||||
| $(PROTO_SRCS): | $(PROTO_HDRS) | ||||
| $(PROTO_OBJS): CFLAGS += $(PROTO_CFLAGS) | ||||
| PROTO_LIB = $(OBJDIR)/libproto.a | ||||
| $(PROTO_LIB): $(PROTO_OBJS) | ||||
| PROTO_LDFLAGS = $(shell $(PKG_CONFIG) --libs protobuf) -pthread | ||||
| .PRECIOUS: $(PROTO_HDRS) $(PROTO_SRCS) | ||||
|  | ||||
| include dep/agg/build.mk | ||||
| include dep/libusbp/build.mk | ||||
| include dep/stb/build.mk | ||||
| include dep/emu/build.mk | ||||
| include dep/fatfs/build.mk | ||||
| include dep/adflib/build.mk | ||||
| include dep/hfsutils/build.mk | ||||
| include scripts/build.mk | ||||
|  | ||||
| include lib/build.mk | ||||
| include arch/build.mk | ||||
| include src/build.mk | ||||
| include src/gui/build.mk | ||||
| include tools/build.mk | ||||
| include tests/build.mk | ||||
|  | ||||
| do-encodedecodetest = $(eval $(do-encodedecodetest-impl)) | ||||
| define do-encodedecodetest-impl | ||||
|  | ||||
| tests: $(OBJDIR)/$1$$(subst $$(space),_,$3).flux.encodedecode | ||||
| $(OBJDIR)/$1$$(subst $$(space),_,$3).flux.encodedecode: scripts/encodedecodetest.sh $(FLUXENGINE_BIN) $2 | ||||
| 	@mkdir -p $(dir $$@) | ||||
| 	@echo ENCODEDECODETEST $1 flux $(FLUXENGINE_BIN) $2 $3 | ||||
| 	@scripts/encodedecodetest.sh $1 flux $(FLUXENGINE_BIN) $2 $3 > $$@ | ||||
|  | ||||
| tests: $(OBJDIR)/$1$$(subst $$(space),_,$3).scp.encodedecode | ||||
| $(OBJDIR)/$1$$(subst $$(space),_,$3).scp.encodedecode: scripts/encodedecodetest.sh $(FLUXENGINE_BIN) $2 | ||||
| 	@mkdir -p $(dir $$@) | ||||
| 	@echo ENCODEDECODETEST $1 scp $(FLUXENGINE_BIN) $2 $3 | ||||
| 	@scripts/encodedecodetest.sh $1 scp $(FLUXENGINE_BIN) $2 $3 > $$@ | ||||
|  | ||||
| endef | ||||
|  | ||||
| $(call do-encodedecodetest,agat,,--drive.tpi=96) | ||||
| $(call do-encodedecodetest,amiga,,--drive.tpi=135) | ||||
| $(call do-encodedecodetest,apple2,,--140 --drive.tpi=96) | ||||
| $(call do-encodedecodetest,atarist,,--360 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,atarist,,--370 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,atarist,,--400 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,atarist,,--410 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,atarist,,--720 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,atarist,,--740 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,atarist,,--800 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,atarist,,--820 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,bk) | ||||
| $(call do-encodedecodetest,brother,,--120 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,brother,,--240 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,commodore,scripts/commodore1541_test.textpb,--171 --drive.tpi=96) | ||||
| $(call do-encodedecodetest,commodore,scripts/commodore1541_test.textpb,--192 --drive.tpi=96) | ||||
| $(call do-encodedecodetest,commodore,,--800 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,commodore,,--1620 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,hplif,,--264 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,hplif,,--616 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,hplif,,--770 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,ibm,,--1200 --drive.tpi=96) | ||||
| $(call do-encodedecodetest,ibm,,--1232 --drive.tpi=96) | ||||
| $(call do-encodedecodetest,ibm,,--1440 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,ibm,,--1680 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,ibm,,--180 --drive.tpi=96) | ||||
| $(call do-encodedecodetest,ibm,,--160 --drive.tpi=96) | ||||
| $(call do-encodedecodetest,ibm,,--320 --drive.tpi=96) | ||||
| $(call do-encodedecodetest,ibm,,--360 --drive.tpi=96) | ||||
| $(call do-encodedecodetest,ibm,,--720_96 --drive.tpi=96) | ||||
| $(call do-encodedecodetest,ibm,,--720_135 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,mac,scripts/mac400_test.textpb,--400 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,mac,scripts/mac800_test.textpb,--800 --drive.tpi=135) | ||||
| $(call do-encodedecodetest,n88basic,,--drive.tpi=96) | ||||
| $(call do-encodedecodetest,rx50,,--drive.tpi=96) | ||||
| $(call do-encodedecodetest,tids990,,--drive.tpi=48) | ||||
| $(call do-encodedecodetest,victor9k,,--612 --drive.tpi=96) | ||||
| $(call do-encodedecodetest,victor9k,,--1224 --drive.tpi=96) | ||||
|  | ||||
| do-corpustest = $(eval $(do-corpustest-impl)) | ||||
| define do-corpustest-impl | ||||
|  | ||||
| tests: $(OBJDIR)/corpustest/$2 | ||||
| $(OBJDIR)/corpustest/$2: $(FLUXENGINE_BIN) \ | ||||
| 		../fluxengine-testdata/data/$1 ../fluxengine-testdata/data/$2 | ||||
| 	@mkdir -p $(OBJDIR)/corpustest | ||||
| 	@echo CORPUSTEST $1 $2 $3 | ||||
| 	@$(FLUXENGINE_BIN) read $3 -s ../fluxengine-testdata/data/$1 -o $$@ > $$@.log | ||||
| 	@cmp $$@ ../fluxengine-testdata/data/$2 | ||||
|  | ||||
| endef | ||||
|  | ||||
| ifneq ($(wildcard ../fluxengine-testdata/data),) | ||||
|  | ||||
| $(call do-corpustest,amiga.flux,amiga.adf,amiga --drive.tpi=135) | ||||
| $(call do-corpustest,atarist360.flux,atarist360.st,atarist --360 --drive.tpi=135) | ||||
| $(call do-corpustest,atarist720.flux,atarist720.st,atarist --720 --drive.tpi=135) | ||||
| $(call do-corpustest,brother120.flux,brother120.img,brother --120 --drive.tpi=135) | ||||
| $(call do-corpustest,cmd-fd2000.flux,cmd-fd2000.img,commodore --1620 --drive.tpi=135) | ||||
| $(call do-corpustest,ibm1232.flux,ibm1232.img,ibm --1232 --drive.tpi=96) | ||||
| $(call do-corpustest,ibm1440.flux,ibm1440.img,ibm --1440 --drive.tpi=135) | ||||
| $(call do-corpustest,mac800.flux,mac800.dsk,mac --800 --drive.tpi=135) | ||||
| $(call do-corpustest,micropolis315.flux,micropolis315.img,micropolis --315 --drive.tpi=100) | ||||
| $(call do-corpustest,northstar87-synthetic.flux,northstar87-synthetic.nsi,northstar --87 --drive.tpi=48) | ||||
| $(call do-corpustest,northstar175-synthetic.flux,northstar175-synthetic.nsi,northstar --175 --drive.tpi=48) | ||||
| $(call do-corpustest,northstar350-synthetic.flux,northstar350-synthetic.nsi,northstar --350 --drive.tpi=48) | ||||
| $(call do-corpustest,victor9k_ss.flux,victor9k_ss.img,victor9k --612 --drive.tpi=96) | ||||
| $(call do-corpustest,victor9k_ds.flux,victor9k_ds.img,victor9k --1224 --drive.tpi=96) | ||||
| # Special OSX settings. | ||||
|  | ||||
| ifeq ($(shell uname),Darwin) | ||||
| 	LDFLAGS += \ | ||||
| 		-framework IOKit \ | ||||
| 		-framework Foundation  | ||||
| endif | ||||
|  | ||||
| $(OBJDIR)/%.a: | ||||
| 	@mkdir -p $(dir $@) | ||||
| 	@echo AR $@ | ||||
| 	@$(AR) rc $@ $^ | ||||
| .PHONY: all | ||||
| all: +all README.md | ||||
|  | ||||
| %.exe: | ||||
| 	@mkdir -p $(dir $@) | ||||
| 	@echo LINK $@ | ||||
| 	@$(CXX) -o $@ $(filter %.o,$^) $(filter %.a,$^) $(LDFLAGS) $(filter %.a,$^) $(LDFLAGS) | ||||
| .PHONY: binaries tests | ||||
| binaries: all | ||||
| tests: all | ||||
| 	 | ||||
| README.md: $(OBJ)/scripts+mkdocindex/scripts+mkdocindex$(EXT) | ||||
| 	@echo MKDOC $@ | ||||
| 	@csplit -s -f$(OBJ)/README. README.md '/<!-- FORMATSSTART -->/' '%<!-- FORMATSEND -->%' | ||||
| 	@(cat $(OBJ)/README.00 && $< && cat $(OBJ)/README.01) > README.md | ||||
|  | ||||
| $(OBJDIR)/%.o: %.cpp | ||||
| 	@mkdir -p $(dir $@) | ||||
| 	@echo CXX $< | ||||
| 	@$(CXX) $(CFLAGS) $(CXXFLAGS) -MMD -MP -MF $(@:.o=.d) -c -o $@ $< | ||||
| .PHONY: tests | ||||
|  | ||||
| $(OBJDIR)/%.o: %.cc | ||||
| 	@mkdir -p $(dir $@) | ||||
| 	@echo CXX $< | ||||
| 	@$(CXX) $(CFLAGS) $(CXXFLAGS) -MMD -MP -MF $(@:.o=.d) -c -o $@ $< | ||||
| .PHONY: install install-bin | ||||
| install:: all install-bin | ||||
|  | ||||
| $(OBJDIR)/%.o: $(OBJDIR)/%.cc | ||||
| 	@mkdir -p $(dir $@) | ||||
| 	@echo CXX $< | ||||
| 	@$(CXX) $(CFLAGS) $(CXXFLAGS) -MMD -MP -MF $(@:.o=.d) -c -o $@ $< | ||||
| 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" | ||||
|  | ||||
| $(OBJDIR)/%.o: %.c | ||||
| 	@mkdir -p $(dir $@) | ||||
| 	@echo CC $< | ||||
| 	@$(CC) $(CFLAGS) $(CFLAGS) -MMD -MP -MF $(@:.o=.d) -c -o $@ $< | ||||
|  | ||||
| $(OBJDIR)/%.pb.h: %.proto | ||||
| 	@mkdir -p $(dir $@) | ||||
| 	@echo PROTOC $@ | ||||
| 	@$(PROTOC) -I. --cpp_out=$(OBJDIR) $< | ||||
|  | ||||
| clean: | ||||
| 	rm -rf $(OBJDIR) | ||||
|  | ||||
| install: install-bin # install-man install-docs ... | ||||
|  | ||||
| install-bin: fluxengine$(EXT) fluxengine-gui$(EXT) brother120tool$(EXT) brother240tool$(EXT) upgrade-flux-file$(EXT) | ||||
| 	install -d "$(DESTDIR)$(BINDIR)" | ||||
| 	for target in $^; do \ | ||||
| 		install $$target "$(DESTDIR)$(BINDIR)/$$target"; \ | ||||
| 	done | ||||
|  | ||||
| -include $(OBJS:%.o=%.d) | ||||
| include build/ab.mk | ||||
|   | ||||
| @@ -128,11 +128,12 @@ choices because they can store multiple types of file system. | ||||
| | [`icl30`](doc/disk-icl30.md) | ICL Model 30: CP/M; 263kB 35-track DSSD | 🦖 |  | CPMFS  | | ||||
| | [`mac`](doc/disk-mac.md) | Macintosh: 400kB/800kB 3.5" GCR | 🦄 | 🦄 | MACHFS  | | ||||
| | [`micropolis`](doc/disk-micropolis.md) | Micropolis: 100tpi MetaFloppy disks | 🦄 | 🦄 |  | | ||||
| | [`ms2000`](doc/disk-ms2000.md) | : MS2000 Microdisk Development System |  |  | MICRODOS  | | ||||
| | [`mx`](doc/disk-mx.md) | DVK MX: Soviet-era PDP-11 clone | 🦖 |  |  | | ||||
| | [`n88basic`](doc/disk-n88basic.md) | N88-BASIC: PC8800/PC98 5.25" 77-track 26-sector DSHD | 🦄 | 🦄 |  | | ||||
| | [`northstar`](doc/disk-northstar.md) | Northstar: 5.25" hard sectored | 🦄 | 🦄 |  | | ||||
| | [`psos`](doc/disk-psos.md) | pSOS: 800kB DSDD with PHILE | 🦄 | 🦄 | PHILE  | | ||||
| | [`rolandd20`](doc/disk-rolandd20.md) | Roland D20: 3.5" electronic synthesiser disks | 🦖 |  |  | | ||||
| | [`rolandd20`](doc/disk-rolandd20.md) | Roland D20: 3.5" electronic synthesiser disks | 🦄 | 🦖 | ROLAND  | | ||||
| | [`rx50`](doc/disk-rx50.md) | Digital RX50: 400kB 5.25" 80-track 10-sector SSDD | 🦖 | 🦖 |  | | ||||
| | [`smaky6`](doc/disk-smaky6.md) | Smaky 6: 308kB 5.25" 77-track 16-sector SSDD, hard sectored | 🦖 |  | SMAKY6  | | ||||
| | [`tids990`](doc/disk-tids990.md) | Texas Instruments DS990: 1126kB 8" DSSD | 🦖 | 🦖 |  | | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| #include "globals.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "aeslanier.h" | ||||
| #include "crc.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "sector.h" | ||||
| #include "bytes.h" | ||||
| #include "lib/crc.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "lib/sector.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "fmt/format.h" | ||||
| #include <string.h> | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| #include "globals.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "agat.h" | ||||
| #include "bytes.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "fmt/format.h" | ||||
|  | ||||
| uint8_t agatChecksum(const Bytes& bytes) | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| #include "globals.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "agat.h" | ||||
| #include "crc.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "sector.h" | ||||
| #include "bytes.h" | ||||
| #include "lib/crc.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "lib/sector.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "fmt/format.h" | ||||
| #include <string.h> | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| #include "globals.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "amiga.h" | ||||
| #include "bytes.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "fmt/format.h" | ||||
|  | ||||
| uint32_t amigaChecksum(const Bytes& bytes) | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| #ifndef AMIGA_H | ||||
| #define AMIGA_H | ||||
|  | ||||
| #include "encoders/encoders.h" | ||||
| #include "lib/encoders/encoders.h" | ||||
|  | ||||
| #define AMIGA_SECTOR_RECORD 0xaaaa44894489LL | ||||
|  | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| #include "globals.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "protocol.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "sector.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/sector.h" | ||||
| #include "amiga.h" | ||||
| #include "bytes.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "fmt/format.h" | ||||
| #include "lib/decoders/decoders.pb.h" | ||||
| #include <string.h> | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| #include "globals.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/encoders/encoders.h" | ||||
| #include "amiga.h" | ||||
| #include "crc.h" | ||||
| #include "readerwriter.h" | ||||
| #include "image.h" | ||||
| #include "lib/crc.h" | ||||
| #include "lib/readerwriter.h" | ||||
| #include "lib/image.h" | ||||
| #include "arch/amiga/amiga.pb.h" | ||||
| #include "lib/encoders/encoders.pb.h" | ||||
|  | ||||
|   | ||||
| @@ -2,8 +2,8 @@ | ||||
| #define APPLE2_H | ||||
|  | ||||
| #include <memory.h> | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/encoders/encoders.h" | ||||
|  | ||||
| #define APPLE2_SECTOR_RECORD 0xd5aa96 | ||||
| #define APPLE2_DATA_RECORD 0xd5aaad | ||||
|   | ||||
| @@ -1,13 +1,13 @@ | ||||
| #include "globals.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "protocol.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "sector.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/sector.h" | ||||
| #include "apple2.h" | ||||
| #include "arch/apple2/apple2.pb.h" | ||||
| #include "lib/decoders/decoders.pb.h" | ||||
| #include "bytes.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "fmt/format.h" | ||||
| #include <string.h> | ||||
| #include <algorithm> | ||||
|   | ||||
| @@ -1,14 +1,14 @@ | ||||
| #include "globals.h" | ||||
| #include "lib/globals.h" | ||||
| #include "arch/apple2/apple2.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
| #include "sector.h" | ||||
| #include "readerwriter.h" | ||||
| #include "image.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/encoders/encoders.h" | ||||
| #include "lib/sector.h" | ||||
| #include "lib/readerwriter.h" | ||||
| #include "lib/image.h" | ||||
| #include "fmt/format.h" | ||||
| #include "lib/encoders/encoders.pb.h" | ||||
| #include <ctype.h> | ||||
| #include "bytes.h" | ||||
| #include "lib/bytes.h" | ||||
|  | ||||
| static int encode_data_gcr(uint8_t data) | ||||
| { | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| #include "globals.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/encoders/encoders.h" | ||||
| #include "brother.h" | ||||
| #include "sector.h" | ||||
| #include "bytes.h" | ||||
| #include "crc.h" | ||||
| #include "lib/sector.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "lib/crc.h" | ||||
| #include <ctype.h> | ||||
|  | ||||
| const FluxPattern SECTOR_RECORD_PATTERN(32, BROTHER_SECTOR_RECORD); | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| #include "globals.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/encoders/encoders.h" | ||||
| #include "brother.h" | ||||
| #include "crc.h" | ||||
| #include "readerwriter.h" | ||||
| #include "image.h" | ||||
| #include "lib/crc.h" | ||||
| #include "lib/readerwriter.h" | ||||
| #include "lib/image.h" | ||||
| #include "arch/brother/brother.pb.h" | ||||
| #include "lib/encoders/encoders.pb.h" | ||||
|  | ||||
|   | ||||
| @@ -1,43 +0,0 @@ | ||||
| LIBARCH_SRCS = \ | ||||
| 	arch/aeslanier/decoder.cc \ | ||||
| 	arch/agat/agat.cc \ | ||||
| 	arch/agat/decoder.cc \ | ||||
| 	arch/agat/encoder.cc \ | ||||
| 	arch/amiga/amiga.cc \ | ||||
| 	arch/amiga/decoder.cc \ | ||||
| 	arch/amiga/encoder.cc \ | ||||
| 	arch/apple2/decoder.cc \ | ||||
| 	arch/apple2/encoder.cc \ | ||||
| 	arch/brother/decoder.cc \ | ||||
| 	arch/brother/encoder.cc \ | ||||
| 	arch/c64/c64.cc \ | ||||
| 	arch/c64/decoder.cc \ | ||||
| 	arch/c64/encoder.cc \ | ||||
| 	arch/f85/decoder.cc \ | ||||
| 	arch/fb100/decoder.cc \ | ||||
| 	arch/ibm/decoder.cc \ | ||||
| 	arch/ibm/encoder.cc \ | ||||
| 	arch/macintosh/decoder.cc \ | ||||
| 	arch/macintosh/encoder.cc \ | ||||
| 	arch/micropolis/decoder.cc \ | ||||
| 	arch/micropolis/encoder.cc \ | ||||
| 	arch/mx/decoder.cc \ | ||||
| 	arch/northstar/decoder.cc \ | ||||
| 	arch/northstar/encoder.cc \ | ||||
| 	arch/rolandd20/decoder.cc \ | ||||
| 	arch/smaky6/decoder.cc \ | ||||
| 	arch/tids990/decoder.cc \ | ||||
| 	arch/tids990/encoder.cc \ | ||||
| 	arch/victor9k/decoder.cc \ | ||||
| 	arch/victor9k/encoder.cc \ | ||||
| 	arch/zilogmcz/decoder.cc \ | ||||
|  | ||||
| LIBARCH_OBJS = $(patsubst %.cc, $(OBJDIR)/%.o, $(LIBARCH_SRCS)) | ||||
| OBJS += $(LIBARCH_OBJS) | ||||
| $(LIBARCH_SRCS): | $(PROTO_HDRS) | ||||
| $(LIBARCH_SRCS): CFLAGS += $(PROTO_CFLAGS) | ||||
| LIBARCH_LIB = $(OBJDIR)/libarch.a | ||||
| LIBARCH_LDFLAGS = | ||||
| $(LIBARCH_LIB): $(LIBARCH_OBJS) | ||||
|  | ||||
| $(call use-pkgconfig, $(LIBARCH_LIB), $(LIBARCH_OBJS), fmt) | ||||
							
								
								
									
										26
									
								
								arch/build.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								arch/build.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| from build.c import cxxlibrary | ||||
| from build.protobuf import proto, protocc | ||||
|  | ||||
| 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", | ||||
|     ], | ||||
| ) | ||||
| @@ -1,4 +1,4 @@ | ||||
| #include "globals.h" | ||||
| #include "lib/globals.h" | ||||
| #include "c64.h" | ||||
|  | ||||
| /* | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| #ifndef C64_H | ||||
| #define C64_H | ||||
|  | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/encoders/encoders.h" | ||||
|  | ||||
| #define C64_SECTOR_RECORD 0xffd49 | ||||
| #define C64_DATA_RECORD 0xffd57 | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| #include "globals.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "protocol.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "sector.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/sector.h" | ||||
| #include "c64.h" | ||||
| #include "crc.h" | ||||
| #include "bytes.h" | ||||
| #include "lib/crc.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "fmt/format.h" | ||||
| #include <string.h> | ||||
| #include <algorithm> | ||||
|   | ||||
| @@ -1,17 +1,17 @@ | ||||
| #include "globals.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/encoders/encoders.h" | ||||
| #include "c64.h" | ||||
| #include "crc.h" | ||||
| #include "sector.h" | ||||
| #include "readerwriter.h" | ||||
| #include "image.h" | ||||
| #include "lib/crc.h" | ||||
| #include "lib/sector.h" | ||||
| #include "lib/readerwriter.h" | ||||
| #include "lib/image.h" | ||||
| #include "fmt/format.h" | ||||
| #include "arch/c64/c64.pb.h" | ||||
| #include "lib/encoders/encoders.pb.h" | ||||
| #include "lib/layout.h" | ||||
| #include <ctype.h> | ||||
| #include "bytes.h" | ||||
| #include "lib/bytes.h" | ||||
|  | ||||
| static bool lastBit; | ||||
|  | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| #include "globals.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "protocol.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "sector.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/sector.h" | ||||
| #include "f85.h" | ||||
| #include "crc.h" | ||||
| #include "bytes.h" | ||||
| #include "lib/crc.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "fmt/format.h" | ||||
| #include <string.h> | ||||
| #include <algorithm> | ||||
|   | ||||
| @@ -1,13 +1,13 @@ | ||||
| #include "globals.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "protocol.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "sector.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/sector.h" | ||||
| #include "fb100.h" | ||||
| #include "crc.h" | ||||
| #include "bytes.h" | ||||
| #include "decoders/rawbits.h" | ||||
| #include "lib/crc.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "lib/decoders/rawbits.h" | ||||
| #include "fmt/format.h" | ||||
| #include <string.h> | ||||
| #include <algorithm> | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| #include "globals.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "ibm.h" | ||||
| #include "crc.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "sector.h" | ||||
| #include "lib/crc.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "lib/sector.h" | ||||
| #include "arch/ibm/ibm.pb.h" | ||||
| #include "proto.h" | ||||
| #include "lib/proto.h" | ||||
| #include "lib/layout.h" | ||||
| #include <string.h> | ||||
|  | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| #include "globals.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/encoders/encoders.h" | ||||
| #include "ibm.h" | ||||
| #include "crc.h" | ||||
| #include "readerwriter.h" | ||||
| #include "image.h" | ||||
| #include "lib/crc.h" | ||||
| #include "lib/readerwriter.h" | ||||
| #include "lib/image.h" | ||||
| #include "arch/ibm/ibm.pb.h" | ||||
| #include "lib/encoders/encoders.pb.h" | ||||
| #include "fmt/format.h" | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| #include "globals.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "protocol.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "sector.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/sector.h" | ||||
| #include "macintosh.h" | ||||
| #include "bytes.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "fmt/format.h" | ||||
| #include <string.h> | ||||
| #include <algorithm> | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| #include "globals.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/encoders/encoders.h" | ||||
| #include "macintosh.h" | ||||
| #include "crc.h" | ||||
| #include "readerwriter.h" | ||||
| #include "image.h" | ||||
| #include "lib/crc.h" | ||||
| #include "lib/readerwriter.h" | ||||
| #include "lib/image.h" | ||||
| #include "fmt/format.h" | ||||
| #include "lib/encoders/encoders.pb.h" | ||||
| #include "lib/layout.h" | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| #include "globals.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "sector.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/sector.h" | ||||
| #include "micropolis.h" | ||||
| #include "bytes.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "fmt/format.h" | ||||
| #include "lib/decoders/decoders.pb.h" | ||||
|  | ||||
| @@ -59,6 +59,76 @@ uint8_t mzosChecksum(const Bytes& bytes) | ||||
|     return checksum; | ||||
| } | ||||
|  | ||||
| static uint8_t b(uint32_t field, uint8_t pos) | ||||
| { | ||||
|     return (field >> pos) & 1; | ||||
| } | ||||
|  | ||||
| static uint8_t eccNextBit(uint32_t ecc, uint8_t data_bit) | ||||
| { | ||||
|     // This is 0x81932080 which is 0x0104C981 with reversed bits | ||||
|     return b(ecc, 7) ^ b(ecc, 13) ^ b(ecc, 16) ^ b(ecc, 17) ^ b(ecc, 20) ^ | ||||
|            b(ecc, 23) ^ b(ecc, 24) ^ b(ecc, 31) ^ data_bit; | ||||
| } | ||||
|  | ||||
| uint32_t vectorGraphicEcc(const Bytes& bytes) | ||||
| { | ||||
|     uint32_t e = 0; | ||||
|     Bytes payloadBytes = bytes.slice(0, bytes.size() - 4); | ||||
|     ByteReader payload(payloadBytes); | ||||
|     while (!payload.eof()) | ||||
|     { | ||||
|         uint8_t byte = payload.read_8(); | ||||
|         for (int i = 0; i < 8; i++) | ||||
|         { | ||||
|             e = (e << 1) | eccNextBit(e, byte >> 7); | ||||
|             byte <<= 1; | ||||
|         } | ||||
|     } | ||||
|     Bytes trailerBytes = bytes.slice(bytes.size() - 4); | ||||
|     ByteReader trailer(trailerBytes); | ||||
|     uint32_t res = e; | ||||
|     while (!trailer.eof()) | ||||
|     { | ||||
|         uint8_t byte = trailer.read_8(); | ||||
|         for (int i = 0; i < 8; i++) | ||||
|         { | ||||
|             res = (res << 1) | eccNextBit(e, byte >> 7); | ||||
|             e <<= 1; | ||||
|             byte <<= 1; | ||||
|         } | ||||
|     } | ||||
|     return res; | ||||
| } | ||||
|  | ||||
| /* Fixes bytes when possible, returning true if changed. */ | ||||
| static bool vectorGraphicEccFix(Bytes& bytes, uint32_t syndrome) | ||||
| { | ||||
|     uint32_t ecc = syndrome; | ||||
|     int pos = (MICROPOLIS_ENCODED_SECTOR_SIZE - 5) * 8 + 7; | ||||
|     bool aligned = false; | ||||
|     while ((ecc & 0xff000000) == 0) | ||||
|     { | ||||
|         pos += 8; | ||||
|         ecc <<= 8; | ||||
|     } | ||||
|     for (; pos >= 0; pos--) | ||||
|     { | ||||
|         bool bit = ecc & 1; | ||||
|         ecc >>= 1; | ||||
|         if (bit) | ||||
|             ecc ^= 0x808264c0; | ||||
|         if ((ecc & 0xff07ffff) == 0) | ||||
|             aligned = true; | ||||
|         if (aligned && pos % 8 == 0) | ||||
|             break; | ||||
|     } | ||||
|     if (pos < 0) | ||||
|         return false; | ||||
|     bytes[pos / 8] ^= ecc >> 16; | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| class MicropolisDecoder : public Decoder | ||||
| { | ||||
| public: | ||||
| @@ -85,9 +155,10 @@ public: | ||||
|         /* Discard a possible partial sector at the end of the track. | ||||
|          * This partial sector could be mistaken for a conflicted sector, if | ||||
|          * whatever data read happens to match the checksum of 0, which is | ||||
|          * rare, but has been observed on some disks. | ||||
|          * rare, but has been observed on some disks. There's 570uS of slack in | ||||
|          * each sector, after accounting for preamble, data, and postamble. | ||||
|          */ | ||||
|         if (now > (getFluxmapDuration() - 12.5e6)) | ||||
|         if (now > (getFluxmapDuration() - 12.0e6)) | ||||
|         { | ||||
|             seekToIndexMark(); | ||||
|             return 0; | ||||
| @@ -114,9 +185,10 @@ public: | ||||
|         _sector->headerStartTime = tell().ns(); | ||||
|  | ||||
|         /* seekToPattern() can skip past the index hole, if this happens | ||||
|          * too close to the end of the Fluxmap, discard the sector. | ||||
|          * too close to the end of the Fluxmap, discard the sector. The | ||||
|          * preamble was expected to be 640uS long. | ||||
|          */ | ||||
|         if (_sector->headerStartTime > (getFluxmapDuration() - 12.5e6)) | ||||
|         if (_sector->headerStartTime > (getFluxmapDuration() - 11.3e6)) | ||||
|         { | ||||
|             return 0; | ||||
|         } | ||||
| @@ -130,6 +202,19 @@ public: | ||||
|         auto rawbits = readRawBits(MICROPOLIS_ENCODED_SECTOR_SIZE * 16); | ||||
|         auto bytes = | ||||
|             decodeFmMfm(rawbits).slice(0, MICROPOLIS_ENCODED_SECTOR_SIZE); | ||||
|  | ||||
|         bool eccPresent = bytes[274] == 0xaa; | ||||
|         uint32_t ecc = 0; | ||||
|         if (_config.ecc_type() == MicropolisDecoderProto::VECTOR && eccPresent) | ||||
|         { | ||||
|             ecc = vectorGraphicEcc(bytes.slice(0, 274)); | ||||
|             if (ecc != 0) | ||||
|             { | ||||
|                 vectorGraphicEccFix(bytes, ecc); | ||||
|                 ecc = vectorGraphicEcc(bytes.slice(0, 274)); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         ByteReader br(bytes); | ||||
|  | ||||
|         int syncByte = br.read_8(); /* sync */ | ||||
| @@ -191,8 +276,10 @@ public: | ||||
|             _sector->data = bytes; | ||||
|         else | ||||
|             error("Sector output size may only be 256 or 275"); | ||||
|         _sector->status = | ||||
|             (wantChecksum == gotChecksum) ? Sector::OK : Sector::BAD_CHECKSUM; | ||||
|         if (wantChecksum == gotChecksum && (!eccPresent || ecc == 0)) | ||||
|             _sector->status = Sector::OK; | ||||
|         else | ||||
|             _sector->status = Sector::BAD_CHECKSUM; | ||||
|     } | ||||
|  | ||||
| private: | ||||
|   | ||||
| @@ -1,14 +1,15 @@ | ||||
| #include "globals.h" | ||||
| #include "lib/globals.h" | ||||
| #include "micropolis.h" | ||||
| #include "sector.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
| #include "image.h" | ||||
| #include "lib/sector.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/encoders/encoders.h" | ||||
| #include "lib/image.h" | ||||
| #include "lib/encoders/encoders.pb.h" | ||||
|  | ||||
| static void write_sector(std::vector<bool>& bits, | ||||
|     unsigned& cursor, | ||||
|     const std::shared_ptr<const Sector>& sector) | ||||
|     const std::shared_ptr<const Sector>& sector, | ||||
|     MicropolisEncoderProto::EccType eccType) | ||||
| { | ||||
|     if ((sector->data.size() != 256) && | ||||
|         (sector->data.size() != MICROPOLIS_ENCODED_SECTOR_SIZE)) | ||||
| @@ -45,8 +46,16 @@ static void write_sector(std::vector<bool>& bits, | ||||
|             writer.write_8(0); /* Padding */ | ||||
|         writer += sector->data; | ||||
|         writer.write_8(micropolisChecksum(sectorData.slice(1))); | ||||
|         for (int i = 0; i < 5; i++) | ||||
|             writer.write_8(0); /* 4 byte ECC and ECC not present flag */ | ||||
|  | ||||
|         uint8_t eccPresent = 0; | ||||
|         uint32_t ecc = 0; | ||||
|         if (eccType == MicropolisEncoderProto::VECTOR) | ||||
|         { | ||||
|             eccPresent = 0xaa; | ||||
|             ecc = vectorGraphicEcc(sectorData + Bytes(4)); | ||||
|         } | ||||
|         writer.write_be32(ecc); | ||||
|         writer.write_8(eccPresent); | ||||
|     } | ||||
|     for (uint8_t b : sectorData) | ||||
|         fullSector->push_back(b); | ||||
| @@ -86,18 +95,34 @@ public: | ||||
|             (_config.rotational_period_ms() * 1e3) / _config.clock_period_us(); | ||||
|  | ||||
|         std::vector<bool> bits(bitsPerRevolution); | ||||
|         std::vector<unsigned> indexes; | ||||
|         unsigned prev_cursor = 0; | ||||
|         unsigned cursor = 0; | ||||
|  | ||||
|         for (const auto& sectorData : sectors) | ||||
|             write_sector(bits, cursor, sectorData); | ||||
|         { | ||||
|             indexes.push_back(cursor); | ||||
|             prev_cursor = cursor; | ||||
|             write_sector(bits, cursor, sectorData, _config.ecc_type()); | ||||
|         } | ||||
|         indexes.push_back(prev_cursor + (cursor - prev_cursor) / 2); | ||||
|         indexes.push_back(cursor); | ||||
|  | ||||
|         if (cursor != bits.size()) | ||||
|             error("track data mismatched length"); | ||||
|  | ||||
|         std::unique_ptr<Fluxmap> fluxmap(new Fluxmap); | ||||
|         fluxmap->appendBits(bits, | ||||
|         nanoseconds_t clockPeriod = | ||||
|             calculatePhysicalClockPeriod(_config.clock_period_us() * 1e3, | ||||
|                 _config.rotational_period_ms() * 1e6)); | ||||
|                 _config.rotational_period_ms() * 1e6); | ||||
|         auto pos = bits.begin(); | ||||
|         for (int i = 1; i < indexes.size(); i++) | ||||
|         { | ||||
|             auto end = bits.begin() + indexes[i]; | ||||
|             fluxmap->appendBits(std::vector<bool>(pos, end), clockPeriod); | ||||
|             fluxmap->appendIndex(); | ||||
|             pos = end; | ||||
|         } | ||||
|         return fluxmap; | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -17,5 +17,6 @@ extern std::unique_ptr<Encoder> createMicropolisEncoder( | ||||
|     const EncoderProto& config); | ||||
|  | ||||
| extern uint8_t micropolisChecksum(const Bytes& bytes); | ||||
| extern uint32_t vectorGraphicEcc(const Bytes& bytes); | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -8,17 +8,30 @@ message MicropolisDecoderProto { | ||||
| 		MICROPOLIS = 1; | ||||
| 		MZOS = 2; | ||||
| 	} | ||||
| 	enum EccType { | ||||
| 		NONE = 0; | ||||
| 		VECTOR = 1; | ||||
| 	} | ||||
|  | ||||
| 	optional int32 sector_output_size = 1 [default = 256, | ||||
| 		(help) = "How much of the raw sector should be saved. Must be 256 or 275"]; | ||||
| 	optional ChecksumType checksum_type = 2 [default = AUTO, | ||||
| 		(help) = "Checksum type to use: AUTO, MICROPOLIS, MZOS"]; | ||||
| 	optional EccType ecc_type = 3 [default = NONE, | ||||
| 		(help) = "ECC type to use: NONE, VECTOR"]; | ||||
| } | ||||
|  | ||||
| message MicropolisEncoderProto { | ||||
|     enum EccType { | ||||
|         NONE = 0; | ||||
|         VECTOR = 1; | ||||
|     } | ||||
|  | ||||
|     optional double clock_period_us = 1 | ||||
|         [ default = 2.0, (help) = "clock rate on the real device" ]; | ||||
|     optional double rotational_period_ms = 2 | ||||
|         [ default = 200.0, (help) = "rotational period on the real device" ]; | ||||
|     optional EccType ecc_type = 3 [default = NONE, | ||||
|         (help) = "ECC type to use for IMG data: NONE, VECTOR"]; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| #include "globals.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "mx/mx.h" | ||||
| #include "crc.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "sector.h" | ||||
| #include "lib/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 <string.h> | ||||
|  | ||||
| const int SECTOR_SIZE = 256; | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| #ifndef MX_H | ||||
| #define MX_H | ||||
|  | ||||
| #include "decoders/decoders.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
|  | ||||
| extern std::unique_ptr<Decoder> createMxDecoder(const DecoderProto& config); | ||||
|  | ||||
|   | ||||
| @@ -11,13 +11,13 @@ | ||||
|  * sure that the hardSectorId is correct. | ||||
|  */ | ||||
|  | ||||
| #include "globals.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "sector.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/sector.h" | ||||
| #include "northstar.h" | ||||
| #include "bytes.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "lib/decoders/decoders.pb.h" | ||||
| #include "fmt/format.h" | ||||
|  | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| #include "globals.h" | ||||
| #include "lib/globals.h" | ||||
| #include "northstar.h" | ||||
| #include "sector.h" | ||||
| #include "bytes.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
| #include "image.h" | ||||
| #include "lib/sector.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/encoders/encoders.h" | ||||
| #include "lib/image.h" | ||||
| #include "lib/encoders/encoders.pb.h" | ||||
|  | ||||
| #define GAP_FILL_SIZE_SD 30 | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| #include "globals.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "protocol.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "sector.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/sector.h" | ||||
| #include "smaky6.h" | ||||
| #include "bytes.h" | ||||
| #include "crc.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "lib/crc.h" | ||||
| #include "fmt/format.h" | ||||
| #include "lib/decoders/decoders.pb.h" | ||||
| #include <string.h> | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| #include "globals.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
| #include "tids990/tids990.h" | ||||
| #include "crc.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "sector.h" | ||||
| #include "lib/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 <string.h> | ||||
| #include <fmt/format.h> | ||||
|  | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| #include "globals.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/encoders/encoders.h" | ||||
| #include "tids990.h" | ||||
| #include "crc.h" | ||||
| #include "readerwriter.h" | ||||
| #include "image.h" | ||||
| #include "lib/crc.h" | ||||
| #include "lib/readerwriter.h" | ||||
| #include "lib/image.h" | ||||
| #include "arch/tids990/tids990.pb.h" | ||||
| #include "lib/encoders/encoders.pb.h" | ||||
| #include <fmt/format.h> | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| #include "globals.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "protocol.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "sector.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/sector.h" | ||||
| #include "victor9k.h" | ||||
| #include "crc.h" | ||||
| #include "bytes.h" | ||||
| #include "lib/crc.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "fmt/format.h" | ||||
| #include <string.h> | ||||
| #include <algorithm> | ||||
|   | ||||
| @@ -1,17 +1,17 @@ | ||||
| #include "globals.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/encoders/encoders.h" | ||||
| #include "victor9k.h" | ||||
| #include "crc.h" | ||||
| #include "sector.h" | ||||
| #include "readerwriter.h" | ||||
| #include "image.h" | ||||
| #include "lib/crc.h" | ||||
| #include "lib/sector.h" | ||||
| #include "lib/readerwriter.h" | ||||
| #include "lib/image.h" | ||||
| #include "fmt/format.h" | ||||
| #include "arch/victor9k/victor9k.pb.h" | ||||
| #include "lib/encoders/encoders.pb.h" | ||||
| #include "lib/layout.h" | ||||
| #include <ctype.h> | ||||
| #include "bytes.h" | ||||
| #include "lib/bytes.h" | ||||
|  | ||||
| static bool lastBit; | ||||
|  | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| #include "globals.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "protocol.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "sector.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/sector.h" | ||||
| #include "zilogmcz.h" | ||||
| #include "bytes.h" | ||||
| #include "crc.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "lib/crc.h" | ||||
| #include "fmt/format.h" | ||||
| #include <string.h> | ||||
| #include <algorithm> | ||||
|   | ||||
							
								
								
									
										194
									
								
								build.lua
									
									
									
									
									
								
							
							
						
						
									
										194
									
								
								build.lua
									
									
									
									
									
								
							| @@ -1,194 +0,0 @@ | ||||
| vars.cflags = { "$(CFLAGS)" } | ||||
| vars.cxxflags = { "$(CXXFLAGS)" } | ||||
| vars.ldflags = { "-pthread" } | ||||
|  | ||||
| include "build/protobuf.lua" | ||||
| include "build/dependency.lua" | ||||
| include "build/tests.lua" | ||||
|  | ||||
| dependency { | ||||
| 	name = "fmt_dep", | ||||
| 	pkg_config = "fmt", | ||||
| } | ||||
|  | ||||
| dependency { | ||||
| 	name = "stb_dep", | ||||
| 	pkg_config = "stb", | ||||
| 	fallback = "dep/stb+stb" | ||||
| } | ||||
|  | ||||
| dependency { | ||||
| 	name = "protobuf_dep", | ||||
| 	pkg_config = "protobuf" | ||||
| } | ||||
|  | ||||
| dependency { | ||||
| 	name = "zlib_dep", | ||||
| 	pkg_config = "zlib" | ||||
| } | ||||
|  | ||||
| proto_cc_library { | ||||
| 	name = "config_lib", | ||||
| 	srcs = { | ||||
| 		"./lib/common.proto", | ||||
| 		"./lib/config.proto", | ||||
| 		"./lib/decoders/decoders.proto", | ||||
| 		"./lib/drive.proto", | ||||
| 		"./lib/encoders/encoders.proto", | ||||
| 		"./lib/fl2.proto", | ||||
| 		"./lib/fluxsink/fluxsink.proto", | ||||
| 		"./lib/fluxsource/fluxsource.proto", | ||||
| 		"./lib/imagereader/imagereader.proto", | ||||
| 		"./lib/imagewriter/imagewriter.proto", | ||||
| 		"./lib/mapper.proto", | ||||
| 		"./lib/usb/usb.proto", | ||||
| 		"./arch/aeslanier/aeslanier.proto", | ||||
| 		"./arch/agat/agat.proto", | ||||
| 		"./arch/amiga/amiga.proto", | ||||
| 		"./arch/apple2/apple2.proto", | ||||
| 		"./arch/brother/brother.proto", | ||||
| 		"./arch/c64/c64.proto", | ||||
| 		"./arch/f85/f85.proto", | ||||
| 		"./arch/fb100/fb100.proto", | ||||
| 		"./arch/ibm/ibm.proto", | ||||
| 		"./arch/macintosh/macintosh.proto", | ||||
| 		"./arch/micropolis/micropolis.proto", | ||||
| 		"./arch/mx/mx.proto", | ||||
| 		"./arch/northstar/northstar.proto", | ||||
| 		"./arch/rolandd20/rolandd20.proto", | ||||
| 		"./arch/tids990/tids990.proto", | ||||
| 		"./arch/victor9k/victor9k.proto", | ||||
| 		"./arch/zilogmcz/zilogmcz.proto", | ||||
| 	} | ||||
| } | ||||
|  | ||||
| clibrary { | ||||
| 	name = "protocol_lib", | ||||
| 	hdrs = { "./protocol.h" } | ||||
| } | ||||
|  | ||||
| clibrary { | ||||
| 	name = "libfluxengine", | ||||
| 	srcs = { | ||||
| 		"./arch/aeslanier/decoder.cc", | ||||
| 		"./arch/agat/agat.cc", | ||||
| 		"./arch/agat/decoder.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/rolandd20.cc", | ||||
| 		"./arch/tids990/decoder.cc", | ||||
| 		"./arch/tids990/encoder.cc", | ||||
| 		"./arch/victor9k/decoder.cc", | ||||
| 		"./arch/victor9k/encoder.cc", | ||||
| 		"./arch/zilogmcz/decoder.cc", | ||||
| 		"./lib/bitmap.cc", | ||||
| 		"./lib/bytes.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/flags.cc", | ||||
| 		"./lib/fluxmap.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/cwffluxsource.cc", | ||||
| 		"./lib/fluxsource/erasefluxsource.cc", | ||||
| 		"./lib/fluxsource/fl2fluxsource.cc", | ||||
| 		"./lib/fluxsource/fluxsource.cc", | ||||
| 		"./lib/fluxsource/hardwarefluxsource.cc", | ||||
| 		"./lib/fluxsource/kryoflux.cc", | ||||
| 		"./lib/fluxsource/kryofluxfluxsource.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/imgimagewriter.cc", | ||||
| 		"./lib/imagewriter/ldbsimagewriter.cc", | ||||
| 		"./lib/imagewriter/nsiimagewriter.cc", | ||||
| 		"./lib/imagewriter/rawimagewriter.cc", | ||||
| 		"./lib/imginputoutpututils.cc", | ||||
| 		"./lib/ldbs.cc", | ||||
| 		"./lib/logger.cc", | ||||
| 		"./lib/mapper.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", | ||||
| 		"protocol.h", | ||||
| 	}, | ||||
| 	deps = { | ||||
| 		"+config_lib", | ||||
| 		"+protocol_lib", | ||||
| 		"+fmt_dep", | ||||
| 		"+protobuf_dep", | ||||
| 		"+zlib_dep", | ||||
| 		"dep/libusbp+libusbp", | ||||
| 	}, | ||||
| 	dep_cflags = { "-Ilib", "-Iarch", "-I." }, | ||||
| 	vars = { | ||||
| 		["+cflags"] = { "-Ilib", "-Iarch", "-I." } | ||||
| 	} | ||||
| } | ||||
|  | ||||
| installable { | ||||
| 	name = "all", | ||||
| 	map = { | ||||
| 		["fluxengine"] = "src+fluxengine", | ||||
| 		["fluxengine-gui"] = "src/gui+fluxengine", | ||||
| 		["brother120tool"] = "tools+brother120tool", | ||||
| 		["brother240tool"] = "tools+brother240tool", | ||||
| 		["upgrade-flux-file"] = "tools+upgrade-flux-file", | ||||
| 	} | ||||
| } | ||||
|  | ||||
| include "tests/build.lua" | ||||
|  | ||||
							
								
								
									
										314
									
								
								build.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										314
									
								
								build.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,314 @@ | ||||
| from build.ab import export | ||||
| from build.c import clibrary, cxxlibrary | ||||
| from build.protobuf import proto, protocc | ||||
| from build.pkg import package | ||||
| from build.utils import test | ||||
| from glob import glob | ||||
| import config | ||||
| import re | ||||
|  | ||||
| package(name="protobuf_lib", package="protobuf") | ||||
| package(name="z_lib", package="zlib") | ||||
| package(name="fmt_lib", package="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") | ||||
| else: | ||||
|     corpus = [ | ||||
|         ("acorndfs", "", "--200"), | ||||
|         ("agat", "", ""), | ||||
|         ("amiga", "", ""), | ||||
|         ("apple2", "", "--140 40track_drive"), | ||||
|         ("atarist", "", "--360"), | ||||
|         ("atarist", "", "--370"), | ||||
|         ("atarist", "", "--400"), | ||||
|         ("atarist", "", "--410"), | ||||
|         ("atarist", "", "--720"), | ||||
|         ("atarist", "", "--740"), | ||||
|         ("atarist", "", "--800"), | ||||
|         ("atarist", "", "--820"), | ||||
|         ("bk", "", ""), | ||||
|         ("brother", "", "--120 40track_drive"), | ||||
|         ("brother", "", "--240"), | ||||
|         ( | ||||
|             "commodore", | ||||
|             "scripts/commodore1541_test.textpb", | ||||
|             "--171 40track_drive", | ||||
|         ), | ||||
|         ( | ||||
|             "commodore", | ||||
|             "scripts/commodore1541_test.textpb", | ||||
|             "--192 40track_drive", | ||||
|         ), | ||||
|         ("commodore", "", "--800"), | ||||
|         ("commodore", "", "--1620"), | ||||
|         ("hplif", "", "--264"), | ||||
|         ("hplif", "", "--608"), | ||||
|         ("hplif", "", "--616"), | ||||
|         ("hplif", "", "--770"), | ||||
|         ("ibm", "", "--1200"), | ||||
|         ("ibm", "", "--1232"), | ||||
|         ("ibm", "", "--1440"), | ||||
|         ("ibm", "", "--1680"), | ||||
|         ("ibm", "", "--180 40track_drive"), | ||||
|         ("ibm", "", "--160 40track_drive"), | ||||
|         ("ibm", "", "--320 40track_drive"), | ||||
|         ("ibm", "", "--360 40track_drive"), | ||||
|         ("ibm", "", "--720_96"), | ||||
|         ("ibm", "", "--720_135"), | ||||
|         ("mac", "scripts/mac400_test.textpb", "--400"), | ||||
|         ("mac", "scripts/mac800_test.textpb", "--800"), | ||||
|         ("n88basic", "", ""), | ||||
|         ("rx50", "", ""), | ||||
|         ("tids990", "", ""), | ||||
|         ("victor9k", "", "--612"), | ||||
|         ("victor9k", "", "--1224"), | ||||
|     ] | ||||
|  | ||||
|     for c in corpus: | ||||
|         name = re.sub(r"[^a-zA-Z0-9]", "_", "".join(c), 0) | ||||
|         corpustests += [ | ||||
|             test( | ||||
|                 name=f"corpustest_{name}_{format}", | ||||
|                 ins=["src+fluxengine"], | ||||
|                 deps=["scripts/encodedecodetest.sh"], | ||||
|                 commands=[ | ||||
|                     "{deps[0]} " | ||||
|                     + c[0] | ||||
|                     + " " | ||||
|                     + format | ||||
|                     + " {ins[0]} '" | ||||
|                     + c[1] | ||||
|                     + "' '" | ||||
|                     + c[2] | ||||
|                     + "' $(dir {outs[0]}) > /dev/null" | ||||
|                 ], | ||||
|                 label="CORPUSTEST", | ||||
|             ) | ||||
|             for format in ["scp", "flux"] | ||||
|         ] | ||||
|  | ||||
| export( | ||||
|     name="all", | ||||
|     items={ | ||||
|         "fluxengine$(EXT)": "src+fluxengine", | ||||
|         "fluxengine-gui$(EXT)": "src/gui", | ||||
|         "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 {}), | ||||
|     deps=["tests", "src/formats+docs", "scripts+mkdocindex"] + corpustests, | ||||
| ) | ||||
							
								
								
									
										19
									
								
								build/_objectify.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								build/_objectify.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| import sys | ||||
| from functools import partial | ||||
|  | ||||
| if len(sys.argv) != 3: | ||||
|     sys.exit("Usage: %s <file> <symbol>" % sys.argv[0]) | ||||
| filename = sys.argv[1] | ||||
| symbol = sys.argv[2] | ||||
|  | ||||
| print("const uint8_t " + symbol + "[] = {") | ||||
| n = 0 | ||||
| with open(filename, "rb") as in_file: | ||||
|     for c in iter(partial(in_file.read, 1), b""): | ||||
|         print("0x%02X," % ord(c), end="") | ||||
|         n += 1 | ||||
|         if n % 16 == 0: | ||||
|             print() | ||||
| print("};") | ||||
|  | ||||
| print("const size_t " + symbol + "_len = sizeof(" + symbol + ");") | ||||
							
								
								
									
										42
									
								
								build/ab.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								build/ab.mk
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| ifeq ($(findstring 4.,$(MAKE_VERSION)),) | ||||
| $(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 | ||||
| ECHO ?= echo | ||||
|  | ||||
| ifeq ($(OS), Windows_NT) | ||||
| 	EXT ?= .exe | ||||
| endif | ||||
| EXT ?= | ||||
|  | ||||
| include $(OBJ)/build.mk | ||||
|  | ||||
| .PHONY: update-ab | ||||
| update-ab: | ||||
| 	@echo "Press RETURN to update ab from the repository, or CTRL+C to cancel." \ | ||||
| 		&& read a \ | ||||
| 		&& (curl -L https://github.com/davidgiven/ab/releases/download/dev/distribution.tar.xz | tar xvJf -) \ | ||||
| 		&& echo "Done." | ||||
|  | ||||
| .PHONY: clean | ||||
| clean:: | ||||
| 	@echo CLEAN | ||||
| 	$(hide) rm -rf $(OBJ) bin | ||||
|  | ||||
| export PYTHONHASHSEED = 1 | ||||
| build-files = $(shell find . -name 'build.py') build/*.py config.py | ||||
| $(OBJ)/build.mk: Makefile $(build-files) | ||||
| 	@echo "AB" | ||||
| 	@mkdir -p $(OBJ) | ||||
| 	$(hide) $(PYTHON) -X pycache_prefix=$(OBJ) build/ab.py -t +all -o $@ \ | ||||
| 		build.py || rm -f $@ | ||||
|  | ||||
							
								
								
									
										487
									
								
								build/ab.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										487
									
								
								build/ab.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,487 @@ | ||||
| from collections.abc import Iterable, Sequence | ||||
| from os.path import * | ||||
| from types import SimpleNamespace | ||||
| import argparse | ||||
| import copy | ||||
| import functools | ||||
| import importlib | ||||
| import importlib.abc | ||||
| import importlib.util | ||||
| import inspect | ||||
| import re | ||||
| import sys | ||||
| import types | ||||
| import pathlib | ||||
| import builtins | ||||
| import os | ||||
|  | ||||
| defaultGlobals = {} | ||||
| targets = {} | ||||
| unmaterialisedTargets = set() | ||||
| materialisingStack = [] | ||||
| outputFp = None | ||||
| cwdStack = [""] | ||||
|  | ||||
| sys.path += ["."] | ||||
| old_import = builtins.__import__ | ||||
|  | ||||
|  | ||||
| def new_import(name, *args, **kwargs): | ||||
|     if name not in sys.modules: | ||||
|         path = name.replace(".", "/") + ".py" | ||||
|         if isfile(path): | ||||
|             sys.stderr.write(f"loading {path}\n") | ||||
|             loader = importlib.machinery.SourceFileLoader(name, path) | ||||
|  | ||||
|             spec = importlib.util.spec_from_loader( | ||||
|                 name, loader, origin="built-in" | ||||
|             ) | ||||
|             module = importlib.util.module_from_spec(spec) | ||||
|             sys.modules[name] = module | ||||
|             cwdStack.append(dirname(path)) | ||||
|             spec.loader.exec_module(module) | ||||
|             cwdStack.pop() | ||||
|  | ||||
|     return old_import(name, *args, **kwargs) | ||||
|  | ||||
|  | ||||
| builtins.__import__ = new_import | ||||
|  | ||||
|  | ||||
| class ABException(BaseException): | ||||
|     pass | ||||
|  | ||||
|  | ||||
| class ParameterList(Sequence): | ||||
|     def __init__(self, parent=[]): | ||||
|         self.data = parent | ||||
|  | ||||
|     def __getitem__(self, i): | ||||
|         return self.data[i] | ||||
|  | ||||
|     def __len__(self): | ||||
|         return len(self.data) | ||||
|  | ||||
|     def __str__(self): | ||||
|         return " ".join(self.data) | ||||
|  | ||||
|     def __add__(self, other): | ||||
|         newdata = self.data.copy() + other | ||||
|         return ParameterList(newdata) | ||||
|  | ||||
|     def __repr__(self): | ||||
|         return f"<PList: {self.data}>" | ||||
|  | ||||
|  | ||||
| class Invocation: | ||||
|     name = None | ||||
|     callback = None | ||||
|     types = None | ||||
|     ins = None | ||||
|     outs = None | ||||
|     binding = None | ||||
|  | ||||
|     def materialise(self, replacing=False): | ||||
|         if self in unmaterialisedTargets: | ||||
|             if not replacing and (self in materialisingStack): | ||||
|                 print("Found dependency cycle:") | ||||
|                 for i in materialisingStack: | ||||
|                     print(f"  {i.name}") | ||||
|                 print(f"  {self.name}") | ||||
|                 sys.exit(1) | ||||
|  | ||||
|             materialisingStack.append(self) | ||||
|  | ||||
|             # Perform type conversion to the declared rule parameter types. | ||||
|  | ||||
|             try: | ||||
|                 self.args = {} | ||||
|                 for k, v in self.binding.arguments.items(): | ||||
|                     if k != "kwargs": | ||||
|                         t = self.types.get(k, None) | ||||
|                         if t: | ||||
|                             v = t(v).convert(self) | ||||
|                         self.args[k] = v | ||||
|                     else: | ||||
|                         for kk, vv in v.items(): | ||||
|                             t = self.types.get(kk, None) | ||||
|                             if t: | ||||
|                                 vv = t(vv).convert(self) | ||||
|                             self.args[kk] = vv | ||||
|  | ||||
|                 # Actually call the callback. | ||||
|  | ||||
|                 cwdStack.append(self.cwd) | ||||
|                 self.callback(**self.args) | ||||
|                 cwdStack.pop() | ||||
|             except BaseException as e: | ||||
|                 print( | ||||
|                     f"Error materialising {self} ({id(self)}): {self.callback}" | ||||
|                 ) | ||||
|                 print(f"Arguments: {self.args}") | ||||
|                 raise e | ||||
|  | ||||
|             if self.outs is None: | ||||
|                 raise ABException(f"{self.name} didn't set self.outs") | ||||
|  | ||||
|             if self in unmaterialisedTargets: | ||||
|                 unmaterialisedTargets.remove(self) | ||||
|  | ||||
|             materialisingStack.pop() | ||||
|  | ||||
|     def __repr__(self): | ||||
|         return "<Invocation %s>" % self.name | ||||
|  | ||||
|  | ||||
| def Rule(func): | ||||
|     sig = inspect.signature(func) | ||||
|  | ||||
|     @functools.wraps(func) | ||||
|     def wrapper(*, name=None, replaces=None, **kwargs): | ||||
|         cwd = None | ||||
|         if name: | ||||
|             if ("+" in name) and not name.startswith("+"): | ||||
|                 (cwd, _) = name.split("+", 1) | ||||
|         if not cwd: | ||||
|             cwd = cwdStack[-1] | ||||
|  | ||||
|         if name: | ||||
|             i = Invocation() | ||||
|             if name.startswith("./"): | ||||
|                 name = join(cwd, name) | ||||
|             elif "+" not in name: | ||||
|                 name = cwd + "+" + name | ||||
|  | ||||
|             i.name = name | ||||
|             i.localname = name.split("+")[-1] | ||||
|  | ||||
|             if name in targets: | ||||
|                 raise ABException(f"target {i.name} has already been defined") | ||||
|             targets[name] = i | ||||
|         elif replaces: | ||||
|             i = replaces | ||||
|             name = i.name | ||||
|         else: | ||||
|             raise ABException("you must supply either name or replaces") | ||||
|  | ||||
|         i.cwd = cwd | ||||
|         i.types = func.__annotations__ | ||||
|         i.callback = func | ||||
|         setattr(i, func.__name__, SimpleNamespace()) | ||||
|  | ||||
|         i.binding = sig.bind(name=name, self=i, **kwargs) | ||||
|         i.binding.apply_defaults() | ||||
|  | ||||
|         unmaterialisedTargets.add(i) | ||||
|         if replaces: | ||||
|             i.materialise(replacing=True) | ||||
|         return i | ||||
|  | ||||
|     defaultGlobals[func.__name__] = wrapper | ||||
|     return wrapper | ||||
|  | ||||
|  | ||||
| class Type: | ||||
|     def __init__(self, value): | ||||
|         self.value = value | ||||
|  | ||||
|  | ||||
| class Targets(Type): | ||||
|     def convert(self, invocation): | ||||
|         value = self.value | ||||
|         if type(value) is str: | ||||
|             value = [value] | ||||
|         if type(value) is list: | ||||
|             value = targetsof(value, cwd=invocation.cwd) | ||||
|         return value | ||||
|  | ||||
|  | ||||
| class Target(Type): | ||||
|     def convert(self, invocation): | ||||
|         value = self.value | ||||
|         if not value: | ||||
|             return None | ||||
|         return targetof(value, cwd=invocation.cwd) | ||||
|  | ||||
|  | ||||
| class TargetsMap(Type): | ||||
|     def convert(self, invocation): | ||||
|         value = self.value | ||||
|         if type(value) is dict: | ||||
|             return { | ||||
|                 k: targetof(v, cwd=invocation.cwd) for k, v in value.items() | ||||
|             } | ||||
|         raise ABException(f"wanted a dict of targets, got a {type(value)}") | ||||
|  | ||||
|  | ||||
| def flatten(*xs): | ||||
|     def recurse(xs): | ||||
|         for x in xs: | ||||
|             if isinstance(x, Iterable) and not isinstance(x, (str, bytes)): | ||||
|                 yield from recurse(x) | ||||
|             else: | ||||
|                 yield x | ||||
|  | ||||
|     return list(recurse(xs)) | ||||
|  | ||||
|  | ||||
| def fileinvocation(s): | ||||
|     i = Invocation() | ||||
|     i.name = s | ||||
|     i.outs = [s] | ||||
|     targets[s] = i | ||||
|     return i | ||||
|  | ||||
|  | ||||
| def targetof(s, cwd): | ||||
|     if isinstance(s, Invocation): | ||||
|         s.materialise() | ||||
|         return s | ||||
|  | ||||
|     if s in targets: | ||||
|         t = targets[s] | ||||
|         t.materialise() | ||||
|         return t | ||||
|  | ||||
|     if s.startswith(".+"): | ||||
|         s = cwd + s[1:] | ||||
|     elif s.startswith("./"): | ||||
|         s = normpath(join(cwd, s)) | ||||
|     elif s.endswith("/"): | ||||
|         return fileinvocation(s) | ||||
|     elif s.startswith("$"): | ||||
|         return fileinvocation(s) | ||||
|  | ||||
|     if "+" not in s: | ||||
|         if isdir(s): | ||||
|             s = s + "+" + basename(s) | ||||
|         else: | ||||
|             return fileinvocation(s) | ||||
|  | ||||
|     (path, target) = s.split("+", 2) | ||||
|     loadbuildfile(join(path, "build.py")) | ||||
|     if not s in targets: | ||||
|         raise ABException(f"build file at {path} doesn't contain +{target}") | ||||
|     i = targets[s] | ||||
|     i.materialise() | ||||
|     return i | ||||
|  | ||||
|  | ||||
| def targetsof(*xs, cwd): | ||||
|     return flatten([targetof(x, cwd) for x in flatten(xs)]) | ||||
|  | ||||
|  | ||||
| def filenamesof(*xs): | ||||
|     s = [] | ||||
|     for t in flatten(xs): | ||||
|         if type(t) == str: | ||||
|             t = normpath(t) | ||||
|             s += [t] | ||||
|         else: | ||||
|             s += [f for f in [normpath(f) for f in filenamesof(t.outs)]] | ||||
|     return s | ||||
|  | ||||
|  | ||||
| def targetnamesof(*xs): | ||||
|     s = [] | ||||
|     for x in flatten(xs): | ||||
|         if type(x) == str: | ||||
|             x = normpath(x) | ||||
|             if x not in s: | ||||
|                 s += [x] | ||||
|         else: | ||||
|             if x.name not in s: | ||||
|                 s += [x.name] | ||||
|     return s | ||||
|  | ||||
|  | ||||
| def filenameof(x): | ||||
|     xs = filenamesof(x) | ||||
|     if len(xs) != 1: | ||||
|         raise ABException("expected a single item") | ||||
|     return xs[0] | ||||
|  | ||||
|  | ||||
| def stripext(path): | ||||
|     return splitext(path)[0] | ||||
|  | ||||
|  | ||||
| def emit(*args): | ||||
|     outputFp.write(" ".join(flatten(args))) | ||||
|     outputFp.write("\n") | ||||
|  | ||||
|  | ||||
| def templateexpand(s, invocation): | ||||
|     class Converter: | ||||
|         def __getitem__(self, key): | ||||
|             if key == "self": | ||||
|                 return invocation | ||||
|             f = filenamesof(invocation.args[key]) | ||||
|             if isinstance(f, Sequence): | ||||
|                 f = ParameterList(f) | ||||
|             return f | ||||
|  | ||||
|     return eval("f%r" % s, invocation.callback.__globals__, Converter()) | ||||
|  | ||||
|  | ||||
| def emitter_rule(name, ins, outs, deps=[]): | ||||
|     emit("") | ||||
|     emit(".PHONY:", name) | ||||
|     if outs: | ||||
|         emit(name, ":", filenamesof(outs), ";") | ||||
|         emit(filenamesof(outs), "&:", filenamesof(ins), filenamesof(deps)) | ||||
|     else: | ||||
|         emit(name, "&:", filenamesof(ins), filenamesof(deps)) | ||||
|  | ||||
|  | ||||
| def emitter_endrule(name): | ||||
|     pass | ||||
|  | ||||
|  | ||||
| def emitter_label(s): | ||||
|     emit("\t$(hide)", "$(ECHO)", s) | ||||
|  | ||||
|  | ||||
| def emitter_exec(cs): | ||||
|     for c in cs: | ||||
|         emit("\t$(hide)", c) | ||||
|  | ||||
|  | ||||
| def unmake(*ss): | ||||
|     return [ | ||||
|         re.sub(r"\$\(([^)]*)\)", r"$\1", s) for s in flatten(filenamesof(ss)) | ||||
|     ] | ||||
|  | ||||
|  | ||||
| @Rule | ||||
| def simplerule( | ||||
|     self, | ||||
|     name, | ||||
|     ins: Targets = [], | ||||
|     outs=[], | ||||
|     deps: Targets = [], | ||||
|     commands=[], | ||||
|     label="RULE", | ||||
|     **kwargs, | ||||
| ): | ||||
|     self.ins = ins | ||||
|     self.outs = outs | ||||
|     self.deps = deps | ||||
|     emitter_rule(self.name, ins + deps, outs) | ||||
|     emitter_label(templateexpand("{label} {name}", self)) | ||||
|  | ||||
|     dirs = [] | ||||
|     for out in filenamesof(outs): | ||||
|         dir = dirname(out) | ||||
|         if dir and dir not in dirs: | ||||
|             dirs += [dir] | ||||
|  | ||||
|         cs = [("mkdir -p %s" % dir) for dir in dirs] | ||||
|     for c in commands: | ||||
|         cs += [templateexpand(c, self)] | ||||
|     emitter_exec(cs) | ||||
|     emitter_endrule(self.name) | ||||
|  | ||||
|  | ||||
| @Rule | ||||
| def normalrule( | ||||
|     self, | ||||
|     name=None, | ||||
|     ins: Targets = [], | ||||
|     deps: Targets = [], | ||||
|     outs=[], | ||||
|     label="RULE", | ||||
|     objdir=None, | ||||
|     commands=[], | ||||
|     **kwargs, | ||||
| ): | ||||
|     objdir = objdir or join("$(OBJ)", name) | ||||
|  | ||||
|     self.normalrule.objdir = objdir | ||||
|     simplerule( | ||||
|         replaces=self, | ||||
|         ins=ins, | ||||
|         deps=deps, | ||||
|         outs=[join(objdir, f) for f in outs], | ||||
|         label=label, | ||||
|         commands=commands, | ||||
|         **kwargs, | ||||
|     ) | ||||
|  | ||||
|  | ||||
| @Rule | ||||
| def export(self, name=None, items: TargetsMap = {}, deps: Targets = []): | ||||
|     cs = [] | ||||
|     self.ins = items.values() | ||||
|     self.outs = [] | ||||
|     for dest, src in items.items(): | ||||
|         destf = filenameof(dest) | ||||
|         dir = dirname(destf) | ||||
|  | ||||
|         srcs = filenamesof(src) | ||||
|         if len(srcs) != 1: | ||||
|             raise ABException( | ||||
|                 "a dependency of an export must have exactly one output file" | ||||
|             ) | ||||
|  | ||||
|         emitter_rule(self.name + "+" + destf, srcs, [destf]) | ||||
|         emitter_label(f"CP {destf}") | ||||
|         if dir: | ||||
|             emitter_exec(["mkdir -p " + dir]) | ||||
|  | ||||
|         emitter_exec(["cp %s %s" % (srcs[0], destf)]) | ||||
|         self.outs += [destf] | ||||
|  | ||||
|     emitter_rule(self.name, self.outs, [], deps) | ||||
|     emit("\t@") | ||||
|  | ||||
|     if self.outs: | ||||
|         emit("clean::") | ||||
|         emit("\t$(hide) rm -f " + (" ".join(filenamesof(self.outs)))) | ||||
|     self.outs += deps | ||||
|  | ||||
|     emitter_endrule(self.name) | ||||
|  | ||||
|  | ||||
| def loadbuildfile(filename): | ||||
|     filename = filename.replace("/", ".").removesuffix(".py") | ||||
|     builtins.__import__(filename) | ||||
|  | ||||
|  | ||||
| def load(filename): | ||||
|     loadbuildfile(filename) | ||||
|     callerglobals = inspect.stack()[1][0].f_globals | ||||
|     for k, v in defaultGlobals.items(): | ||||
|         callerglobals[k] = v | ||||
|  | ||||
|  | ||||
| def main(): | ||||
|     parser = argparse.ArgumentParser() | ||||
|     parser.add_argument("-o", "--output") | ||||
|     parser.add_argument("files", nargs="+") | ||||
|     parser.add_argument("-t", "--targets", action="append") | ||||
|     args = parser.parse_args() | ||||
|     if not args.targets: | ||||
|         raise ABException("no targets supplied") | ||||
|  | ||||
|     global outputFp | ||||
|     outputFp = open(args.output, "wt") | ||||
|  | ||||
|     for k in ("Rule", "Targets", "load", "filenamesof", "stripext"): | ||||
|         defaultGlobals[k] = globals()[k] | ||||
|  | ||||
|     global __name__ | ||||
|     sys.modules["build.ab"] = sys.modules[__name__] | ||||
|     __name__ = "build.ab" | ||||
|  | ||||
|     for f in args.files: | ||||
|         loadbuildfile(f) | ||||
|  | ||||
|     for t in flatten([a.split(",") for a in args.targets]): | ||||
|         if t not in targets: | ||||
|             raise ABException("target %s is not defined" % t) | ||||
|         targets[t].materialise() | ||||
|     emit("AB_LOADED = 1\n") | ||||
|  | ||||
|  | ||||
| main() | ||||
							
								
								
									
										251
									
								
								build/build.lua
									
									
									
									
									
								
							
							
						
						
									
										251
									
								
								build/build.lua
									
									
									
									
									
								
							| @@ -1,251 +0,0 @@ | ||||
| local OBJDIR = "$(OBJDIR)" | ||||
|  | ||||
| local function objdir(e) | ||||
| 	return concatpath(OBJDIR, e.cwd, e.name) | ||||
| end | ||||
|  | ||||
| definerule("normalrule", | ||||
| 	{ | ||||
| 		ins = { type="targets" }, | ||||
| 		deps = { type="targets", default={} }, | ||||
| 		outs = { type="targets", default={} }, | ||||
| 		outleaves = { type="strings" }, | ||||
| 		label = { type="string", optional=true }, | ||||
| 		objdir = { type="string", optional=true }, | ||||
| 		commands = { type="strings" }, | ||||
| 	}, | ||||
| 	function (e) | ||||
| 		local dir = e.objdir or objdir(e) | ||||
| 		local realouts = {} | ||||
| 		for _, v in pairs(e.outleaves) do | ||||
| 			realouts[#realouts+1] = concatpath(dir, v) | ||||
| 		end | ||||
|  | ||||
| 		local vars = inherit(e.vars, { | ||||
| 			dir = dir | ||||
| 		}) | ||||
|  | ||||
| 		local result = simplerule { | ||||
| 			name = e.name, | ||||
| 			ins = e.ins, | ||||
| 			deps = e.deps, | ||||
| 			outs = concat(realouts, filenamesof(e.outs)), | ||||
| 			label = e.label, | ||||
| 			commands = e.commands, | ||||
| 			vars = vars, | ||||
| 		} | ||||
| 		result.dir = dir | ||||
| 		return result | ||||
| 	end | ||||
| ) | ||||
|  | ||||
| local function is_clike(f) | ||||
| 	return f:find("%.c$") or f:find("%.cc$") or f:find("%.cpp$") | ||||
| end | ||||
|  | ||||
| definerule("cfile", | ||||
| 	{ | ||||
| 		srcs = { type="targets" }, | ||||
| 		deps = { type="targets", default={} } | ||||
| 	}, | ||||
| 	function (e) | ||||
| 		local cflags = e.vars.cflags | ||||
| 		local cxxflags = e.vars.cxxflags | ||||
| 		for _, target in ipairs(targetsof(e.deps)) do | ||||
| 			if target.is.clibrary then | ||||
| 				cflags = concat(cflags, target.dep_cflags) | ||||
| 				cxxflags = concat(cxxflags, target.dep_cxxflags) | ||||
| 			end | ||||
| 		end | ||||
|  | ||||
| 		local src = filter(filenamesof(e.srcs), is_clike) | ||||
| 		local cmd | ||||
| 		local cxx = false | ||||
| 		if src[1]:find("%.c$") then | ||||
| 			cmd = "$(CC) -c -o %{outs[1]} %{ins[1]} %{hdrpaths} %{cflags}" | ||||
| 		else | ||||
| 			cmd = "$(CXX) -c -o %{outs[1]} %{ins[1]} %{hdrpaths} %{cflags} %{cxxflags}" | ||||
| 			cxx = true | ||||
| 		end | ||||
|  | ||||
| 		local outleaf = basename(e.name)..".o" | ||||
| 		local rule = normalrule { | ||||
| 			name = e.name, | ||||
| 			cwd = e.cwd, | ||||
| 			ins = e.srcs, | ||||
| 			deps = e.deps, | ||||
| 			outleaves = {outleaf}, | ||||
| 			label = e.label, | ||||
| 			commands = cmd, | ||||
| 			vars = { | ||||
| 				hdrpaths = {}, | ||||
| 				cflags = cflags, | ||||
| 				cxxflags = cxxflags, | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		rule.is.cxxfile = cxx | ||||
| 		return rule | ||||
| 	end | ||||
| ) | ||||
|  | ||||
| local function do_cfiles(e) | ||||
| 	local outs = {} | ||||
| 	local srcs = filenamesof(e.srcs) | ||||
| 	for _, f in ipairs(sorted(filter(srcs, is_clike))) do | ||||
| 		local ofile | ||||
| 		if f:find(OBJDIR, 1, true) == 1 then | ||||
| 			ofile = e.name.."/"..f:sub(#OBJDIR+1)..".o" | ||||
| 		else | ||||
| 			ofile = e.name.."/"..f..".o" | ||||
| 		end | ||||
| 		outs[#outs+1] = cfile { | ||||
| 			name = ofile, | ||||
| 			srcs = { f }, | ||||
| 			deps = e.deps | ||||
| 		} | ||||
| 	end | ||||
| 	return outs | ||||
| end | ||||
|  | ||||
| definerule("clibrary", | ||||
| 	{ | ||||
| 		srcs = { type="targets", default={} }, | ||||
| 		deps = { type="targets", default={} }, | ||||
| 		hdrs = { type="targets", default={} }, | ||||
| 		dep_cflags = { type="strings", default={} }, | ||||
| 		dep_cxxflags = { type="strings", default={} }, | ||||
| 		dep_ldflags = { type="strings", default={} }, | ||||
| 		dep_libs = { type="strings", default={} }, | ||||
| 	}, | ||||
| 	function (e) | ||||
| 		local ins = do_cfiles(e) | ||||
| 		local cxx = false | ||||
| 		for _, f in ipairs(ins) do | ||||
| 			if f.is.cxxfile then | ||||
| 				cxx = true | ||||
| 				break | ||||
| 			end | ||||
| 		end | ||||
|  | ||||
| 		local mkdirs = {} | ||||
| 		local copies = {} | ||||
| 		local outs = {} | ||||
| 		local function copy_file(src, dest) | ||||
| 			mkdirs[#mkdirs+1] = "mkdir -p %{dir}/"..dirname(dest) | ||||
| 			copies[#copies+1] = "cp "..src.." %{dir}/"..dest | ||||
| 			outs[#outs+1] = objdir(e).."/"..dest | ||||
| 		end | ||||
|  | ||||
| 		local deps = {} | ||||
| 		for k, v in pairs(e.hdrs) do | ||||
| 			deps[#deps+1] = v | ||||
| 			if type(k) == "number" then | ||||
| 				v = filenamesof(v) | ||||
| 				for _, v in ipairs(v) do | ||||
| 					if not startswith(e.cwd, v) then | ||||
| 						error(string.format("filename '%s' is not local to '%s' --- ".. | ||||
| 							"you'll have to specify the output filename manually", v, e.cwd)) | ||||
| 					end | ||||
| 					copy_file(v, v:gsub("^"..e.cwd, "")) | ||||
| 				end | ||||
| 			else | ||||
| 				v = filenamesof(v) | ||||
| 				if #v ~= 1 then | ||||
| 					error("each mapped hdrs item can only cope with a single file") | ||||
| 				end | ||||
| 				copy_file(v[1], k) | ||||
| 			end | ||||
| 		end | ||||
|  | ||||
| 		ins = sorted(filenamesof(ins)) | ||||
| 		local has_ar = (#ins ~= 0) | ||||
| 		local lib = normalrule { | ||||
| 			name = e.name, | ||||
| 			cwd = e.cwd, | ||||
| 			ins = sorted(filenamesof(ins)), | ||||
| 			deps = deps, | ||||
| 			outs = outs, | ||||
| 			outleaves = { e.name..".a" }, | ||||
| 			label = e.label, | ||||
| 			commands = { | ||||
| 				sorted(mkdirs), | ||||
| 				sorted(copies), | ||||
| 				has_ar and "rm -f %{outs[1]} && $(AR) cqs %{outs[1]} %{ins}" or {}, | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 		lib.dep_cflags = concat(e.dep_cflags, "-I"..lib.dir) | ||||
| 		lib.dep_cxxflags = e.dep_cxxflags | ||||
| 		lib.dep_ldflags = e.dep_ldflags | ||||
| 		lib.dep_libs = concat(e.dep_libs, has_ar and matching(filenamesof(lib), "%.a$") or {}) | ||||
| 		lib.dep_cxx = cxx | ||||
|  | ||||
| 		for _, d in pairs(targetsof(e.deps)) do | ||||
| 			lib.dep_cflags = concat(lib.dep_cflags, d.dep_cflags) | ||||
| 			lib.dep_cxxflags = concat(lib.dep_cxxflags, d.dep_cxxflags) | ||||
| 			lib.dep_ldflags = concat(lib.dep_ldflags, d.dep_ldflags) | ||||
| 			lib.dep_libs = concat(lib.dep_libs, d.dep_libs) | ||||
| 			lib.dep_cxx = lib.dep_cxx or d.dep_cxx | ||||
| 		end | ||||
|  | ||||
| 		return lib | ||||
| 	end | ||||
| ) | ||||
|  | ||||
| definerule("cprogram", | ||||
| 	{ | ||||
| 		srcs = { type="targets", default={} }, | ||||
| 		deps = { type="targets", default={} }, | ||||
| 	}, | ||||
| 	function (e) | ||||
| 		local deps = e.deps | ||||
| 		local ins = {} | ||||
| 		local cxx = false | ||||
|  | ||||
| 		if (#e.srcs > 0) then | ||||
| 			local objs = do_cfiles(e) | ||||
| 			for _, obj in pairs(objs) do | ||||
| 				if obj.is.cxxfile then | ||||
| 					cxx = true | ||||
| 				end | ||||
| 				ins[#ins+1] = obj | ||||
| 			end | ||||
| 		end | ||||
|  | ||||
| 		local libs = {} | ||||
| 		local cflags = {} | ||||
| 		local cxxflags = {} | ||||
| 		local ldflags = {} | ||||
| 		for _, lib in pairs(e.deps) do | ||||
| 			cflags = concat(cflags, lib.dep_cflags) | ||||
| 			cxxflags = concat(cxxflags, lib.dep_cxxflags) | ||||
| 			ldflags = concat(ldflags, lib.dep_ldflags) | ||||
| 			libs = concat(libs, lib.dep_libs) | ||||
| 			cxx = cxx or lib.dep_cxx | ||||
| 		end | ||||
|  | ||||
| 		local command | ||||
| 		if cxx then | ||||
| 			command = "$(CXX) $(LDFLAGS) %{ldflags} -o %{outs[1]} %{ins} %{libs} %{libs}" | ||||
| 		else | ||||
| 			command = "$(CC) $(LDFLAGS) %{ldflags} -o %{outs[1]} %{ins} %{libs} %{libs}" | ||||
| 		end | ||||
|  | ||||
| 		return normalrule { | ||||
| 			name = e.name, | ||||
| 			cwd = e.cwd, | ||||
| 			deps = deps, | ||||
| 			ins = ins, | ||||
| 			outleaves = { e.name }, | ||||
| 			commands = { command }, | ||||
| 			vars = { | ||||
| 				cflags = cflags, | ||||
| 				cxxflags = cxxflags, | ||||
| 				ldflags = ldflags, | ||||
| 				libs = libs, | ||||
| 			} | ||||
| 		} | ||||
| 	end | ||||
| ) | ||||
|  | ||||
							
								
								
									
										265
									
								
								build/c.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										265
									
								
								build/c.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,265 @@ | ||||
| from os.path import basename, join | ||||
| from build.ab import ( | ||||
|     ABException, | ||||
|     Rule, | ||||
|     Targets, | ||||
|     TargetsMap, | ||||
|     filenameof, | ||||
|     flatten, | ||||
|     filenamesof, | ||||
|     normalrule, | ||||
|     stripext, | ||||
| ) | ||||
| from os.path import * | ||||
| from types import SimpleNamespace | ||||
|  | ||||
|  | ||||
| def cfileimpl(self, name, srcs, deps, suffix, commands, label, kind, cflags): | ||||
|     outleaf = stripext(basename(filenameof(srcs[0]))) + suffix | ||||
|  | ||||
|     normalrule( | ||||
|         replaces=self, | ||||
|         ins=srcs, | ||||
|         deps=deps, | ||||
|         outs=[outleaf], | ||||
|         label=label, | ||||
|         commands=commands, | ||||
|         cflags=cflags, | ||||
|     ) | ||||
|  | ||||
|  | ||||
| @Rule | ||||
| def cfile( | ||||
|     self, | ||||
|     name, | ||||
|     srcs: Targets = [], | ||||
|     deps: Targets = [], | ||||
|     cflags=[], | ||||
|     suffix=".o", | ||||
|     commands=["$(CC) -c -o {outs[0]} {ins[0]} $(CFLAGS) {cflags}"], | ||||
|     label="CC", | ||||
| ): | ||||
|     cfileimpl(self, name, srcs, deps, suffix, commands, label, "cfile", cflags) | ||||
|  | ||||
|  | ||||
| @Rule | ||||
| def cxxfile( | ||||
|     self, | ||||
|     name, | ||||
|     srcs: Targets = [], | ||||
|     deps: Targets = [], | ||||
|     cflags=[], | ||||
|     suffix=".o", | ||||
|     commands=["$(CXX) -c -o {outs[0]} {ins[0]} $(CFLAGS) {cflags}"], | ||||
|     label="CXX", | ||||
| ): | ||||
|     cfileimpl( | ||||
|         self, name, srcs, deps, suffix, commands, label, "cxxfile", cflags | ||||
|     ) | ||||
|  | ||||
|  | ||||
| def findsources(name, srcs, deps, cflags, filerule): | ||||
|     objs = [] | ||||
|     for s in flatten(srcs): | ||||
|         objs += [ | ||||
|             filerule( | ||||
|                 name=join(name, f.removeprefix("$(OBJ)/")), | ||||
|                 srcs=[f], | ||||
|                 deps=deps, | ||||
|                 cflags=cflags, | ||||
|             ) | ||||
|             for f in filenamesof(s) | ||||
|             if f.endswith(".c") or f.endswith(".cc") or f.endswith(".cpp") | ||||
|         ] | ||||
|         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 | ||||
| ): | ||||
|     if not srcs and not hdrs: | ||||
|         raise ABException( | ||||
|             "clibrary contains no sources and no exported headers" | ||||
|         ) | ||||
|  | ||||
|     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, | ||||
|             srcs, | ||||
|             deps + ([f"{name}_hdrs"] if hr else []), | ||||
|             cflags + ([f"-I{hr.normalrule.objdir}"] if hr else []), | ||||
|             kind, | ||||
|         ) | ||||
|  | ||||
|         normalrule( | ||||
|             replaces=self, | ||||
|             ins=actualsrcs, | ||||
|             outs=[basename(name) + ".a"], | ||||
|             label=label, | ||||
|             commands=commands if actualsrcs else [], | ||||
|         ) | ||||
|  | ||||
|         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] | ||||
|  | ||||
|  | ||||
| @Rule | ||||
| def clibrary( | ||||
|     self, | ||||
|     name, | ||||
|     srcs: Targets = [], | ||||
|     deps: Targets = [], | ||||
|     hdrs: TargetsMap = {}, | ||||
|     cflags=[], | ||||
|     ldflags=[], | ||||
|     commands=["$(AR) cqs {outs[0]} {ins}"], | ||||
|     label="LIB", | ||||
| ): | ||||
|     return libraryimpl( | ||||
|         self, name, srcs, deps, hdrs, cflags, ldflags, commands, label, cfile | ||||
|     ) | ||||
|  | ||||
|  | ||||
| @Rule | ||||
| def cxxlibrary( | ||||
|     self, | ||||
|     name, | ||||
|     srcs: Targets = [], | ||||
|     deps: Targets = [], | ||||
|     hdrs: TargetsMap = {}, | ||||
|     cflags=[], | ||||
|     ldflags=[], | ||||
|     commands=["$(AR) cqs {outs[0]} {ins}"], | ||||
|     label="LIB", | ||||
| ): | ||||
|     return libraryimpl( | ||||
|         self, name, srcs, deps, hdrs, cflags, ldflags, commands, label, cxxfile | ||||
|     ) | ||||
|  | ||||
|  | ||||
| def programimpl( | ||||
|     self, name, srcs, deps, cflags, ldflags, commands, label, filerule, kind | ||||
| ): | ||||
|     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 | ||||
|  | ||||
|     deps += [f for f in filenamesof(srcs) if f.endswith(".h")] | ||||
|  | ||||
|     ars = [f for f in filenamesof(libraries) if f.endswith(".a")] | ||||
|     normalrule( | ||||
|         replaces=self, | ||||
|         ins=(findsources(name, srcs, deps, cflags, filerule) + ars + ars), | ||||
|         outs=[basename(name) + "$(EXT)"], | ||||
|         deps=deps, | ||||
|         label=label, | ||||
|         commands=commands, | ||||
|         ldflags=ldflags, | ||||
|     ) | ||||
|  | ||||
|  | ||||
| @Rule | ||||
| def cprogram( | ||||
|     self, | ||||
|     name, | ||||
|     srcs: Targets = [], | ||||
|     deps: Targets = [], | ||||
|     cflags=[], | ||||
|     ldflags=[], | ||||
|     commands=["$(CC) -o {outs[0]} {ins} {ldflags} $(LDFLAGS)"], | ||||
|     label="CLINK", | ||||
| ): | ||||
|     programimpl( | ||||
|         self, | ||||
|         name, | ||||
|         srcs, | ||||
|         deps, | ||||
|         cflags, | ||||
|         ldflags, | ||||
|         commands, | ||||
|         label, | ||||
|         cfile, | ||||
|         "cprogram", | ||||
|     ) | ||||
|  | ||||
|  | ||||
| @Rule | ||||
| def cxxprogram( | ||||
|     self, | ||||
|     name, | ||||
|     srcs: Targets = [], | ||||
|     deps: Targets = [], | ||||
|     cflags=[], | ||||
|     ldflags=[], | ||||
|     commands=["$(CXX) -o {outs[0]} {ins} {ldflags} $(LDFLAGS)"], | ||||
|     label="CXXLINK", | ||||
| ): | ||||
|     programimpl( | ||||
|         self, | ||||
|         name, | ||||
|         srcs, | ||||
|         deps, | ||||
|         cflags, | ||||
|         ldflags, | ||||
|         commands, | ||||
|         label, | ||||
|         cxxfile, | ||||
|         "cxxprogram", | ||||
|     ) | ||||
							
								
								
									
										38
									
								
								build/pkg.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								build/pkg.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| from build.ab import Rule, emit, Target | ||||
| from types import SimpleNamespace | ||||
| import os | ||||
| import subprocess | ||||
|  | ||||
| emit( | ||||
|     """ | ||||
| PKG_CONFIG ?= pkg-config | ||||
| PACKAGES := $(shell $(PKG_CONFIG) --list-all | cut -d' ' -f1 | sort) | ||||
| """ | ||||
| ) | ||||
|  | ||||
|  | ||||
| @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") | ||||
|  | ||||
|     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})"] | ||||
							
								
								
									
										65
									
								
								build/protobuf.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								build/protobuf.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| 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 | ||||
|  | ||||
| emit( | ||||
|     """ | ||||
| PROTOC ?= protoc | ||||
| ifeq ($(filter protobuf, $(PACKAGES)),) | ||||
| $(error Required package 'protobuf' not installed.)" | ||||
| endif | ||||
| """ | ||||
| ) | ||||
|  | ||||
|  | ||||
| @Rule | ||||
| def proto(self, name, srcs: Targets = [], deps: Targets = []): | ||||
|     normalrule( | ||||
|         replaces=self, | ||||
|         ins=srcs, | ||||
|         outs=[f"{name}.descriptor"], | ||||
|         deps=deps, | ||||
|         commands=[ | ||||
|             "$(PROTOC) --include_source_info --descriptor_set_out={outs[0]} {ins}" | ||||
|         ], | ||||
|         label="PROTO", | ||||
|     ) | ||||
|     self.proto.srcs = filenamesof(srcs) + flatten( | ||||
|         [s.proto.srcs for s in flatten(deps)] | ||||
|     ) | ||||
|  | ||||
|  | ||||
| @Rule | ||||
| 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, | ||||
|         outs=outs, | ||||
|         deps=deps, | ||||
|         commands=["$(PROTOC) --cpp_out={self.normalrule.objdir} {ins}"], | ||||
|         label="PROTOCC", | ||||
|     ) | ||||
|  | ||||
|     r.materialise() | ||||
|     headers = { | ||||
|         f: join(r.normalrule.objdir, f) for f in outs if f.endswith(".pb.h") | ||||
|     } | ||||
|  | ||||
|     cxxlibrary( | ||||
|         replaces=self, | ||||
|         srcs=[f"{name}_srcs"], | ||||
|         hdrs=headers, | ||||
|         cflags=[f"-I{r.normalrule.objdir}"], | ||||
|     ) | ||||
| @@ -1,18 +0,0 @@ | ||||
| definerule("test", | ||||
| 	{ | ||||
| 		srcs = { type="targets", default={} }, | ||||
| 	}, | ||||
| 	function (e) | ||||
| 		if vars.TESTS == "yes" then | ||||
| 			normalrule { | ||||
| 				name = e.name, | ||||
| 				ins = e.srcs, | ||||
| 				outleaves = { "log.txt" }, | ||||
| 				commands = { | ||||
| 					"%{ins} > %{outs}", | ||||
| 				} | ||||
| 			} | ||||
| 		end | ||||
| 	end | ||||
| ) | ||||
|  | ||||
							
								
								
									
										43
									
								
								build/utils.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								build/utils.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| from build.ab import Rule, normalrule, Target, filenameof, Targets | ||||
| from os.path import basename | ||||
|  | ||||
|  | ||||
| @Rule | ||||
| def objectify(self, name, src: Target, symbol): | ||||
|     normalrule( | ||||
|         replaces=self, | ||||
|         ins=["build/_objectify.py", src], | ||||
|         outs=[basename(filenameof(src)) + ".h"], | ||||
|         commands=["$(PYTHON) {ins[0]} {ins[1]} " + symbol + " > {outs}"], | ||||
|         label="OBJECTIFY", | ||||
|     ) | ||||
|  | ||||
|  | ||||
| @Rule | ||||
| def test( | ||||
|     self, | ||||
|     name, | ||||
|     command: Target = None, | ||||
|     commands=None, | ||||
|     ins: Targets = [], | ||||
|     deps: Targets = [], | ||||
|     label="TEST", | ||||
| ): | ||||
|     if command: | ||||
|         normalrule( | ||||
|             replaces=self, | ||||
|             ins=[command], | ||||
|             outs=["sentinel"], | ||||
|             commands=["{ins[0]}", "touch {outs}"], | ||||
|             deps=deps, | ||||
|             label=label, | ||||
|         ) | ||||
|     else: | ||||
|         normalrule( | ||||
|             replaces=self, | ||||
|             ins=ins, | ||||
|             outs=["sentinel"], | ||||
|             commands=commands + ["touch {outs}"], | ||||
|             deps=deps, | ||||
|             label=label, | ||||
|         ) | ||||
							
								
								
									
										5
									
								
								config.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								config.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| import platform | ||||
|  | ||||
| windows = platform.system() == "Windows" | ||||
| osx = platform.system() == "Darwin" | ||||
| unix = not windows | ||||
| @@ -1,22 +0,0 @@ | ||||
| ADFLIB_SRCS = \ | ||||
| 	dep/adflib/src/adf_bitm.c \ | ||||
| 	dep/adflib/src/adf_cache.c \ | ||||
| 	dep/adflib/src/adf_dir.c \ | ||||
| 	dep/adflib/src/adf_disk.c \ | ||||
| 	dep/adflib/src/adf_dump.c \ | ||||
| 	dep/adflib/src/adf_env.c \ | ||||
| 	dep/adflib/src/adf_file.c \ | ||||
| 	dep/adflib/src/adf_hd.c \ | ||||
| 	dep/adflib/src/adf_link.c \ | ||||
| 	dep/adflib/src/adf_raw.c \ | ||||
| 	dep/adflib/src/adf_salv.c \ | ||||
| 	dep/adflib/src/adf_util.c \ | ||||
|  | ||||
| ADFLIB_OBJS = $(patsubst %.c, $(OBJDIR)/%.o, $(ADFLIB_SRCS)) | ||||
| $(ADFLIB_OBJS): CFLAGS += -Idep/adflib/src -Idep/adflib | ||||
| ADFLIB_LIB = $(OBJDIR)/libadflib.a | ||||
| $(ADFLIB_LIB): $(ADFLIB_OBJS) | ||||
| ADFLIB_CFLAGS = -Idep/adflib/src | ||||
| ADFLIB_LDFLAGS = | ||||
| OBJS += $(ADFLIB_OBJS) | ||||
|  | ||||
							
								
								
									
										47
									
								
								dep/adflib/build.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								dep/adflib/build.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| from build.c import clibrary | ||||
|  | ||||
| clibrary( | ||||
|     name="adflib", | ||||
|     srcs=[ | ||||
|         "./src/adf_bitm.c", | ||||
|         "./src/adf_bitm.h", | ||||
|         "./src/adf_cache.c", | ||||
|         "./src/adf_cache.h", | ||||
|         "./src/adf_dir.c", | ||||
|         "./src/adf_dir.h", | ||||
|         "./src/adf_disk.c", | ||||
|         "./src/adf_disk.h", | ||||
|         "./src/adf_dump.c", | ||||
|         "./src/adf_dump.h", | ||||
|         "./src/adf_env.c", | ||||
|         "./src/adf_env.h", | ||||
|         "./src/adf_file.c", | ||||
|         "./src/adf_file.h", | ||||
|         "./src/adf_hd.c", | ||||
|         "./src/adf_hd.h", | ||||
|         "./src/adf_link.c", | ||||
|         "./src/adf_link.h", | ||||
|         "./src/adf_raw.c", | ||||
|         "./src/adf_raw.h", | ||||
|         "./src/adf_salv.c", | ||||
|         "./src/adf_salv.h", | ||||
|         "./src/adf_str.h", | ||||
|         "./src/adf_util.c", | ||||
|         "./src/adf_util.h", | ||||
|         "./src/defendian.h", | ||||
|         "./src/hd_blk.h", | ||||
|         "./src/prefix.h", | ||||
|         "./adf_nativ.h", | ||||
|         "./config.h", | ||||
|         "./src/adflib.h", | ||||
|     ], | ||||
|     cflags=["-Idep/adflib", "-Idep/adflib/src"], | ||||
|     hdrs={ | ||||
|         "adf_blk.h": "./src/adf_blk.h", | ||||
|         "adf_defs.h": "./src/adf_defs.h", | ||||
|         "adf_err.h": "./src/adf_err.h", | ||||
|         "adf_nativ.h": "./adf_nativ.h", | ||||
|         "adf_str.h": "./src/adf_str.h", | ||||
|         "adflib.h": "./src/adflib.h", | ||||
|     }, | ||||
| ) | ||||
| @@ -1,38 +0,0 @@ | ||||
| AGG_SRCS = \ | ||||
| 	dep/agg/src/agg_arrowhead.cpp \ | ||||
| 	dep/agg/src/agg_line_aa_basics.cpp \ | ||||
| 	dep/agg/src/agg_vcgen_bspline.cpp \ | ||||
| 	dep/agg/src/agg_vpgen_segmentator.cpp \ | ||||
| 	dep/agg/src/agg_color_rgba.cpp \ | ||||
| 	dep/agg/src/agg_sqrt_tables.cpp \ | ||||
| 	dep/agg/src/agg_bspline.cpp \ | ||||
| 	dep/agg/src/agg_curves.cpp \ | ||||
| 	dep/agg/src/agg_rounded_rect.cpp \ | ||||
| 	dep/agg/src/agg_vcgen_markers_term.cpp \ | ||||
| 	dep/agg/src/agg_vcgen_dash.cpp \ | ||||
| 	dep/agg/src/agg2d.cpp \ | ||||
| 	dep/agg/src/agg_trans_affine.cpp \ | ||||
| 	dep/agg/src/agg_gsv_text.cpp \ | ||||
| 	dep/agg/src/agg_vcgen_smooth_poly1.cpp \ | ||||
| 	dep/agg/src/agg_trans_single_path.cpp \ | ||||
| 	dep/agg/src/agg_vpgen_clip_polygon.cpp \ | ||||
| 	dep/agg/src/agg_embedded_raster_fonts.cpp \ | ||||
| 	dep/agg/src/agg_trans_double_path.cpp \ | ||||
| 	dep/agg/src/agg_vcgen_stroke.cpp \ | ||||
| 	dep/agg/src/agg_arc.cpp \ | ||||
| 	dep/agg/src/agg_image_filters.cpp \ | ||||
| 	dep/agg/src/agg_trans_warp_magnifier.cpp \ | ||||
| 	dep/agg/src/agg_vpgen_clip_polyline.cpp \ | ||||
| 	dep/agg/src/agg_bezier_arc.cpp \ | ||||
| 	dep/agg/src/agg_line_profile_aa.cpp \ | ||||
| 	dep/agg/src/agg_vcgen_contour.cpp \ | ||||
| 	 | ||||
| AGG_OBJS = $(patsubst %.cpp, $(OBJDIR)/%.o, $(AGG_SRCS)) | ||||
| AGG_LIB = $(OBJDIR)/libagg.a | ||||
| $(AGG_LIB): $(AGG_OBJS) | ||||
| AGG_LDFLAGS = $(AGG_LIB) | ||||
| AGG_CFLAGS = -Idep/agg/include | ||||
| OBJS += $(AGG_OBJS) | ||||
|  | ||||
| $(AGG_OBJS): CFLAGS += $(AGG_CFLAGS) | ||||
|  | ||||
							
								
								
									
										164
									
								
								dep/agg/build.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								dep/agg/build.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,164 @@ | ||||
| from build.c import cxxlibrary | ||||
|  | ||||
| cxxlibrary( | ||||
|     name="agg", | ||||
|     srcs=[ | ||||
|         "./src/agg_arrowhead.cpp", | ||||
|         "./src/agg_line_aa_basics.cpp", | ||||
|         "./src/agg_vcgen_bspline.cpp", | ||||
|         "./src/agg_vpgen_segmentator.cpp", | ||||
|         "./src/agg_color_rgba.cpp", | ||||
|         "./src/agg_sqrt_tables.cpp", | ||||
|         "./src/agg_bspline.cpp", | ||||
|         "./src/agg_curves.cpp", | ||||
|         "./src/agg_rounded_rect.cpp", | ||||
|         "./src/agg_vcgen_markers_term.cpp", | ||||
|         "./src/agg_vcgen_dash.cpp", | ||||
|         "./src/agg2d.cpp", | ||||
|         "./src/agg_trans_affine.cpp", | ||||
|         "./src/agg_gsv_text.cpp", | ||||
|         "./src/agg_vcgen_smooth_poly1.cpp", | ||||
|         "./src/agg_trans_single_path.cpp", | ||||
|         "./src/agg_vpgen_clip_polygon.cpp", | ||||
|         "./src/agg_embedded_raster_fonts.cpp", | ||||
|         "./src/agg_trans_double_path.cpp", | ||||
|         "./src/agg_vcgen_stroke.cpp", | ||||
|         "./src/agg_arc.cpp", | ||||
|         "./src/agg_image_filters.cpp", | ||||
|         "./src/agg_trans_warp_magnifier.cpp", | ||||
|         "./src/agg_vpgen_clip_polyline.cpp", | ||||
|         "./src/agg_bezier_arc.cpp", | ||||
|         "./src/agg_line_profile_aa.cpp", | ||||
|         "./src/agg_vcgen_contour.cpp", | ||||
|     ], | ||||
|     hdrs={ | ||||
|         "agg2d.h": "./include/agg2d.h", | ||||
|         "agg_alpha_mask_u8.h": "./include/agg_alpha_mask_u8.h", | ||||
|         "agg_arc.h": "./include/agg_arc.h", | ||||
|         "agg_array.h": "./include/agg_array.h", | ||||
|         "agg_arrowhead.h": "./include/agg_arrowhead.h", | ||||
|         "agg_basics.h": "./include/agg_basics.h", | ||||
|         "agg_bezier_arc.h": "./include/agg_bezier_arc.h", | ||||
|         "agg_bitset_iterator.h": "./include/agg_bitset_iterator.h", | ||||
|         "agg_blur.h": "./include/agg_blur.h", | ||||
|         "agg_bounding_rect.h": "./include/agg_bounding_rect.h", | ||||
|         "agg_bspline.h": "./include/agg_bspline.h", | ||||
|         "agg_clip_liang_barsky.h": "./include/agg_clip_liang_barsky.h", | ||||
|         "agg_color_gray.h": "./include/agg_color_gray.h", | ||||
|         "agg_color_rgba.h": "./include/agg_color_rgba.h", | ||||
|         "agg_config.h": "./include/agg_config.h", | ||||
|         "agg_conv_adaptor_vcgen.h": "./include/agg_conv_adaptor_vcgen.h", | ||||
|         "agg_conv_adaptor_vpgen.h": "./include/agg_conv_adaptor_vpgen.h", | ||||
|         "agg_conv_bspline.h": "./include/agg_conv_bspline.h", | ||||
|         "agg_conv_clip_polygon.h": "./include/agg_conv_clip_polygon.h", | ||||
|         "agg_conv_clip_polyline.h": "./include/agg_conv_clip_polyline.h", | ||||
|         "agg_conv_close_polygon.h": "./include/agg_conv_close_polygon.h", | ||||
|         "agg_conv_concat.h": "./include/agg_conv_concat.h", | ||||
|         "agg_conv_contour.h": "./include/agg_conv_contour.h", | ||||
|         "agg_conv_curve.h": "./include/agg_conv_curve.h", | ||||
|         "agg_conv_dash.h": "./include/agg_conv_dash.h", | ||||
|         "agg_conv_gpc.h": "./include/agg_conv_gpc.h", | ||||
|         "agg_conv_marker_adaptor.h": "./include/agg_conv_marker_adaptor.h", | ||||
|         "agg_conv_marker.h": "./include/agg_conv_marker.h", | ||||
|         "agg_conv_segmentator.h": "./include/agg_conv_segmentator.h", | ||||
|         "agg_conv_shorten_path.h": "./include/agg_conv_shorten_path.h", | ||||
|         "agg_conv_smooth_poly1.h": "./include/agg_conv_smooth_poly1.h", | ||||
|         "agg_conv_stroke.h": "./include/agg_conv_stroke.h", | ||||
|         "agg_conv_transform.h": "./include/agg_conv_transform.h", | ||||
|         "agg_conv_unclose_polygon.h": "./include/agg_conv_unclose_polygon.h", | ||||
|         "agg_curves.h": "./include/agg_curves.h", | ||||
|         "agg_dda_line.h": "./include/agg_dda_line.h", | ||||
|         "agg_ellipse_bresenham.h": "./include/agg_ellipse_bresenham.h", | ||||
|         "agg_ellipse.h": "./include/agg_ellipse.h", | ||||
|         "agg_embedded_raster_fonts.h": "./include/agg_embedded_raster_fonts.h", | ||||
|         "agg_font_cache_manager2.h": "./include/agg_font_cache_manager2.h", | ||||
|         "agg_font_cache_manager.h": "./include/agg_font_cache_manager.h", | ||||
|         "agg_gamma_functions.h": "./include/agg_gamma_functions.h", | ||||
|         "agg_gamma_lut.h": "./include/agg_gamma_lut.h", | ||||
|         "agg_glyph_raster_bin.h": "./include/agg_glyph_raster_bin.h", | ||||
|         "agg_gradient_lut.h": "./include/agg_gradient_lut.h", | ||||
|         "agg_gsv_text.h": "./include/agg_gsv_text.h", | ||||
|         "agg_image_accessors.h": "./include/agg_image_accessors.h", | ||||
|         "agg_image_filters.h": "./include/agg_image_filters.h", | ||||
|         "agg_line_aa_basics.h": "./include/agg_line_aa_basics.h", | ||||
|         "agg_math.h": "./include/agg_math.h", | ||||
|         "agg_math_stroke.h": "./include/agg_math_stroke.h", | ||||
|         "agg_path_length.h": "./include/agg_path_length.h", | ||||
|         "agg_path_storage.h": "./include/agg_path_storage.h", | ||||
|         "agg_path_storage_integer.h": "./include/agg_path_storage_integer.h", | ||||
|         "agg_pattern_filters_rgba.h": "./include/agg_pattern_filters_rgba.h", | ||||
|         "agg_pixfmt_amask_adaptor.h": "./include/agg_pixfmt_amask_adaptor.h", | ||||
|         "agg_pixfmt_base.h": "./include/agg_pixfmt_base.h", | ||||
|         "agg_pixfmt_gray.h": "./include/agg_pixfmt_gray.h", | ||||
|         "agg_pixfmt_rgba.h": "./include/agg_pixfmt_rgba.h", | ||||
|         "agg_pixfmt_rgb.h": "./include/agg_pixfmt_rgb.h", | ||||
|         "agg_pixfmt_rgb_packed.h": "./include/agg_pixfmt_rgb_packed.h", | ||||
|         "agg_pixfmt_transposer.h": "./include/agg_pixfmt_transposer.h", | ||||
|         "agg_rasterizer_cells_aa.h": "./include/agg_rasterizer_cells_aa.h", | ||||
|         "agg_rasterizer_compound_aa.h": "./include/agg_rasterizer_compound_aa.h", | ||||
|         "agg_rasterizer_outline_aa.h": "./include/agg_rasterizer_outline_aa.h", | ||||
|         "agg_rasterizer_outline.h": "./include/agg_rasterizer_outline.h", | ||||
|         "agg_rasterizer_scanline_aa.h": "./include/agg_rasterizer_scanline_aa.h", | ||||
|         "agg_rasterizer_scanline_aa_nogamma.h": "./include/agg_rasterizer_scanline_aa_nogamma.h", | ||||
|         "agg_rasterizer_sl_clip.h": "./include/agg_rasterizer_sl_clip.h", | ||||
|         "agg_renderer_base.h": "./include/agg_renderer_base.h", | ||||
|         "agg_renderer_markers.h": "./include/agg_renderer_markers.h", | ||||
|         "agg_renderer_mclip.h": "./include/agg_renderer_mclip.h", | ||||
|         "agg_renderer_outline_aa.h": "./include/agg_renderer_outline_aa.h", | ||||
|         "agg_renderer_outline_image.h": "./include/agg_renderer_outline_image.h", | ||||
|         "agg_renderer_primitives.h": "./include/agg_renderer_primitives.h", | ||||
|         "agg_renderer_raster_text.h": "./include/agg_renderer_raster_text.h", | ||||
|         "agg_renderer_scanline.h": "./include/agg_renderer_scanline.h", | ||||
|         "agg_rendering_buffer_dynarow.h": "./include/agg_rendering_buffer_dynarow.h", | ||||
|         "agg_rendering_buffer.h": "./include/agg_rendering_buffer.h", | ||||
|         "agg_rounded_rect.h": "./include/agg_rounded_rect.h", | ||||
|         "agg_scanline_bin.h": "./include/agg_scanline_bin.h", | ||||
|         "agg_scanline_boolean_algebra.h": "./include/agg_scanline_boolean_algebra.h", | ||||
|         "agg_scanline_p.h": "./include/agg_scanline_p.h", | ||||
|         "agg_scanline_storage_aa.h": "./include/agg_scanline_storage_aa.h", | ||||
|         "agg_scanline_storage_bin.h": "./include/agg_scanline_storage_bin.h", | ||||
|         "agg_scanline_u.h": "./include/agg_scanline_u.h", | ||||
|         "agg_shorten_path.h": "./include/agg_shorten_path.h", | ||||
|         "agg_simul_eq.h": "./include/agg_simul_eq.h", | ||||
|         "agg_span_allocator.h": "./include/agg_span_allocator.h", | ||||
|         "agg_span_converter.h": "./include/agg_span_converter.h", | ||||
|         "agg_span_gouraud_gray.h": "./include/agg_span_gouraud_gray.h", | ||||
|         "agg_span_gouraud.h": "./include/agg_span_gouraud.h", | ||||
|         "agg_span_gouraud_rgba.h": "./include/agg_span_gouraud_rgba.h", | ||||
|         "agg_span_gradient_alpha.h": "./include/agg_span_gradient_alpha.h", | ||||
|         "agg_span_gradient_contour.h": "./include/agg_span_gradient_contour.h", | ||||
|         "agg_span_gradient.h": "./include/agg_span_gradient.h", | ||||
|         "agg_span_gradient_image.h": "./include/agg_span_gradient_image.h", | ||||
|         "agg_span_image_filter_gray.h": "./include/agg_span_image_filter_gray.h", | ||||
|         "agg_span_image_filter.h": "./include/agg_span_image_filter.h", | ||||
|         "agg_span_image_filter_rgba.h": "./include/agg_span_image_filter_rgba.h", | ||||
|         "agg_span_image_filter_rgb.h": "./include/agg_span_image_filter_rgb.h", | ||||
|         "agg_span_interpolator_adaptor.h": "./include/agg_span_interpolator_adaptor.h", | ||||
|         "agg_span_interpolator_linear.h": "./include/agg_span_interpolator_linear.h", | ||||
|         "agg_span_interpolator_persp.h": "./include/agg_span_interpolator_persp.h", | ||||
|         "agg_span_interpolator_trans.h": "./include/agg_span_interpolator_trans.h", | ||||
|         "agg_span_pattern_gray.h": "./include/agg_span_pattern_gray.h", | ||||
|         "agg_span_pattern_rgba.h": "./include/agg_span_pattern_rgba.h", | ||||
|         "agg_span_pattern_rgb.h": "./include/agg_span_pattern_rgb.h", | ||||
|         "agg_span_solid.h": "./include/agg_span_solid.h", | ||||
|         "agg_span_subdiv_adaptor.h": "./include/agg_span_subdiv_adaptor.h", | ||||
|         "agg_trans_affine.h": "./include/agg_trans_affine.h", | ||||
|         "agg_trans_bilinear.h": "./include/agg_trans_bilinear.h", | ||||
|         "agg_trans_double_path.h": "./include/agg_trans_double_path.h", | ||||
|         "agg_trans_perspective.h": "./include/agg_trans_perspective.h", | ||||
|         "agg_trans_single_path.h": "./include/agg_trans_single_path.h", | ||||
|         "agg_trans_viewport.h": "./include/agg_trans_viewport.h", | ||||
|         "agg_trans_warp_magnifier.h": "./include/agg_trans_warp_magnifier.h", | ||||
|         "agg_vcgen_bspline.h": "./include/agg_vcgen_bspline.h", | ||||
|         "agg_vcgen_contour.h": "./include/agg_vcgen_contour.h", | ||||
|         "agg_vcgen_dash.h": "./include/agg_vcgen_dash.h", | ||||
|         "agg_vcgen_markers_term.h": "./include/agg_vcgen_markers_term.h", | ||||
|         "agg_vcgen_smooth_poly1.h": "./include/agg_vcgen_smooth_poly1.h", | ||||
|         "agg_vcgen_stroke.h": "./include/agg_vcgen_stroke.h", | ||||
|         "agg_vcgen_vertex_sequence.h": "./include/agg_vcgen_vertex_sequence.h", | ||||
|         "agg_vertex_sequence.h": "./include/agg_vertex_sequence.h", | ||||
|         "agg_vpgen_clip_polygon.h": "./include/agg_vpgen_clip_polygon.h", | ||||
|         "agg_vpgen_clip_polyline.h": "./include/agg_vpgen_clip_polyline.h", | ||||
|         "agg_vpgen_segmentator.h": "./include/agg_vpgen_segmentator.h", | ||||
|     }, | ||||
| ) | ||||
| @@ -1,21 +0,0 @@ | ||||
| ifeq ($(OS), Windows_NT) | ||||
|  | ||||
| EMU_SRCS = \ | ||||
| 	dep/emu/fnmatch.c | ||||
|  | ||||
| EMU_OBJS = $(patsubst %.c, $(OBJDIR)/%.o, $(EMU_SRCS)) | ||||
| $(EMU_OBJS): CFLAGS += -Idep/emu | ||||
| EMU_LIB = $(OBJDIR)/libemu.a | ||||
| $(EMU_LIB): $(EMU_OBJS) | ||||
| EMU_CFLAGS = -Idep/emu | ||||
| EMU_LDFLAGS = $(EMU_LIB) | ||||
| OBJS += $(EMU_OBJS) | ||||
|  | ||||
| else | ||||
|  | ||||
| EMU_LIB = | ||||
| EMU_CFLAGS = | ||||
| EMU_LDFLAGS = | ||||
|  | ||||
| endif | ||||
|  | ||||
							
								
								
									
										3
									
								
								dep/emu/build.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								dep/emu/build.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| from build.c import clibrary | ||||
|  | ||||
| clibrary(name="emu", srcs=["./fnmatch.c"], hdrs={"fnmatch.h": "./fnmatch.h"}) | ||||
| @@ -1,13 +0,0 @@ | ||||
| FATFS_SRCS = \ | ||||
| 	dep/fatfs/source/ff.c \ | ||||
| 	dep/fatfs/source/ffsystem.c \ | ||||
| 	dep/fatfs/source/ffunicode.c \ | ||||
| 	 | ||||
| FATFS_OBJS = $(patsubst %.c, $(OBJDIR)/%.o, $(FATFS_SRCS)) | ||||
| $(FATFS_OBJS): CFLAGS += -Idep/fatfs/source | ||||
| FATFS_LIB = $(OBJDIR)/libfatfs.a | ||||
| $(FATFS_LIB): $(FATFS_OBJS) | ||||
| FATFS_CFLAGS = -Idep/fatfs/source | ||||
| FATFS_LDFLAGS =  | ||||
| OBJS += $(FATFS_OBJS) | ||||
|  | ||||
							
								
								
									
										18
									
								
								dep/fatfs/build.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								dep/fatfs/build.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| from build.c import clibrary | ||||
|  | ||||
| clibrary( | ||||
|     name="fatfs", | ||||
|     srcs=[ | ||||
|         "./source/ff.c", | ||||
|         "./source/ffsystem.c", | ||||
|         "./source/ffunicode.c", | ||||
|         "./source/ff.h", | ||||
|         "./source/ffconf.h", | ||||
|         "./source/diskio.h", | ||||
|     ], | ||||
|     hdrs={ | ||||
|         "ff.h": "./source/ff.h", | ||||
|         "ffconf.h": "./source/ffconf.h", | ||||
|         "diskio.h": "./source/diskio.h", | ||||
|     }, | ||||
| ) | ||||
| @@ -1,22 +0,0 @@ | ||||
| HFSUTILS_SRCS = \ | ||||
| 	dep/hfsutils/libhfs/block.c \ | ||||
| 	dep/hfsutils/libhfs/btree.c \ | ||||
| 	dep/hfsutils/libhfs/data.c \ | ||||
| 	dep/hfsutils/libhfs/file.c \ | ||||
| 	dep/hfsutils/libhfs/hfs.c \ | ||||
| 	dep/hfsutils/libhfs/low.c \ | ||||
| 	dep/hfsutils/libhfs/medium.c \ | ||||
| 	dep/hfsutils/libhfs/memcmp.c \ | ||||
| 	dep/hfsutils/libhfs/node.c \ | ||||
| 	dep/hfsutils/libhfs/record.c \ | ||||
| 	dep/hfsutils/libhfs/version.c \ | ||||
| 	dep/hfsutils/libhfs/volume.c \ | ||||
| 	 | ||||
| HFSUTILS_OBJS = $(patsubst %.c, $(OBJDIR)/%.o, $(HFSUTILS_SRCS)) | ||||
| $(HFSUTILS_OBJS): CFLAGS += -Idep/hfsutils/libhfs | ||||
| HFSUTILS_LIB = $(OBJDIR)/libhfsutils.a | ||||
| $(HFSUTILS_LIB): $(HFSUTILS_OBJS) | ||||
| HFSUTILS_CFLAGS = -Idep/hfsutils/libhfs | ||||
| HFSUTILS_LDFLAGS = | ||||
| OBJS += $(HFSUTILS_OBJS) | ||||
|  | ||||
							
								
								
									
										25
									
								
								dep/hfsutils/build.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								dep/hfsutils/build.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| from build.c import clibrary | ||||
|  | ||||
| clibrary( | ||||
|     name="hfsutils", | ||||
|     srcs=[ | ||||
|         "./libhfs/block.c", | ||||
|         "./libhfs/btree.c", | ||||
|         "./libhfs/data.c", | ||||
|         "./libhfs/file.c", | ||||
|         "./libhfs/hfs.c", | ||||
|         "./libhfs/low.c", | ||||
|         "./libhfs/medium.c", | ||||
|         "./libhfs/memcmp.c", | ||||
|         "./libhfs/node.c", | ||||
|         "./libhfs/record.c", | ||||
|         "./libhfs/version.c", | ||||
|         "./libhfs/volume.c", | ||||
|     ], | ||||
|     hdrs={ | ||||
|         "apple.h": "./libhfs/apple.h", | ||||
|         "hfs.h": "./libhfs/hfs.h", | ||||
|         "libhfs.h": "./libhfs/libhfs.h", | ||||
|         "os.h": "./libhfs/os.h", | ||||
|     }, | ||||
| ) | ||||
| @@ -1,61 +0,0 @@ | ||||
| LIBUSBP_SRCS = \ | ||||
| 	dep/libusbp/src/async_in_pipe.c \ | ||||
| 	dep/libusbp/src/error.c \ | ||||
| 	dep/libusbp/src/error_hresult.c \ | ||||
| 	dep/libusbp/src/find_device.c \ | ||||
| 	dep/libusbp/src/list.c \ | ||||
| 	dep/libusbp/src/pipe_id.c \ | ||||
| 	dep/libusbp/src/string.c \ | ||||
| 	 | ||||
| ifeq ($(OS), Windows_NT) | ||||
|  | ||||
| LIBUSBP_LDFLAGS += -lsetupapi -lwinusb -lole32 -luuid | ||||
| LIBUSBP_SRCS += \ | ||||
| 	dep/libusbp/src/windows/async_in_transfer_windows.c \ | ||||
| 	dep/libusbp/src/windows/device_instance_id_windows.c \ | ||||
| 	dep/libusbp/src/windows/device_windows.c \ | ||||
| 	dep/libusbp/src/windows/error_windows.c \ | ||||
| 	dep/libusbp/src/windows/generic_handle_windows.c \ | ||||
| 	dep/libusbp/src/windows/generic_interface_windows.c \ | ||||
| 	dep/libusbp/src/windows/interface_windows.c \ | ||||
| 	dep/libusbp/src/windows/list_windows.c \ | ||||
| 	dep/libusbp/src/windows/serial_port_windows.c \ | ||||
|  | ||||
| else ifeq ($(shell uname),Darwin) | ||||
|  | ||||
| LIBUSBP_SRCS += \ | ||||
| 	dep/libusbp/src/mac/async_in_transfer_mac.c \ | ||||
| 	dep/libusbp/src/mac/device_mac.c \ | ||||
| 	dep/libusbp/src/mac/error_mac.c \ | ||||
| 	dep/libusbp/src/mac/generic_handle_mac.c \ | ||||
| 	dep/libusbp/src/mac/generic_interface_mac.c \ | ||||
| 	dep/libusbp/src/mac/iokit_mac.c \ | ||||
| 	dep/libusbp/src/mac/list_mac.c \ | ||||
| 	dep/libusbp/src/mac/serial_port_mac.c \ | ||||
|  | ||||
| else | ||||
|  | ||||
| LIBUSBP_CFLAGS += $(shell pkg-config --cflags libudev) | ||||
| LIBUSBP_LDFLAGS += $(shell pkg-config --libs libudev) | ||||
| LIBUSBP_SRCS += \ | ||||
| 	dep/libusbp/src/linux/async_in_transfer_linux.c \ | ||||
| 	dep/libusbp/src/linux/device_linux.c \ | ||||
| 	dep/libusbp/src/linux/error_linux.c \ | ||||
| 	dep/libusbp/src/linux/generic_handle_linux.c \ | ||||
| 	dep/libusbp/src/linux/generic_interface_linux.c \ | ||||
| 	dep/libusbp/src/linux/list_linux.c \ | ||||
| 	dep/libusbp/src/linux/serial_port_linux.c \ | ||||
| 	dep/libusbp/src/linux/udev_linux.c \ | ||||
| 	dep/libusbp/src/linux/usbfd_linux.c \ | ||||
|  | ||||
| endif | ||||
|  | ||||
| LIBUSBP_OBJS = $(patsubst %.c, $(OBJDIR)/%.o, $(LIBUSBP_SRCS)) | ||||
| $(LIBUSBP_OBJS): private CFLAGS += -Idep/libusbp/src -Idep/libusbp/include | ||||
| LIBUSBP_LIB = $(OBJDIR)/libusbp.a | ||||
| LIBUSBP_CFLAGS += -Idep/libusbp/include | ||||
| LIBUSBP_LDFLAGS += | ||||
| $(LIBUSBP_LIB): $(LIBUSBP_OBJS) | ||||
| OBJS += $(LIBUSBP_OBJS) | ||||
|  | ||||
|  | ||||
							
								
								
									
										72
									
								
								dep/libusbp/build.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								dep/libusbp/build.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| from build.ab import emit | ||||
| from build.c import clibrary | ||||
| from build.pkg import package | ||||
| from config import windows, osx, unix | ||||
|  | ||||
| srcs = [ | ||||
|     "./src/async_in_pipe.c", | ||||
|     "./src/error.c", | ||||
|     "./src/error_hresult.c", | ||||
|     "./src/find_device.c", | ||||
|     "./src/list.c", | ||||
|     "./src/pipe_id.c", | ||||
|     "./src/string.c", | ||||
|     "./src/libusbp_internal.h", | ||||
|     "./include/libusbp_config.h", | ||||
|     "./include/libusbp.h", | ||||
| ] | ||||
| deps = [] | ||||
| ldflags = [] | ||||
|  | ||||
| if windows: | ||||
|     srcs += [ | ||||
|         "./src/windows/async_in_transfer_windows.c", | ||||
|         "./src/windows/device_instance_id_windows.c", | ||||
|         "./src/windows/device_windows.c", | ||||
|         "./src/windows/error_windows.c", | ||||
|         "./src/windows/generic_handle_windows.c", | ||||
|         "./src/windows/generic_interface_windows.c", | ||||
|         "./src/windows/interface_windows.c", | ||||
|         "./src/windows/list_windows.c", | ||||
|         "./src/windows/serial_port_windows.c", | ||||
|     ] | ||||
|     ldflags += ["-lsetupapi", "-lwinusb", "-lole32", "-luuid"] | ||||
| elif osx: | ||||
|     srcs += [ | ||||
|         "./src/mac/async_in_transfer_mac.c", | ||||
|         "./src/mac/device_mac.c", | ||||
|         "./src/mac/error_mac.c", | ||||
|         "./src/mac/generic_handle_mac.c", | ||||
|         "./src/mac/generic_interface_mac.c", | ||||
|         "./src/mac/iokit_mac.c", | ||||
|         "./src/mac/list_mac.c", | ||||
|         "./src/mac/serial_port_mac.c", | ||||
|     ] | ||||
| else: | ||||
|     package(name="udev_lib", package="libudev") | ||||
|     srcs += [ | ||||
|         "./src/linux/async_in_transfer_linux.c", | ||||
|         "./src/linux/device_linux.c", | ||||
|         "./src/linux/error_linux.c", | ||||
|         "./src/linux/generic_handle_linux.c", | ||||
|         "./src/linux/generic_interface_linux.c", | ||||
|         "./src/linux/list_linux.c", | ||||
|         "./src/linux/serial_port_linux.c", | ||||
|         "./src/linux/udev_linux.c", | ||||
|         "./src/linux/usbfd_linux.c", | ||||
|     ] | ||||
|     deps += [".+udev_lib"] | ||||
|  | ||||
| clibrary( | ||||
|     name="libusbp", | ||||
|     srcs=srcs, | ||||
|     cflags=["-Idep/libusbp/include", "-Idep/libusbp/src"], | ||||
|     ldflags=ldflags, | ||||
|     deps=deps, | ||||
|     hdrs={ | ||||
|         "libusbp_internal.h": "./src/libusbp_internal.h", | ||||
|         "libusbp_config.h": "./include/libusbp_config.h", | ||||
|         "libusbp.hpp": "./include/libusbp.hpp", | ||||
|         "libusbp.h": "./include/libusbp.h", | ||||
|     }, | ||||
| ) | ||||
| @@ -234,7 +234,7 @@ namespace libusbp | ||||
|         } | ||||
|  | ||||
|         /*! Wrapper for libusbp_error_get_message(). */ | ||||
|         virtual const char * what() const noexcept | ||||
|         virtual const char * what() const noexcept override | ||||
|         { | ||||
|             return libusbp_error_get_message(pointer); | ||||
|         } | ||||
|   | ||||
							
								
								
									
										103
									
								
								dep/libusbp/src/dummy.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								dep/libusbp/src/dummy.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,103 @@ | ||||
|  | ||||
| // This file contains failing place-holders to make things compile | ||||
| // on otherwise unsupported platforms. | ||||
|  | ||||
| #include <libusbp_internal.h> | ||||
|  | ||||
| struct libusbp_device | ||||
| { | ||||
|     char* syspath; | ||||
|     char* serial_number; // may be NULL | ||||
|     uint16_t product_id; | ||||
|     uint16_t vendor_id; | ||||
|     uint16_t revision; | ||||
| }; | ||||
|  | ||||
| static libusbp_error* fail() | ||||
| { | ||||
|     return error_create("USB hardware is not supported on this platform"); | ||||
| } | ||||
|  | ||||
| libusbp_error* libusbp_device_copy( | ||||
|     const libusbp_device* source, libusbp_device** dest) | ||||
| { | ||||
|     return fail(); | ||||
| } | ||||
|  | ||||
| libusbp_error* libusbp_generic_interface_create(const libusbp_device* device, | ||||
|     uint8_t interface_number, | ||||
|     bool composite __attribute__((unused)), | ||||
|     libusbp_generic_interface** gi) | ||||
| { | ||||
|     return fail(); | ||||
| } | ||||
|  | ||||
| libusbp_error* libusbp_generic_handle_open( | ||||
|     const libusbp_generic_interface* gi, libusbp_generic_handle** handle) | ||||
| { | ||||
|     return fail(); | ||||
| } | ||||
|  | ||||
| void libusbp_device_free(libusbp_device* device) {} | ||||
|  | ||||
| void libusbp_generic_handle_close(libusbp_generic_handle* handle) {} | ||||
|  | ||||
| void libusbp_generic_interface_free(libusbp_generic_interface* gi) {} | ||||
|  | ||||
| libusbp_error* libusbp_device_get_vendor_id( | ||||
|     const libusbp_device* device, uint16_t* vendor_id) | ||||
| { | ||||
|     return fail(); | ||||
| } | ||||
|  | ||||
| libusbp_error* libusbp_device_get_product_id( | ||||
|     const libusbp_device* device, uint16_t* product_id) | ||||
| { | ||||
|     return fail(); | ||||
| } | ||||
|  | ||||
| libusbp_error* libusbp_device_get_serial_number( | ||||
|     const libusbp_device* device, char** serial_number) | ||||
| { | ||||
|     return fail(); | ||||
| } | ||||
|  | ||||
| libusbp_error* libusbp_write_pipe(libusbp_generic_handle* handle, | ||||
|     uint8_t pipe_id, | ||||
|     const void* data, | ||||
|     size_t size, | ||||
|     size_t* transferred) | ||||
| { | ||||
|     return fail(); | ||||
| } | ||||
|  | ||||
| libusbp_error* libusbp_read_pipe(libusbp_generic_handle* handle, | ||||
|     uint8_t pipe_id, | ||||
|     void* data, | ||||
|     size_t size, | ||||
|     size_t* transferred) | ||||
| { | ||||
|     return fail(); | ||||
| } | ||||
|  | ||||
| libusbp_error* libusbp_serial_port_create(const libusbp_device* device, | ||||
|     uint8_t interface_number, | ||||
|     bool composite, | ||||
|     libusbp_serial_port** port) | ||||
| { | ||||
|     return fail(); | ||||
| } | ||||
|  | ||||
| libusbp_error* libusbp_serial_port_get_name( | ||||
|     const libusbp_serial_port* port, char** name) | ||||
| { | ||||
|     return fail(); | ||||
| } | ||||
|  | ||||
| void libusbp_serial_port_free(libusbp_serial_port* port) {} | ||||
|  | ||||
| libusbp_error* libusbp_list_connected_devices( | ||||
|     libusbp_device*** device_list, size_t* device_count) | ||||
| { | ||||
|     return fail(); | ||||
| } | ||||
							
								
								
									
										49
									
								
								dep/snowhouse/build.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								dep/snowhouse/build.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| from build.c import cxxlibrary | ||||
|  | ||||
| cxxlibrary( | ||||
|     name="snowhouse", | ||||
|     hdrs={ | ||||
|         "snowhouse/snowhouse.h": "./include/snowhouse/snowhouse.h", | ||||
|         "snowhouse/assert.h": "./include/snowhouse/assert.h", | ||||
|         "snowhouse/fluent/fluent.h": "./include/snowhouse/fluent/fluent.h", | ||||
|         "snowhouse/fluent/constraintadapter.h": "./include/snowhouse/fluent/constraintadapter.h", | ||||
|         "snowhouse/fluent/constraintlist.h": "./include/snowhouse/fluent/constraintlist.h", | ||||
|         "snowhouse/fluent/operators/andoperator.h": "./include/snowhouse/fluent/operators/andoperator.h", | ||||
|         "snowhouse/fluent/operators/invalidexpressionexception.h": "./include/snowhouse/fluent/operators/invalidexpressionexception.h", | ||||
|         "snowhouse/fluent/operators/collections/collectionoperator.h": "./include/snowhouse/fluent/operators/collections/collectionoperator.h", | ||||
|         "snowhouse/fluent/operators/collections/collectionconstraintevaluator.h": "./include/snowhouse/fluent/operators/collections/collectionconstraintevaluator.h", | ||||
|         "snowhouse/fluent/operators/collections/atleastoperator.h": "./include/snowhouse/fluent/operators/collections/atleastoperator.h", | ||||
|         "snowhouse/fluent/operators/collections/noneoperator.h": "./include/snowhouse/fluent/operators/collections/noneoperator.h", | ||||
|         "snowhouse/fluent/operators/collections/atmostoperator.h": "./include/snowhouse/fluent/operators/collections/atmostoperator.h", | ||||
|         "snowhouse/fluent/operators/collections/alloperator.h": "./include/snowhouse/fluent/operators/collections/alloperator.h", | ||||
|         "snowhouse/fluent/operators/collections/exactlyoperator.h": "./include/snowhouse/fluent/operators/collections/exactlyoperator.h", | ||||
|         "snowhouse/fluent/operators/notoperator.h": "./include/snowhouse/fluent/operators/notoperator.h", | ||||
|         "snowhouse/fluent/operators/constraintoperator.h": "./include/snowhouse/fluent/operators/constraintoperator.h", | ||||
|         "snowhouse/fluent/operators/oroperator.h": "./include/snowhouse/fluent/operators/oroperator.h", | ||||
|         "snowhouse/fluent/expressionbuilder.h": "./include/snowhouse/fluent/expressionbuilder.h", | ||||
|         "snowhouse/assertionexception.h": "./include/snowhouse/assertionexception.h", | ||||
|         "snowhouse/exceptions.h": "./include/snowhouse/exceptions.h", | ||||
|         "snowhouse/stringizers.h": "./include/snowhouse/stringizers.h", | ||||
|         "snowhouse/macros.h": "./include/snowhouse/macros.h", | ||||
|         "snowhouse/constraints/equalscontainerconstraint.h": "./include/snowhouse/constraints/equalscontainerconstraint.h", | ||||
|         "snowhouse/constraints/islessthanorequaltoconstraint.h": "./include/snowhouse/constraints/islessthanorequaltoconstraint.h", | ||||
|         "snowhouse/constraints/equalsconstraint.h": "./include/snowhouse/constraints/equalsconstraint.h", | ||||
|         "snowhouse/constraints/isgreaterthanconstraint.h": "./include/snowhouse/constraints/isgreaterthanconstraint.h", | ||||
|         "snowhouse/constraints/fulfillsconstraint.h": "./include/snowhouse/constraints/fulfillsconstraint.h", | ||||
|         "snowhouse/constraints/endswithconstraint.h": "./include/snowhouse/constraints/endswithconstraint.h", | ||||
|         "snowhouse/constraints/constraints.h": "./include/snowhouse/constraints/constraints.h", | ||||
|         "snowhouse/constraints/haslengthconstraint.h": "./include/snowhouse/constraints/haslengthconstraint.h", | ||||
|         "snowhouse/constraints/startswithconstraint.h": "./include/snowhouse/constraints/startswithconstraint.h", | ||||
|         "snowhouse/constraints/equalswithdeltaconstraint.h": "./include/snowhouse/constraints/equalswithdeltaconstraint.h", | ||||
|         "snowhouse/constraints/isgreaterthanorequaltoconstraint.h": "./include/snowhouse/constraints/isgreaterthanorequaltoconstraint.h", | ||||
|         "snowhouse/constraints/containsconstraint.h": "./include/snowhouse/constraints/containsconstraint.h", | ||||
|         "snowhouse/constraints/islessthanconstraint.h": "./include/snowhouse/constraints/islessthanconstraint.h", | ||||
|         "snowhouse/constraints/isemptyconstraint.h": "./include/snowhouse/constraints/isemptyconstraint.h", | ||||
|         "snowhouse/constraints/expressions/andexpression.h": "./include/snowhouse/constraints/expressions/andexpression.h", | ||||
|         "snowhouse/constraints/expressions/orexpression.h": "./include/snowhouse/constraints/expressions/orexpression.h", | ||||
|         "snowhouse/constraints/expressions/expression_fwd.h": "./include/snowhouse/constraints/expressions/expression_fwd.h", | ||||
|         "snowhouse/constraints/expressions/notexpression.h": "./include/snowhouse/constraints/expressions/notexpression.h", | ||||
|         "snowhouse/constraints/expressions/expression.h": "./include/snowhouse/constraints/expressions/expression.h", | ||||
|         "snowhouse/stringize.h": "./include/snowhouse/stringize.h", | ||||
|     }, | ||||
| ) | ||||
| @@ -1,23 +0,0 @@ | ||||
| ifeq ($(shell $(PKG_CONFIG) stb; echo $$?), 0) | ||||
|  | ||||
| # System libstb present. | ||||
|  | ||||
| STB_LIB = | ||||
| STB_CFLAGS := $(shell $(PKG_CONFIG) --cflags stb) | ||||
| STB_LDFLAGS := $(shell $(PKG_CONFIG) --libs stb) | ||||
|  | ||||
| else | ||||
|  | ||||
| STB_SRCS = \ | ||||
| 	dep/stb/stb_image_write.c | ||||
| 	 | ||||
| STB_OBJS = $(patsubst %.c, $(OBJDIR)/%.o, $(STB_SRCS)) | ||||
| $(STB_OBJS): CFLAGS += -Idep/stb/src | ||||
| STB_LIB = $(OBJDIR)/libstb.a | ||||
| $(STB_LIB): $(STB_OBJS) | ||||
| STB_CFLAGS = | ||||
| STB_LDFLAGS = $(STB_LIB) | ||||
| OBJS += $(STB_OBJS) | ||||
|  | ||||
| endif | ||||
|  | ||||
							
								
								
									
										7
									
								
								dep/stb/build.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								dep/stb/build.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| from build.c import clibrary | ||||
|  | ||||
| clibrary( | ||||
|     name="stb", | ||||
|     srcs=["./stb_image_write.c"], | ||||
|     hdrs={"stb_image_write.h": "./stb_image_write.h"}, | ||||
| ) | ||||
| @@ -204,7 +204,7 @@ install some support packages. | ||||
|   - For Linux with Ubuntu/Debian: | ||||
| 	`libusb-1.0-0-dev`, `libsqlite3-dev`, `zlib1g-dev`, | ||||
| 	`libudev-dev`, `protobuf-compiler`, `libwxgtk3.0-gtk3-dev`, | ||||
| 	`libfmt-dev`. | ||||
| 	`libfmt-dev`, `python3`. | ||||
|   - For Linux with Fedora/Red Hat: | ||||
|     `git`, `make`, `gcc`, `gcc-c++`, `xxd`, `protobuf-compiler`, | ||||
|     `protobuf-devel`, `fmt-devel`, `systemd-devel`, `wxGTK3-devel`, | ||||
| @@ -214,7 +214,7 @@ install some support packages. | ||||
|   - For Windows with MSYS2: `make`, `mingw-w64-i686-libusb`, | ||||
| 	`mingw-w64-i686-protobuf`, `mingw-w64-i686-sqlite3`, `mingw-w64-i686-zlib`, | ||||
| 	`mingw-w64-i686-gcc`, `vim`, `diffutils`, `mingw-w64-i686-wxWidgets`, | ||||
| 	`mingw-w64-i686-fmt`, `mingw-w64-i686-pkg-config`. | ||||
| 	`mingw-w64-i686-fmt`, `mingw-w64-i686-pkg-config`, `mingw-w64-i686-python`. | ||||
|  | ||||
| These lists are not necessarily exhaustive --- please [get in | ||||
| touch](https://github.com/davidgiven/fluxengine/issues/new) if I've missed | ||||
| @@ -222,10 +222,16 @@ anything. | ||||
|  | ||||
| Windows and Linux (and other Unixes) build by just doing `make`. OSX builds by | ||||
| doing `gmake` (we're using a feature which the elderly default make in OSX | ||||
| doesn't have). You should end up with some executables in the current | ||||
| directory, one of which is called `fluxengine` or `fluxengine.exe` depending on | ||||
| your platform. It has minimal dependencies and you should be able to put it | ||||
| anywhere. The other binaries may also be of interest. | ||||
| doesn't have). Remember to add an appropriate `-j` option for a parallel build. | ||||
| You should end up with some executables in the current directory, one of which | ||||
| is called `fluxengine` or `fluxengine.exe` depending on your platform. It has | ||||
| minimal dependencies and you should be able to put it anywhere. The other | ||||
| binaries may also be of interest. | ||||
|  | ||||
| Potential issues: | ||||
|  | ||||
|   - Complaints about a missing `libudev` on Windows? Make sure you're using the | ||||
|   mingw Python rather than the msys Python. | ||||
|  | ||||
| If it doesn't build, please [get in | ||||
| touch](https://github.com/davidgiven/fluxengine/issues/new). | ||||
|   | ||||
| @@ -15,6 +15,7 @@ encoding scheme. | ||||
|  | ||||
|   - Format variants: | ||||
|       - `264`: 264kB 3.5" 66-track SSDD; HP9121 format | ||||
|       - `608`: 608kB 3.5" 76-track DSDD; HP9122 format | ||||
|       - `616`: 616kB 3.5" 77-track DSDD | ||||
|       - `770`: 770kB 3.5" 77-track DSDD | ||||
|  | ||||
| @@ -23,12 +24,19 @@ encoding scheme. | ||||
| To read: | ||||
|  | ||||
|   - `fluxengine read hplif --264 -s drive:0 -o hplif.img` | ||||
|   - `fluxengine read hplif --608 -s drive:0 -o hplif.img` | ||||
|   - `fluxengine read hplif --616 -s drive:0 -o hplif.img` | ||||
|   - `fluxengine read hplif --770 -s drive:0 -o hplif.img` | ||||
|  | ||||
| To write: | ||||
|  | ||||
|   - `fluxengine write hplif --264 -d drive:0 -i hplif.img` | ||||
|   - `fluxengine write hplif --608 -d drive:0 -i hplif.img` | ||||
|   - `fluxengine write hplif --616 -d drive:0 -i hplif.img` | ||||
|   - `fluxengine write hplif --770 -d drive:0 -i hplif.img` | ||||
|  | ||||
| ## References | ||||
|  | ||||
|   * [A summary of the Hewlett Packard floppy disk | ||||
|     formats](http://www.bitsavers.org/pdf/hp/disc/912x/HP_Flexible_Disk_Formats.pdf) | ||||
|  | ||||
|   | ||||
| @@ -22,13 +22,25 @@ pinout as a 96tpi PC 5.25" drive. In use they should be identical. | ||||
| While most operating systems use the standard Micropolis checksum, Vector | ||||
| Graphic MZOS uses a unique checksum.  The decoder will automatically detect | ||||
| the checksum type in use; however, a specific checksum type may be forced | ||||
| using the `--decoder.micropolis.checksum_type=n` where the type is one of: | ||||
| using the `--decoder.micropolis.checksum_type=TYPE` where TYPE is one of: | ||||
|  | ||||
| | Type | Description                             | | ||||
| |------|-----------------------------------------| | ||||
| | 0    | Automatically detect                    | | ||||
| | 1    | Standard Micropolis (MDOS, CP/M, OASIS) | | ||||
| | 2    | Vector Graphic MZOS                     | | ||||
| | Checksum   | Description                             | | ||||
| |------------|-----------------------------------------| | ||||
| | AUTO       | Automatically detect                    | | ||||
| | MICROPOLIS | Standard Micropolis (MDOS, CP/M, OASIS) | | ||||
| | MZOS       | Vector Graphic MZOS                     | | ||||
|  | ||||
| Later versions of the Micropolis format supported ECC, especially in | ||||
| controllers with HDD support. The ECC can detect and correct errors. However, | ||||
| it is unclear what ECC algorithm was used by each vendor. ECC is disabled by | ||||
| default, but available for checking and correcting using | ||||
| `--decoder.micropolis.ecc_type=TYPE` and for writing from IMG files using | ||||
| `--encoder.micropolis.ecc_type=TYPE`, where TYPE is one of: | ||||
|  | ||||
| | ECC    | Description                              | | ||||
| |--------|------------------------------------------| | ||||
| | NONE   | No ECC processing enabled                | | ||||
| | VECTOR | Vector Graphic Dual-Mode Disk Controller | | ||||
|  | ||||
| The [CP/M BIOS](https://www.seasip.info/Cpm/bios.html) defined SELDSK, SETTRK, | ||||
| and SETSEC, but no function to select the head/side. Double-sided floppies | ||||
|   | ||||
							
								
								
									
										33
									
								
								doc/disk-ms2000.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								doc/disk-ms2000.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| ms2000 | ||||
| ==== | ||||
| ## MS2000 Microdisk Development System | ||||
| <!-- This file is automatically generated. Do not edit. --> | ||||
|  | ||||
| The RCA MicroDisk Development System MS2000 is a highly obscure (i.e. I gather | ||||
| that single digit numbers of original machines exist) development system for the | ||||
| RCA1802 series of CPUs, as made famous by the Cosmac ELF. It was a fairly | ||||
| straightforward big bag o'RAM system with a 2kB boot ROM, 62kB of RAM, twin | ||||
| floppy drives and a serial terminal --- CP/M users will find it very familiar. | ||||
|  | ||||
| Read and writing disks is currently not supported by FluxEngine, but there is | ||||
| basic support for the MicroDisk operating system's file system. This should | ||||
| allow files to be read from MS2000 disk images. | ||||
|  | ||||
| The disks are normal DD 3.5" disks, using a 70-track, single sided variation of | ||||
| the venerable IBM floppy disk scheme, so allowing 315kB of storage per disk. | ||||
|  | ||||
| If you have access to flux files for MS2000 disks, please [get in | ||||
| touch](https://github.com/davidgiven/cpm65/issues/new) --- I would like to add | ||||
| better support for these. | ||||
|  | ||||
| ## Options | ||||
|  | ||||
| (no options) | ||||
|  | ||||
| ## Examples | ||||
|  | ||||
| ## References | ||||
|  | ||||
|   - [The EMMA-02 emulator](https://www.emma02.hobby-site.com/ms2000.html), which | ||||
|     supports the MS2000 and provides information on it. | ||||
|  | ||||
| @@ -9,13 +9,29 @@ drive, used for saving MIDI sequences and samples. | ||||
| Weirdly, it seems to use precisely the same format as the Brother word | ||||
| processors: a thoroughly non-IBM-compatible custom GCR system. | ||||
|  | ||||
| FluxEngine pretends to support this, but it has had almost no testing, the only | ||||
| disk image I have seen for it was mostly corrupt, and very little is known | ||||
| about the format, so I have no idea whether it's correct or not. | ||||
| FluxEngine supports both reading and writing D20 disks, as well as basic support | ||||
| for the filesystem, allowing files to be read from and written to D20 disks. | ||||
| Note that the D20 was never intended to support arbitrary files on its disks and | ||||
| is very likely to crash if you put unexpected files on a disk. In addition, | ||||
| while the file format itself is currently unknown, there is a header at the top | ||||
| of the file containing what appears to be the name shown in the D20 file | ||||
| browser, so the name by which you see it is not necessarily the filename. | ||||
|  | ||||
| A word of warning --- just like the Brother word processors, the D20 floppy | ||||
| drive isn't very well aligned. The drive itself uses quarter-stepping to | ||||
| automatically adapt to whatever alignment the disk was formatted with. This | ||||
| means that trying to read such a disk on a PC drive, which does _not_ have | ||||
| adjustable alignment, may not work very well. In these situations it is possible | ||||
| to adjust the alignment of most modern drives, but this is a somewhat risky | ||||
| process and may result in permanently wrecking the drive alignment. | ||||
|  | ||||
| Please [get in touch](https://github.com/davidgiven/fluxengine/issues/new) if | ||||
| you know anything about it. | ||||
|  | ||||
| Many thanks to trondl [on the VCF | ||||
| forums](https://forum.vcfed.org/index.php?threads/roland-d-20-decoding-the-mysterious-floppy-format.1243226/) | ||||
| for assistance with this!  | ||||
|  | ||||
| ## Options | ||||
|  | ||||
| (no options) | ||||
| @@ -26,3 +42,7 @@ To read: | ||||
|  | ||||
|   - `fluxengine read rolandd20 -s drive:0 -o rolandd20.img` | ||||
|  | ||||
| To write: | ||||
|  | ||||
|   - `fluxengine write rolandd20 -d drive:0 -i rolandd20.img` | ||||
|  | ||||
|   | ||||
							
								
								
									
										13
									
								
								doc/using.md
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								doc/using.md
									
									
									
									
									
								
							| @@ -58,7 +58,14 @@ If _more_ than one device is plugged in, you need to specify which one to use | ||||
| with the `--usb.serial` parameter, which takes the device serial number as a | ||||
| parameter.  You can find out the serial numbers by running the command without | ||||
| the `--usb.serial` parameter, and if more than one device is attached they will | ||||
| be listed. The serial number is also shown whenever a connection is made. | ||||
| be listed. The serial number is also shown whenever a connection is made. You | ||||
| can list all the detectable devices with: | ||||
|  | ||||
| ``` | ||||
| $ fluxengine test devices | ||||
| ``` | ||||
|  | ||||
| This will show you their serial numbers. | ||||
|  | ||||
| You _can_ work with more than one FluxEngine at the same time, using different | ||||
| invocations of the client; but be careful of USB bandwidth. If the devices are | ||||
| @@ -221,6 +228,10 @@ FluxEngine supports a number of ways to get or put flux. When using the `-s` or | ||||
|  | ||||
|     Read from a Catweasel flux file. **Read only.** | ||||
|    | ||||
|   - `dmk:<directory>` | ||||
|  | ||||
|     Read from a Catweasel CMK directory. **Read only.** | ||||
|    | ||||
|   - `<filename.a2r>` | ||||
|  | ||||
|     Write to a AppleSauce flux file. **Write only.** | ||||
|   | ||||
							
								
								
									
										44
									
								
								extras/build.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								extras/build.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| from build.ab import normalrule, simplerule | ||||
| from build.utils import objectify | ||||
| from build.c import clibrary | ||||
|  | ||||
| icons = ["fluxfile", "hardware", "icon", "imagefile"] | ||||
|  | ||||
| clibrary( | ||||
|     name="icons", | ||||
|     hdrs={ | ||||
|         f"icons/{n}.h": objectify( | ||||
|             name=n + "_h", src=f"./{n}.png", symbol=f"icon_{n}_png" | ||||
|         ) | ||||
|         for n in icons | ||||
|     }, | ||||
| ) | ||||
|  | ||||
| normalrule( | ||||
|     name="fluxengine_iconset", | ||||
|     ins=["./icon.png"], | ||||
|     outs=["fluxengine.iconset"], | ||||
|     commands=[ | ||||
|         "mkdir -p {outs[0]}", | ||||
|         "sips -z 64 64 {ins[0]} --out {outs[0]}/icon_32x32@2x.png > /dev/null", | ||||
|     ], | ||||
|     label="ICONSET", | ||||
| ) | ||||
|  | ||||
| normalrule( | ||||
|     name="fluxengine_icns", | ||||
|     ins=[".+fluxengine_iconset"], | ||||
|     outs=["fluxengine.icns"], | ||||
|     commands=["iconutil -c icns -o {outs[0]} {ins[0]}"], | ||||
|     label="ICONUTIL", | ||||
| ) | ||||
|  | ||||
| normalrule( | ||||
|     name="fluxengine_ico", | ||||
|     ins=["./icon.png"], | ||||
|     outs=["fluxengine.ico"], | ||||
|     commands=[ | ||||
|         "png2ico {outs[0]} {ins[0]}" | ||||
|     ], | ||||
|     label="MAKEICON", | ||||
| ) | ||||
| @@ -1,9 +1,9 @@ | ||||
| #include "globals.h" | ||||
| #include "flags.h" | ||||
| #include "dep/agg/include/agg2d.h" | ||||
| #include "dep/stb/stb_image_write.h" | ||||
| #include "utils.h" | ||||
| #include "bitmap.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/flags.h" | ||||
| #include "agg2d.h" | ||||
| #include "stb_image_write.h" | ||||
| #include "lib/utils.h" | ||||
| #include "lib/bitmap.h" | ||||
| #include <regex> | ||||
| #include <sstream> | ||||
|  | ||||
|   | ||||
							
								
								
									
										106
									
								
								lib/build.mk
									
									
									
									
									
								
							
							
						
						
									
										106
									
								
								lib/build.mk
									
									
									
									
									
								
							| @@ -1,106 +0,0 @@ | ||||
| LIBFLUXENGINE_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/cwffluxsource.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/philefs.cc \ | ||||
| 	lib/vfs/prodos.cc \ | ||||
| 	lib/vfs/smaky6fs.cc \ | ||||
| 	lib/vfs/vfs.cc \ | ||||
| 	lib/vfs/zdos.cc \ | ||||
|  | ||||
| LIBFLUXENGINE_OBJS = $(patsubst %.cc, $(OBJDIR)/%.o, $(LIBFLUXENGINE_SRCS)) | ||||
| OBJS += $(LIBFLUXENGINE_OBJS) | ||||
| $(LIBFLUXENGINE_SRCS): | $(PROTO_HDRS) | ||||
| LIBFLUXENGINE_LIB = $(OBJDIR)/libfluxengine.a | ||||
| LIBFLUXENGINE_CFLAGS =  | ||||
| LIBFLUXENGINE_LDFLAGS = | ||||
|  | ||||
| $(LIBFLUXENGINE_LIB): $(LIBFLUXENGINE_OBJS) | ||||
|  | ||||
| $(LIBFLUXENGINE_OBJS): CFLAGS += $(LIBARCH_CFLAGS) | ||||
| $(LIBFLUXENGINE_OBJS): CFLAGS += $(LIBUSBP_CFLAGS) | ||||
| $(LIBFLUXENGINE_OBJS): CFLAGS += $(PROTO_CFLAGS) | ||||
| $(LIBFLUXENGINE_OBJS): CFLAGS += $(FATFS_CFLAGS) | ||||
| $(LIBFLUXENGINE_OBJS): CFLAGS += $(ADFLIB_CFLAGS) | ||||
| $(LIBFLUXENGINE_OBJS): CFLAGS += $(HFSUTILS_CFLAGS) | ||||
|  | ||||
| $(call use-pkgconfig, $(LIBFLUXENGINE_LIB), $(LIBFLUXENGINE_OBJS), fmt) | ||||
							
								
								
									
										25
									
								
								lib/build.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								lib/build.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| from build.c import cxxlibrary | ||||
| from build.protobuf import proto, protocc | ||||
|  | ||||
|  | ||||
| proto(name="common_proto", srcs=["./common.proto"]) | ||||
|  | ||||
| proto( | ||||
|     name="config_proto", | ||||
|     srcs=[ | ||||
|         "./config.proto", | ||||
|         "./layout.proto", | ||||
|         "./drive.proto", | ||||
|         "./decoders/decoders.proto", | ||||
|         "./encoders/encoders.proto", | ||||
|         "./fluxsink/fluxsink.proto", | ||||
|         "./fluxsource/fluxsource.proto", | ||||
|         "./imagereader/imagereader.proto", | ||||
|         "./imagewriter/imagewriter.proto", | ||||
|         "./usb/usb.proto", | ||||
|         "./vfs/vfs.proto", | ||||
|     ], | ||||
|     deps=[".+common_proto", "+fl2_proto"], | ||||
| ) | ||||
|  | ||||
| protocc(name="config_proto_lib", srcs=[".+config_proto", "arch+arch_proto"]) | ||||
							
								
								
									
										40
									
								
								lib/bytes.cc
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								lib/bytes.cc
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| #include "globals.h" | ||||
| #include "bytes.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/bytes.h" | ||||
| #include <fstream> | ||||
| #include <zlib.h> | ||||
|  | ||||
| @@ -71,6 +71,15 @@ Bytes::Bytes( | ||||
| { | ||||
| } | ||||
|  | ||||
| Bytes::Bytes(std::istream& istream, size_t len): | ||||
|     _data(createVector(0)), | ||||
|     _low(0), | ||||
|     _high(0) | ||||
| { | ||||
|     ByteWriter bw(*this); | ||||
|     bw.append(istream, len); | ||||
| } | ||||
|  | ||||
| Bytes* Bytes::operator=(const Bytes& other) | ||||
| { | ||||
|     _data = other._data; | ||||
| @@ -352,13 +361,32 @@ uint64_t ByteReader::read_be64() | ||||
|     return ((uint64_t)read_be32() << 32) | read_be32(); | ||||
| } | ||||
|  | ||||
| ByteWriter& ByteWriter::operator+=(std::istream& stream) | ||||
| ByteWriter& ByteWriter::append(std::istream& stream, size_t length) | ||||
| { | ||||
|     Bytes buffer(4096); | ||||
|  | ||||
|     while (stream.read((char*)buffer.begin(), buffer.size())) | ||||
|         this->append(buffer); | ||||
|     this->append(buffer.slice(0, stream.gcount())); | ||||
|     while (length != 0) | ||||
|     { | ||||
|         size_t chunk = std::min((size_t)buffer.size(), length); | ||||
|         if (!stream.read((char*)buffer.begin(), chunk)) | ||||
|         { | ||||
|             this->append(buffer.slice(0, stream.gcount())); | ||||
|             break; | ||||
|         } | ||||
|         else | ||||
|             this->append(buffer); | ||||
|  | ||||
|         length -= chunk; | ||||
|     } | ||||
|  | ||||
|     return *this; | ||||
| } | ||||
|  | ||||
| ByteWriter& ByteWriter::pad(unsigned count, uint8_t b) | ||||
| { | ||||
|     while (count--) | ||||
|         this->write_8(b); | ||||
|  | ||||
|     return *this; | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										13
									
								
								lib/bytes.h
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								lib/bytes.h
									
									
									
									
									
								
							| @@ -19,6 +19,7 @@ public: | ||||
|     Bytes(std::shared_ptr<std::vector<uint8_t>> data, | ||||
|         unsigned start, | ||||
|         unsigned end); | ||||
|     Bytes(std::istream& istream, size_t len = SIZE_MAX); | ||||
|  | ||||
|     Bytes* operator=(const Bytes& other); | ||||
|  | ||||
| @@ -323,7 +324,10 @@ public: | ||||
|         return *this; | ||||
|     } | ||||
|  | ||||
|     ByteWriter& operator+=(std::istream& stream); | ||||
|     ByteWriter& operator+=(std::istream& stream) | ||||
|     { | ||||
|         return this->append(stream); | ||||
|     } | ||||
|  | ||||
|     ByteWriter& append(const char* data) | ||||
|     { | ||||
| @@ -340,10 +344,9 @@ public: | ||||
|         return *this += data; | ||||
|     } | ||||
|  | ||||
|     ByteWriter& append(std::istream& stream) | ||||
|     { | ||||
|         return *this += stream; | ||||
|     } | ||||
|     ByteWriter& append(std::istream& stream, size_t length = SIZE_MAX); | ||||
|  | ||||
|     ByteWriter& pad(unsigned count, uint8_t byte = 0); | ||||
|  | ||||
| private: | ||||
|     Bytes& _bytes; | ||||
|   | ||||
| @@ -32,6 +32,7 @@ enum FluxSourceSinkType { | ||||
| 	FLUXTYPE_SCP = 9; | ||||
| 	FLUXTYPE_TEST_PATTERN = 10; | ||||
| 	FLUXTYPE_VCD = 11; | ||||
| 	FLUXTYPE_DMK = 12; | ||||
| } | ||||
|  | ||||
| enum ImageReaderWriterType { | ||||
|   | ||||
| @@ -78,6 +78,14 @@ static const std::vector<FluxConstructor> fluxConstructors = { | ||||
|             proto->set_type(FLUXTYPE_CWF); | ||||
|             proto->mutable_cwf()->set_filename(s); | ||||
|         }}, | ||||
|     {.name = "CatWeazle DMK directory", | ||||
|      .pattern = std::regex("^dmk:(.*)$"), | ||||
|      .source = | ||||
|             [](auto& s, auto* proto) | ||||
|         { | ||||
|             proto->set_type(FLUXTYPE_DMK); | ||||
|             proto->mutable_dmk()->set_directory(s); | ||||
|         }}, | ||||
|     {.pattern = std::regex("^erase:$"), | ||||
|      .source = | ||||
|             [](auto& s, auto* proto) | ||||
| @@ -172,7 +180,6 @@ ConfigProto* Config::combined() | ||||
|         /* First apply any standalone options. */ | ||||
|  | ||||
|         std::set<std::string> options = _appliedOptions; | ||||
|         std::set<const OptionPrerequisiteProto*> prereqs; | ||||
|         for (const auto& option : _baseConfig.option()) | ||||
|         { | ||||
|             if (options.find(option.name()) != options.end()) | ||||
|   | ||||
| @@ -52,7 +52,8 @@ class InapplicableValueException : public ErrorException | ||||
| public: | ||||
|     InapplicableValueException(): | ||||
|         ErrorException("selected format cannot be used here") | ||||
|     {} | ||||
|     { | ||||
|     } | ||||
| }; | ||||
|  | ||||
| struct FluxConstructor | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| #include "globals.h" | ||||
| #include "bytes.h" | ||||
| #include "crc.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "lib/crc.h" | ||||
|  | ||||
| template <class T> | ||||
| T reflect(T bin, unsigned width = sizeof(T) * 8) | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| #include <string> | ||||
| #include <vector> | ||||
| #include "csvreader.h" | ||||
| #include "lib/csvreader.h" | ||||
|  | ||||
| std::vector<std::string> CsvReader::readLine() | ||||
| { | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| #include "globals.h" | ||||
| #include "flags.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/flags.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/encoders/encoders.h" | ||||
| #include "arch/agat/agat.h" | ||||
| #include "arch/aeslanier/aeslanier.h" | ||||
| #include "arch/amiga/amiga.h" | ||||
| @@ -21,12 +21,12 @@ | ||||
| #include "arch/tids990/tids990.h" | ||||
| #include "arch/victor9k/victor9k.h" | ||||
| #include "arch/zilogmcz/zilogmcz.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "flux.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "lib/flux.h" | ||||
| #include "protocol.h" | ||||
| #include "decoders/rawbits.h" | ||||
| #include "sector.h" | ||||
| #include "image.h" | ||||
| #include "lib/decoders/rawbits.h" | ||||
| #include "lib/sector.h" | ||||
| #include "lib/image.h" | ||||
| #include "lib/decoders/decoders.pb.h" | ||||
| #include "lib/layout.h" | ||||
| #include <numeric> | ||||
| @@ -137,8 +137,10 @@ std::shared_ptr<TrackDataFlux> Decoder::decodeToSectors( | ||||
|  | ||||
|         if (_sector->status != Sector::MISSING) | ||||
|         { | ||||
|             auto trackLayout = Layout::getLayoutOfTrack( | ||||
|                 _sector->logicalTrack, _sector->logicalSide); | ||||
|             if ((_sector->status == Sector::OK) && | ||||
|                 ((_sector->logicalTrack != trackInfo->logicalTrack) || | ||||
|                     (_sector->logicalSide != trackInfo->logicalSide))) | ||||
|                 _sector->status == Sector::WRONG_PLACE; | ||||
|             _trackdata->sectors.push_back(_sector); | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| #ifndef DECODERS_H | ||||
| #define DECODERS_H | ||||
|  | ||||
| #include "bytes.h" | ||||
| #include "sector.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "decoders/fluxdecoder.h" | ||||
| #include "lib/bytes.h" | ||||
| #include "lib/sector.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "lib/decoders/fluxdecoder.h" | ||||
|  | ||||
| class Sector; | ||||
| class Fluxmap; | ||||
| @@ -12,7 +12,7 @@ class FluxmapReader; | ||||
| class RawBits; | ||||
| class DecoderProto; | ||||
|  | ||||
| #include "flux.h" | ||||
| #include "lib/flux.h" | ||||
|  | ||||
| extern void setDecoderManualClockRate(double clockrate_us); | ||||
|  | ||||
|   | ||||
| @@ -21,7 +21,7 @@ import "arch/zilogmcz/zilogmcz.proto"; | ||||
| import "lib/fluxsink/fluxsink.proto"; | ||||
| import "lib/common.proto"; | ||||
|  | ||||
| //NEXT: 32 | ||||
| //NEXT: 33 | ||||
| message DecoderProto { | ||||
| 	optional double pulse_debounce_threshold = 1 [default = 0.30, | ||||
| 		(help) = "ignore pulses with intervals shorter than this, in fractions of a clock"]; | ||||
| @@ -66,6 +66,7 @@ message DecoderProto { | ||||
| 	optional string write_csv_to = 23 | ||||
| 		[(help) = "if set, write a CSV report of the disk state"]; | ||||
| 	optional bool skip_unnecessary_tracks = 29 [default = true, | ||||
| 		(help) = "don't read tracks if we already have all necessary sectors"]; | ||||
| 		(help) = "don't read physical tracks if we already have all necessary sectors"]; | ||||
| 	optional bool collate_sectors_from_all_tracks = 32 [default = false, | ||||
| 		(help) = "when creating the image, consider all valid sectors even if they're on the wrong track"]; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| #include "globals.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "decoders/fluxdecoder.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "lib/decoders/fluxdecoder.h" | ||||
| #include "lib/decoders/decoders.pb.h" | ||||
|  | ||||
| /* This is a port of the samdisk code: | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| #include "globals.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/fluxmapreader.h" | ||||
| #include "flags.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/fluxmapreader.h" | ||||
| #include "lib/flags.h" | ||||
| #include "lib/proto.h" | ||||
| #include "protocol.h" | ||||
| #include "proto.h" | ||||
| #include <numeric> | ||||
| #include <math.h> | ||||
| #include <strings.h> | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| #ifndef FLUXMAPREADER_H | ||||
| #define FLUXMAPREADER_H | ||||
|  | ||||
| #include "fluxmap.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/flags.h" | ||||
| #include "protocol.h" | ||||
| #include "flags.h" | ||||
|  | ||||
| class FluxMatcher; | ||||
| class DecoderProto; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| #include "globals.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
|  | ||||
| Bytes decodeFmMfm( | ||||
|     std::vector<bool>::const_iterator ii, std::vector<bool>::const_iterator end) | ||||
|   | ||||
| @@ -1,8 +1,9 @@ | ||||
| syntax = "proto2"; | ||||
|  | ||||
| import "lib/common.proto"; | ||||
| import "lib/fl2.proto"; | ||||
|  | ||||
| // Next: 17 | ||||
| // Next: 15 | ||||
| message DriveProto | ||||
| { | ||||
|     optional int32 drive = 1 | ||||
| @@ -11,32 +12,30 @@ message DriveProto | ||||
|         [ default = INDEXMODE_DRIVE, (help) = "index pulse source" ]; | ||||
|     optional int32 hard_sector_count = 3 | ||||
|         [ default = 0, (help) = "number of hard sectors on disk" ]; | ||||
|     optional double hard_sector_threshold_ns = 16 | ||||
|     optional double hard_sector_threshold_ns = 4 | ||||
|         [ default = 0, (help) = "index pulses longer than this interval are " | ||||
|             "considered sector markers; shorter indicates an true index marker" ]; | ||||
|     optional bool high_density = 4 | ||||
|     optional bool high_density = 5 | ||||
|         [ default = true, (help) = "set if this is a high density disk" ]; | ||||
|     optional bool sync_with_index = 5 | ||||
|     optional bool sync_with_index = 6 | ||||
|         [ default = false, (help) = "start reading at index mark" ]; | ||||
|     optional double revolutions = 6 | ||||
|     optional double revolutions = 7 | ||||
|         [ default = 1.2, (help) = "number of revolutions to read" ]; | ||||
|  | ||||
|     optional int32 tracks = 7 | ||||
|     optional int32 tracks = 8 | ||||
|         [ default = 81, (help) = "Number of tracks supported by drive" ]; | ||||
|     optional int32 heads = 8 | ||||
|     optional int32 heads = 9 | ||||
|         [ default = 2, (help) = "Number of heads supported by drive" ]; | ||||
|     optional int32 head_bias = 9 [ | ||||
|     optional int32 head_bias = 10 [ | ||||
|         default = 0, | ||||
|         (help) = "Bias to apply to the head position (in tracks)" | ||||
|     ]; | ||||
|     optional int32 group_offset = 14 [ | ||||
|     optional int32 group_offset = 11 [ | ||||
|         default = 0, | ||||
|         (help) = "When writing groups, erase all tracks except this one in each group" | ||||
|     ]; | ||||
|     optional int32 head_width = 10 | ||||
|         [ default = 1, (help) = "Width of the head (in tracks)" ]; | ||||
|     optional float tpi = 11 [ default = 0, (help) = "TPI of drive; 0 disables all track mapping" ]; | ||||
|     optional double rotational_period_ms = 12 | ||||
|     optional DriveType drive_type = 12 [ default = DRIVETYPE_UNKNOWN, (help) = "Type of drive" ]; | ||||
|     optional double rotational_period_ms = 13 | ||||
|         [ default = 0, (help) = "Rotational period of the drive in milliseconds (0 to autodetect)"]; | ||||
|  | ||||
|     enum ErrorBehaviour { | ||||
| @@ -45,7 +44,7 @@ message DriveProto | ||||
|         RECALIBRATE = 2; | ||||
|     } | ||||
|  | ||||
|     optional ErrorBehaviour error_behaviour = 15 | ||||
|     optional ErrorBehaviour error_behaviour = 14 | ||||
|         [ default = JIGGLE, (help) = "what to do when an error occurs during reads" ]; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| #include "globals.h" | ||||
| #include "fluxmap.h" | ||||
| #include "decoders/decoders.h" | ||||
| #include "encoders/encoders.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/decoders/decoders.h" | ||||
| #include "lib/encoders/encoders.h" | ||||
| #include "arch/agat/agat.h" | ||||
| #include "arch/amiga/amiga.h" | ||||
| #include "arch/apple2/apple2.h" | ||||
| @@ -98,6 +98,9 @@ Fluxmap& Fluxmap::appendBits(const std::vector<bool>& bits, nanoseconds_t clock) | ||||
|             appendPulse(); | ||||
|         } | ||||
|     } | ||||
|     unsigned delta = (now - duration()) / NS_PER_TICK; | ||||
|     if (delta) | ||||
|         appendInterval(delta); | ||||
|  | ||||
|     return *this; | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| #include "globals.h" | ||||
| #include "proto.h" | ||||
| #include "fluxmap.h" | ||||
| #include "lib/globals.h" | ||||
| #include "lib/proto.h" | ||||
| #include "lib/fluxmap.h" | ||||
| #include "lib/fl2.pb.h" | ||||
| #include <fstream> | ||||
|  | ||||
|   | ||||
| @@ -15,11 +15,28 @@ message TrackFluxProto { | ||||
| 	repeated bytes flux = 3; | ||||
| } | ||||
|  | ||||
| enum DriveType { | ||||
| 	DRIVETYPE_UNKNOWN = 0; | ||||
| 	DRIVETYPE_40TRACK = 1; | ||||
| 	DRIVETYPE_80TRACK = 2; | ||||
| 	DRIVETYPE_APPLE2 = 3; | ||||
| } | ||||
|  | ||||
| enum FormatType { | ||||
| 	FORMATTYPE_UNKNOWN = 0; | ||||
| 	FORMATTYPE_40TRACK = 1; | ||||
| 	FORMATTYPE_80TRACK = 2; | ||||
| } | ||||
|  | ||||
| // NEXT: 8 | ||||
| message FluxFileProto { | ||||
| 	optional int32 magic = 1; | ||||
| 	optional FluxFileVersion version = 2; | ||||
| 	repeated TrackFluxProto track = 3; | ||||
| 	optional double rotational_period_ms = 4; | ||||
| 	optional int32 tpi = 5; | ||||
| 	optional DriveType drive_type = 6 [default = DRIVETYPE_UNKNOWN]; | ||||
| 	optional FormatType format_type = 7 [default = FORMATTYPE_UNKNOWN]; | ||||
|  | ||||
| 	reserved 5; | ||||
| } | ||||
|  | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user