Merge from master.

This commit is contained in:
David Given
2023-10-31 01:04:48 +01:00
278 changed files with 4910 additions and 2576 deletions

View File

@@ -19,9 +19,10 @@ jobs:
repository: 'davidgiven/fluxengine-testdata' repository: 'davidgiven/fluxengine-testdata'
path: 'fluxengine-testdata' path: 'fluxengine-testdata'
- name: apt - 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 - 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: build-macos-current:
runs-on: macos-latest runs-on: macos-latest
@@ -37,7 +38,7 @@ jobs:
- name: brew - name: brew
run: brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg run: brew install sqlite pkg-config libusb protobuf wxwidgets fmt make coreutils dylibbundler libjpeg
- name: make - name: make
run: gmake -j2 -C fluxengine run: gmake -j`nproc` -C fluxengine
- name: Upload build artifacts - name: Upload build artifacts
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v2
@@ -58,17 +59,20 @@ jobs:
install: >- install: >-
diffutils diffutils
make make
mingw-w64-i686-binutils
mingw-w64-i686-fmt mingw-w64-i686-fmt
mingw-w64-i686-gcc mingw-w64-i686-gcc
mingw-w64-i686-libusb mingw-w64-i686-libusb
mingw-w64-i686-nsis
mingw-w64-i686-pkg-config mingw-w64-i686-pkg-config
mingw-w64-i686-protobuf mingw-w64-i686-protobuf
mingw-w64-i686-python
mingw-w64-i686-sqlite3 mingw-w64-i686-sqlite3
mingw-w64-i686-wxWidgets mingw-w64-i686-wxWidgets
mingw-w64-i686-zlib mingw-w64-i686-zlib
mingw-w64-i686-nsis mingw-w64-i686-imagemagick
zip
vim vim
zip
- name: update-protobuf - name: update-protobuf
run: | run: |
pacman -U --noconfirm https://repo.msys2.org/mingw/mingw32/mingw-w64-i686-protobuf-21.9-1-any.pkg.tar.zst 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' repository: 'davidgiven/fluxengine-testdata'
path: 'fluxengine-testdata' path: 'fluxengine-testdata'
- name: build - name: build
run: make -j2 -C fluxengine run: MAGICK_TIME_LIMIT=100 make -j`nproc` -C fluxengine
- name: nsis - name: nsis
run: | run: |

View File

@@ -23,17 +23,20 @@ jobs:
install: >- install: >-
diffutils diffutils
make make
mingw-w64-i686-binutils
mingw-w64-i686-fmt mingw-w64-i686-fmt
mingw-w64-i686-gcc mingw-w64-i686-gcc
mingw-w64-i686-libusb mingw-w64-i686-libusb
mingw-w64-i686-nsis
mingw-w64-i686-pkg-config mingw-w64-i686-pkg-config
mingw-w64-i686-protobuf mingw-w64-i686-protobuf
mingw-w64-i686-python
mingw-w64-i686-sqlite3 mingw-w64-i686-sqlite3
mingw-w64-i686-wxWidgets mingw-w64-i686-wxWidgets
mingw-w64-i686-zlib mingw-w64-i686-zlib
mingw-w64-i686-nsis mingw-w64-i686-imagemagick
zip
vim vim
zip
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: update-protobuf - name: update-protobuf
@@ -42,7 +45,7 @@ jobs:
- name: build - name: build
run: | run: |
make -j2 MAGICK_TIME_LIMIT=100 make -j`nproc`
- name: nsis - name: nsis
run: | run: |

View File

@@ -1,4 +1,5 @@
.obj .obj
.git
streams streams
.*\.flux .*\.flux
.*\.img .*\.img

336
Makefile
View File

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

View File

@@ -1,11 +1,11 @@
#include "globals.h" #include "lib/globals.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "aeslanier.h" #include "aeslanier.h"
#include "crc.h" #include "lib/crc.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "sector.h" #include "lib/sector.h"
#include "bytes.h" #include "lib/bytes.h"
#include "fmt/format.h" #include "fmt/format.h"
#include <string.h> #include <string.h>

View File

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

View File

@@ -1,11 +1,11 @@
#include "globals.h" #include "lib/globals.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "agat.h" #include "agat.h"
#include "crc.h" #include "lib/crc.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "sector.h" #include "lib/sector.h"
#include "bytes.h" #include "lib/bytes.h"
#include "fmt/format.h" #include "fmt/format.h"
#include <string.h> #include <string.h>

View File

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

View File

@@ -1,7 +1,7 @@
#ifndef AMIGA_H #ifndef AMIGA_H
#define AMIGA_H #define AMIGA_H
#include "encoders/encoders.h" #include "lib/encoders/encoders.h"
#define AMIGA_SECTOR_RECORD 0xaaaa44894489LL #define AMIGA_SECTOR_RECORD 0xaaaa44894489LL

View File

@@ -1,11 +1,11 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "protocol.h" #include "protocol.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "sector.h" #include "lib/sector.h"
#include "amiga.h" #include "amiga.h"
#include "bytes.h" #include "lib/bytes.h"
#include "fmt/format.h" #include "fmt/format.h"
#include "lib/decoders/decoders.pb.h" #include "lib/decoders/decoders.pb.h"
#include <string.h> #include <string.h>

View File

@@ -1,10 +1,10 @@
#include "globals.h" #include "lib/globals.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "encoders/encoders.h" #include "lib/encoders/encoders.h"
#include "amiga.h" #include "amiga.h"
#include "crc.h" #include "lib/crc.h"
#include "readerwriter.h" #include "lib/readerwriter.h"
#include "image.h" #include "lib/image.h"
#include "arch/amiga/amiga.pb.h" #include "arch/amiga/amiga.pb.h"
#include "lib/encoders/encoders.pb.h" #include "lib/encoders/encoders.pb.h"

View File

@@ -2,8 +2,8 @@
#define APPLE2_H #define APPLE2_H
#include <memory.h> #include <memory.h>
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "encoders/encoders.h" #include "lib/encoders/encoders.h"
#define APPLE2_SECTOR_RECORD 0xd5aa96 #define APPLE2_SECTOR_RECORD 0xd5aa96
#define APPLE2_DATA_RECORD 0xd5aaad #define APPLE2_DATA_RECORD 0xd5aaad

