Jump to content
phaeron

a8rawconv, a new raw disk conversion utility

Recommended Posts

darn, those didn't work either. Am wondering if my belt-driven drive is simply too wobbly in timing to be useful for writing flux images with tight sector timings?

 

sigh, I will try to find a TEAC FD-55B somewhere.

 

-Thom

Share this post


Link to post
Share on other sites

Was able to write Jumpman from the a8 preservation archive just fine. No warnings.

 

Tried both cuts of Lode Runner from the 1983 release, both having phantom sectors...

$ a8rawconv.exe Lode\ Runner\ \(1983\)\(Broderbund\ Software\)\(US\).atx scp1:48tpi
A8 raw disk conversion utility v0.92
Copyright (C) 2014-2016 Avery Lee, All Rights Reserved.
Licensed under GNU General Public License, version 2 or later.

WARNING: Track  5, sector  9: 1 phantom sector found.
WARNING: Track  5, sector  8: 1 phantom sector found.
WARNING: Track  5, sector  7: 1 phantom sector found.
WARNING: Track  5, sector  6: 1 phantom sector found.
WARNING: Track  5, sector  5: 1 phantom sector found.
WARNING: Track  5, sector  4: 1 phantom sector found.
WARNING: Track  5, sector  3: 1 phantom sector found.
WARNING: Track  5, sector  2: 1 phantom sector found.
Detected SCP port: COM4.
Initializing SCP device.
SCP version info: hardware version 1.1, firmware version 1.2
Detecting drive RPM... 300 RPM (actual 298.82 RPM)
Writing track 0: 82648 bytes, delay 0.540
Writing track 1: 69130 bytes, delay 0.026
Erasing track 2 (6 revs)
Erasing track 3 (6 revs)
Erasing track 4 (6 revs)
Writing track 5: 70308 bytes, delay 0.411
Writing track 6: 74898 bytes, delay 0.651
Writing track 7: 74870 bytes, delay 0.799
Writing track 8: 75138 bytes, delay 0.876
Writing track 9: 74756 bytes, delay 0.889
Writing track 10: 74960 bytes, delay 0.855
Writing track 11: 74852 bytes, delay 0.756
Writing track 12: 74486 bytes, delay 0.603
Writing track 13: 74874 bytes, delay 0.391
Writing track 14: 74522 bytes, delay 0.125
Writing track 15: 75014 bytes, delay 0.798
Writing track 16: 62270 bytes, delay 0.421
Erasing track 17 (6 revs)
Erasing track 18 (6 revs)
Erasing track 19 (6 revs)
Writing track 20: 71802 bytes, delay 0.386
Writing track 21: 86988 bytes, delay 0.718
Writing track 22: 88174 bytes, delay 0.993
Writing track 23: 87936 bytes, delay 0.202
Writing track 24: 87074 bytes, delay 0.359
Writing track 25: 86572 bytes, delay 0.462
Writing track 26: 86898 bytes, delay 0.500
Writing track 27: 87010 bytes, delay 0.472
Writing track 28: 87156 bytes, delay 0.393
Writing track 29: 87242 bytes, delay 0.256
Writing track 30: 86508 bytes, delay 0.066
Writing track 31: 86972 bytes, delay 0.823
Writing track 32: 85366 bytes, delay 0.517
Writing track 33: 86632 bytes, delay 0.149
Writing track 34: 87052 bytes, delay 0.741
Writing track 35: 86996 bytes, delay 0.263
Writing track 36: 87062 bytes, delay 0.732
Writing track 37: 69150 bytes, delay 0.144
Erasing track 38 (6 revs)
Writing track 39: 64406 bytes, delay 0.812

This one shows the title screen, and loads to a score display, but hangs.

 

and the [a]lternate:

$ a8rawconv.exe Lode\ Runner\ \(1983\)\(Broderbund\ Software\)\(US\)\[a\].atx scp1:48tpi
A8 raw disk conversion utility v0.92
Copyright (C) 2014-2016 Avery Lee, All Rights Reserved.
Licensed under GNU General Public License, version 2 or later.

