Skip to content

Commit

Permalink
Add the brother240tool program.
Browse files Browse the repository at this point in the history
  • Loading branch information
davidgiven committed Nov 24, 2019
1 parent a1f3087 commit 2520834
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 2 deletions.
4 changes: 2 additions & 2 deletions doc/disk-brother.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,8 @@ reverse engineered it to find out.

Standard Linux mtools will access the filesystem image and allow you to move
files in and out. However, you'll need to change the media type bytes at
offsets 0x015 and 0x100 from 0x58 to 0xf0 before mtools will touch it. Once
done, this will work:
offsets 0x015 and 0x100 from 0x58 to 0xf0 before mtools will touch it. The
supplied `brother240tool` will do this. Once done, this will work:

```
mdir -i brother.img
Expand Down
7 changes: 7 additions & 0 deletions mkninja.sh
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,13 @@ buildsimpleprogram brother120tool \
libemu.a \
libfmt.a \

buildsimpleprogram brother240tool \
-Idep/emu \
tools/brother240tool.cc \
libbackend.a \
libemu.a \
libfmt.a \

runtest bitaccumulator-test tests/bitaccumulator.cc
runtest bytes-test tests/bytes.cc
runtest compression-test tests/compression.cc
Expand Down
56 changes: 56 additions & 0 deletions tools/brother240tool.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#include "globals.h"
#include "fmt/format.h"
#include <fstream>

static std::fstream inputFile;

void syntax()
{
std::cout << "Syntax: brother240tool <image>\n"
"The disk image will be flipped from Brother to DOS format and back\n"
"again.\n";
exit(0);
}

uint8_t getbyte(uint32_t offset)
{
inputFile.seekg(offset, std::ifstream::beg);
return inputFile.get();
}

void putbyte(uint32_t offset, uint8_t value)
{
inputFile.seekp(offset, std::ifstream::beg);
inputFile.put(value);
}

int main(int argc, const char* argv[])
{
if (argc < 2)
syntax();

inputFile.open(argv[1], std::ios::in | std::ios::out | std::ios::binary);
if (!inputFile.is_open())
Error() << fmt::format("cannot open input file '{}'", argv[1]);

uint8_t b1 = getbyte(0x015);
uint8_t b2 = getbyte(0x100);
if ((b1 == 0x58) && (b2 == 0x58))
{
std::cerr << "Flipping from Brother to DOS.\n";
putbyte(0x015, 0xf0);
putbyte(0x100, 0xf0);
}
else if ((b1 == 0xf0) && (b2 == 0xf0))
{
std::cerr << "Flipping from DOS to Brother.\n";
putbyte(0x015, 0x58);
putbyte(0x100, 0x58);
}
else
Error() << "Unknown image format.";

inputFile.close();
return 0;
}

0 comments on commit 2520834

Please sign in to comment.