View File

@@ -1,13 +1,13 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "protocol.h" #include "protocol.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "sector.h" #include "lib/sector.h"
#include "apple2.h" #include "apple2.h"
#include "arch/apple2/apple2.pb.h" #include "arch/apple2/apple2.pb.h"
#include "lib/decoders/decoders.pb.h" #include "lib/decoders/decoders.pb.h"
#include "bytes.h" #include "lib/bytes.h"
#include "fmt/format.h" #include "fmt/format.h"
#include <string.h> #include <string.h>
#include <algorithm> #include <algorithm>

View File

@@ -1,14 +1,14 @@
#include "globals.h" #include "lib/globals.h"
#include "arch/apple2/apple2.h" #include "arch/apple2/apple2.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "encoders/encoders.h" #include "lib/encoders/encoders.h"
#include "sector.h" #include "lib/sector.h"
#include "readerwriter.h" #include "lib/readerwriter.h"
#include "image.h" #include "lib/image.h"
#include "fmt/format.h" #include "fmt/format.h"
#include "lib/encoders/encoders.pb.h" #include "lib/encoders/encoders.pb.h"
#include <ctype.h> #include <ctype.h>
#include "bytes.h" #include "lib/bytes.h"
static int encode_data_gcr(uint8_t data) static int encode_data_gcr(uint8_t data)
{ {

View File

@@ -1,12 +1,12 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "encoders/encoders.h" #include "lib/encoders/encoders.h"
#include "brother.h" #include "brother.h"
#include "sector.h" #include "lib/sector.h"
#include "bytes.h" #include "lib/bytes.h"
#include "crc.h" #include "lib/crc.h"
#include <ctype.h> #include <ctype.h>
const FluxPattern SECTOR_RECORD_PATTERN(32, BROTHER_SECTOR_RECORD); const FluxPattern SECTOR_RECORD_PATTERN(32, BROTHER_SECTOR_RECORD);

View File

@@ -1,10 +1,10 @@
#include "globals.h" #include "lib/globals.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "encoders/encoders.h" #include "lib/encoders/encoders.h"
#include "brother.h" #include "brother.h"
#include "crc.h" #include "lib/crc.h"
#include "readerwriter.h" #include "lib/readerwriter.h"
#include "image.h" #include "lib/image.h"
#include "arch/brother/brother.pb.h" #include "arch/brother/brother.pb.h"
#include "lib/encoders/encoders.pb.h" #include "lib/encoders/encoders.pb.h"

View File

@@ -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
View 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",
],
)

View File

