{"id":189,"date":"2022-06-04T06:13:24","date_gmt":"2022-06-04T06:13:24","guid":{"rendered":"https:\/\/delectra.com\/toys\/?p=189"},"modified":"2022-06-04T06:19:56","modified_gmt":"2022-06-04T06:19:56","slug":"scanner-calibration-101","status":"publish","type":"post","link":"https:\/\/delectra.com\/toys\/?p=189","title":{"rendered":"Scanner calibration 101"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"414\" height=\"300\" src=\"https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/Patches-reconstruct.png\" alt=\"\" class=\"wp-image-190\" srcset=\"https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/Patches-reconstruct.png 414w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/Patches-reconstruct-300x217.png 300w\" sizes=\"auto, (max-width: 414px) 100vw, 414px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A few years ago I was able to run the k4050 plugin up to the point where it fails to detect any scanners on the SCSI bus as I have not connected the scanner to the SCSI.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Over the last few years I was given copies of the mac 8.6 software (diagnostics) the sun PIW installers, and recently the service manual. This made me take another look at the diagnostics program for mac os 8\/9. The service manual was targeted to the Sun Piw. There is a lot of Piw code in the Photoshop plugin driver.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The main issue with the Mac os 8 diagnostic program was that it was zipped. This removed all the resource data effectively destroying the program. A Hex dump of the remaining part of the app shows it as PowerPC PEF built with mangled name symbols. This would imply that most of the app is still there and might be recovered by synthesizing the resource fork.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The same custom dissembler written for the photoshop plugin was used to dump the diagnostic. A search online found a copy of Metrowerks CodeWarrior that seems to match the libraries used.  An example app was built and the resource skeleton was added to the resource fork. Type and creator set to application.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Of course the menus are incorrect and there are no windows. But the app runs. It even generates a debug log though the try\/catch mechanism. Placing a breakpoint just before the &#8216;wrong scanner&#8217; exit allows tracing. Time to read up on CodeWarrior PPob classes. The code also uses some Rouge Wave string classes. The PCD4050 plugin also uses this library (available from the Sun linux IDE.) That library has not been updated since 1996. Interesting to see that it has #ifdef definitions for MacOS and CodeWarrior.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Since these apps are compiled with debug tags with mangled names, it is almost easy to read the code. The code also used a try\/catch error handler. This will sometimes even give the filename and line number of the source code. About 40 to 50 percent of the code is power-plant application framework. Given that many of the remaining classes start with Piw, this code is basically ported sun code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The SCIS driver classes are preceded with DIS. I have been unable to find this class as a library. Most likely this was an in house library.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The diagnostic and calibration programs used special strips of film exposed with a test pattern. The manual gives the layout of these patches along with some YCC values of a set of patches that are different on a given target.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"456\" src=\"https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/TargetUsage-1024x456.png\" alt=\"\" class=\"wp-image-191\" srcset=\"https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/TargetUsage-1024x456.png 1024w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/TargetUsage-300x134.png 300w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/TargetUsage-768x342.png 768w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/TargetUsage-624x278.png 624w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/TargetUsage.png 1343w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The Mac OS 8.6 zip archive contains a smi of a calibration run (and logs) these did not use resource forks. The smi will mount and is an image of the calibration floppy. The files in the system extensions folder seem flat and look to contain matrix data for a 4050 scanner.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The resulting tables give RGB values. Probably in volts. The upper ranges are over 2048. but quite a bit less than 4096. Scaling with a 4096 (2^12) results in the patches displaying really dark on the display. Inverting the RGB, and one can see washed out color patches.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is probable that these calibration strips have all been lost or destroyed. There is no evidence any were ever online. Chances of finding them are slim to none.   I suspect the handful of people who have contacted me represents most of those who may retain a slight interest in this obsolete tech.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the meantime, here is a bit of an update as to what I have found and done.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"460\" src=\"https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/TargetGrid-1024x460.png\" alt=\"\" class=\"wp-image-192\" srcset=\"https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/TargetGrid-1024x460.png 1024w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/TargetGrid-300x135.png 300w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/TargetGrid-768x345.png 768w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/TargetGrid-624x280.png 624w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/TargetGrid.png 1287w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Entering the logged result values into a simple postscript program shows this grid matches the Illustrations in the service manual. This is a way a calibration film strip could be made. If one could photograph the resulting postscript output then the results could be photographed onto film. I have not done film photography (other than with the stereo realist in years.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With my searches for data relating to PhotoCD I know that old cameras are cheap and sold in bulk. A visit to the local electronics recycler has tubs of them. Mostly digital, but quite a few film cameras as well. Some even loaded with film. I knew I had an old can of expired film. All I would need to do would be to expose it with precisely placed color.  patches. Something postscript can do.  I purchased a dozen or so cameras. Some had film jammed inside.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I learned about something worse than photo CD. APS! How could I have missed APS and Advantix? Oh no, a totally new distraction. I now have half a dozen APS cameras. And a completely new distraction.  I suspect there will be more on this later.  These cameras are a world unto themselves.   At the time of this blog writing, they can be had cheap and old film and processing remains available for others who like really failed products.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/IMG_0099.png\" alt=\"\" class=\"wp-image-193\" srcset=\"https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/IMG_0099.png 1024w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/IMG_0099-300x225.png 300w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/IMG_0099-768x576.png 768w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/IMG_0099-624x468.png 624w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">While these cameras are interesting, they do not take normal film. Sort of a film data  tape hybrid.  They do contain some interesting motors and gearing.  This film is no longer manufactured.  Some of the cameras contained partial rolls.  I found that the local lab can process it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I also found a school science project supplier online.  Too bad I did not have access to this sort of thing 25 years ago.  They sell simple spectrometers, filters and diffraction gratings.   I got out my old copy stand and rigged it with LED lighting. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"480\" height=\"640\" src=\"https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/IMG_0096.png\" alt=\"\" class=\"wp-image-194\" srcset=\"https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/IMG_0096.png 480w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/IMG_0096-225x300.png 225w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">I used an old iPhone to simply photograph the filter slides.  I then took the APS camera and shot the rest of the roll through each filter against my monitor background.  The results are promising.  The film came back and each frame has the inverse of the color. I have not attempted to scan the returned film as the Kodak scanner has a long way to go. The old USB scanner i have gives less than satisfactory results.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The next step is to modify an old Olympus film camera that I gutted.  This was a point an shoot camera.  A digital camera back would probably be more productive. This way is so much more interesting.  An Arduino should be able to  control the shutter solenoid and the film advance.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/IMG_0132.png\" alt=\"\" class=\"wp-image-195\" srcset=\"https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/IMG_0132.png 640w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/IMG_0132-300x225.png 300w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/IMG_0132-624x468.png 624w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A lot of the work over the last couple of years has been dissembling and re-construction the plugin code.    This sort of effort does not really lend itself into frequent blog postings.   I sort of swap between dissembling camera hardware, and dissembling munged obsolete driver code.  I also actively scan piano rolls with custom hardware. So these efforts do have some general use.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I have a couple of vintage macs which I use for tracing  code.  The plugin and the diagnostics are not small programs, with the plug in clocking in at near 2MB.  The surviving diagnostic code is about half that size.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There was never a mac driver for the Film scanner 2000.   I have not found any references to a DIS SCSI library.  DIS is the class name of the SCSI library used.   Other classes are PTS and PIW.  <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I would be really surprised if anyone has one of these units working anywhere.  I check once a month for parts or more documentation.  I think only three or so people ever contacted me. (but they all did have most useful stuff.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I have also been hesitant to apply any power or signals to the SCSI port as I only have one film scanner.  Research has directed to something called RaSCSI, which looks like a promising way to emulate the interface.   This way I can also create a bridge to Ethernet, which would be a more practical way to communicate with the scanner.  <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I have yet to ring out an adapter to the MD50 connector from the HDI30 on the laptop.  I did find I had a cable that goes to the flatbed Apple Color scanner which I still have. Another project for another blog.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When the pcd 2000 scanner (or the other variations) are connected the host program downloads a hex file.   While there is quite a sophisticated controller unit based on the 80C196KB.  The actual program is downloaded every time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The service manuals are quite informative about this operation.  There is also an online paper (which is behind a paywall) that also covers what these boards do.   The heart of this system is an ASIC called a normalizer.   This term is also used for programs that convert postscript to PDF.  There must also be quite a bit of ram on this board as the raw images are 18megapixels.  The user\/operator is well protected from this raw data. It all seems to be about the density.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/IMG_2730.png\" alt=\"\" class=\"wp-image-196\" srcset=\"https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/IMG_2730.png 1024w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/IMG_2730-300x225.png 300w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/IMG_2730-768x576.png 768w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/IMG_2730-624x468.png 624w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The mac OS  8 image does contain a  hex file called 4050.hex  While there are strings that refer to other scanners like the 2000, these are used in the wrong scanner dialog.  Another reason I have not connected the scanner is the lack of the correct microcode file.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The PIW install disks contain more hex files. One is called scanner.hex and the other metaphor.hex.  Dumping these shows the version strings.  There are a lot of references to metaphor in the OS 8 code.  It is almost it&#8217;s own class.  Metaphor seems to be the 4045\/4050 driver.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Scanner.hex is the 2000 code.   I modified the postscript table driven disassembler that I have used on 8080, avr,m68k and powerpc to do 80C196.  The first results were a bit off as I had used the wrong chip variant, which has different registers.  When the 80C196 register table was used, the code started making sense.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The main processor board is mostly latches.  There is some SRAM and a seven segment display.  (this board is shown in an earlier blog.)  An interesting thing is that the code regularly pushes 4 digit hex numbers onto the stack.   These do not seem to be memory locations.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">By chance I noticed that they were the same range as the error codes in the service manual.  These codes should show on the 7 segment display.  The sophistication of this is quite impressive.  Too bad most consumer equipment does not do these types of boundary checks any more.   I think they really did think this tech would last the next hundred years.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"691\" height=\"742\" src=\"https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/Screen-Shot-2022-06-03-at-9.56.23-PM.png\" alt=\"\" class=\"wp-image-197\" srcset=\"https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/Screen-Shot-2022-06-03-at-9.56.23-PM.png 691w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/Screen-Shot-2022-06-03-at-9.56.23-PM-279x300.png 279w, https:\/\/delectra.com\/toys\/wp-content\/uploads\/2022\/06\/Screen-Shot-2022-06-03-at-9.56.23-PM-624x670.png 624w\" sizes=\"auto, (max-width: 691px) 100vw, 691px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">by adding these numbers to a table in the disassembler one can see the error handler. The timer overflow basically sets counters. So some sort of kernel is being used with the state queued.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>D0 00C80B: C8E0\t\t'..'\tprepError:PUSH\t.stack_frame.\tlooks like error handler setup\nC0 00C80D: A018E0\t'...'\t          LD\t.stack_frame.,SP\t; .stack_frame. &lt;- SP\nC0 00C810: C8A6\t\t'..'\t          PUSH\tR.A6\nC0 00C812: A3E0041C\t'....'\t          LD\tAX,000004H&#91;.stack_frame.]\t; AX &lt;- Var2\nC0 00C816: 8981291C\t'..).'\t          CMP\tAX,#0x2981\t; Bus device reset\nC0 00C81A: D726\t\t'.&amp;'\t          JNE\tL000016\t; PC &lt;- 00C842 PC + 38 (00C81C)\nD0 00C81C: C301560700\t'..V..'\tL000017:  ST\tZERO_REG,000756H&#91;ZERO_REG]\t;  .datamemL. MEM_WORD(000756) &lt;- ZERO_REG\nC0 00C821: 11A6\t\t'..'\t          CLRB\tR.A6\nC0 00C823: 2018\t\t' .'\t          SJMP\tL000018\t; PC &lt;- 00C83D PC + 24 (00C825)\nD0 00C825: ACA61C\t'...'\tL000019:  LDBZE\tAX,R.A6\t; AX &lt;- R.A6\nC0 00C828: 09011C\t'...'\t          SHL\tAX, #0x1\nC0 00C82B: C71D460700\t'..F..'\t          STB\tZERO_REG,000746H&#91;AX]\t; MEM_BYTE(AX + 1862) &lt;- ZERO_REG\nC0 00C830: ACA61C\t'...'\t          LDBZE\tAX,R.A6\t; AX &lt;- R.A6\nC0 00C833: 09011C\t'...'\t          SHL\tAX, #0x1\nC0 00C836: C71D470700\t'..G..'\t          STB\tZERO_REG,000747H&#91;AX]\t; MEM_BYTE(AX + 1863) &lt;- ZERO_REG\nC0 00C83B: 17A6\t\t'..'\t          INCB\tR.A6\nD0 00C83D: 9908A6\t'...'\tL000018:  CMPB\tR.A6,#0x08\t; R.A6 == 8\nC0 00C840: D3E3\t\t'..'\t          JNC\tL000019\t; PC &lt;- 00C825 PC + -29 (00C842)\nD0 00C842: A30156071C\t'..V..'\tL000016:  LD\tAX,000756H&#91;ZERO_REG]\t; AX &lt;-  .datamemL. MEM_WORD(000756)\nC0 00C847: 8907001C\t'....'\t          CMP\tAX,#0x0007\t; AX == 7\nC0 00C84B: DB2F\t\t'.\/'\t          JC\tL000020\t; PC &lt;- 00C87C PC + 47 (00C84D)\nD0 00C84D: 450400E01C\t'E....'\tL000021:  ADD\tAX,.stack_frame.,#0x0004\t; AX = .stack_frame. + 4\nC0 00C852: C81C\t\t'..'\t          PUSH\tAX\nC0 00C854: A30156071C\t'..V..'\t          LD\tAX,000756H&#91;ZERO_REG]\t; AX &lt;-  .datamemL. MEM_WORD(000756)\nC0 00C859: 6107001C\t'a...'\t          AND\tAX,#0x0007\t; AX &amp;= 7\nC0 00C85D: 09011C\t'...'\t          SHL\tAX, #0x1\nC0 00C860: 6546071C\t'eF..'\t          ADD\tAX,#0x0746\t; AX += 1862\nC0 00C864: C81C\t\t'..'\t          PUSH\tAX\nC0 00C866: EF6856\t'.hV'\t          LCALL\tL000022\t; (00C869 + 22120) -&gt; 001ED1\nC0 00C869: 65040018\t'e...'\t          ADD\tSP,#0x0004\t; SP += 4\nC0 00C86D: A30156071C\t'..V..'\t          LD\tAX,000756H&#91;ZERO_REG]\t; AX &lt;-  .datamemL. MEM_WORD(000756)\nC0 00C872: 4501001C1E\t'E....'\t          ADD\tBX,AX,#0x0001\t; BX = AX + 1\nC0 00C877: C30156071E\t'..V..'\t          ST\tBX,000756H&#91;ZERO_REG]\t;  .datamemL. MEM_WORD(000756) &lt;- BX\nD0 00C87C: A30156071C\t'..V..'\tL000020:  LD\tAX,000756H&#91;ZERO_REG]\t; AX &lt;-  .datamemL. MEM_WORD(000756)\nC0 00C881: 051C\t\t'..'\t          DEC\tAX\nC0 00C883: 6107001C\t'a...'\t          AND\tAX,#0x0007\t; AX &amp;= 7\nC0 00C887: CCA6\t\t'..'\t          POP\tR.A6\nC0 00C889: CCE0\t\t'..'\t          POP\t.stack_frame.\nC0 00C88B: F0\t\t'.'\t          RET\t\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Some of the startup code is also of interest.  Most likely the various communication sections are memory mapped in the higher address space.  Curiously there is not a lot of windowing.  This may be a result of the compiler used as only a subset of instructions are common. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>L000003:  SUB\tSP,#0x0004\t; SP -= 4\nC0 00965B: C8E0\t\t'..'\t          PUSH\t.stack_frame.\nC0 00965D: A018E0\t'...'\t          LD\t.stack_frame.,SP\t; .stack_frame. &lt;- SP\nC0 009660: C872\t\t'.r'\t          PUSH\tR.72\nC0 009662: C874\t\t'.t'\t          PUSH\tR.74\nC0 009664: A100D072\t'...r'\t          LD\tR.72,#0xD000\t; R.72 &lt;--12288\nC0 009668: BD441C\t'.D.'\t          LDBSE\tAX,#0x44\t; AX &lt;-68\nC0 00966B: C301E4001C\t'.....'\t          ST\tAX,0000E4H&#91;ZERO_REG]\t; REG(R.E4) MEM_WORD(0000E4) &lt;- AX\nC0 009670: C2721C\t'.r.'\t          ST\t&#91;R.72],AX\t; MEM_WORD(R.72) &lt;- AX\nC0 009673: A100D272\t'...r'\t          LD\tR.72,#0xD200\t; R.72 &lt;--11776\nC0 009677: A100801C\t'....'\t          LD\tAX,#0x8000\t; Scanner software not downloaded\nC0 00967B: C301E6001C\t'.....'\t          ST\tAX,0000E6H&#91;ZERO_REG]\t; REG(R.E6) MEM_WORD(0000E6) &lt;- AX\nC0 009680: C2721C\t'.r.'\t          ST\t&#91;R.72],AX\t; MEM_WORD(R.72) &lt;- AX\nC0 009683: A100D472\t'...r'\t          LD\tR.72,#0xD400\t; R.72 &lt;--11264\nC0 009687: C301E80000\t'.....'\t          ST\tZERO_REG,0000E8H&#91;ZERO_REG]\t; REG(R.E8) MEM_WORD(0000E8) &lt;- ZERO_REG\nC0 00968C: A301E8001C\t'.....'\t          LD\tAX,0000E8H&#91;ZERO_REG]\t; AX &lt;- REG(R.E8) MEM_WORD(0000E8)\nC0 009691: C2721C\t'.r.'\t          ST\t&#91;R.72],AX\t; MEM_WORD(R.72) &lt;- AX\nC0 009694: A100D672\t'...r'\t          LD\tR.72,#0xD600\t; R.72 &lt;--10752\nC0 009698: C301EA0000\t'.....'\t          ST\tZERO_REG,0000EAH&#91;ZERO_REG]\t; REG(R.EA) MEM_WORD(0000EA) &lt;- ZERO_REG\nC0 00969D: A301EA001C\t'.....'\t          LD\tAX,0000EAH&#91;ZERO_REG]\t; AX &lt;- REG(R.EA) MEM_WORD(0000EA)\nC0 0096A2: C2721C\t'.r.'\t          ST\t&#91;R.72],AX\t; MEM_WORD(R.72) &lt;- AX\nC0 0096A5: A100D872\t'...r'\t          LD\tR.72,#0xD800\t; R.72 &lt;--10240\nC0 0096A9: C301EC0000\t'.....'\t          ST\tZERO_REG,0000ECH&#91;ZERO_REG]\t; REG(R.EC) MEM_WORD(0000EC) &lt;- ZERO_REG\nC0 0096AE: A301EC001C\t'.....'\t          LD\tAX,0000ECH&#91;ZERO_REG]\t; AX &lt;- REG(R.EC) MEM_WORD(0000EC)\nC0 0096B3: C2721C\t'.r.'\t          ST\t&#91;R.72],AX\t; MEM_WORD(R.72) &lt;- AX\nC0 0096B6: A100DA72\t'...r'\t          LD\tR.72,#0xDA00\t; R.72 &lt;--9728\nC0 0096BA: C301EE0000\t'.....'\t          ST\tZERO_REG,0000EEH&#91;ZERO_REG]\t; REG(R.EE) MEM_WORD(0000EE) &lt;- ZERO_REG\nC0 0096BF: A301EE001C\t'.....'\t          LD\tAX,0000EEH&#91;ZERO_REG]\t; AX &lt;- REG(R.EE) MEM_WORD(0000EE)\nC0 0096C4: C2721C\t'.r.'\t          ST\t&#91;R.72],AX\t; MEM_WORD(R.72) &lt;- AX\nC0 0096C7: A120DC1C\t'. ..'\t          LD\tAX,#0xDC20\t; AX &lt;--9184\nC0 0096CB: C3E0021C\t'....'\t          ST\tAX,000002H&#91;.stack_frame.]\t; Var1 &lt;- AX\nC0 0096CF: B103CA\t'...'\t          LDB\tR.CA,#0x03\t; R.CA &lt;- 3\nC0 0096D2: C61CCA\t'...'\t          STB\t&#91;AX],R.CA\t; MEM_BYTE(AX) &lt;- R.CA\nC0 0096D5: A100DE72\t'...r'\t          LD\tR.72,#0xDE00\t; R.72 &lt;--8704\nC0 0096D9: C301F20000\t'.....'\t          ST\tZERO_REG,0000F2H&#91;ZERO_REG]\t; REG(R.F2) MEM_WORD(0000F2) &lt;- ZERO_REG\nC0 0096DE: A301F2001C\t'.....'\t          LD\tAX,0000F2H&#91;ZERO_REG]\t; AX &lt;- REG(R.F2) MEM_WORD(0000F2)\nC0 0096E3: C2721C\t'.r.'\t          ST\t&#91;R.72],AX\t; MEM_WORD(R.72) &lt;- AX\nC0 0096E6: A301F2001C\t'.....'\t          LD\tAX,0000F2H&#91;ZERO_REG]\t; AX &lt;- REG(R.F2) MEM_WORD(0000F2)\nC0 0096EB: 8100801C\t'....'\t          OR\tAX,#0x8000\t; Scanner software not downloaded\nC0 0096EF: C301F2001C\t'.....'\t          ST\tAX,0000F2H&#91;ZERO_REG]\t; REG(R.F2) MEM_WORD(0000F2) &lt;- AX\nC0 0096F4: C2721C\t'.r.'\t          ST\t&#91;R.72],AX\t; MEM_WORD(R.72) &lt;- AX\nC0 0096F7: A1401F1C\t'.@..'\t          LD\tAX,#0x1F40\t; AX &lt;-8000\nC0 0096FB: C30122051C\t'..\"..'\t          ST\tAX,000522H&#91;ZERO_REG]\t;  .datamemL. MEM_WORD(000522) &lt;- AX\nC0 009700: B11003\t'...'\t          LDB\tAD_RESULT_H,#0x10\t; AD_RESULT_H &lt;- 16\nC0 009703: B11015\t'...'\t          LDB\tIOS0,#0x10\t; IOS0 &lt;- 16\nC0 009706: B12616\t'.&amp;.'\t          LDB\tIOS1,#0x26\t; IOS1 &lt;- 38\nC0 009709: B1010B\t'...'\t          LDB\tTiMER1.H,#0x01\t; TiMER1.H &lt;- 1\nC0 00970C: B1260E\t'.&amp;.'\t          LDB\tIOPORT0,#0x26\t; IOPORT0 &lt;- 38\nC0 00970F: B1800E\t'...'\t          LDB\tIOPORT0,#0x80\t; IOPORT0 &lt;- 128\nC0 009712: B10D11\t'...'\t          LDB\tSP_STAT,#0x0D\t; SP_STAT &lt;- 13\nC0 009715: 910508\t'...'\t          ORB\tINT_MASK,#0x05\t; INT_MASK |= 5\nC0 009718: 911213\t'...'\t          ORB\tINT_MASK1,#0x12\t; INT_MASK1 |= 18\nC0 00971B: 11CF\t\t'..'\t          CLRB\tR.CF\nC0 00971D: 11D0\t\t'..'\t          CLRB\tR.D0\nC0 00971F: 11CE\t\t'..'\t          CLRB\tR.CE\nC0 009721: B1201C\t'. .'\t          LDB\tAX,#0x20\t; AX &lt;- 32\nC0 009724: C70175061C\t'..u..'\t          STB\tAX,000675H&#91;ZERO_REG]\t;  .datamemL. MEM_BYTE(000675) &lt;- AX\nC0 009729: B101D1\t'...'\t          LDB\tR.D1,#0x01\t; R.D1 &lt;- 1\nC0 00972C: C701A10B00\t'.....'\t          STB\tZERO_REG,000BA1H&#91;ZERO_REG]\t;  .datamemL. MEM_BYTE(000BA1) &lt;- ZERO_REG\nC0 009731: EF5831\t'.X1'\t          LCALL\tL000004\t; (009734 + 12632) -&gt; 00C88C\nC0 009734: EFA331\t'..1'\t          LCALL\tL000012\t; (009737 + 12707) -&gt; 00C8DA\nC0 009737: C701E30000\t'.....'\t          STB\tZERO_REG,0000E3H&#91;ZERO_REG]\t; REG(R.E3) MEM_BYTE(0000E3) &lt;- ZERO_REG\nC0 00973C: EFAE88\t'...'\t          LCALL\tL000013\t; (00973F + -30546) -&gt; 001FED\nC0 00973F: 9BE00800\t'....'\t          CMPB\tZERO_REG,000008H&#91;.stack_frame.]\t; Var4 == ZERO_REG\nC0 009743: D730\t\t'.0'\t          JNE\tL000014\t; PC &lt;- 009775 PC + 48 (009745)\nD0 009745: C98029\t'..)'\tL000015:  PUSH\t#0x2980\t; Power on or reset occurred\nC0 009748: EFC030\t'..0'\t          LCALL\tprepError\t; (00974B + 12480) -&gt; 00C80B\nC0 00974B: 65020018\t'e...'\t          ADD\tSP,#0x0002\t; SP += 2\nC0 00974F: 51080F1C\t'Q...'\t          ANDB\tAX,IOPORT1,#0x08\t; AX = IOPORT1 &amp; 8\nC0 009753: 99081C\t'...'\t          CMPB\tAX,#0x08\t; AX == 8\nC0 009756: D70A\t\t'..'\t          JNE\tL002049\t; PC &lt;- 009762 PC + 10 (009758)\nD0 009758: C90080\t'...'\tL002050:  PUSH\t#0x8000\t; Scanner software not downloaded\nC0 00975B: EFAD30\t'..0'\t          LCALL\tprepError\t; (00975E + 12461) -&gt; 00C80B .processed.\nC0 00975E: 65020018\t'e...'\t          ADD\tSP,#0x0002\t; SP += 2\nD0 009762: C90600\t'...'\tL002049:  PUSH\t#0x0006\t; MEM_WORD(SP -= 2) &lt;- 6\nC0 009765: EF7831\t'.x1'\t          LCALL\tL000132\t; (009768 + 12664) -&gt; 00C8E0 .processed.\nC0 009768: 65020018\t'e...'\t          ADD\tSP,#0x0002\t; SP += 2\nC0 00976C: C701690600\t'..i..'\t          STB\tZERO_REG,000669H&#91;ZERO_REG]\t;  .datamemL. MEM_BYTE(000669) &lt;- ZERO_REG\nC0 009771: A1401FB8\t'.@..'\t          LD\tR.B8,#0x1F40\t; R.B8 &lt;-8000\nD0 009775: C800\t\t'..'\tL000014:  PUSH\tZERO_REG\nC0 009777: C800\t\t'..'\t          PUSH\tZERO_REG\nC0 009779: EFEC2A\t'..*'\t          LCALL\tL000023\t; (00977C + 10988) -&gt; 00C268\nC0 00977C: 65040018\t'e...'\t          ADD\tSP,#0x0004\t; SP += 4\nC0 009780: C800\t\t'..'\t          PUSH\tZERO_REG\nC0 009782: C800\t\t'..'\t          PUSH\tZERO_REG\nC0 009784: EFE12A\t'..*'\t          LCALL\tL000023\t; (009787 + 10977) -&gt; 00C268 .processed.\nC0 009787: 65040018\t'e...'\t          ADD\tSP,#0x0004\t; SP += 4\nC0 00978B: C95C7C\t'.\\|'\t          PUSH\t#0x7C5C\t; MEM_WORD(SP -= 2) &lt;- 31836\nC0 00978E: C9785C\t'.x\\'\t          PUSH\t#0x5C78\t; MEM_WORD(SP -= 2) &lt;- 23672\nC0 009791: EFD42A\t'..*'\t          LCALL\tL000023\t; (009794 + 10964) -&gt; 00C268 .processed.\nC0 009794: 65040018\t'e...'\t          ADD\tSP,#0x0004\t; SP += 4\nC0 009798: C701680600\t'..h..'\t          STB\tZERO_REG,000668H&#91;ZERO_REG]\t;  .datamemL. MEM_BYTE(000668) &lt;- ZERO_REG\nC0 00979D: C90100\t'...'\t          PUSH\t#0x0001\t; MEM_WORD(SP -= 2) &lt;- 1\nC0 0097A0: EF53F5\t'.S.'\t          LCALL\tL000034\t; (0097A3 + -2733) -&gt; 008CF6\nC0 0097A3: 65020018\t'e...'\t          ADD\tSP,#0x0002\t; SP += 2\nC0 0097A7: EFC2F5\t'...'\t          LCALL\tL000040\t; (0097AA + -2622) -&gt; 008D6C\nC0 0097AA: C701440600\t'..D..'\t          STB\tZERO_REG,000644H&#91;ZERO_REG]\t;  .datamemL. MEM_BYTE(000644) &lt;- ZERO_REG\nC0 0097AF: C701740600\t'..t..'\t          STB\tZERO_REG,000674H&#91;ZERO_REG]\t;  .datamemL. MEM_BYTE(000674) &lt;- ZERO_REG\nC0 0097B4: EF5A18\t'.Z.'\t          LCALL\tL000050\t; (0097B7 + 6234) -&gt; 00B011\nC0 0097B7: 881C00\t'...'\t          CMP\tZERO_REG,AX\t; ZERO_REG == AX\nC0 0097BA: DF0A\t\t'..'\t          JE\tL001816\t; PC &lt;- 0097C6 PC + 10 (0097BC)\nD0 0097BC: C92780\t'.'.'\tL001817:  PUSH\t#0x8027\t; EEPROM failure\nC0 0097BF: EF4930\t'.I0'\t          LCALL\tprepError\t; (0097C2 + 12361) -&gt; 00C80B .processed.\nC0 0097C2: 65020018\t'e...'\t          ADD\tSP,#0x0002\t; SP += 2\nD0 0097C6: C800\t\t'..'\tL001816:  PUSH\tZERO_REG\nC0 0097C8: C90400\t'...'\t          PUSH\t#0x0004\t; MEM_WORD(SP -= 2) &lt;- 4\nC0 0097CB: EF467F\t'.F'\t          LCALL\tL000107\t; (0097CE + 32582) -&gt; 001714 .processed.\nC0 0097CE: 65040018\t'e...'\t          ADD\tSP,#0x0004\t; SP += 4\nC0 0097D2: C96008\t'.`.'\t          PUSH\t#0x0860\t; MEM_WORD(SP -= 2) &lt;- 2144\nC0 0097D5: C800\t\t'..'\t          PUSH\tZERO_REG\nC0 0097D7: EF4A79\t'.Jy'\t          LCALL\tL000887\t; (0097DA + 31050) -&gt; 001124 .processed.\nC0 0097DA: 65040018\t'e...'\t          ADD\tSP,#0x0004\t; SP += 4\nC0 0097DE: C9D007\t'...'\t          PUSH\t#0x07D0\t; MEM_WORD(SP -= 2) &lt;- 2000\nC0 0097E1: C90200\t'...'\t          PUSH\t#0x0002\t; MEM_WORD(SP -= 2) &lt;- 2\nC0 0097E4: EF3D79\t'.=y'\t          LCALL\tL000887\t; (0097E7 + 31037) -&gt; 001124 .processed.\nC0 0097E7: 65040018\t'e...'\t          ADD\tSP,#0x0004\t; SP += 4\n\n\n... &lt; many lines of code skipped &gt; ...<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Changing some of the data skip tables to disassemble the metaphor.hex and 4050.hex Shows that they have the same code and error messages.  The 4050.hex that is with the munged mac disk image is quite a bit larger.  It looks like there were many revisions.  It is also probable that this code is a bit buggy when stressed outside the normal usage patterns.<\/p>\n\n\n\n<p class=\"has-large-font-size wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In summery it looks like the calibration system can be re constructed through postscript and sacrificing old cameras to expose film.  It is also possible to access the tables inside the programs as the films and calibration values will have shifted over the decades.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I have kept the pcdscan email address open.  So feedback to that email  at this domain is welcome.    Perhaps someone does still have a working disk image of an installed system with the resource forks intact &#8230;   <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A few years ago I was able to run the k4050 plugin up to the point where it fails to detect any scanners on the SCSI bus as I have not connected the scanner to the SCSI. Over the last few years I was given copies of the mac 8.6 software (diagnostics) the sun PIW [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[10,12,11,6,7],"class_list":["post-189","post","type-post","status-publish","format-standard","hentry","category-egyptian-hall-of-mystery","tag-calibration","tag-camera","tag-driver","tag-kodak","tag-photocd"],"_links":{"self":[{"href":"https:\/\/delectra.com\/toys\/index.php?rest_route=\/wp\/v2\/posts\/189","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/delectra.com\/toys\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/delectra.com\/toys\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/delectra.com\/toys\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/delectra.com\/toys\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=189"}],"version-history":[{"count":6,"href":"https:\/\/delectra.com\/toys\/index.php?rest_route=\/wp\/v2\/posts\/189\/revisions"}],"predecessor-version":[{"id":204,"href":"https:\/\/delectra.com\/toys\/index.php?rest_route=\/wp\/v2\/posts\/189\/revisions\/204"}],"wp:attachment":[{"href":"https:\/\/delectra.com\/toys\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/delectra.com\/toys\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=189"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/delectra.com\/toys\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}