WARNING: Track  0, sector 17: 1 phantom sector found.
WARNING: Track 39, sector 17: 1 phantom sector found.
WARNING: Track 39, sector 15: 1 phantom sector found.
WARNING: Track 39, sectors 3 and 5 overlapped during encoding. Encoded track may not work.
Detected SCP port: COM4.
Initializing SCP device.
SCP version info: hardware version 1.1, firmware version 1.2
Detecting drive RPM... 300 RPM (actual 299.07 RPM)
Writing track 0: 79582 bytes, delay 0.010
Writing track 1: 73932 bytes, delay 0.236
Writing track 2: 78644 bytes, delay 0.851
Writing track 3: 78030 bytes, delay 0.468
Writing track 4: 77378 bytes, delay 0.079
Writing track 5: 78274 bytes, delay 0.697
Writing track 6: 78422 bytes, delay 0.305
Writing track 7: 77454 bytes, delay 0.924
Writing track 8: 84530 bytes, delay 0.539
Writing track 9: 87256 bytes, delay 0.153
Writing track 10: 83090 bytes, delay 0.767
Writing track 11: 89236 bytes, delay 0.378
Writing track 12: 93198 bytes, delay 0.995
Writing track 13: 93140 bytes, delay 0.610
Writing track 14: 93046 bytes, delay 0.222
Writing track 15: 93224 bytes, delay 0.838
Writing track 16: 93020 bytes, delay 0.448
Writing track 17: 92972 bytes, delay 0.066
Writing track 18: 93114 bytes, delay 0.681
Writing track 19: 91632 bytes, delay 0.294
Writing track 20: 71930 bytes, delay 0.910
Writing track 21: 86938 bytes, delay 0.519
Writing track 22: 87964 bytes, delay 0.137
Writing track 23: 88070 bytes, delay 0.751
Writing track 24: 87076 bytes, delay 0.365
Writing track 25: 86698 bytes, delay 0.979
Writing track 26: 86920 bytes, delay 0.590
Writing track 27: 86946 bytes, delay 0.208
Writing track 28: 87260 bytes, delay 0.822
Writing track 29: 87286 bytes, delay 0.436
Writing track 30: 86504 bytes, delay 0.050
Writing track 31: 86932 bytes, delay 0.661
Writing track 32: 85308 bytes, delay 0.278
Writing track 33: 86814 bytes, delay 0.893
Writing track 34: 86996 bytes, delay 0.507
Writing track 35: 86960 bytes, delay 0.121
Writing track 36: 87062 bytes, delay 0.733
Writing track 37: 69200 bytes, delay 0.349
Writing track 38: 93220 bytes, delay 0.964
Writing track 39: 57850 bytes, delay 0.946

This fails immediately upon trying to check for the clusterfucked sector overlap 5 car pile-up on track 39...

 

Lode Runner (1983)(Broderbund Software)(US).atx Lode Runner (1983)(Broderbund Software)(US)[a].atx

Edited by tschak909

Share this post


Link to post
Share on other sites

 

This might help from my backup guide when writing ATX files with 20-21 sector tracks. You can also do this to a specific track only by adding -t. a8rawconv p.atx scp0:96tpi -p 96 -t 5

 

Atari Disk Preservation and Restore Guide.pdf

 

-p (50-200) - When writing an ATX and tracks larger than 19s are present you will need to add the -p command which adjusts the timing, otherwise sectors will be missing and you will see the message below.

 

tqhqePx8Vhy_Td-ZY8OFggtUMUPcw7BivsXc21k7wQlLNxcaAZ2lRZYhP07kiWCAqHHp7aGLqP3gQP6VHT-_VQl8H35D3vfYMwuo_PmEUU6KNPW2h3A3MJBZsfuhQVC1QFIVgDhM

 

The general rule I’ve discovered is -p 96 for 20s and -p 91 for 21s. Ex - a8rawconv p.atx scp0:96tpi -p 96

 

Adjusting the timings can also have beneficial effects on some older disks, which will only normally run on an 810 drive. By using -p 100+ I’ve found you can sometimes create a copy which will run fine on a 1050. 

 

There are limits though, anything below 81 and too high will not produce a readable track. This means that you cannot write ATX files with very large tracks. Writing the raw SCP file is the only way to produce these.

Edited by Zarxx
added -t
  • Like 1

Share this post


Link to post
Share on other sites

I have succesfully used a8rawconv to convert apple ii DOS 3.3 16 sector, SCP images (made using a greaseweazle device) to DSK.

 

Thank you for writing this tool.

 

I have not been able to make usable ProDOS disks though. I suspect this may be due to the different sector layout from Dos 3.3, as alluded to here

 

snip:

 

Specifically, on-disk sectors 0 to 15 of a DOS 3.3 image (ordinarily having the extension DSK or DO) should contain the contents of the image sectors at offsets: 0, 7, 14, 6, 13, 5, 12, 4, 11, 3, 10, 2, 9, 1, 8, 15 — i.e. increase by 7 at each step, and take the modulo by 15 if out of bounds. The on-disk sectors 0 to 15 of a Pro-DOS image (ordinarily PO) should contain the sectors at offsets 0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15 — i.e. increase by 8 each step, and take the modulo by 15 if out of bounds.

 