@@ -1,4 +1,4 @@
#include "globals.h" #include "lib/globals.h"
#include "c64.h" #include "c64.h"
/* /*

View File

@@ -1,8 +1,8 @@
#ifndef C64_H #ifndef C64_H
#define C64_H #define C64_H
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "encoders/encoders.h" #include "lib/encoders/encoders.h"
#define C64_SECTOR_RECORD 0xffd49 #define C64_SECTOR_RECORD 0xffd49
#define C64_DATA_RECORD 0xffd57 #define C64_DATA_RECORD 0xffd57

View File

@@ -1,12 +1,12 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "protocol.h" #include "protocol.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "sector.h" #include "lib/sector.h"
#include "c64.h" #include "c64.h"
#include "crc.h" #include "lib/crc.h"
#include "bytes.h" #include "lib/bytes.h"
#include "fmt/format.h" #include "fmt/format.h"
#include <string.h> #include <string.h>
#include <algorithm> #include <algorithm>

View File

@@ -1,17 +1,17 @@
#include "globals.h" #include "lib/globals.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "encoders/encoders.h" #include "lib/encoders/encoders.h"
#include "c64.h" #include "c64.h"
#include "crc.h" #include "lib/crc.h"
#include "sector.h" #include "lib/sector.h"
#include "readerwriter.h" #include "lib/readerwriter.h"
#include "image.h" #include "lib/image.h"
#include "fmt/format.h" #include "fmt/format.h"
#include "arch/c64/c64.pb.h" #include "arch/c64/c64.pb.h"
#include "lib/encoders/encoders.pb.h" #include "lib/encoders/encoders.pb.h"
#include "lib/layout.h" #include "lib/layout.h"
#include <ctype.h> #include <ctype.h>
#include "bytes.h" #include "lib/bytes.h"
static bool lastBit; static bool lastBit;

View File

@@ -1,12 +1,12 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "protocol.h" #include "protocol.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "sector.h" #include "lib/sector.h"
#include "f85.h" #include "f85.h"
#include "crc.h" #include "lib/crc.h"
#include "bytes.h" #include "lib/bytes.h"
#include "fmt/format.h" #include "fmt/format.h"
#include <string.h> #include <string.h>
#include <algorithm> #include <algorithm>

View File

@@ -1,13 +1,13 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "protocol.h" #include "protocol.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "sector.h" #include "lib/sector.h"
#include "fb100.h" #include "fb100.h"
#include "crc.h" #include "lib/crc.h"
#include "bytes.h" #include "lib/bytes.h"
#include "decoders/rawbits.h" #include "lib/decoders/rawbits.h"
#include "fmt/format.h" #include "fmt/format.h"
#include <string.h> #include <string.h>
#include <algorithm> #include <algorithm>

View File

@@ -1,12 +1,12 @@
#include "globals.h" #include "lib/globals.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "ibm.h" #include "ibm.h"
#include "crc.h" #include "lib/crc.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "sector.h" #include "lib/sector.h"
#include "arch/ibm/ibm.pb.h" #include "arch/ibm/ibm.pb.h"
#include "proto.h" #include "lib/proto.h"
#include "lib/layout.h" #include "lib/layout.h"
#include <string.h> #include <string.h>

View File

@@ -1,10 +1,10 @@
#include "globals.h" #include "lib/globals.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "encoders/encoders.h" #include "lib/encoders/encoders.h"
#include "ibm.h" #include "ibm.h"
#include "crc.h" #include "lib/crc.h"
#include "readerwriter.h" #include "lib/readerwriter.h"
#include "image.h" #include "lib/image.h"
#include "arch/ibm/ibm.pb.h" #include "arch/ibm/ibm.pb.h"
#include "lib/encoders/encoders.pb.h" #include "lib/encoders/encoders.pb.h"
#include "fmt/format.h" #include "fmt/format.h"

View File

@@ -1,11 +1,11 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "protocol.h" #include "protocol.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "sector.h" #include "lib/sector.h"
#include "macintosh.h" #include "macintosh.h"
#include "bytes.h" #include "lib/bytes.h"
#include "fmt/format.h" #include "fmt/format.h"
#include <string.h> #include <string.h>
#include <algorithm> #include <algorithm>

View File

@@ -1,10 +1,10 @@
#include "globals.h" #include "lib/globals.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "encoders/encoders.h" #include "lib/encoders/encoders.h"
#include "macintosh.h" #include "macintosh.h"
#include "crc.h" #include "lib/crc.h"
#include "readerwriter.h" #include "lib/readerwriter.h"
#include "image.h" #include "lib/image.h"
#include "fmt/format.h" #include "fmt/format.h"
#include "lib/encoders/encoders.pb.h" #include "lib/encoders/encoders.pb.h"
#include "lib/layout.h" #include "lib/layout.h"

View File

@@ -1,10 +1,10 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "sector.h" #include "lib/sector.h"
#include "micropolis.h" #include "micropolis.h"
#include "bytes.h" #include "lib/bytes.h"
#include "fmt/format.h" #include "fmt/format.h"
#include "lib/decoders/decoders.pb.h" #include "lib/decoders/decoders.pb.h"
@@ -67,28 +67,32 @@ static uint8_t b(uint32_t field, uint8_t pos)
static uint8_t eccNextBit(uint32_t ecc, uint8_t data_bit) static uint8_t eccNextBit(uint32_t ecc, uint8_t data_bit)
{ {
// This is 0x81932080 which is 0x0104C981 with reversed bits // 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) 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; b(ecc, 23) ^ b(ecc, 24) ^ b(ecc, 31) ^ data_bit;
} }
uint32_t vectorGraphicEcc(const Bytes& bytes) uint32_t vectorGraphicEcc(const Bytes& bytes)
{ {
uint32_t e = 0; uint32_t e = 0;
Bytes payloadBytes = bytes.slice(0, bytes.size()-4); Bytes payloadBytes = bytes.slice(0, bytes.size() - 4);
ByteReader payload(payloadBytes); ByteReader payload(payloadBytes);
while (!payload.eof()) { while (!payload.eof())
{
uint8_t byte = payload.read_8(); uint8_t byte = payload.read_8();
for (int i = 0; i < 8; i++) { for (int i = 0; i < 8; i++)
{
e = (e << 1) | eccNextBit(e, byte >> 7); e = (e << 1) | eccNextBit(e, byte >> 7);
byte <<= 1; byte <<= 1;
} }
} }
Bytes trailerBytes = bytes.slice(bytes.size()-4); Bytes trailerBytes = bytes.slice(bytes.size() - 4);
ByteReader trailer(trailerBytes); ByteReader trailer(trailerBytes);
uint32_t res = e; uint32_t res = e;
while (!trailer.eof()) { while (!trailer.eof())
{
uint8_t byte = trailer.read_8(); uint8_t byte = trailer.read_8();
for (int i = 0; i < 8; i++) { for (int i = 0; i < 8; i++)
{
res = (res << 1) | eccNextBit(e, byte >> 7); res = (res << 1) | eccNextBit(e, byte >> 7);
e <<= 1; e <<= 1;
byte <<= 1; byte <<= 1;
@@ -101,13 +105,15 @@ uint32_t vectorGraphicEcc(const Bytes& bytes)
static bool vectorGraphicEccFix(Bytes& bytes, uint32_t syndrome) static bool vectorGraphicEccFix(Bytes& bytes, uint32_t syndrome)
{ {
uint32_t ecc = syndrome; uint32_t ecc = syndrome;
int pos = (MICROPOLIS_ENCODED_SECTOR_SIZE-5)*8+7; int pos = (MICROPOLIS_ENCODED_SECTOR_SIZE - 5) * 8 + 7;
bool aligned = false; bool aligned = false;
while ((ecc & 0xff000000) == 0) { while ((ecc & 0xff000000) == 0)
{
pos += 8; pos += 8;
ecc <<= 8; ecc <<= 8;
} }
for (; pos >= 0; pos--) { for (; pos >= 0; pos--)
{
bool bit = ecc & 1; bool bit = ecc & 1;
ecc >>= 1; ecc >>= 1;
if (bit) if (bit)
@@ -119,7 +125,7 @@ static bool vectorGraphicEccFix(Bytes& bytes, uint32_t syndrome)
} }
if (pos < 0) if (pos < 0)
return false; return false;
bytes[pos/8] ^= ecc >> 16; bytes[pos / 8] ^= ecc >> 16;
return true; return true;
} }
@@ -199,9 +205,11 @@ public:
bool eccPresent = bytes[274] == 0xaa; bool eccPresent = bytes[274] == 0xaa;
uint32_t ecc = 0; uint32_t ecc = 0;
if (_config.ecc_type() == MicropolisDecoderProto::VECTOR && eccPresent) { if (_config.ecc_type() == MicropolisDecoderProto::VECTOR && eccPresent)
{
ecc = vectorGraphicEcc(bytes.slice(0, 274)); ecc = vectorGraphicEcc(bytes.slice(0, 274));
if (ecc != 0) { if (ecc != 0)
{
vectorGraphicEccFix(bytes, ecc); vectorGraphicEccFix(bytes, ecc);
ecc = vectorGraphicEcc(bytes.slice(0, 274)); ecc = vectorGraphicEcc(bytes.slice(0, 274));
} }

View File

@@ -1,9 +1,9 @@
#include "globals.h" #include "lib/globals.h"
#include "micropolis.h" #include "micropolis.h"
#include "sector.h" #include "lib/sector.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "encoders/encoders.h" #include "lib/encoders/encoders.h"
#include "image.h" #include "lib/image.h"
#include "lib/encoders/encoders.pb.h" #include "lib/encoders/encoders.pb.h"
static void write_sector(std::vector<bool>& bits, static void write_sector(std::vector<bool>& bits,
@@ -49,7 +49,8 @@ static void write_sector(std::vector<bool>& bits,
uint8_t eccPresent = 0; uint8_t eccPresent = 0;
uint32_t ecc = 0; uint32_t ecc = 0;
if (eccType == MicropolisEncoderProto::VECTOR) { if (eccType == MicropolisEncoderProto::VECTOR)
{
eccPresent = 0xaa; eccPresent = 0xaa;
ecc = vectorGraphicEcc(sectorData + Bytes(4)); ecc = vectorGraphicEcc(sectorData + Bytes(4));
} }
@@ -98,23 +99,25 @@ public:
unsigned prev_cursor = 0; unsigned prev_cursor = 0;
unsigned cursor = 0; unsigned cursor = 0;
for (const auto& sectorData : sectors) { for (const auto& sectorData : sectors)
{
indexes.push_back(cursor); indexes.push_back(cursor);
prev_cursor = cursor; prev_cursor = cursor;
write_sector(bits, cursor, sectorData, _config.ecc_type()); write_sector(bits, cursor, sectorData, _config.ecc_type());
} }
indexes.push_back(prev_cursor + (cursor - prev_cursor)/2); indexes.push_back(prev_cursor + (cursor - prev_cursor) / 2);
indexes.push_back(cursor); indexes.push_back(cursor);
if (cursor != bits.size()) if (cursor != bits.size())
error("track data mismatched length"); error("track data mismatched length");
std::unique_ptr<Fluxmap> fluxmap(new Fluxmap); std::unique_ptr<Fluxmap> fluxmap(new Fluxmap);
nanoseconds_t clockPeriod = calculatePhysicalClockPeriod( nanoseconds_t clockPeriod =
_config.clock_period_us() * 1e3, calculatePhysicalClockPeriod(_config.clock_period_us() * 1e3,
_config.rotational_period_ms() * 1e6); _config.rotational_period_ms() * 1e6);
auto pos = bits.begin(); auto pos = bits.begin();
for (int i = 1; i < indexes.size(); i++) { for (int i = 1; i < indexes.size(); i++)
{
auto end = bits.begin() + indexes[i]; auto end = bits.begin() + indexes[i];
fluxmap->appendBits(std::vector<bool>(pos, end), clockPeriod); fluxmap->appendBits(std::vector<bool>(pos, end), clockPeriod);
fluxmap->appendIndex(); fluxmap->appendIndex();

View File

@@ -1,10 +1,10 @@
#include "globals.h" #include "lib/globals.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "mx/mx.h" #include "arch/mx/mx.h"
#include "crc.h" #include "lib/crc.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "sector.h" #include "lib/sector.h"
#include <string.h> #include <string.h>
const int SECTOR_SIZE = 256; const int SECTOR_SIZE = 256;

View File

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

View File

@@ -11,13 +11,13 @@
* sure that the hardSectorId is correct. * sure that the hardSectorId is correct.
*/ */
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "sector.h" #include "lib/sector.h"
#include "northstar.h" #include "northstar.h"
#include "bytes.h" #include "lib/bytes.h"
#include "lib/decoders/decoders.pb.h" #include "lib/decoders/decoders.pb.h"
#include "fmt/format.h" #include "fmt/format.h"

