Apache Spark 2.4 EOL
EOL = End of Life. It's dead, Jim. No longer supported. If you get this error in Azure Synapse, then your Apache Spark Pool worker is trying to load v2.4 (INSERT_VERSON_HERE, really... as I'm sure this'll happen in the future as the window rolls) which has been deleted.
RUNTIME_CONFIGURATION_ERROR_VHDOVERRIDENOTFOUND: Livy session has failed. Session state: Error. Error code: RUNTIME_CONFIGURATION_ERROR_VHDOVERRIDENOTFOUND. Cannot find vhd based on override: Message=The system did not find a VHD copy in the system for creating the ClusterName=12341223-5555-4444-3333-63c446fe4d8b, Workspace=synws-d-e-v-d-e-v-01, Subscription=, Location=australiaeast, isVhdOverride=True Source: Dependency.
I'm putting this on the web so others can googl' for it. I had no results and it burnt 1/4 of my weekend. Re-deploy your pools with:
Update-AzSynapseSparkPool -WorkspaceName ws_name -Name pool_name -SparkVersion 3.4
And... cross your fingers. Of course, if you've tried to delete a pool with notebooks attached, then you'll have ERROR, POOL IN DELETED_FAILED STATE and you'll need to create a new temp pool, associate ALL notebooks, delete the old and then rename the new... or create another with the old name and then switch them all back and delete the new... or something. It's a monday problem.
3Com EtherLink II 3C503 – Boot ROMs
The XT-IDE Universal BIOS is a very cool project, enabling older hardware to support much newer storage devices. The safest way to use it is with a dedicted 8-bit ISA controller card, but there are other ways to get started. If you have an Ethernet card with a spare ROM slot on it, you can program an EPROM with their BIOS and boot from there! Or so I thought... enter the 3Com 3C503.
Willem EPROM Burning: 101
I've discussed using the Willem Programmer before and, since working out the caveats, it's relatively straight-forward. Firstly, make sure you have a known-working version of the burning software installed on a known-working machine with a known-working parallel port. Next, check that you have the EPROM-specific dip switches correct, the power at a suitably-high (with enough current!) level and TOTALLY erased EPROMS. I usually leave my EPROMs to cook for around 20 minutes in my super-dodgy Ultra-Viole(n)t eraser.
Another good note is to make sure that you write them more-than-once when programming. Press the program button on the programming software again and again... so that the EPROM is written and verified multiple times. The software will write a byte and check it, and I've had it where the second programming run will fail. The usual reason is that the EPROM wasn't erased well enough, and that the initial write tinkered with residual data/current in the chip's cells, which then settled. The second write will write/read/check and fail as that cell has changed to another value. Erasing and programming again might work, else that chip needs to go in the bin.
Preparing an XT-IDE Boot EPROM
The default ROM can be downloaded from here. Choose the folder whose name begins with an 'r' and has the highest number. This'll be the most-recent release of the software and should be bug-free on all supported hardware. There's a miriad of flavours of the software, so you'll need to choose the one that's right for your hardware.
Burn it to an EPROM. I chose a 27C256 as I had a spare truckload.
Testing it in known hardware
This is paramount. Don't just slap this in marginal hardware and expect things to work. I found a boring Realtek PCI 8139 NIC and slapped the freshly-minted EPROM in.
It was installed in my PIII-500 workhorse and worked first time!
Just for fun, I inspected the area of system memory where it mentioned the ROM was hosted:
Microsoft(R) Windows 98 (C)Copyright Microsoft Corp 1981-1999. C:\WIN98JP\DESKTOP>debug -d d000:0000 D000:0000 55 AA 10 E9 B5 03 58 55-42 32 31 30 2D 3D 58 54 U.....XUB210-=XT D000:0010 49 44 45 20 55 6E 69 76-65 72 73 61 6C 20 42 49 IDE Universal BI D000:0020 4F 53 20 28 41 54 29 3D-2D 00 00 00 72 36 32 39 OS (AT)=-...r629 D000:0030 20 0A 28 32 30 32 34 2D-30 37 2D 32 30 29 00 00 .(2024-07-20).. D000:0040 61 FC 00 00 04 00 00 00-02 80 00 01 00 00 F0 01 a............... D000:0050 F0 03 00 0E 1D 00 00 00-00 00 1D 00 00 00 00 00 ................ D000:0060 70 01 70 03 00 0F 1D 00-00 00 00 00 1D 00 00 00 p.p............. D000:0070 00 00 E8 01 E8 03 00 00-1D 00 00 00 00 00 1D 00 ................ -d d197:0000 D197:0000 89 55 12 89 5D 14 31 C9-89 4D 16 C7 45 18 00 02 .U..].1..M..E... D197:0010 2D 01 40 81 DA EC 00 19-CB 73 04 80 4D 02 02 26 -.@......s..M..& D197:0020 8A 54 0A 30 F6 89 55 08-89 4D 0A 26 8A 54 0B 89 .T.0..U..M.&.T.. D197:0030 55 0C 89 4D 0E 26 8B 54-0C 89 55 04 89 4D 06 91 U..M.&.T..U..M.. D197:0040 E9 4F FB 81 7E 18 AA 55-75 14 C6 46 1F 21 F7 56 .O..~..Uu..F.!.V D197:0050 18 E8 0D 00 89 4E 1C 80-66 24 FE E9 3A FB E9 CD .....N..f$..:... D197:0060 FA B9 01 00 80 7D 14 04-73 03 80 C9 04 C3 FF FF .....}..s....... D197:0070 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ................
Nice, there it is. I dumped it (great tutorial on dumping over here at MESS) for safe-keeping, so I could use it for any comparison in the future:
-n pci-d000.bin -r bx BX 0000 :0000 -r cx CX 0000 :2000 -m d000:0 2000 0100 -w 0100 02000 BYTES WRITTEN -q
Note that you need to hit enter at the end of any line starting with "-". 0x2000 is 8kb (aka 8192) in HEX. Debug also only cares for 8.3 filenames, so don't give it anything longer.
3Com EtherLink II 3C503
The actual card to test was this 'trusty' 100yen purchase from a Hard Off in Japan. The 3Com 3C503 was detected and installed under Win98 and worked fine. I then put in the EPROM and nothing happened during a restart!
This card has one thing going for it: configurable jumpers. The ROM location can be easily specified and I'd put it at 0xCC00.
I have no idea if this was a good location, but I went for it. A reboot saw absolutely nothing get executed! To test if it had actually been loaded into memory, I used debug once more:
Microsoft(R) Windows 98 (C)Copyright Microsoft Corp 1981-1999. C:\WIN98JP\DESKTOP>debug -d cc00:0000 CC00:0000 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ................ CC00:0010 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ................ CC00:0020 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ................ CC00:0030 FF FF FF FF FF 00 00 00-00 00 00 00 00 00 00 00 ................ CC00:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ CC00:0050 BF 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ CC00:0060 08 00 45 00 CA 00 8F 02-60 E8 12 01 00 00 32 FF ..E.....`.....2. CC00:0070 8A DA 66 D1 E3 66 50 66-BA D4 03 66 B8 1F 57 66 ..f..fPf...f..Wf -q
Ah yeah, that's not it. I tried a few other locations, landing on D800, but it seems that Windows 98 was stealing the memory back after DOS had loaded. I ended up having to F8 to DOS when booting and debug from there:
That's still not it! But at least it's blank. What am I doing wrong? Turns out this card only supports 27C64 EPROMs and I've shoved a 27C256 in it! Ok, lift the address pin that could be conflicting:
And what do we see?
We're literally a half-step closer! I spent a lot of time googlin' what the @#$ was going on, but then I looked at the card again:
DATA MODE has an option between 16 and 8. I had thought this was Twisted Pair or BNC... but I was wrong. Setting it to 8 (finally) revealed:
Ok, the 'top end' looks good... what about the rear end? The ROM is 8kb, but there's a bit of filler at the end. The ROM data is around 1D7 bytes:
Ok good, but what about the very end? The ROM is 8k, and that's 0x2000 in hex. It's based at 0xD800, so we also need to check up to 0xD9FF:
What... what is that 0x04 0x04? I only had to ask the internet, because... as I keep saying, nothing is new on the internet. Someone has almost always had an issue in the same vein as anything and everything I've ever encountered. The strange thing with this forum thread is that they say that the 3C503 returns 0x80 0x80 as the last two bytes. Above, as you can see, we're getting 0x04 0x04. How broken are we? I dumped the ROM and compared everything with HxD and we're not bad! It really just is the last two bytes.
Ok, so there are the two bad values right at the end. The card is always reporting them and we need to find a work around.
BIOS Option ROM Checksums
We know the EPROM data is being loaded into memory, but we don't know why the system BIOS isn't executing it. I had to dig a bit to find a thread on Option ROM checksums which lead me to a great howto on Etherboot ROM booting. This latter document contained a great list of dot-points that need to be met for an Option ROM to be seen and booted:
How does the main BIOS know that the code in the ROM is to be executed and why does it not execute some random code by accident? The ROM code has several conditions placed on it:
- The ROM must start on a 2kB boundary in the memory space, between 0xC8000 and 0xEE000, although some main BIOSes scan outside these limits.
- The first two bytes of the ROM must be 55 AA hex.
- The third byte of the ROM should contain the number of bytes in the ROM code divided by 512. So if the ROM code is 16kB long, then this byte would hold 20 hex (32 decimal).
- All the bytes in the ROM (specified by the length byte just mentioned) must checksum to 8 bits of binary zero. The sum is formed by 8 bit addition of all the bytes, throwing away the carry. Note that there is not a particular location designated as the "checksum byte". Normally the ROM building process alters an unused byte somewhere to fulfil the checksum condition.
From the dump above, we can confirm that we tick the first and second point. For the third point, our third byte is 0x10, meaning that we're 8192 bytes long. This means that if we add together every byte in our 2k ROM, we need to sum to a total of 0. Fortunately, we don't have to do this manually! If we use the checksum calculator over here, it'll run throught the ROM and adjust the last byte to fulfil the checksum zero-sum requirement.
I fed it the ROM dumped from memory, as loaded by the 3C503. Why bother using the correct binary on disk if that's not the way it'll show in RAM?
C:\Users\steve\Downloads>romcksum32.exe \\yadayada\....\3comd800.bin ROM Checksum Calculator VER: 0.2 REV: D Copyright (C) 1998-2021 Microprogramming TECHNIQUES Programming/PC Code: Alexandru Groza All rights reserved. ROM file : 3comd800.bin Disk size : 8192 (8 KiB) ROM usage : 100.00% (8192/8192) ROM checksum : 0x4h (8-bit) ROM file checksum updated.
So, what's it done?
It replaced the final 0x04 with an 0x49? So it decided that, once summed, we were missing 0x45 to sum back around to zero... sure... but our card is going to whack that final 0x49 back to 0x04. We'll need to 'spread' this checksum'd difference around spare bytes, but they're all 0xFF, so let's change the third-last byte to 0x00 and use it to store the remainder. Running the checksum again after making this change saw:
So, with an 0x00 instead of 0xFF, we now have a final byte value of 0x48. So the FF was worth 0x01? Regardless, if we know the last 0x48 will become 0x04 in the physical machine, we can store the 0x44 difference in the third-last byte:
And you know what? I wrote this version of the binary to an EPROM, inserted it into the 3C503 and IT BOOTED! Of course, this was a stock-standard XT-IDE BIOS ROM. What you ACTUALLY need to do is to run the XTIDECFG.COM file from a floppy with a machine-relevant BIOS loaded and then customise it to the configuration on your machine. This default BIOS tries to load a second ATA controller and causes no end of lock-ups as the hardware isn't actually attached!
I can't believe it worked.
Apricot Xi PC
This Apricot Xi (further info) (Service Manual) appeared on eBay and the seller was willing to ship it! He descibed it as the following:
It was tested to power up only. The hard drive spins up and a red light is visible inside through the floppy drive slot. It did not appear to boot. A minute or so after first powering up some caps blew in the power supply, likely filter capacitors. It did not stop and later could be powered up again to the same state.
That latter concept of why not try turn it on again after it exploded left me a little bemused... but what could I lose by trying to get it going?
The tear-down was nice and simple. A few screws here and there and things just nicely came apart.
The power supply was out first and the damage was blindingly obvious.
Those two nuts on the wall were not fun to remove, but with them out the base board came out cleanly.
With the new capacitors back in, the unit was re-assembled.
Of note, in the middle shot above, make sure to line up the carry-handle with the slot it fits through. In the last shot, make sure to re-connect the speaker cable to the motherboard before screwing down the drive-bay plate.
With it all together, voltages were checked and the 12v rail was quite high! With no load, this was mildly expected. I slapped in a sacraficial HDD and hit the power... it spun up and the motherboard speaker even beeped! I was good to continue the testing.
Video Out
Long-story-short... it's a 71.9hz vertical sync signal at 15.978khz horizontal. This doesn't match MDA, CGA or EGA... let alone anything higher.
The video port is a 9-pin male DB-9 with both syncs, video and a dangerous -12v pin. Don't just hook this up to anything non-Apricot!
I attempted with some logic to invert the vertical sync as it was mentioned somewhere that it might be negative and needs to be positive, but that didn't work.
The GBS-8200 didn't work either! So, what to do? Let's test something that's been on the shelf for a while...
I hadn't tested out the oscilliscope before and I still don't know how to use it. I was happy to see it seeing signals... but I couldn't work out if the frequencies were at the numbers I needed. I then realised my retro-corner LCD supports 15khz and threw together a test-wire straight through to VGA plug:
Hello there! It's totally failing to work out the vertical refresh rate... but that's fine... this thing is running a VGA vertical refresh with an EGA horizontal... it was never expected to 100% work without some kind of conversion. Just for fun, here's the specifications:
----CRT DATA DISPLAY SPECIFICATIONS--- | |
---|---|
PHYSICAL CHARACTERISTICS | |
Dimension | 174mm max. |
Height | 241 ±1.5 mm |
Width | 226±5.0 mm |
Depth | 6.2 Ibs (2.8 kg) |
Weight | 240AMB39 polish |
Picture Tube | Visual 9" 90° def. 20 mm dia. |
Tilt | 10° ± 1° |
ELECTRICAL CHARACTERISTICS OF CRT DISPLAY MONITOR | |
Power Requirements | DC 11.8V 1.0A |
Video Input Signal Requirements | Black level = 0 + 0.4 -O.OV White level = 4 ± 1.5V |
Input Impedance | 300 ohms min 40pF max. |
VERTICAL INPUT SYNC SIGNAL REQUIREMENTS | |
Active Polarity | Positive |
Pulse Rate | 71.9 Hz |
Pulse Width | 158us |
Amplitude | Low = 0 + 0.4 -O.OV High = 4 ± 1.5V |
Input Impedance | 1 Kohm min. 40pF max. |
HORIZONTAL INPUT SYNC SIGNAL REQUIREMENTS | |
Active Polarity | Positive |
Pulse Rate | 15.79 kHz |
Pulse Width | 8.0us |
Amplitude | Low = 0 + 0.4 -O.OV High = 4 ± 1.5V |
Input Impedance | 2 Kohms min. 40pF max. |
Video Amplifier Band Width | 25 MHz typ |
Resolution | >= 800 TV Lines at center >= 650 TV Lines at corner |
Vertical Character Area | 120 ±5mm |
Horizontal Character Area | 150 ±5mm * According to the attached timing chart * +B = 11.8 ± 0.05V |
BLANKING TIME REQUIREMENTS | |
Vertical | 1200us min. |
Horizontal | lOus min. |
Vertical Deflection Linearity | 10% |
Horizontal Deflection Linearity | 10% ((max - min)/(max + min) x 100) |
So, what next? Find someone else that's built a 15khz VGA adapter. Writing this now, after building the MCEBlaster, I can't help but wonder if I should not have gone the simpler route and built the qiqitori analog-RGB to VGA adapter?
The MCEBlaster is multi-purpose for MDA/CGA/EGA, but none of those suit this display output! MDA is close, but it's still a reach from the resolution this unit is outputting. Using qiqitori's adapter, I could've just customised the code directly for this machine.
REGARDLESS, I didn't have this hindsight and built the MCEBlaster. In fact, I built it to the the schematic... expecting my video pin display data to be fed into all three coloured RGB TTL lines at once...
This was wrong, and with code changes forcing the EGA lines to 72hz vertical (which the code was picking up as the input signal, correctly), I got the following:
With a silly amount of tinkering (as this was never going to work as EGA is too limited to display the full EGA picture), I eventually got quite a bit of the picture to display!:
As mentioned, trying to fit 800x400 in 320x240 was never going to work. We're an MDA-esque signal and the board had full provision for such. I should have, from the start, fed the image into the input as if it was an MDA plug. This meant we needed to input video data on pin 7 and intensity on pin 6.
Unfortunately, the Apricot doesn't output an intensity pin, so pin 6 can be grounded. My wiring between the 74LVC245 and Pico could stay, as per the schematic, as the Pico knew to look on pins 26 and 27 if the vertical frequency was correct. I adjusted the MDA modeline config to look for 72hz (rounded-up) sync and we started getting somewhere...
I already had that encroaching feeling of Why am I doing this? If/when it works, what will I do with it?... so this was a good enough video output to test the rest of the peripherals. The error shown above is Error 31 and it means that Keyboard diagnostics failed.
Keyboard Input
As always, someone has already done this before. I built the circuit and plugged everything together expecting things to just-work, but I still got Error 31!
With the arduino connected, there was no data showing as coming from the Apricot? I checked the MAME source code for the Apricot keyboard and you could see that the keyboard was meant to receive a reset command from the computer and respond with an ACK:
case CMD_KEYBOARD_RESET: logerror("System requests keyboard reset\n"); transmit_byte(ACK_DIAGNOSTICS); break;
The computer stayed silent towards everything I threw at it. No amount of forced-sending of control codes from the keyboard to the computer worked, so I hooked up the oscilloscope to the data pin 2 of the keyboard port and yeah, the transmit signal from the computer to the keyboard was held high and had a not of noise. Interestingly though, pressing CTRL+ALT+DEL on the keyboard actually did reset the Apricot? The apricot-kbd arduino code has a special block where sees a reset request and holds the transmission line to ground for 100ms. Is this the required signal? I checked the schematics again and noticed that there was a special path for a system reset request.
Above, you can see the keyboard connector in the green box on the left. The two standard paths are orange and blue and they travel through respective MC1489/MC1488 paths to the Z80 SIO/0. I'm getting nothing from, and seemingly sending nothing to, this chip... so the only reason reset would work is via the purple path down the bottom.
Just for fun, I dismembered the trace between the SIO and the MC1488 on the outbound TX line to see if the MC1488 was the issue. Doing so still saw a high and messy voltage on the Z80A SIO/0 side, meaning something was wrong it, or with a chip further towards the CPU. Whilst doing all this, I happened to press my finger down on the SIO and found that it was hot enough to fry an egg! No wonder it's lid is so smooth and shiny.
It was a very quick removal. A socket was installed and... I found a pair of ICs (supposedly new-old-stock) on eBay. The machine was put back in the corner of the room... unscrewed, but neatly stacked. The ICs came in due course and one was installed.
And...?
PS2 to Xi Value FA - Status Bits 0 Code 0xFA [�] -- . Value AA - Status Bits 0 Code 0xAA [�] -- 5F Value 2B - Status Bits 0 Code 0x2B [+] -- 60 Value 802B - Status Bits 80 Code 0x2B [+] -- FFFFFFE0 Value 2B - Status Bits 0 Code 0x2B [+] -- 60 Value 802B - Status Bits 80 Code 0x2B [+] -- FFFFFFE0 Value 2B - Status Bits 0 Code 0x2B [+] -- 60 Value 802B - Status Bits 80 Code 0x2B [+] -- FFFFFFE0 Value 2B - Status Bits 0 Code 0x2B [+] -- 60 Value 802B - Status Bits 80 Code 0x2B [+] -- FFFFFFE0 ----------From Apricot: 0 [] Value 2B - Status Bits 0 Code 0x2B [+] -- 60 Value 802B - Status Bits 80 Code 0x2B [+] -- FFFFFFE0 Value 2B - Status Bits 0 Code 0x2B [+] -- 60 Value 802B - Status Bits 80 Code 0x2B [+] -- FFFFFFE0 Value 11E - Status Bits 1 Code 0x1E [] -- 40 Value 811E - Status Bits 81 Code 0x1E [] -- FFFFFFC0 ----------From Apricot: E8 [�] ----------From Apricot: E8 [�] ----------From Apricot: E2 [�] ----------From Apricot: D0 [�] D4 [�] AA [�] E3 [�] 0 [] E2 [�] 81 [�] 52 [R] 41 [A] 4D [M] 20 [ ] 35 [5] 31 [1] 32 [2] 4B [K] Value 11E - Status Bits 1 Code 0x1E [] -- 40 Value 811E - Status Bits 81 Code 0x1E [] -- FFFFFFC0
Wowzers... it's reporting 512K RAM to the non-existent Keyboard LCD! The paired values are from the PS/2 Keyboard keypresses and the data from the Apricot is self-explanatory once you've read the opcodes over here.
if (Serial1.available()) { Serial.println("----------From Apricot:"); while (Serial1.available()) { uint16_t b = Serial1.read(); Serial.print(b, HEX); Serial.print(" ["); Serial.print((char)(b & 0xff)); Serial.print("] "); switch (b) { //keyboard reset. just ACK case 0xe8: Serial1.write(0xfb); break; } } Serial.println(""); } }
Above is the only bit I changed when compared to the git repo.
Floppy Disk
This thing is a monstrosity, and didn't work at the start. It wasn't until I replaced the ZIO above that the floppy started seeking on boot and showing other signs of life. I haven't got a floppy disk formatted for this unit yet, but it really does seem that a catastrophic event occurred to wreck a whole bunch of chips in this machine. With one fixed, the data bus may well have been free'd up to communicate. It does still seem that once the machine has warmed up, that more faults start occurring. I'm guessing RAM? Either way, here's the beast of a drive:
If I can get it working more-consistently then I'll use apridisk to write disk images and have fun... but that's for another post. This one has gone on long enough!
Heat-Activated Gremlins
It seems that there are still issues with this machine. With the keyboard responding with an ACK, the system is finally reporting System OK on a cold boot, but starts to lose it once it's warmed up. After hitting enter at the prompt, the following message was displayed:
You can tell it's coded into the autoexec.bat file. Whilst trying to search for files on the Winchester Disk that others may have left behind, I initially received proper disk directory listings... until I didn't.
Letting the machine cool down again saw those same error'd directories list fine... so it's not the HDD itself... it's heat. I left the machine on for 20 minutes and touched all the chips... only the main CPU and its friend were (burningly) hot.
Could I be bothered replacing it? Should I heatsink the crap out of it to test further? Why am I even doing all of this? No idea.
How To Miss Doctor Yellow
So, you've all heard the news: Doctor Yellow is being retired in 2027. Thankfully that's 2 years away, so I still have time to see the consist in action. During my recent trip to Japan I travelled all the way to coastal Kanagawa to photograph Shinkansen and freight in the country-side, but gave up due to the weather and ... a general feeling of old-age?
The Original Plan
Take enough trains to Hayakawa Station and walk an extended path to Nebukawa Station. The embedded map below doesn't show the actual path, opting for the most direct. If one follows some of the mountain contours, many tunnel portals can be observed from amazing angles!
It was probably overly-adventurous in the middle of a humid summer. The forecast was actually for rain, but by 9am it was already nearly 30 degrees celsius.
What Actually Happened
I arrived at Hayakawa Station bright and early on Thursday the 6th of June, 2024. There's a pedestrian bridge just east of the station (and a Lawson), so I went to get some line-side shots (and breakfast).
The elevation of the pedestrian bridge really is nice! For some reason I decided that the main goal was to get up to the first Shinkansen tunnel portal.
I got half-way up a hill to a beautiful vantage point for Shinkansen. As I was making my way up there two freighters passed on the zai-rai-sen, one being a Kangaroo-Liner!
Finally, the s-bend of the road provided an awesome vantage point.
I was appeased by the Shinkansen action:
After watching quite a few Shinkansen pass, I somehow let the ambient temperature, humidity and mosquitos get to me. It was a mild climb to this point and I knew this was one of the smaller inclines over the entire path. Due to all of this, I chose to not continue on the original path and, instead, to head back into Tokyo and check out anything with air-conditioning. I'm still regretting this!
Anyway, I spent 5 seconds admiring the people who obviously didn't choose for the Shinkansen to be built next to their bedroom...
...and then I left back to Hayakawa, took the locals to Fujiawa, Enoden to Enoshima, the monorail to Ofuna and then trains to Akiba.
What Did I Miss Out On?
For those playing at home, there's a Japanese-only website known as Kamotsu (Freight) Channel for tracking the locomotives on japanese train services. Users also have the opportunity to upload other sightings... including Doctor Yellow! So, a week after returning from Japan, I was still in the sliding-window of sightings and happened to check when Doctor Yellow been operational whilst I was in Japan.
(You'll just have to pretend that the screenshot above was for the correct dates)
Would you believe it was the exact day I'd chosen to be line-side in Kanagawa? If I'd stayed 30 more minutes I would've snapped the ultra-rare sighting of Doctor Yellow on the Tokaido Shinkansen? The thought still haunts me... but I will seek revenge! I'll also go back to Nou in Itoigawa and also find those bloody onion trains.