Unfortunately my ability to manipulate the source code to a8rawconv to allow for the different offsets above isn't good enough to make a usable ProDOS disk.

Share this post


Link to post
Share on other sites
1 hour ago, pksw said:

I have not been able to make usable ProDOS disks though. I suspect this may be due to the different sector layout from Dos 3.3, as alluded to here

 

snip:

 

Specifically, on-disk sectors 0 to 15 of a DOS 3.3 image (ordinarily having the extension DSK or DO) should contain the contents of the image sectors at offsets: 0, 7, 14, 6, 13, 5, 12, 4, 11, 3, 10, 2, 9, 1, 8, 15 — i.e. increase by 7 at each step, and take the modulo by 15 if out of bounds. The on-disk sectors 0 to 15 of a Pro-DOS image (ordinarily PO) should contain the sectors at offsets 0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15 — i.e. increase by 8 each step, and take the modulo by 15 if out of bounds.

 

Unfortunately my ability to manipulate the source code to a8rawconv to allow for the different offsets above isn't good enough to make a usable ProDOS disk.

Yes, this is the issue. Currently, a8rawconv only writes out disk images in DOS 3.3 sector ordering and you need ProDOS ordering. The sector order lists you found are the pertinent ones, but the one in diska2.cpp is the reverse mapping, which can be produced from the above mappings with a little Python:

>>> [[0, 7, 14, 6, 13, 5, 12, 4, 11, 3, 10, 2, 9, 1, 8, 15].index(x) for x in range(0,16)]
[0, 13, 11, 9, 7, 5, 3, 1, 14, 12, 10, 8, 6, 4, 2, 15]
>>> [[0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15].index(x) for x in range(0,16)]
[0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15]

Replace the kLogicalToPhysicalA2DOS array in diska2.cpp with the last mapping and see if that does the trick. If so, I can update the code to switch to that for .PO files.

 

  • Like 2

Share this post


Link to post
Share on other sites
5 hours ago, phaeron said:

Yes, this is the issue. Currently, a8rawconv only writes out disk images in DOS 3.3 sector ordering and you need ProDOS ordering. The sector order lists you found are the pertinent ones, but the one in diska2.cpp is the reverse mapping, which can be produced from the above mappings with a little Python:

>>> [[0, 7, 14, 6, 13, 5, 12, 4, 11, 3, 10, 2, 9, 1, 8, 15].index(x) for x in range(0,16)]
[0, 13, 11, 9, 7, 5, 3, 1, 14, 12, 10, 8, 6, 4, 2, 15]
>>> [[0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15].index(x) for x in range(0,16)]
[0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11, 13, 15]

Replace the kLogicalToPhysicalA2DOS array in diska2.cpp with the last mapping and see if that does the trick. If so, I can update the code to switch to that for .PO files.

I did try that, and managed to get the source to compile under the free download Visual Studio 2019 (I've never used it - I haven't programmed since turbo pascal 6 in the 90s, and never learnt C). However, the DSK file still doesn't seem to be right. Viewing the original disk and the converted one with a hex editor does find some blocks that are the same, and in the correct offsets. But there is a lot of junk data too, and text that I can see in the original disk, that just isn't in the converted DSK.  I'll do a bit more testing using different media, to ensure it's not a bad read.

 

I did find a reference to PRODOS encoding at https://www.bigmessowires.com/2011/10/02/crazy-disk-encoding-schemes/

and a manual for PRODOS at http://www.apple-iigs.info/doc/fichiers/beneathprodos.pdf

 

Edited by pksw

Share this post


Link to post
Share on other sites

I'm getting "Undefined symbols for architecture x86_64:" trying to compile this on a mac.

 

wine a8rawconv.exe seems to work ok but it would be nice to get it native.

 

 "/Library/Developer/CommandLineTools/usr/bin/ld" -demangle -lto_library /Library/Developer/CommandLineTools/usr/lib/libLTO.dylib -no_deduplicate -dynamic -arch x86_64 -macosx_version_min 10.14.0 -syslibroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk -o a.out /var/folders/ch/hnn9fp4s7f7gtnls1_jb_k2m0000gn/T/compileall-87b033.o -L/usr/local/lib -lSystem /Library/Developer/CommandLineTools/usr/lib/clang/10.0.1/lib/darwin/libclang_rt.osx.a