View File

@@ -1,10 +1,10 @@
#include "globals.h" #include "lib/globals.h"
#include "northstar.h" #include "northstar.h"
#include "sector.h" #include "lib/sector.h"
#include "bytes.h" #include "lib/bytes.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "encoders/encoders.h" #include "lib/encoders/encoders.h"
#include "image.h" #include "lib/image.h"
#include "lib/encoders/encoders.pb.h" #include "lib/encoders/encoders.pb.h"
#define GAP_FILL_SIZE_SD 30 #define GAP_FILL_SIZE_SD 30

View File

@@ -1,12 +1,12 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "protocol.h" #include "protocol.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "sector.h" #include "lib/sector.h"
#include "smaky6.h" #include "smaky6.h"
#include "bytes.h" #include "lib/bytes.h"
#include "crc.h" #include "lib/crc.h"
#include "fmt/format.h" #include "fmt/format.h"
#include "lib/decoders/decoders.pb.h" #include "lib/decoders/decoders.pb.h"
#include <string.h> #include <string.h>

View File

@@ -1,11 +1,11 @@
#include "globals.h" #include "lib/globals.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "encoders/encoders.h" #include "lib/encoders/encoders.h"
#include "tids990/tids990.h" #include "arch/tids990/tids990.h"
#include "crc.h" #include "lib/crc.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "sector.h" #include "lib/sector.h"
#include <string.h> #include <string.h>
#include <fmt/format.h> #include <fmt/format.h>

View File

@@ -1,10 +1,10 @@
#include "globals.h" #include "lib/globals.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "encoders/encoders.h" #include "lib/encoders/encoders.h"
#include "tids990.h" #include "tids990.h"
#include "crc.h" #include "lib/crc.h"
#include "readerwriter.h" #include "lib/readerwriter.h"
#include "image.h" #include "lib/image.h"
#include "arch/tids990/tids990.pb.h" #include "arch/tids990/tids990.pb.h"
#include "lib/encoders/encoders.pb.h" #include "lib/encoders/encoders.pb.h"
#include <fmt/format.h> #include <fmt/format.h>

View File

@@ -1,12 +1,12 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "protocol.h" #include "protocol.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "sector.h" #include "lib/sector.h"
#include "victor9k.h" #include "victor9k.h"
#include "crc.h" #include "lib/crc.h"
#include "bytes.h" #include "lib/bytes.h"
#include "fmt/format.h" #include "fmt/format.h"
#include <string.h> #include <string.h>
#include <algorithm> #include <algorithm>