Undefined symbols for architecture x86_64:
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::compare(unsigned long, unsigned long, char const*) const", referenced from:
      parse_args(int, char**) in compileall-87b033.o
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::compare(unsigned long, unsigned long, char const*, unsigned long) const", referenced from:
      bool std::__1::operator==<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*) in compileall-87b033.o
  "std::__1::__vector_base_common<true>::__throw_length_error() const", referenced from:
      std::__1::vector<SectorInfo, std::__1::allocator<SectorInfo> >::__vallocate(unsigned long) in compileall-87b033.o
      std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >::__vallocate(unsigned long) in compileall-87b033.o
      std::__1::vector<SectorParser, std::__1::allocator<SectorParser> >::__recommend(unsigned long) const in compileall-87b033.o
      std::__1::vector<SectorParserMFM, std::__1::allocator<SectorParserMFM> >::__recommend(unsigned long) const in compileall-87b033.o
      std::__1::vector<unsigned char, std::__1::allocator<unsigned char> >::__recommend(unsigned long) const in compileall-87b033.o
      std::__1::vector<SectorInfo, std::__1::allocator<SectorInfo> >::__recommend(unsigned long) const in compileall-87b033.o
      std::__1::vector<SectorInfo*, std::__1::allocator<SectorInfo*> >::__vallocate(unsigned long) in compileall-87b033.o
      ...
  "std::logic_error::logic_error(char const*)", referenced from:
      std::length_error::length_error(char const*) in compileall-87b033.o
  "std::length_error::~length_error()", referenced from:
      std::__1::__throw_length_error(char const*) in compileall-87b033.o
  "std::__1::__next_prime(unsigned long)", referenced from:
      std::__1::__hash_table<std::__1::__hash_value_type<sift_sectors(TrackInfo&, int, std::__1::vector<SectorInfo*, std::__1::allocator<SectorInfo*> >&)::HashedSectorRef, unsigned int>, std::__1::__unordered_map_hasher<sift_sectors(TrackInfo&, int, std::__1::vector<SectorInfo*, std::__1::allocator<SectorInfo*> >&)::HashedSectorRef, std::__1::__hash_value_type<sift_sectors(TrackInfo&, int, std::__1::vector<SectorInfo*, std::__1::allocator<SectorInfo*> >&)::HashedSectorRef, unsigned int>, sift_sectors(TrackInfo&, int, std::__1::vector<SectorInfo*, std::__1::allocator<SectorInfo*> >&)::HashedSectorPred, true>, std::__1::__unordered_map_equal<sift_sectors(TrackInfo&, int, std::__1::vector<SectorInfo*, std::__1::allocator<SectorInfo*> >&)::HashedSectorRef, std::__1::__hash_value_type<sift_sectors(TrackInfo&, int, std::__1::vector<SectorInfo*, std::__1::allocator<SectorInfo*> >&)::HashedSectorRef, unsigned int>, sift_sectors(TrackInfo&, int, std::__1::vector<SectorInfo*, std::__1::allocator<SectorInfo*> >&)::HashedSectorPred, true>, std::__1::allocator<std::__1::__hash_value_type<sift_sectors(TrackInfo&, int, std::__1::vector<SectorInfo*, std::__1::allocator<SectorInfo*> >&)::HashedSectorRef, unsigned int> > >::rehash(unsigned long) in compileall-87b033.o
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char const*, unsigned long)", referenced from:
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string<std::nullptr_t>(char const*) in compileall-87b033.o
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::assign(char const*)", referenced from:
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator=(char const*) in compileall-87b033.o
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::replace(unsigned long, unsigned long, char const*)", referenced from:
      kf_read(RawDisk&, int, int, char const*, int, int, int) in compileall-87b033.o
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
      kf_read(RawDisk&, int, int, char const*, int, int, int) in compileall-87b033.o
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()", referenced from:
      parse_args(int, char**) in compileall-87b033.o
      kf_read(RawDisk&, int, int, char const*, int, int, int) in compileall-87b033.o
      ___cxx_global_var_init.1 in compileall-87b033.o
      ___cxx_global_var_init.185 in compileall-87b033.o
  "void std::__1::__sort<std::__1::__less<int, int>&, int*>(int*, int*, std::__1::__less<int, int>&)", referenced from:
      void std::__1::sort<int*, std::__1::__less<int, int> >(int*, int*, std::__1::__less<int, int>) in compileall-87b033.o
  "std::terminate()", referenced from:
      ___clang_call_terminate in compileall-87b033.o
  "typeinfo for std::length_error", referenced from:
      std::__1::__throw_length_error(char const*) in compileall-87b033.o
  "vtable for std::length_error", referenced from:
      std::length_error::length_error(char const*) in compileall-87b033.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
  "operator delete(void*)", referenced from:
      std::__1::__libcpp_deallocate(void*, unsigned long) in compileall-87b033.o
  "operator new(unsigned long)", referenced from:
      std::__1::__libcpp_allocate(unsigned long, unsigned long) in compileall-87b033.o
  "___cxa_allocate_exception", referenced from:
      std::__1::__throw_length_error(char const*) in compileall-87b033.o
  "___cxa_begin_catch", referenced from:
      ___clang_call_terminate in compileall-87b033.o
  "___cxa_free_exception", referenced from:
      std::__1::__throw_length_error(char const*) in compileall-87b033.o
  "___cxa_throw", referenced from:
      std::__1::__throw_length_error(char const*) in compileall-87b033.o
  "___gxx_personality_v0", referenced from:
      process_track_fm(RawTrack const&) in compileall-87b033.o
      process_track_mfm(RawTrack const&) in compileall-87b033.o
      parse_args(int, char**) in compileall-87b033.o
      bool std::__1::operator==<char, std::__1::char_traits<char>, std::__1::allocator<char> >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const*) in compileall-87b033.o
      show_layout() in compileall-87b033.o
      sift_sectors(TrackInfo&, int, std::__1::vector<SectorInfo*, std::__1::allocator<SectorInfo*> >&) in compileall-87b033.o
      _main in compileall-87b033.o
      ...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

 