View File

@@ -1,17 +1,17 @@
#include "globals.h" #include "lib/globals.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "encoders/encoders.h" #include "lib/encoders/encoders.h"
#include "victor9k.h" #include "victor9k.h"
#include "crc.h" #include "lib/crc.h"
#include "sector.h" #include "lib/sector.h"
#include "readerwriter.h" #include "lib/readerwriter.h"
#include "image.h" #include "lib/image.h"
#include "fmt/format.h" #include "fmt/format.h"
#include "arch/victor9k/victor9k.pb.h" #include "arch/victor9k/victor9k.pb.h"
#include "lib/encoders/encoders.pb.h" #include "lib/encoders/encoders.pb.h"
#include "lib/layout.h" #include "lib/layout.h"
#include <ctype.h> #include <ctype.h>
#include "bytes.h" #include "lib/bytes.h"
static bool lastBit; static bool lastBit;

View File

@@ -1,12 +1,12 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "protocol.h" #include "protocol.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "sector.h" #include "lib/sector.h"
#include "zilogmcz.h" #include "zilogmcz.h"
#include "bytes.h" #include "lib/bytes.h"
#include "crc.h" #include "lib/crc.h"
#include "fmt/format.h" #include "fmt/format.h"
#include <string.h> #include <string.h>
#include <algorithm> #include <algorithm>

310
build.py Normal file
View File

@@ -0,0 +1,310 @@
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/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/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/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 = [
("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
View 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
View 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 $@

486
build/ab.py Normal file
View File

@@ -0,0 +1,486 @@
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)
if dir:
cs += ["mkdir -p " + dir]
srcs = filenamesof(src)
if len(srcs) != 1:
raise ABException(
"a dependency of an export must have exactly one output file"
)
cs += ["cp %s %s" % (srcs[0], destf)]
self.outs += [destf]
emitter_rule(self.name, items.values(), self.outs, deps)
emitter_label(f"EXPORT {self.name}")
emitter_exec(cs)
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()

265
build/c.py Normal file
View 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
View 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)
"""
)
@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
View 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}"],
)

43
build/utils.py Normal file
View 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
View File

@@ -0,0 +1,5 @@
import platform
windows = platform.system() == "Windows"
osx = platform.system() == "Darwin"
unix = not windows

View File

@@ -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
View 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",
},
)

View File

@@ -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
View 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",
},
)

View File

@@ -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
View File

@@ -0,0 +1,3 @@
from build.c import clibrary
clibrary(name="emu", srcs=["./fnmatch.c"], hdrs={"fnmatch.h": "./fnmatch.h"})

View File

@@ -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
View 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",
},
)

View File

@@ -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
View 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",
},
)

View File

@@ -1,66 +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 ifeq ($(shell uname),Linux)
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 \
else
LIBUSBP_SRCS += \
dep/libusbp/src/dummy.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
View 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",
},
)

49
dep/snowhouse/build.py Normal file
View 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",
},
)

View File

@@ -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
View 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"},
)

View File

@@ -204,7 +204,7 @@ install some support packages.
- For Linux with Ubuntu/Debian: - For Linux with Ubuntu/Debian:
`libusb-1.0-0-dev`, `libsqlite3-dev`, `zlib1g-dev`, `libusb-1.0-0-dev`, `libsqlite3-dev`, `zlib1g-dev`,
`libudev-dev`, `protobuf-compiler`, `libwxgtk3.0-gtk3-dev`, `libudev-dev`, `protobuf-compiler`, `libwxgtk3.0-gtk3-dev`,
`libfmt-dev`. `libfmt-dev`, `python3`.
- For Linux with Fedora/Red Hat: - For Linux with Fedora/Red Hat:
`git`, `make`, `gcc`, `gcc-c++`, `xxd`, `protobuf-compiler`, `git`, `make`, `gcc`, `gcc-c++`, `xxd`, `protobuf-compiler`,
`protobuf-devel`, `fmt-devel`, `systemd-devel`, `wxGTK3-devel`, `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`, - For Windows with MSYS2: `make`, `mingw-w64-i686-libusb`,
`mingw-w64-i686-protobuf`, `mingw-w64-i686-sqlite3`, `mingw-w64-i686-zlib`, `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-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 These lists are not necessarily exhaustive --- please [get in
touch](https://github.com/davidgiven/fluxengine/issues/new) if I've missed 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 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 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 doesn't have). Remember to add an appropriate `-j` option for a parallel build.
directory, one of which is called `fluxengine` or `fluxengine.exe` depending on You should end up with some executables in the current directory, one of which
your platform. It has minimal dependencies and you should be able to put it is called `fluxengine` or `fluxengine.exe` depending on your platform. It has
anywhere. The other binaries may also be of interest. 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 If it doesn't build, please [get in
touch](https://github.com/davidgiven/fluxengine/issues/new). touch](https://github.com/davidgiven/fluxengine/issues/new).

33
doc/disk-ms2000.md Normal file
View 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.

44
extras/build.py Normal file
View 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=[
"convert {ins[0]} -resize 64x46 -define icon:auto-resize=64,48,32,16 {outs[0]}"
],
label="MAKEICON",
)

View File

@@ -1,9 +1,9 @@
#include "globals.h" #include "lib/globals.h"
#include "flags.h" #include "lib/flags.h"
#include "dep/agg/include/agg2d.h" #include "agg2d.h"
#include "dep/stb/stb_image_write.h" #include "stb_image_write.h"
#include "utils.h" #include "lib/utils.h"
#include "bitmap.h" #include "lib/bitmap.h"
#include <regex> #include <regex>
#include <sstream> #include <sstream>

View File

@@ -1,108 +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/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 \
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
View 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"])

View File

@@ -1,5 +1,5 @@
#include "globals.h" #include "lib/globals.h"
#include "bytes.h" #include "lib/bytes.h"
#include <fstream> #include <fstream>
#include <zlib.h> #include <zlib.h>

View File

@@ -172,7 +172,6 @@ ConfigProto* Config::combined()
/* First apply any standalone options. */ /* First apply any standalone options. */
std::set<std::string> options = _appliedOptions; std::set<std::string> options = _appliedOptions;
std::set<const OptionPrerequisiteProto*> prereqs;
for (const auto& option : _baseConfig.option()) for (const auto& option : _baseConfig.option())
{ {
if (options.find(option.name()) != options.end()) if (options.find(option.name()) != options.end())

View File

@@ -52,7 +52,8 @@ class InapplicableValueException : public ErrorException
public: public:
InapplicableValueException(): InapplicableValueException():
ErrorException("selected format cannot be used here") ErrorException("selected format cannot be used here")
{} {
}
}; };
struct FluxConstructor struct FluxConstructor

View File

@@ -1,6 +1,6 @@
#include "globals.h" #include "lib/globals.h"
#include "bytes.h" #include "lib/bytes.h"
#include "crc.h" #include "lib/crc.h"
template <class T> template <class T>
T reflect(T bin, unsigned width = sizeof(T) * 8) T reflect(T bin, unsigned width = sizeof(T) * 8)

View File

@@ -1,6 +1,6 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "csvreader.h" #include "lib/csvreader.h"
std::vector<std::string> CsvReader::readLine() std::vector<std::string> CsvReader::readLine()
{ {

View File

@@ -1,8 +1,8 @@
#include "globals.h" #include "lib/globals.h"
#include "flags.h" #include "lib/flags.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "encoders/encoders.h" #include "lib/encoders/encoders.h"
#include "arch/agat/agat.h" #include "arch/agat/agat.h"
#include "arch/aeslanier/aeslanier.h" #include "arch/aeslanier/aeslanier.h"
#include "arch/amiga/amiga.h" #include "arch/amiga/amiga.h"
@@ -21,12 +21,12 @@
#include "arch/tids990/tids990.h" #include "arch/tids990/tids990.h"
#include "arch/victor9k/victor9k.h" #include "arch/victor9k/victor9k.h"
#include "arch/zilogmcz/zilogmcz.h" #include "arch/zilogmcz/zilogmcz.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "flux.h" #include "lib/flux.h"
#include "protocol.h" #include "protocol.h"
#include "decoders/rawbits.h" #include "lib/decoders/rawbits.h"
#include "sector.h" #include "lib/sector.h"
#include "image.h" #include "lib/image.h"
#include "lib/decoders/decoders.pb.h" #include "lib/decoders/decoders.pb.h"
#include "lib/layout.h" #include "lib/layout.h"
#include <numeric> #include <numeric>

View File

@@ -1,10 +1,10 @@
#ifndef DECODERS_H #ifndef DECODERS_H
#define DECODERS_H #define DECODERS_H
#include "bytes.h" #include "lib/bytes.h"
#include "sector.h" #include "lib/sector.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "decoders/fluxdecoder.h" #include "lib/decoders/fluxdecoder.h"
class Sector; class Sector;
class Fluxmap; class Fluxmap;
@@ -12,7 +12,7 @@ class FluxmapReader;
class RawBits; class RawBits;
class DecoderProto; class DecoderProto;
#include "flux.h" #include "lib/flux.h"
extern void setDecoderManualClockRate(double clockrate_us); extern void setDecoderManualClockRate(double clockrate_us);

View File

@@ -1,7 +1,7 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "decoders/fluxdecoder.h" #include "lib/decoders/fluxdecoder.h"
#include "lib/decoders/decoders.pb.h" #include "lib/decoders/decoders.pb.h"
/* This is a port of the samdisk code: /* This is a port of the samdisk code:

View File

@@ -1,9 +1,9 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "flags.h" #include "lib/flags.h"
#include "lib/proto.h"
#include "protocol.h" #include "protocol.h"
#include "proto.h"
#include <numeric> #include <numeric>
#include <math.h> #include <math.h>
#include <strings.h> #include <strings.h>

View File

@@ -1,9 +1,9 @@
#ifndef FLUXMAPREADER_H #ifndef FLUXMAPREADER_H
#define FLUXMAPREADER_H #define FLUXMAPREADER_H
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "lib/flags.h"
#include "protocol.h" #include "protocol.h"
#include "flags.h"
class FluxMatcher; class FluxMatcher;
class DecoderProto; class DecoderProto;

View File

@@ -1,5 +1,5 @@
#include "globals.h" #include "lib/globals.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
Bytes decodeFmMfm( Bytes decodeFmMfm(
std::vector<bool>::const_iterator ii, std::vector<bool>::const_iterator end) std::vector<bool>::const_iterator ii, std::vector<bool>::const_iterator end)

View File

@@ -1,8 +1,9 @@
syntax = "proto2"; syntax = "proto2";
import "lib/common.proto"; import "lib/common.proto";
import "lib/fl2.proto";
// Next: 17 // Next: 15
message DriveProto message DriveProto
{ {
optional int32 drive = 1 optional int32 drive = 1
@@ -11,32 +12,30 @@ message DriveProto
[ default = INDEXMODE_DRIVE, (help) = "index pulse source" ]; [ default = INDEXMODE_DRIVE, (help) = "index pulse source" ];
optional int32 hard_sector_count = 3 optional int32 hard_sector_count = 3
[ default = 0, (help) = "number of hard sectors on disk" ]; [ 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 " [ default = 0, (help) = "index pulses longer than this interval are "
"considered sector markers; shorter indicates an true index marker" ]; "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" ]; [ 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" ]; [ 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" ]; [ 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" ]; [ 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" ]; [ default = 2, (help) = "Number of heads supported by drive" ];
optional int32 head_bias = 9 [ optional int32 head_bias = 10 [
default = 0, default = 0,
(help) = "Bias to apply to the head position (in tracks)" (help) = "Bias to apply to the head position (in tracks)"
]; ];
optional int32 group_offset = 14 [ optional int32 group_offset = 11 [
default = 0, default = 0,
(help) = "When writing groups, erase all tracks except this one in each group" (help) = "When writing groups, erase all tracks except this one in each group"
]; ];
optional int32 head_width = 10 optional DriveType drive_type = 12 [ default = DRIVETYPE_UNKNOWN, (help) = "Type of drive" ];
[ default = 1, (help) = "Width of the head (in tracks)" ]; optional double rotational_period_ms = 13
optional float tpi = 11 [ default = 0, (help) = "TPI of drive; 0 disables all track mapping" ];
optional double rotational_period_ms = 12
[ default = 0, (help) = "Rotational period of the drive in milliseconds (0 to autodetect)"]; [ default = 0, (help) = "Rotational period of the drive in milliseconds (0 to autodetect)"];
enum ErrorBehaviour { enum ErrorBehaviour {
@@ -45,7 +44,7 @@ message DriveProto
RECALIBRATE = 2; RECALIBRATE = 2;
} }
optional ErrorBehaviour error_behaviour = 15 optional ErrorBehaviour error_behaviour = 14
[ default = JIGGLE, (help) = "what to do when an error occurs during reads" ]; [ default = JIGGLE, (help) = "what to do when an error occurs during reads" ];
} }

View File

@@ -1,7 +1,7 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/decoders.h" #include "lib/decoders/decoders.h"
#include "encoders/encoders.h" #include "lib/encoders/encoders.h"
#include "arch/agat/agat.h" #include "arch/agat/agat.h"
#include "arch/amiga/amiga.h" #include "arch/amiga/amiga.h"
#include "arch/apple2/apple2.h" #include "arch/apple2/apple2.h"

View File

@@ -1,6 +1,6 @@
#include "globals.h" #include "lib/globals.h"
#include "proto.h" #include "lib/proto.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "lib/fl2.pb.h" #include "lib/fl2.pb.h"
#include <fstream> #include <fstream>

View File

@@ -15,11 +15,28 @@ message TrackFluxProto {
repeated bytes flux = 3; 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 { message FluxFileProto {
optional int32 magic = 1; optional int32 magic = 1;
optional FluxFileVersion version = 2; optional FluxFileVersion version = 2;
repeated TrackFluxProto track = 3; repeated TrackFluxProto track = 3;
optional double rotational_period_ms = 4; 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;
} }

View File

@@ -1,7 +1,7 @@
#ifndef FLUX_H #ifndef FLUX_H
#define FLUX_H #define FLUX_H
#include "bytes.h" #include "lib/bytes.h"
class Fluxmap; class Fluxmap;
class Sector; class Sector;

View File

@@ -1,6 +1,6 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "protocol.h" #include "protocol.h"
Fluxmap& Fluxmap::appendBytes(const Bytes& bytes) Fluxmap& Fluxmap::appendBytes(const Bytes& bytes)

View File

@@ -1,7 +1,7 @@
#ifndef FLUXMAP_H #ifndef FLUXMAP_H
#define FLUXMAP_H #define FLUXMAP_H
#include "bytes.h" #include "lib/bytes.h"
#include "protocol.h" #include "protocol.h"
#include "fmt/format.h" #include "fmt/format.h"

View File

@@ -1,15 +1,15 @@
#include "globals.h" #include "lib/globals.h"
#include "flags.h" #include "lib/flags.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "bytes.h" #include "lib/bytes.h"
#include "protocol.h" #include "protocol.h"
#include "fluxsink/fluxsink.h" #include "lib/fluxsink/fluxsink.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "lib/fluxsink/fluxsink.pb.h" #include "lib/fluxsink/fluxsink.pb.h"
#include "lib/logger.h" #include "lib/logger.h"
#include "proto.h" #include "lib/proto.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "a2r.h" #include "lib/a2r.h"
#include <fstream> #include <fstream>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>

View File

@@ -1,12 +1,12 @@
#include "globals.h" #include "lib/globals.h"
#include "flags.h" #include "lib/flags.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "bytes.h" #include "lib/bytes.h"
#include "protocol.h" #include "protocol.h"
#include "fluxsink/fluxsink.h" #include "lib/fluxsink/fluxsink.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "lib/fluxsink/fluxsink.pb.h" #include "lib/fluxsink/fluxsink.pb.h"
#include "proto.h" #include "lib/proto.h"
#include <fstream> #include <fstream>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>

View File

@@ -1,14 +1,14 @@
#include "globals.h" #include "lib/globals.h"
#include "flags.h" #include "lib/flags.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "bytes.h" #include "lib/bytes.h"
#include "protocol.h" #include "protocol.h"
#include "fluxsink/fluxsink.h" #include "lib/fluxsink/fluxsink.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "lib/fluxsink/fluxsink.pb.h" #include "lib/fluxsink/fluxsink.pb.h"
#include "proto.h" #include "lib/proto.h"
#include "lib/fl2.pb.h" #include "lib/fl2.pb.h"
#include "fl2.h" #include "lib/fl2.h"
#include <fstream> #include <fstream>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
@@ -45,7 +45,8 @@ public:
proto.set_rotational_period_ms( proto.set_rotational_period_ms(
globalConfig()->drive().rotational_period_ms()); globalConfig()->drive().rotational_period_ms());
proto.set_tpi(globalConfig()->drive().tpi()); proto.set_drive_type(globalConfig()->drive().drive_type());
proto.set_format_type(globalConfig()->layout().format_type());
saveFl2File(_filename, proto); saveFl2File(_filename, proto);
} }

View File

@@ -1,9 +1,9 @@
#include "globals.h" #include "lib/globals.h"
#include "flags.h" #include "lib/flags.h"
#include "fluxsink/fluxsink.h" #include "lib/fluxsink/fluxsink.h"
#include "lib/config.pb.h" #include "lib/config.pb.h"
#include "proto.h" #include "lib/proto.h"
#include "utils.h" #include "lib/utils.h"
#include <regex> #include <regex>
std::unique_ptr<FluxSink> FluxSink::create(const FluxSinkProto& config) std::unique_ptr<FluxSink> FluxSink::create(const FluxSinkProto& config)

View File

@@ -1,7 +1,7 @@
#ifndef FLUXSINK_H #ifndef FLUXSINK_H
#define FLUXSINK_H #define FLUXSINK_H
#include "flags.h" #include "lib/flags.h"
#include <ostream> #include <ostream>
class Fluxmap; class Fluxmap;

View File

@@ -1,10 +1,10 @@
#include "globals.h" #include "lib/globals.h"
#include "flags.h" #include "lib/flags.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "logger.h" #include "lib/logger.h"
#include "proto.h" #include "lib/proto.h"
#include "usb/usb.h" #include "lib/usb/usb.h"
#include "fluxsink/fluxsink.h" #include "lib/fluxsink/fluxsink.h"
#include "lib/fluxsink/fluxsink.pb.h" #include "lib/fluxsink/fluxsink.pb.h"
#include "lib/readerwriter.h" #include "lib/readerwriter.h"

View File

@@ -1,15 +1,15 @@
#include "globals.h" #include "lib/globals.h"
#include "flags.h" #include "lib/flags.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "bytes.h" #include "lib/bytes.h"
#include "protocol.h" #include "protocol.h"
#include "fluxsink/fluxsink.h" #include "lib/fluxsink/fluxsink.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "lib/fluxsink/fluxsink.pb.h" #include "lib/fluxsink/fluxsink.pb.h"
#include "proto.h" #include "lib/proto.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "layout.h" #include "lib/layout.h"
#include "scp.h" #include "lib/scp.h"
#include "lib/logger.h" #include "lib/logger.h"
#include <fstream> #include <fstream>
#include <sys/stat.h> #include <sys/stat.h>
@@ -55,7 +55,7 @@ public:
_fileheader.start_track = strackno(minTrack, minSide); _fileheader.start_track = strackno(minTrack, minSide);
_fileheader.end_track = strackno(maxTrack, maxSide); _fileheader.end_track = strackno(maxTrack, maxSide);
_fileheader.flags = SCP_FLAG_INDEXED; _fileheader.flags = SCP_FLAG_INDEXED;
if (globalConfig()->drive().tpi() != 48) if (globalConfig()->drive().drive_type() != DRIVETYPE_40TRACK)
_fileheader.flags |= SCP_FLAG_96TPI; _fileheader.flags |= SCP_FLAG_96TPI;
_fileheader.cell_width = 0; _fileheader.cell_width = 0;
if ((minSide == 0) && (maxSide == 0)) if ((minSide == 0) && (maxSide == 0))

View File

@@ -1,12 +1,12 @@
#include "globals.h" #include "lib/globals.h"
#include "flags.h" #include "lib/flags.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "bytes.h" #include "lib/bytes.h"
#include "protocol.h" #include "protocol.h"
#include "fluxsink/fluxsink.h" #include "lib/fluxsink/fluxsink.h"
#include "decoders/fluxmapreader.h" #include "lib/decoders/fluxmapreader.h"
#include "lib/fluxsink/fluxsink.pb.h" #include "lib/fluxsink/fluxsink.pb.h"
#include "proto.h" #include "lib/proto.h"
#include <fstream> #include <fstream>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>

View File

@@ -1,8 +1,8 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "lib/fluxsource/fluxsource.pb.h" #include "lib/fluxsource/fluxsource.pb.h"
#include "fluxsource/fluxsource.h" #include "lib/fluxsource/fluxsource.h"
#include "proto.h" #include "lib/proto.h"
#include <fstream> #include <fstream>
struct A2Rv2Flux struct A2Rv2Flux
@@ -80,13 +80,14 @@ public:
/* 5.25" with quarter stepping. */ /* 5.25" with quarter stepping. */
_extraConfig.mutable_drive()->set_tracks(160); _extraConfig.mutable_drive()->set_tracks(160);
_extraConfig.mutable_drive()->set_heads(1); _extraConfig.mutable_drive()->set_heads(1);
_extraConfig.mutable_drive()->set_head_width(4); _extraConfig.mutable_drive()->set_drive_type(
_extraConfig.mutable_drive()->set_tpi(48 * 4); DRIVETYPE_APPLE2);
} }
else else
{ {
/* 3.5". */ /* 3.5". */
_extraConfig.mutable_drive()->set_tpi(135); _extraConfig.mutable_drive()->set_drive_type(
DRIVETYPE_80TRACK);
} }
Bytes stream = findChunk("STRM"); Bytes stream = findChunk("STRM");

View File

@@ -1,8 +1,8 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "lib/fluxsource/fluxsource.pb.h" #include "lib/fluxsource/fluxsource.pb.h"
#include "fluxsource/fluxsource.h" #include "lib/fluxsource/fluxsource.h"
#include "proto.h" #include "lib/proto.h"
#include <fstream> #include <fstream>
struct CwfHeader struct CwfHeader

View File

@@ -1,6 +1,6 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "fluxsource/fluxsource.h" #include "lib/fluxsource/fluxsource.h"
#include "lib/fluxsource/fluxsource.pb.h" #include "lib/fluxsource/fluxsource.pb.h"
class EraseFluxSource : public TrivialFluxSource class EraseFluxSource : public TrivialFluxSource

View File

@@ -1,11 +1,11 @@
#include "globals.h" #include "lib/globals.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include "lib/fluxsource/fluxsource.pb.h" #include "lib/fluxsource/fluxsource.pb.h"
#include "lib/fl2.pb.h" #include "lib/fl2.pb.h"
#include "fluxsource/fluxsource.h" #include "lib/fluxsource/fluxsource.h"
#include "proto.h" #include "lib/proto.h"
#include "fl2.h" #include "lib/fl2.h"
#include "fluxmap.h" #include "lib/fluxmap.h"
#include <fstream> #include <fstream>
class Fl2FluxSourceIterator : public FluxSourceIterator class Fl2FluxSourceIterator : public FluxSourceIterator
@@ -39,8 +39,8 @@ public:
_extraConfig.mutable_drive()->set_rotational_period_ms( _extraConfig.mutable_drive()->set_rotational_period_ms(
_proto.rotational_period_ms()); _proto.rotational_period_ms());
if (_proto.has_tpi()) if (_proto.has_drive_type())
_extraConfig.mutable_drive()->set_tpi(_proto.tpi()); _extraConfig.mutable_drive()->set_drive_type(_proto.drive_type());
} }
public: public:

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