Share this post


Link to post
Share on other sites

Anyone have any tips on compiling this under Linux ?

 

scl enable devtoolset-6 'gcc -std=c++11 -fno-builtin -fpermissive -o a8rawconv a8rawconv.cpp'

 

I receive tons of errors, like:

 

a8rawconv.cpp:(.text+0x226): undefined reference to `g_verbosity'

a8rawconv.cpp:(.text+0x62a): undefined reference to `SectorParser::Parse(unsigned int, unsigned char, unsigned char)'

a8rawconv.cpp:(.text+0x72f): undefined reference to `SectorParser::Init(int, std::vector<unsigned int, std::allocator<unsigned int> > const*, float, TrackInfo*, unsigned int)'

a8rawconv.cpp:(.text+0xc05): undefined reference to `SectorParserMFMAmiga::Parse(unsigned int, unsigned char, unsigned char)'
a8rawconv.cpp:(.text+0xcde): undefined reference to `SectorParserMFM::Parse(unsigned int, unsigned char, unsigned char)'
a8rawconv.cpp:(.text+0xe31): undefined reference to `SectorParserMFMAmiga::Init(int, int, std::vector<unsigned int, std::allocator<unsigned int> > const*, float, TrackInfo*, unsigned int)'
a8rawconv.cpp:(.text+0xf02): undefined reference to `SectorParserMFM::Init(int, std::vector<unsigned int, std::allocator<unsigned int> > const*, float, TrackInfo*, unsigned int)'

 

and many many more.

 

I don't know C++, I know with C, I just used to make simple makefiles to compile all the files and link everything together, but if this is done for C++, since this is originating with Windows, makefiles are not used.

 

Hoping someone else has done this.  My system is still CentOS 6, so I had to use devtoolset in order to get access to a new enough gcc.

 

Thanks in advance for any tips.

 

Share this post


Link to post
Share on other sites
27 minutes ago, cwilbar said:

Anyone have any tips on compiling this under Linux ?

 

scl enable devtoolset-6 'gcc -std=c++11 -fno-builtin -fpermissive -o a8rawconv a8rawconv.cpp'

 

You're compiling the wrong file. Per the manual, compile compileall.cpp instead.

Share this post


Link to post
Share on other sites
15 hours ago, phaeron said:

You're compiling the wrong file. Per the manual, compile compileall.cpp instead.

@phaeron ,

 

I tried that as well at one point, but I've since re-tried it with a clean unzip of the source.  These are the errors (if I add "#include <math.h>" in front of the existing includes in a8rawconv.cpp, the floorf and fmod issues go away, but the others remain):

 

In file included from compileall.cpp:4:0:
a8rawconv.cpp: In function ‘void process_track_macgcr(const RawTrack&)’:
a8rawconv.cpp:785:64: error: ‘floorf’ was not declared in this scope
         newsec.mEndingPosition -= floorf(newsec.mEndingPosition);
                                                                ^
a8rawconv.cpp:803:1: error: jump to label ‘reject_data’ [-fpermissive]
 reject_data:
 ^~~~~~~~~~~
a8rawconv.cpp:685:15: note:   from here
          goto reject_data;
               ^~~~~~~~~~~
a8rawconv.cpp:776:21: note:   crosses initialization of ‘SectorInfo& newsec’
         SectorInfo& newsec = tracksecs.back();
                     ^~~~~~
a8rawconv.cpp:774:15: note:   crosses initialization of ‘std::vector<SectorInfo>& tracksecs’
         auto& tracksecs = g_disk.mTracks[rawTrack.mSide][rawTrack.mTrack].mSectors;
               ^~~~~~~~~
a8rawconv.cpp:772:13: note:   crosses initialization of ‘int vsn_time’
         int vsn_time = time_basis - time_left;
             ^~~~~~~~
a8rawconv.cpp:752:14: note:   crosses initialization of ‘bool checksumOK’
         bool checksumOK = (checksumA == decCheckA && checksumB == decCheckB && checksumC == decCheckC);
              ^~~~~~~~~~
a8rawconv.cpp:747:17: note:   crosses initialization of ‘uint8_t decCheckC’
         uint8_t decCheckC = z3 + ((z0 << 6) & 0xc0);
                 ^~~~~~~~~
a8rawconv.cpp:746:17: note:   crosses initialization of ‘uint8_t decCheckB’
         uint8_t decCheckB = z2 + ((z0 << 4) & 0xc0);
                 ^~~~~~~~~
a8rawconv.cpp:745:17: note:   crosses initialization of ‘uint8_t decCheckA’
         uint8_t decCheckA = z1 + ((z0 << 2) & 0xc0);
                 ^~~~~~~~~
a8rawconv.cpp:739:23: note:   crosses initialization of ‘const uint8_t z3’
         const uint8_t z3 = kGCR6Decoder[buf[175*4+3]];
                       ^~
a8rawconv.cpp:738:23: note:   crosses initialization of ‘const uint8_t z2’
         const uint8_t z2 = kGCR6Decoder[buf[175*4+2]];
                       ^~
a8rawconv.cpp:737:23: note:   crosses initialization of ‘const uint8_t z1’
         const uint8_t z1 = kGCR6Decoder[buf[175*4+1]];
                       ^~
a8rawconv.cpp:736:23: note:   crosses initialization of ‘const uint8_t z0’
         const uint8_t z0 = kGCR6Decoder[buf[175*4+0]];
                       ^~
a8rawconv.cpp:693:18: note:   crosses initialization of ‘uint32_t invalid’
         uint32_t invalid = 0;
                  ^~~~~~~
a8rawconv.cpp:692:17: note:   crosses initialization of ‘uint8_t carry’
         uint8_t carry = 0;
                 ^~~~~
a8rawconv.cpp:691:17: note:   crosses initialization of ‘uint8_t checksumC’
         uint8_t checksumC = 0;
                 ^~~~~~~~~
a8rawconv.cpp:690:17: note:   crosses initialization of ‘uint8_t checksumB’
         uint8_t checksumB = 0;
                 ^~~~~~~~~
a8rawconv.cpp:689:17: note:   crosses initialization of ‘uint8_t checksumA’
         uint8_t checksumA = 0;
                 ^~~~~~~~~
a8rawconv.cpp: In function ‘void process_track_a2gcr(const RawTrack&)’:
a8rawconv.cpp:1048:63: error: ‘floorf’ was not declared in this scope
        sector.mEndingPosition -= floorf(sector.mEndingPosition);

                                                           ^

In file included from compileall.cpp:5:0:
diskadf.cpp: In function ‘void read_adf(DiskInfo&, const char*, int)’:
diskadf.cpp:36:42: error: ‘floorf’ was not declared in this scope
     sec.mPosition -= floorf(sec.mPosition);
                                          ^
In file included from compileall.cpp:6:0:
diskatr.cpp: In function ‘void read_atr(DiskInfo&, const char*, int)’:
diskatr.cpp:121:41: error: ‘floorf’ was not declared in this scope
    sec.mPosition -= floorf(sec.mPosition);
                                         ^
In file included from compileall.cpp:9:0:
diskvfd.cpp: In function ‘void read_vfd(DiskInfo&, const char*, int, int)’:
diskvfd.cpp:41:42: error: ‘floorf’ was not declared in this scope
     sec.mPosition -= floorf(sec.mPosition);
                                          ^
In file included from compileall.cpp:11:0:
checksum.cpp: In function ‘uint16_t ComputeAddressCRC(uint32_t, uint32_t, uint32_t, uint32_t, bool)’:
checksum.cpp:65:20: warning: narrowing conversion of ‘((sectorSize > 512u) ? 3 : ((sectorSize > 256u) ? 2 : ((sectorSize > 128u) ? 1 : 0)))’ from ‘in’ to ‘uint8_t {aka unsigned char}’ inside { } [-Wnarrowing]
   sectorSize > 512 ? 3 : sectorSize > 256 ? 2 : sectorSize > 128 ? 1 : 0
   ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from compileall.cpp:12:0:
disk.cpp: In function ‘void find_splice_point(int, RawTrack&, const TrackInfo&)’:
disk.cpp:129:33: error: ‘floor’ was not declared in this scope
   splice_pos -= floor(splice_pos);
                                 ^
disk.cpp: In function ‘void sift_sectors(TrackInfo&, int, std::vector<SectorInfo*>&)’:
disk.cpp:210:21: error: ‘fabsf’ was not declared in this scope
     if (fabsf(poserr) > 0.03f)
                     ^
disk.cpp:231:33: error: ‘floorf’ was not declared in this scope
    position0 -= floorf(position0);
                                 ^
In file included from compileall.cpp:13:0:
encode.cpp: In function ‘void encode_track(RawTrack&, TrackInfo&, int, double)’:
encode.cpp:368:56: error: ‘fmod’ was not declared in this scope
      , fmod(encodingPosition / (200000000.0 / 6.0), 1.0)
                                                        ^
In file included from compileall.cpp:17:0:
rawdiskscpdirect.cpp: In function ‘void scp_direct_write(const RawDisk&, const char*, int, int, bool, bool)’:
rawdiskscpdirect.cpp:225:32: error: ‘floor’ was not declared in this scope
    rot_delay -= floor(rot_delay);
                                ^
In file included from compileall.cpp:21:0:
sectorparser.cpp: In member function ‘bool SectorParser::Parse(uint32_t, uint8_t, uint8_t)’:
sectorparser.cpp:80:30: error: ‘floorf’ was not declared in this scope
     mRotPos -= floorf(mRotPos);
                              ^
sectorparser.cpp:190:60: error: ‘floorf’ was not declared in this scope
     newsec.mEndingPosition -= floorf(newsec.mEndingPosition);
                                                            ^
sectorparser.cpp: In member function ‘bool SectorParserMFM::Parse(uint32_t, uint8_t, uint8_t)’:
sectorparser.cpp:416:60: error: ‘floorf’ was not declared in this scope
     newsec.mEndingPosition -= floorf(newsec.mEndingPosition);
                                                            ^
sectorparser.cpp: In member function ‘bool SectorParserMFMAmiga::Parse(uint32_t, uint8_t, uint8_t)’:
sectorparser.cpp:601:59: error: ‘floorf’ was not declared in this scope
    newsec.mEndingPosition -= floorf(newsec.mEndingPosition);

 

 

 

Share this post


Link to post
Share on other sites
8 hours ago, cwilbar said:

@phaeron ,

 

I tried that as well at one point, but I've since re-tried it with a clean unzip of the source.  These are the errors (if I add "#include <math.h>" in front of the existing includes in a8rawconv.cpp, the floorf and fmod issues go away, but the others remain):

It looks like you might be using the weaktest version that I posted, which was a not very well tested dump from the dev tree. The math.h include is a correct fix, the initialization errors are a C++ compliance issue that would take a bit more to fix. Not sure why you're seeing that error if you're compiling with -fpermissive, but in any case I'd recommend using the last released version instead, 0.92:

 

Share this post


Link to post
Share on other sites

@phaeron

 

Tried again with 0.92.  Had to add include for math.h, everything worked much better, until it went to link....

 

$ scl enable devtoolset-6 'gcc -std=c++11 -fno-builtin -o a8rawconv -lm -lstdc++ compileall.cpp'
/tmp/ccgQtpzF.o: In function `std::_Hashtable<sift_sectors(TrackInfo&, int, std::vector<SectorInfo*, std::allocator<SectorInfo*> >&)::HashedSectorRef, std::pair<sift_sectors(TrackInfo&, int, std::vector<SectorInfo*, std::allocator<SectorInfo*> >&)::HashedSectorRef const, unsigned int>, std::allocator<std::pair<sift_sectors(TrackInfo&, int, std::vector<SectorInfo*, std::allocator<SectorInfo*> >&)::HashedSectorRef const, unsigned int> >, std::__detail::_Select1st, sift_sectors(TrackInfo&, int, std::vector<SectorInfo*, std::allocator<SectorInfo*> >&)::HashedSectorPred, sift_sectors(TrackInfo&, int, std::vector<SectorInfo*, std::allocator<SectorInfo*> >&)::HashedSectorPred, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::_M_insert_unique_node(unsigned long, unsigned long, std::__detail::_Hash_node<std::pair<sift_sectors(TrackInfo&, int, std::vector<SectorInfo*, std::allocator<SectorInfo*> >&)::HashedSectorRef const, unsigned int>, true>*)':
compileall.cpp:(.text+0xfc76): undefined reference to `std::__detail::_Prime_rehash_policy::_M_need_rehash(unsigned long, unsigned long, unsigned long) const'
collect2: error: ld returned 1 exit status

 

I have yet too determine why this one has happening, hopefully you or someone else has seen this one....

 

Share this post


Link to post
Share on other sites
12 hours ago, cwilbar said:

I have yet too determine why this one has happening, hopefully you or someone else has seen this one....

Not sure on this one, but your build line is definitely more complex than mine, which is just:

 

g++ -std=c++11 compileall.cpp

I realized that I was using a fairly old version of gcc and updated my WSL installation to Ubuntu 18.04, but couldn't get this error either with gcc 7.4.0 or Clang 6.0.0. All I got was the math.h issue. It's a link error instead of a compile error, which is a bit odd.

Share this post


Link to post
Share on other sites

OK, I have 0.92 compiling now.

 

For those who want to compile this on CentOS6/RH6, you need scl (because RH 'freezes' software versions on the major release, and they are old).  On CentOS6, this is installed with:

 

yum install centos-release-scl
yum install devtoolset-6

 

The process would be similar for RH6, but you'll need to look up to see how it differs.

 

Once you have scl and devtoolset-6, add an "#include <math.h>" line in a8rawconv.cpp, and then use this command to compile it:

 

scl enable devtoolset-6 'g++ -std=c++11 compileall.cpp -o a8rawconv'

 

using g++ rather than gcc the linking behaves differently, and it compiles and links w/o error.

 

Not sure why I didn't try g++ command.... I was going by  some site that talked about using scl, and they were using gcc command lines there.

 

I've even been able to compile the development ("weaktest") version as well as 0.92.

 

Edited by cwilbar

Share this post


Link to post
Share on other sites

Can confirm using g++ rather than gcc and the command line "g++ -std=c++11 compileall.cpp -o a8rawconv" works on macOS as well.

 

Good work @cwilbar!

 

Share this post


Link to post
Share on other sites

I'm trying to set up my Supercard Pro for the first time, connected to my Mac (running Mojave) using a8rawconv. I'm getting "unable to open serial port." Is there a driver to install or something to do to set up serial?
 
./a8rawconv -p 104 scp0:48tpi backed_up_disk.atr
A8 raw disk conversion utility v0.9
Copyright (C) 2014-2015 Avery Lee, All Rights Reserved.
Licensed under GNU General Public License, version 2 or later.
Unable to open serial port: /dev/cu.usbserial-SCP-JIM
 
Thanks
Kevin

Share this post


Link to post
Share on other sites
1 hour ago, Savetz said:

A8 raw disk conversion utility v0.9
Copyright (C) 2014-2015 Avery Lee, All Rights Reserved.
Licensed under GNU General Public License, version 2 or later.
Unable to open serial port: /dev/cu.usbserial-SCP-JIM

 

Seems like you didn't install the drivers. Install the manufacturer SCP software

Share this post


Link to post
Share on other sites

I can't find Mac drivers. One thread says they exist, but everything I find is for Windows.

 

—Kevin

Share this post


Link to post
Share on other sites

@Savetz, I'm guessing you are running the version of a8rawconv that I compiled for Mac? When I initially tested, the SuperCard Pro was available on serial port /dev/cu.usbserial-SCP-JIM (no drivers needed). It is possible that it changed in newer versions of MacOS.

 

From a Terminal window, type:

ls /dev/*usb*

and see what you get back.

Edited by Farb
  • Like 1

Share this post


Link to post
Share on other sites
6 hours ago, Farb said:

@Savetz, I'm guessing you are running the version of a8rawconv that I compiled for Mac? When I initially tested, the SuperCard Pro was available on serial port /dev/cu.usbserial-SCP-JIM (no drivers needed). It is possible that it changed in newer versions of MacOS.

 

From a Terminal window, type:

ls /dev/*usb*

and see what you get back.

 

Yes, I'm using the pre-compiled version.

 

$ ls /dev/*usb*
ls: /dev/*usb*: No such file or directory

 

thanks

—K

Share this post


Link to post
Share on other sites

And, just to be certain, you ran this with the SuperCard Pro board plugged in via USB?

 

At least in prior versions of MacOS, a file would appear in the /dev directory when the USB cable was plugged in and disappear when it was unplugged. We need to figure out what device shows up. I'll check with my Mac notebook shortly and see if I see anything.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...