HP Dual PIII-500 Motherboard
I had a good to-and-fro with the Seller on this item. He initially wanted ~AUD500 for it, so I low-balled just under 200. He didn't accept, but then proceeded to get zero bids. It was then re-listed at an auction price of AUD99 and didn't go for much more. If you look on eBay US, seems they're still fetching quite a few dollars! Anyway, it's a dual P3-500 board with on-board SCSI! Nice. The only thing I didn't know was what server it had been ripped out of.
Looking at the photos now, I see that there's a glaringly-obvious Hewlett Packard logo hidden below the AGP slot... something I totally missed when the board arrived. So instead, after a little googlin', I had determined that it was the motherboard from a HP Compaq Netserver E60. This was thanks to the "exchange" code/part-number of "D7140-63000" labelled on one of the ICs.
Front Panel Connector Pinout
Found that someone else had restored such a unit, but not so recently. A private message to the author saw no response. What did help though, were the pictures in that post. IT shows that there's no reset button? Just Power LED, Power Switch and HDD LED.
So, what to do? Grab a screwdriver and poke the pins! Actually, first I worked out which pin was ground via a multimeter. Turns out it's second-from-the-left, but there's only one ground, so that meant getting the LEDs lit will be tricky. After a bit more poking, the left-most pin was determined to be the power switch and, before I knew it, the motherboard speaker was beeping awfully as it had no Video or RAM.
HDD activity wasn't on the header, so I just used the connection directly on the SCSI drive.
A Suitable Video Card
I've had this crazy ATI Rage 128 All-In-Wonder in as box for ages and have never had a good reason to test it. Thankfully, this motherboard has AGP, so let's do it!
With this card in place, most of the operating systems I tried had issues. Drivers, resolutions, framebuffers... this card seems to be a bit of a Unicorn and really only good for Windows. Fortunately, a little bit of effort paid off and it ended up working on all systems. For future reference, here's a possible pinout for the video out breakout cable.
So, What RAM?
The manual indicates that the motherboard supports up to four SDRAM DIMMS, for a maximum total of 1GB. These are expected to be full server-grade and I had quite a few lying aorund. The actual specifications are: 64MB, 128MB, or 256MB unbuffered, 72 bits wide, ECC single-bit correcting, multi-bit detecting. So, those huge DIMMs in the box, with huge stickers and terms like 'sync':
Finally, I get to use the ECC SDRAM modules that seem to be very popular (i.e. in everyone's junk box gathering dust) and never usable in standard desktop motherboards! And, summing up what worked, I could only get to 384mb RAM. I tried mixing ECC and Non-ECC, but this threw a really ugly error. Interestingly it can obviously tell if the RAM DIMM is Non-ECC. Also mixing ECC 133mhz with 100mhz would throw shitty beeping. Finishing the RAM combination testing, I then just put in normal PC100 SDRAM and the bloody thing just booted straight up! No errors, no warning that this was pleb-RAM and not servah-RAM? This was a better option as I had enough laying around to get up to 512mb.
Microcode Update Block Missing
This error appears on HP NetServers when third-party CPUs are used which didn't come with a microcode block flashed onto them.
Could it be that these CPUs have just lost the block that had been previously flashed? Regardless, someone else has already solved this issue, but the link to HP for the new BIOS to flash is well gone! A quick google turned up this BIOS update, but it wants Windows and the filename ends in FR?... I'll get to that after I've mucked around with other OSsss.
Redhat Linux 7.2
And then for some Redhat! I already had the CDs burnt thanks to installing it on the Sony Vaio Z505. The installation was a breeze, but the installer did try to trick me into selecting the wrong video card.
Instead, choose the All-In-Wonder 20-ish lines above. Don't forget to test the mode!
Interestingly, as above, the mode worked fine during setup! Not so well once it then tried to boot... I'd selected the graphical login during install, so on first reboot, the machine produced a blank screen when it tried to load up XDM. It was still the correct resolution, but the whole machine had actually frozen up! No keyboard, no mouse, nothing... SSH wasn't running, so I couldn't connect underneath either! What to do? I could single-user and work out how to switch to text login, or re-install. I chose the latter to save time and effort.
Second time around, a login! startx still produced a blank screen though... at the correct resolution! I rebooted once more, but this time I logged in via SSH and ran startx remotely and...
Last login: Wed Feb 24 03:38:38 2021 [root@localhost root]# startx XFree86 Version 4.1.0 (Red Hat Linux release: 4.1.0-3) / X Window System (protocol Version 11, revision 0, vendor release 6510) Release Date: 2 June 2001 If the server is older than 6-12 months, or if your card is newer than the above date, look for a newer version before reporting problems. (See http://www.XFree86.Org/FAQ) Build Operating System: Linux 2.4.9-31smp i686 [ELF] Build Host: stripples.devel.redhat.com Module Loader present (==) Log file: "/var/log/XFree86.0.log", Time: Wed Feb 24 03:43:04 2021 (==) Using config file: "/etc/X11/XF86Config-4" Markers: (--) probed, (**) from config file, (==) default setting, (++) from command line, (!!) notice, (II) informational, (WW) warning, (EE) error, (NI) not implemented, (??) unknown. (==) ServerLayout "Anaconda Configured" (**) |-->Screen "Screen0" (0) (**) | |-->Monitor "Monitor0" (**) | |-->Device "ATI All-in-Wonder 128 Pro AGP" (**) |-->Input Device "Mouse0" (**) |-->Input Device "Keyboard0" (**) XKB: rules: "xfree86" (**) XKB: model: "pc105" (**) XKB: layout: "us" (**) FontPath set to "unix/:7100" (**) RgbPath set to "/usr/X11R6/lib/X11/rgb" (==) ModulePath set to "/usr/X11R6/lib/modules" (--) using VT number 7 (II) Loading /usr/X11R6/lib/modules/fonts/libbitmap.a (II) Module bitmap: vendor="The XFree86 Project" compiled for 4.1.0, module version = 1.0.0 (II) Loading /usr/X11R6/lib/modules/libpcidata.a (II) Module pcidata: vendor="The XFree86 Project" compiled for 4.1.0, module version = 0.1.0 (II) Loading /usr/X11R6/lib/modules/libscanpci.a (II) Module scanpci: vendor="The XFree86 Project" compiled for 4.1.0, module version = 0.1.0 (II) Unloading /usr/X11R6/lib/modules/libscanpci.a (--) PCI:*(1:0:0) ATI Rage 128 RF rev 0, Mem @ 0xf8000000/26, 0xf4200000/14, I/O @ 0x9000/8 (II) Loading /usr/X11R6/lib/modules/extensions/libGLcore.a (II) Module GLcore: vendor="The XFree86 Project" compiled for 4.1.0, module version = 1.0.0 (II) Loading /usr/X11R6/lib/modules/extensions/libdbe.a (II) Module dbe: vendor="The XFree86 Project" compiled for 4.1.0, module version = 1.0.0 (II) Loading /usr/X11R6/lib/modules/extensions/libextmod.a (II) Module extmod: vendor="The XFree86 Project" compiled for 4.1.0, module version = 1.0.0 (II) Loading /usr/X11R6/lib/modules/linux/libfbdevhw.a (II) Module fbdevhw: vendor="The XFree86 Project" compiled for 4.1.0, module version = 0.0.2 (II) Loading /usr/X11R6/lib/modules/extensions/libpex5.a (II) Module pex5: vendor="The XFree86 Project" compiled for 4.1.0, module version = 1.0.0 (II) Loading /usr/X11R6/lib/modules/extensions/libdri.a (II) Module dri: vendor="The XFree86 Project" compiled for 4.1.0, module version = 1.0.0 (II) Loading /usr/X11R6/lib/modules/linux/libdrm.a (II) Module drm: vendor="The XFree86 Project" compiled for 4.1.0, module version = 1.0.0 (II) Loading /usr/X11R6/lib/modules/extensions/libglx.a (II) Module glx: vendor="The XFree86 Project" compiled for 4.1.0, module version = 1.0.0 (II) Loading /usr/X11R6/lib/modules/extensions/librecord.a (II) Module record: vendor="The XFree86 Project" compiled for 4.1.0, module version = 1.13.0 (II) Loading /usr/X11R6/lib/modules/extensions/libxie.a (II) Module xie: vendor="The XFree86 Project" compiled for 4.1.0, module version = 1.0.0 (II) Loading /usr/X11R6/lib/modules/drivers/r128_drv.o (II) Module r128: vendor="The XFree86 Project" compiled for 4.1.0, module version = 4.0.1 (II) Loading /usr/X11R6/lib/modules/drivers/ati_drv.o (II) Module ati: vendor="The XFree86 Project" compiled for 4.1.0, module version = 6.3.6 (II) Loading /usr/X11R6/lib/modules/input/mouse_drv.o (II) Module mouse: vendor="The XFree86 Project" compiled for 4.1.0, module version = 1.0.0 (II) ATI: ATI driver (version 6.3.6) for chipsets: ati, ativga (II) R128: Driver for ATI Rage 128 chipsets: ATI Rage 128 RE (PCI), ATI Rage 128 RF (AGP), ATI Rage 128 RG (AGP), ATI Rage 128 RK (PCI), ATI Rage 128 RL (AGP), ATI Rage 128 SM (AGP), ATI Rage 128 Pro PD (PCI), ATI Rage 128 Pro PF (AGP), ATI Rage 128 Pro ULTRA TF (AGP), ATI Rage 128 Pro ULTRA TL (AGP), ATI Rage 128 Pro ULTRA TR (AGP), ATI Rage 128 Mobility LE (PCI), ATI Rage 128 Mobility LF (AGP), ATI Rage 128 Mobility MF (AGP), ATI Rage 128 Mobility ML (AGP) (II) RADEON: Driver for ATI Radeon chipsets: ATI Radeon QD (AGP), ATI Radeon QE (AGP), ATI Radeon QF (AGP), ATI Radeon QG (AGP), ATI Radeon VE QY (AGP), ATI Radeon VE QZ (AGP), ATI Radeon Mobility LW (AGP), ATI Radeon Mobility LY (AGP), ATI Radeon Mobility LZ (AGP) (--) Assigning device section with no busID to primary device (--) Chipset ATI Rage 128 RF (AGP) found (II) Loading /usr/X11R6/lib/modules/libvgahw.a (II) Module vgahw: vendor="The XFree86 Project" compiled for 4.1.0, module version = 0.1.0 (II) R128(0): PCI bus 1 card 0 func 0 (**) R128(0): Depth 16, (--) framebuffer bpp 16 (II) R128(0): Pixel depth = 16 bits stored in 2 bytes (16 bpp pixmaps) (==) R128(0): Default visual is TrueColor (==) R128(0): RGB weight 565 (II) R128(0): Using 6 bits per RGB (8 bit DAC) (II) Loading /usr/X11R6/lib/modules/linux/libint10.a (II) Module int10: vendor="The XFree86 Project" compiled for 4.1.0, module version = 1.0.0 (II) R128(0): initializing int10 (II) R128(0): Primary V_BIOS segment is: 0xc000 (--) R128(0): Chipset: "ATI Rage 128 RF (AGP)" (ChipID = 0x5246) (--) R128(0): Linear framebuffer at 0xf8000000 (--) R128(0): MMIO registers at 0xf4200000 (--) R128(0): VideoRAM: 16384 kByte (128-bit SDR SGRAM 1:1) (II) R128(0): PLL parameters: rf=2864 rd=63 min=12500 max=25000; xclk=9000 (II) Loading /usr/X11R6/lib/modules/libddc.a (II) Module ddc: vendor="The XFree86 Project" compiled for 4.1.0, module version = 1.0.0 (II) Loading /usr/X11R6/lib/modules/libvbe.a (II) Module vbe: vendor="The XFree86 Project" compiled for 4.1.0, module version = 1.0.0 (II) R128(0): VESA BIOS detected (II) R128(0): VESA VBE DDC supported (II) R128(0): Manufacturer: PTS Model: 30d Serial#: 214342 (II) R128(0): Year: 2005 Week: 22 (II) R128(0): EDID Version: 1.3 (II) R128(0): Analog Display Input, Input Voltage Level: 0.700/0.700 V (II) R128(0): Sync: Separate (II) R128(0): Max H-Image Size [cm]: horiz.: 34 vert.: 27 (II) R128(0): Gamma: 2.50 (II) R128(0): DPMS capabilities: Off; RGB/Color Display (II) R128(0): First detailed timing is preferred mode (II) R128(0): redX: 0.630 redY: 0.330 greenX: 0.300 greenY: 0.600 (II) R128(0): blueX: 0.148 blueY: 0.098 whiteX: 0.310 whiteY: 0.330 (II) R128(0): Supported VESA Video Modes: (II) R128(0): 720x400@70Hz (II) R128(0): 640x480@60Hz (II) R128(0): 640x480@67Hz (II) R128(0): 640x480@72Hz (II) R128(0): 640x480@75Hz (II) R128(0): 800x600@56Hz (II) R128(0): 800x600@60Hz (II) R128(0): 800x600@72Hz (II) R128(0): 800x600@75Hz (II) R128(0): 832x624@75Hz (II) R128(0): 1024x768@60Hz (II) R128(0): 1024x768@70Hz (II) R128(0): 1024x768@75Hz (II) R128(0): 1280x1024@75Hz (II) R128(0): Manufacturer's mask: 0 (II) R128(0): Supported Future Video Modes: (II) R128(0): #0: hsize: 1280 vsize 1024 refresh: 60 vid: 32897 (II) R128(0): Supported additional Video Mode: (II) R128(0): clock: 108.0 MHz Image Size: 337 x 270 mm (II) R128(0): h_active: 1280 h_sync: 1328 h_sync_end 1440 h_blank_end 1688 h_border: 0 (II) R128(0): v_active: 1024 v_sync: 1025 v_sync_end 1028 v_blanking: 1066 v_border: 0 (II) R128(0): Ranges: V min: 60 V max: 75 Hz, H min: 30 H max: 80 kHz, PixClock max 140 MHz (II) R128(0): Monitor name: 17JAGBLK-AV (II) R128(0): Serial No: P2U052214342 (==) R128(0): Using gamma correction (1.0, 1.0, 1.0) (II) R128(0): Monitor0: Using hsync range of 30.00-80.00 kHz (II) R128(0): Monitor0: Using vrefresh range of 60.00-75.00 Hz (II) R128(0): Clock range: 12.50 to 250.00 MHz (II) R128(0): Not using mode "1400x1050" (hsync out of range) (II) R128(0): Not using mode "1400x1050" (hsync out of range) (II) R128(0): Not using default mode "640x350" (vrefresh out of range) (II) R128(0): Not using default mode "640x400" (vrefresh out of range) (II) R128(0): Not using default mode "720x400" (vrefresh out of range) (II) R128(0): Not using default mode "640x480" (vrefresh out of range) (II) R128(0): Not using default mode "800x600" (vrefresh out of range) (II) R128(0): Not using default mode "800x600" (vrefresh out of range) (II) R128(0): Not using default mode "1024x768" (vrefresh out of range) (II) R128(0): Not using default mode "1024x768" (vrefresh out of range) (II) R128(0): Not using default mode "1280x960" (hsync out of range) (II) R128(0): Not using default mode "1280x1024" (hsync out of range) (II) R128(0): Not using default mode "1600x1200" (hsync out of range) (II) R128(0): Not using default mode "1600x1200" (hsync out of range) (II) R128(0): Not using default mode "1600x1200" (hsync out of range) (II) R128(0): Not using default mode "1600x1200" (hsync out of range) (II) R128(0): Not using default mode "1792x1344" (hsync out of range) (II) R128(0): Not using default mode "1792x1344" (bad mode clock/interlace/doublescan) (II) R128(0): Not using default mode "1856x1392" (hsync out of range) (II) R128(0): Not using default mode "1856x1392" (bad mode clock/interlace/doublescan) (II) R128(0): Not using default mode "1920x1440" (hsync out of range) (II) R128(0): Not using default mode "1920x1440" (bad mode clock/interlace/doublescan) (--) R128(0): Virtual size is 1280x1024 (pitch 1280) (**) R128(0): Default mode "1280x1024": 135.0 MHz, 80.0 kHz, 75.0 Hz (--) R128(0): Display dimensions: (34, 27) cm (--) R128(0): DPI set to (95, 96) (II) Loading /usr/X11R6/lib/modules/libfb.a (II) Module fb: vendor="The XFree86 Project" compiled for 4.1.0, module version = 1.0.0 (II) Loading /usr/X11R6/lib/modules/libramdac.a (II) Module ramdac: vendor="The XFree86 Project" compiled for 4.1.0, module version = 0.1.0 (II) Loading /usr/X11R6/lib/modules/libxaa.a (II) Module xaa: vendor="The XFree86 Project" compiled for 4.1.0, module version = 1.0.0 (==) R128(0): Write-combining range (0xf8000000,0x1000000)
And then the SSH session timed out. Seems that the card driver has tried to instantiate the DRM driver and frozen. A lot of mucking around then ensued, but the answer is simple: The r128 X11 driver didn't load the r128 DRM kernel module, so when it tries to call it, it just locks up. The answer is to run insmod r128 prior to starting X. Of course, this wont work if you've chosen to go for the graphical login. To get it to start on boot, edit /etc/rc.d/rc.local and slap the insmod line in there.
If you've already installed a distro and can't do anything as it boots to a black screen each time, then you need to edit your bootloader config to get linux to boot into single-user mode. For grub, hit E when the boot menu appears, select the second line and hit E again. Navigate to the end of the line and add the word single.
Hit enter and then press B. Linux will then boot, mounting disks, and provide a shell prompt with you already logged in as root. Just edit rc.local from here, inserting the insmod r128 command, and reboot. From here, all was working perfectly. I hadn't tested the All-In-Wonder features though... Looks like I'd need Gatos. The instructions don't look that hard.
Back to that BIOS update, can I use Wine?
Wine was installed by default, and so I wondered if I could run the BIOS updater from Linux? I wasn't ready to install XP/98SE/ME just yet. I downloaded the file and gave it a go:
[root@localhost root]# wine wineserver: chdir /root/.wine : No such file or directory [root@localhost root]# mkdir .wine [root@localhost root]# wine Wine release 20010731 Usage: wine [options] [--] program_name [arguments] The -- has to be used if you specify arguments (of the program) Options: --debugmsg name Turn debugging-messages on or off --dll name Enable or disable built-in DLLs --dosver x.xx DOS version to imitate (e.g. 6.22) Only valid with --winver win31 --help,-h Show this help message --managed Allow the window manager to manage created windows --version,-v Display the Wine version --winver Version to imitate (win95,nt40,win31,nt2k,win98,nt351,win30,win20) [root@localhost root]# wine e60bios_fr.exe x11drv: Can't open display:
Ok ok, let's start X...
Ok sure, it's just a WinZip Self-Extractor that makes a floppy image... can we extract the image?
[root@localhost root]# unzip e60bios_fr.exe Archive: e60bios_fr.exe inflating: makeunix.bat inflating: disk1.img inflating: rawrite2.exe inflating: disks.ico extracting: about.txt
Yes, yes we can. We don't have to use rawrite as Linux has dd, but we'll just check what's in that batch file:
[root@localhost root]# cat makeunix.bat @echo off echo Hewlett Packard Company Self extracting diskette Set echo. echo You will need 1 formatted diskette(s) to continue echo. echo Press Enter to Continue or Cntrl-C to end the job pause ^>nul: echo. echo Diskette Creation disk1 echo NetServer E60 BIOS Update Diskette echo Press Enter to Continue or Cntrl-C to end the job pause ^>nul: echo. rawrite2.exe -f disk1.img
Nothing special... just a dump straight to floppy. Let's do that, Linux-style! Before I format this floppy... what's on it?
Oh, just a WAD for DOOM II of our high school. Excuse the crappy image... I was a little excited to find a floppy from a drawer with ~20 year old data on it?! I'll write another post on that. Where as I?
[root@localhost root]# dd if=disk1.img of=/dev/fd0 bs=1024 conv=sync ; sync 1440+0 records in 1440+0 records out [root@localhost root]# cd /mnt [root@localhost mnt]# mount floppy/ [root@localhost mnt]# ls floppy/ config.sys contents.abf e60bios.fr io.sys language.dat msdos.sys phlash.exe phlshwrp.exe phlshwrp.hds phlshwrp.ini platform.bin [root@localhost mnt]# ls -l floppy/ total 688 -r-xr-xr-x 1 root root 29 Aug 18 1998 config.sys -r-xr-xr-x 1 root root 305 Oct 27 2000 contents.abf -r-xr-xr-x 1 root root 524288 Oct 27 2000 e60bios.fr -r-xr-xr-x 1 root root 40992 May 31 1994 io.sys -r-xr-xr-x 1 root root 2 Dec 10 1998 language.dat -r-xr-xr-x 1 root root 38166 May 31 1994 msdos.sys -r-xr-xr-x 1 root root 65605 Feb 9 1999 phlash.exe -r-xr-xr-x 1 root root 21179 Jan 13 1999 phlshwrp.exe -r-xr-xr-x 1 root root 6791 Dec 31 1997 phlshwrp.hds -r-xr-xr-x 1 root root 1739 Oct 27 2000 phlshwrp.ini -r-xr-xr-x 1 root root 1207 Jan 22 1999 platform.bin
Nice, there's our boot disk. Time to shutdown and boot the machine with the floppy inserted.
Make sure your flexible disk is set to a higher priority than your solid disk. And then learn french! Or.... cheat...
Note that it did mistranslate one 0 for an 8, but whatever, just do the next-next-finish:
And then it'll reboot by itself:
Yey! Microcode 0000000E installed!
Dodgy LAN Port
For the life of me, I couldn't work out why I had intermittent LAN connectivity whilst using the machine. It wasn't until I checked the LEDs at the back on the port to see that sometimes none were lit, other times just link and then finally activity also. On my LAN, there's always activity thanks to streaming South Yarra Railcam, so it was very strange to see only link lit up.
A quick jiggle of the cable saw that all change though. If I forced the cable away from the board, the lights would go out. On the contrary, pulling the cable down towards the motherboard saw the LAN port function 100% correctly. It seems that the contacts inside the socket were not making a good enough connection with the end of the cable and needed adjusting. Fortunately, the tweezers from the iFixit kit worked perfectly for grabbing each of the 8 contacts and bending them up. At the very back of the plug is a guide for each contact to slide down when the LAN cable is inserted, so I just made sure not to lift the contact wires past/out-of these.
BeOS R5 Professional
This took a little bit of re-learning. After acquiring the ISO, everything just installed perfectly. Google even, sorta, showed in NetPositive. I then tried to set up World O' Networking and, after it restarted the network server, nothing worked anymore. Even a ping from Terminal just threw: ping socket: name not found. A google for this error brought up an Arstechnica forum post from 1999 where a user had the same error! I re-installed BeOS and the network worked again... I re-installed WON and it died again. Reading the doco, it said that if I wanted to uninstall WON thoroughly, I had to go to /beos/system/boot and edit Netscript. Turns out this file didn't even exist! The WON setup had failed to copy in its substitute and had just renamed the old file. I grabbed it manually from the desktop and then everything booted up! But there were no computers to be found in the WON folder on the desktop.
Windows XP
As you'd pretty much eXPect, it all just worked perfectly. All CPUs online and all hardware flying along.
I installed the ATI drivers and even managed to half-capture my shitty megadrive clone. The picture wasn't healthy, but I don't know if I was expecting it to even work, let along show a picture!
Apple eMate 300 – ATA + Wifi
This little critter arrived in the post a while back after another bout of impulse-eBay-shopping. It was described as having a faulty touchscreen and bad hinges, so I got it for a deal! Of course, buying a broken unicorn is never a good idea, so I had my expectations managed for when it arrived if I couldn't get it to function.
As is always the case, the box was ripped open and the unit inspected on delivery day. It was very clean (albeit a little dusty) and showed very few signs of wear! I plugged it in straight away and was rewarded with a very black boot screen. The contrast can be set by the slider to the bottom-left of the screen. The volume is to the right of the contrast slider.
After the boot screen, I was presented with a standard touchscreen calibration program. Clicking the three points worked fine and so did the touchscreen!? I mentioned this to the seller and they thanked AusPost for bashing the unit around in transit. I don't think I've ever had a reason to thank them for such a service! Anyway, turns out this is an intermittent fault as the calibration started failing down the track; it'd get stuck in an infinite loop of calibration and never get to the main menu.
Anyway, with it booted and functional... I tinkered around and checked out what noises it could make... looking for that Eep. From here, it was thrown back in the box and forgotten about as I had the PowerBook Duo 230 to work on and I really needed to manage my time/projects appropriately!
Transferring data
You'll need a Serial Cable and either the Newton Connection Utility for OS9 and lower or the NCX for OSX. I installed the former on my PowerCenter (running OS 9.1) and all was a breeze. Make sure you extract all three disk images and then run the installer. It'll ask to reboot, so do so.
Once back up, connect your eMate to your computer with a serial cable via the printer port and configure Newton Connection Utility accordingly...
Now on the eMate, open up the Dock application. You'll be prompted to select the transport method and then, fingers crossed, you'll connect to your machine!
And on the PC... Connected!
From here, when installing packages, you'll need to use the PackType application to re-add metadata (resource fork stuff) to any PKG you've downloaded. If you don't do this, then the PKG files wont appear in the file browser when you choose Install Package above. Note there's also an article here at UNNA on setting up extension handlers properly so that downloaded PKGs are associated correctly... but they seem to refer to a package installation application which must come with NCX as it wasn't part of NCU for OS 9 or lower.
Cool... we can now drop files across... let's get some Mass Storage PCMCIA cards going!
Storage
This unit has a PCMCIA slot on the side, so I wanted to test what devices I could plug into it. I've gathered quite a collection of random PCMCIA cards, so I thought I'd just slap'em in and see what stuck. Straight away there was failures all around as supposedly these eMates only want to use Linear PCMCIA Memory Cards. Linear? Dunno.. but there's some in the USA on eBay and I can't be bothered waiting that long.
Anywho... turns out that you can install an ATA driver package and just use ATA cards! The driver is over here and is free, whereas it used to cost money when these things were relevant. Download the ATA Support driver and install it.
After a reboot, I started trying cards. My Clik card made an awful noise and failed to work...
I then tried the CF to PCMCIA with the 128mb card in it and it worked perfectly! There were a few steps to jump through to get the card partitioned... make sure your card has nothing valuable on it!
From here, I tried to save my data to the card. That's easy enough, but I tell you what, trying to navigate the system and find where you've saved files is slightly confusing!
Just to help out... whenever you're in the main menu, you can use the top-right dropdown to select the storage and then find your files.
In the main menu, Command-O doesn't open... it switches between a condensed list or back to icon mode. Fortunately, when you're in Works, Command-O does actually bring up the File Open dialog!
Networking with wireless
You'll find a list of compatible cards here and instructions on how to install the software here. Again, all software is downloaded from kallysis.com.
Install the software in the order specified and then insert your card! My Buffalo came up recognised as a Melco? I therefore chose Buffalo in the list when configuring the access point and had failures everywhere. It seems that Buffalo provided a white-label card, exactly as mine, to Melco who slapped their own brand on and hence my confusion.
Selecting the correct card and then turning on AppleTalk got my PowerCenter180 listed... but it just timed out when trying to connect. I then tried NetHopper 3.2 and got limited results...
After a few reboots, I got stuck in a calibration loop and couldn't actually get back into the main menu of the eMate. I initially thought it was due to installed software, but it turned out to be much worse...
Touchscreen Calibration and Hinges
This unit slams shut when you gently try to close it and, thanks to the weird calibration loop above, it was time to pull the entire thing open and check out what was going on. Supposedly these can implode and ruin the LCD data cable, so I didn't want to let the loose springs linger. Following the amazing guide at pda-soft, I set to work pulling the unit apart...
Multi-tasking while waiting for a long-running database query to execute, I found the link at the bottom of the page above describing what to do if the cable is damaged, or the hinges are broken.
Returning to my eMate, I desoldered the required wires and checked out the hinges... bugger! Not-quite-punctured... but well-damaged. No wonder I got stuck in a calibration loop! Time to continue totally dismantling this unit to extract the pieces that need fixing. Thanks to the instructions.. the culprits were out in no time...
The hinges have now been out-sourced to a friend who is very good with metalwork. I happily punctured a digit trying to bend the springs with two pairs of pliers... so gave up pretty quickly. (But then I finally got around to fixing the hinges!)
Apple PowerBook Duo 230 – Broken Caps Lock LED
So, I accidently removed it whilst cleaning the keyboard when this unit arrived. Fortunately, I didn't lose it, so I started pondering the best method to stick the LED back down to the plastic film. The traces on the plastic are made of a conductive compound that can supposedly be soldered? When I tried... it all just melted! Hence the hole above where the LED should be.
Above, you'll see that I'm going to repair this in-situ as popping all the keys out once more is something I don't even dream about.
Circuit Pens
So, from Jaycar, you can buy expensive circuit pens that supposedly allow you to draw conductive lines on surfaces. I've had one in the soldering kit for a while and grabbed it to try and fix this.
I moved the LED into position and used the circuit pen to dab the bottom leg, providing enough goo to cover onto the actual trace on the plastic film.
Letting this dry for a day, I then got a piece of very small wire and manually joined the top leg to the other trace. It worked fine! It worked fine until I bumped the LED and then the whole thing just flipped off the board. Turns out you can't use the circuit pens to glue things in place... you need to make sure they wont move first!
Tin Foil
Second attempt was from some googlin' that I don't need to bring up. Someone wrote that tin foil works well to conduct between the traces onboard and whatever you need to connect to. This made sense, so I cut some TINY pieces and stuck them under tape so that I could draw my own circuits. It actually didn't work too bad, but the light would fade in and out depending on where you were typing on the keyboard.
Winding/Transformer Wire
Ok, the final answer is to solder wiring to the LED's legs and then either run these along the traces on the mylar or run them all the way to the circuit board underneath. The latter will cause issues for the next human/robot who opens this PowerBook, but will prove to be the best fix. I chose the former first, just to see if I could do it.
De-soldering the crap that was on the ends of the LED's legs was a little challenging. It was actually the trace compound from the keyboard membrane and it didn't really want to melt. After a little coercion it finally cleaned off. From there, I tinned up the winding wire and soldered long lengths onto each side.
These were then trimmed and tinned. The next part was the hardest in this whole task: place LED where it should be glued down, twist one wire into shape of trace, twist other wire. Sounds easy enough, but without the unit being stuck in place, the wires would easily just bend out of shape and head in the wrong directions. I didn't really want to glue it first, just in case this whole experiment fails!
I also chose the stupidest place to try and place the winding wires... on a curve in the traces? Jeez... I should've made them a little longer and put them both on the vertical straight areas. Anyway... with a lot of adjusting, the wires lined up! And.....!?
NICE! A solid keyboard Caps Lock light!
Apple PowerBook Duo 230 – Networking
So, after getting the keyboard working again on this PowerBook Duo 230, it was time to connect it to the big-bad-internet. Back in the day, this little laptop was all about portability and so therefore meant a small form-factor and a very limited set of ports! On the back, you get the standard Printer/Modem Serial Port, a docking port and an optional internal fax/modem.
To get networking running, we'll be using the serial port and a bridge, of some description...
Asante AppleTalk Bridge
Back in the day, you'd dial-up from the hotel room you were staying in and get work done. Nowadays... it's all Wireless, so this laptop is well out of it's depth. Fortunately, we can still use ethernet via the use of an AppleTalk Bridge.
I initially tried to make a pseudo-wireless network with my Vonets Wireless bridge. Unfortunately, with this setup I was unable to list any AppleTalk Servers in Chooser. As soon as I plugged in ethernet, the TX/RX lights went a lot crazier and A2SERVER appeared! So.. after a bit of REALLY SLOW copying... what can we do with this?
Yesss... but let's test out a software bridge... These hardware bridges are expensive!
Standard LocalTalk
Using a standard serial cable, you can connect your laptop to another Macintosh. I was surprised with how easy this was... you don't even need a special serial cable!? I would've at-least expected a proprietary Apple serial crossover cable. With a cable I had used for the bridge abvoe, I just plugged it between the Power Center and the PowerBook.
And, just like that, it worked!
Apple LocalTalk Bridge
Another method is via Apple's LocalTalk Bridge software. Using the above serial connection, you can supposedly have the other Macintosh route LocalTalk traffic onto the Ethernet network via the LocalTalk Bridge software. Supposedly you just drop the control panel into the System folder and reboot. Unfortunately... I couldn't get it working easily... but didn't really try too hard!
Meanwhile, if you, like me, can't be bothered getting Apple's LocalTalk Bridge software to run, Low-end Mac has a great write-up on the usage of other bridge software.
AppleTalk tunnels over the Internet
Finally, like we used to do with IPX tunnels, you can even bridge AppleTalk via bbraun's AppleTalk Bridge Software. Unfortunately, I don't have a remote Macintosh AppleTalk network to join, so I'll give this a miss for now!
Apple PowerBook Duo 230
This little beast arrived last week and I've finally cleared the workspace to work on it. I've been on a bit of a buying-frenzy since christmas, so there should be some random things appearing on here in the next few weeks.
Anyway, it was cheap because it's damaged. It's reported to have a non-responsive keyboard, a broken screen latch and a poor install of System 7.6. The poor install is described as "every app, when double-clicking, just throws error -39".
Keyboard
So, turns out people have fixed these before. That's a cute story.. but I have never thought of using an eraser on any of those goddamn-awful rubber buttons. Does it work?
Got the required utensil... next...
Ok, getting the keyboard out was easy enough... just don't follow these instructions. The author says to remove the bottom two screws... this is WRONG!. Remove the top three instead! Actually, I just checked the link... he's responded saying he'll fix it. I left a comment under the image where he points to the screws to remove. Anyway, where were we... Under the keyboard, you'll see how the keys are held in. I initially wanted to remove the backplane, but it's plastic-welded in place via the lugs.
Above, in the dark holes, you can see that the keys are held with two opposing clips. Turns out that, if from the top-side you just apply gentle pressure to the top-half of each key, it'll gently prise out!
Once the keys are off, you have direct access to the rubber sheet. This actually has the graphite contact rings under it, so don't be too rough!
As you can see, each key has a black ring directly under it that is pressed down onto the membranes. There are actually two membranes, but they act different to the regular press-them-together. Usually there's a third sheet in-between the two membranes that keeps them separate... instead we have two membranes that form opposing semi-circles that the rings under the keys connect.
So, from here, GENTLY rub the areas that receive contact from the rubber rings. There's a caps-lock LED to the left that you need to watch out for... what did I say? Watch out!
Too late... my eraser was too large, my force too strong. I recommend using a pencil with an eraser on the end... or just anything with a finer tip! I'll fix that LED at a later date. Let's assemble and see the difference.
Yessss! It works beautifully. Meanwhile, there's weird red dead pixels... but they don't line up with pixels... maybe there's something in the screen layers... fun for when I replace the latch later.
It's alive! Time to network it. And reformat once the MiniDock arrives.
Replacing the ear microphones on a Sony Aibo ERS-7
He'd arrived a few weeks back and gets energised a few hours per week... but he's a bad dog! He says "Good bye" in repsonse to me saying "Hello Aibo" and I'm going to blame him first... it can't be my mumbling? Can it? Just to be certain, I browsed around and found a DIY Repair Guide on Aibo Doctor. I quickly ordered a selection of microphones from element14 and got to work. Canine surgery is daunting!
The Microphones
As I always manage to get my orders wrong, I went ahead and ordered a selection of Microphones.
Note that an ERS-7 Aibo needs 6mm microphones, so you can see that one set is already incorrect. Next, there's directional and omni-directional. The microphones in Aibo are omni*, so I settled with the KECG2742TBL-A units.
Disassembling Aibo's Visor
Following the instructions here, one can disassemble Aibo's head to get to his ears. First step, remove the rubber earlobes by stretching them over the silver joint. Next, open his mouth and remove the two screws.
With these two removed, you can un-hook the rear of the bottom half of his head. This shell is not directly connected to his bottom jaw, so open his mouth fully and then push the whole lower-half back. With it unhooked, you can then bring it forward again and bring it over his jaw. With this piece out of the way, it's back to the front of his head where we need to remove the two outside screws on the metal plate inside his nose.
With those two out, you then need a longer screwdriver to get to the two screws deeper inside his skull. They're on either side of where his jaw would attach near his ears. See the image below, one screw on one side is in focus.
Finally, there's a clip on each side just in front of his ears, holding the visor on.
Very gently pry this open and the visor should lift up. You now have the option to disconnect all the cabling, but instead I just let it rest forward. Make sure it doesn't put undue pressure on the ribbon cables inside.
You now have access to the ear joints.
Disassembling Aibo's Ear Joints
Ok, this isn't the actual ear/microphone yet... before we get to that, there's a bit of fidgeting required to get the ear joints disassembled. When following the next steps, at no time will you need to apply excessive force! Doing so will most-probably damage poor Aibo. The ear joints are a two-part component and are built to be assembled/disassembled with ease. If you look at either side of Aibo's ears, you'll see that one side has a fixed arm and the other has an arm that slides backwards. The fixed arm is at the front and also has a little actuator (metal bar with notch) that is the mechanism that flaps Aibo's ears around when he's playing.
So, back to the joints: two pieces, first is removed by sliding the rear arm further to the rear. From there, you can grab the whole circular joint and unhook it from both front lugs. There's a lug in the actual main arm and a lug in the little black actuator arm.
The image above doesn't really help to explain how to undo it. The movement is one-shot and you can see in the photo above that the black actuator is on the left. This means that you're looking at Aibo's right ear and that you'd grab the top silver circle and slide it gently to the right (rear of his head) until both lugs are clear on the left. Once done, you can then slide off the rear shield.
From here, it's a single screw and the microphone + housing is free. Make sure you also unhook the cable!
Replacing Aibo's Inner-Ear
With the microphone unhooked and unscrewed, the silver shell can be lifted off (gently) by applying pressure to the joints that hold it on. With this off, you can really see what condition Aibo's ears are in!
From here, you can slide the microphone out, just enough, to be able to de-solder and solder a new component.
As you can see, I cheated and used the phone the new microphones came in to hold them in-place whilst soldering. I used the datasheet to make sure I got the polarity the correct way around, assuming that red was positive.
With everything wired up, the microphone was pushed back into the housing and re-assembled. Make sure that you have the wires in the correct groove according to the side the ear has been removed from!
Finally, as per above, there is absolutely no need for excessive force on any part of this assembly. I found that, once trying to re-fit the visor, it wouldn't sit flat! Turns out that I'd assembled the rear part of the ear-joint incorrectly and only one side of the guides was actually in the right spot!
If you look above, you can see that the left guide is sitting above the plastic strip that it was meant to slide onto! This meant totally dismantling that ear again to pull that part back and slide it back on again! Painful, but required.
Can Aibo hear me now?
Nope, same as before! Turns out you can just use Clinic Mode to determine if his microphones actually really need replacing! I should've done this first, but I also sorta wanted to play doctor and see what his insides looked like!
OpenTTD 0.1.4 on TurboLinux 1.1 for Power PC
So, TurboLinux 1.1 is up and running on my Power Computing PowerCenter 180. It took a lot of effort and what is the result? A cobbled-together version of RedHat 2.0 for PPC! Ancient. I should probably stick to tuxracer, but that may even be 'too new'. I want to get OTTD running on this, so I've chosen a really early version that will hopefully mean I don't need to uplift the entire kernel/OS to get running.
Automake and Autoconf
To build OpenTTD, we'll need an appropriate version of SDL. I chose 1.2.1 and, upon trying to build this, found out that it then needs newer versions of Automake and Autoconf. Actually, it requires Autoconf 2.13 and, perfectly, we only had 2.12 from the CD-ROM! One point makes a difference, eh? Linux from scratch has a great tutorial here for autoconf, so I just followed the instructions and installed very easily.
tar -xzvf autoconf-2.13.tar.gz cd autoconf-2.13 ./configure --prefix=/usr make make install
automake 1.4-p6 was then built and installed (same process as above, but with a different archive and folder name)... and now SDL would behave.
SDL 1.2.1
SDL was actually very straight-forward, once I knew what I was doing. I actually initially started down a path of upgrading the compiler and libc, but then quickly decided that it was a dependency-can-of-worms and just left everything as 'stock' as possible. So, back to SDL, downloaded 1.2.1 from here, extract it and try to configure it. Actually, you can't, you need to call autogen.sh first...
./autogen.sh
With the above auto* tools installed, autogen will sit quietly for a few minutes and then tell you that you're ready to run configure...
./configure
This completed cleaning, so now we just make...
make
This then took hours... and eventually failed! There was a very obvious error: the installed version of RedHat 2.0 (I mean, TurboLinux 1.1) does not have a linux/joystick.h header file! What to do/guess?
./configure --disable-joystick
It didn't complain, and rebuilt the Makefiles... including those in the src/joystick folder... bad sign? Let's quickly build that and see what happens...
cd src/joystick make
It compiled fine! Seems that it still needs to create a 'don't make anything' Makefile in there. Also, you could see a new GCC arg of -DDISABLE_JOYSTICK, so my fluke worked perfectly. Anyway, let's go back and re-build.
cd .. make
The build continued... And finished! What next?
make install
This also succeeded, with a few warning through it, and a bit of doco which zoomed past, not allowing me to scroll back up! Regardless, the following is used when configuring:
which sdl-config /usr/local/bin/sdl-config
Nice! But actually, it wasn't... I'd later find out that half of the source was still expecting joysticks and that I should've performed a make clean when I re-configure'd! Also, the SDL bits and bobs landed in the /usr/local folder... not optimal on this system, so at the very start, if you're playing at home, use this configure line instead:
./configure --disable-joystick --prefix=/usr
And then OTTD will build! Or so we hope...
OpenTTD 0.1.4
The source was extracted and I started by trying to configure:
# ./configure error: permission denied # chmod a+x configure # ./configure : bad option
Actually inspecting the configure script just shows it replacing the SDL variables in a JamFile? Uh oh... not a Makefile... we don't have Jam on here! There's also a Makefile, does that work?
# make ... Makefile:113: window.d: No such file or directory ...
Eh? Started building OTTD and it was quickly apparent that it hated the Makefile. I started creating a new version, and things were working, so I looked at the old one again and realised the line-endings were incorrect! Make sure your Makefile has just \n and not windows endings! Kicking it off again, all was working fine, until it got to minilzo.c/.h.
minilzo.c:249: Invalid token in expression
This file is sprinkled with multi-line \'d source and gcc simply hates it all... so it had to all be collapsed.
#define LZO_CHECK_MPOS_DET(m_pos,m_off,in,ip,max_offset) \ (m_pos == NULL || (m_off = (lzo_moff_t) (ip - m_pos)) > max_offset) #define LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,max_offset) \ (BOUNDS_CHECKING_OFF_IN_EXPR( \ (PTR_LT(m_pos,in) || \ (m_off = (lzo_moff_t) PTR_DIFF(ip,m_pos)) <= 0 || \ m_off > max_offset) ))
All those slashes weren't allowed... so a quick find/replace in Notepad++ of '\\n' to '' worked a treat. lzoconf.h also had a few... but, with these all collapsed...
unix.c:10: sys/statvfs.h: No such file or directory
Indeed, the file didn't exist! But, statfs.h did, so I did a quick rename! And well, it built! And failed when I ran it as english.lng was missing. Usually you'd build the strings, but I stole the file plus the other required GRFs from my standard TTDX Data Archive.. that was always kept near for emergencies such as this!
And it loaded! Slow, chuggy and crashy with lots of frameskip warning shown in the console. Actually, the whole thing would segfault when I tried to move the window on the screen. From here, I'm happy to have achieved this much, but I'm not going to polish it. Instead, it's time to test a newer version of Linux.
TurboLinux 1.1 on a PowerCenter 180
I've been meaning to try this for a long time, after getting BeOS to work on the PowerCenter. Actually, I now realise I haven't even posted about that... I promise to do that later. Anyway, I'd recently been scouring the vintage column on eBay and trundled across a beautiful jewel-cased 2-CD version of TurboLinux 1.1 for PowerPC (original site). There was absolutely no one bidding on it, so I took that and a camera for a Raspberry Pi, of which I'll tinker with later.
For those who want a copy of the ISOs, I've dumped them via the instructions here. Of course, if you're inside TurboLinux (Inception?) then you can't use isoinfo as it doesn't exist. Instead, I loaded into Mac OS 9 and loaded up Adaptec Toast to get the data. Actually, I loaded up Toast to make a toast-formatted ISO. But instead, toast just 'stopped' when I asked it to save a disc image. Either way, dd worked with the parameters that Toast provided and I even managed to use a burnt copy to run the final install... how else to test?
A note on the images above, they were built with dd on ppc linux (TurboLinux 1.1 at that!) and they failed to burn with PowerISO. Somehow ImgBurn succeeded.
To get this up-and-running, I needed to put my PowerCenter 180 back together. I'd recently scavenged a few parts to get the AV Power Mac 6400 running (oh crap, that's another post that never happened) and so slapped RAM back in this machine and a second spare 50-pin SCSI drive.
Note that there's already some great tutorials online. This LinuxPPC Installation Guide by Jérôme Cornet helped me tremendously.
Preparing the SCSI drive
I could've/should've changed the order of this post... but for those playing at home who just want to get this installed and working, you'll want to set up your drive correctly first! When I was first tinkering, I happened to do it in the reverse order: slap the drive in and start the Linux install... I don't recommend this as the partitioning tool doesn't really like 'weird' disks. I had issues when trying to re-write the partition tables on PC formatted drives, to the point where some would prevent the machine from even booting.
To get started, you'll need a totally separate SCSI HDD from your Macintosh install (if you have one) to get TurboLinux going in a PowerCenter. On my specific machine, the OpenFirmware boot screen stays black, so I actually don't know if there are options there, or if the quik bootloader (installed at the end of the process) actually work. If they do, then you may be able to get away with one HDD, if the bootloader let's you back into Mac OS. Or maybe Boot-X will work, I'll test that at the end of the article.
Anyway, I grabbed a spare Seagate 2.1gb drive and installed it as SCSI ID 0. I then downloaded FWB Hard Disk Toolkit 4.5.2 and formatted it. Finally, the drive was partitioned with one 2gb root partition and one swap partition. I found that there are errors if the root partition is over 2gb, so please make it no larger. Note that you cannot use the LinuxPPC partition type. I tried this first and TurboLinux will just tell you that your drive isn't prepared. Instead, you have to choose custom and then type in Apple_UNIX_SVR2 as the partition type, for your swap partition also! The installer then distinguishes the partition by name, so make sure, as above, you call them root and swap!
Note that I didn't low-level format the drive the first time and managed to muck up the whole drive when attempting my first install. This was because I'd created a 4gb root partition and the system reported that it was out of space!? I then used pdisk in the installer and somehow whacked the drive to the point where it started reporting that it was only 1gb in size. Because of all this, I can only recommend that you simply start fresh with a low-level-formatted clean disk.
Grab your Linux CD
TurboLinux requires a 1.44mb floppy to boot the installer. Make sure you have a clean Macintosh-formatted floppy available. Note that during the install, it managed to fail when copying installer.coff file over to the floppy. I Ok'd out of the error and just copied the file manually. In hindsight, you should eject the floppy now! I then re-ran the installer, skipping the copy-to-floppy, and it turns out the final step afterwards is 'double-clicking' on the Install Linux icon that it's put on the desktop...
So, that Install Linux icon just loads up a preset into the Boot Variables control panel. This was installed by the TurboLinux installer and is just a GUI to manipulate OpenFirmware's settings. The preset it loads is to boot installer.coff file from the floppy drive. Double-click the link on the desktop and then choose Write & Reboot. It'll ask if you're ready to reboot. Eject the floppy now (if you haven't followed the above advice) and hit Yes. As soon as you press the button, slap that floppy disk back in. I took my time to do this the first time and got nothing but a black screen! Turns out my machine was sitting at the OpenFirmware prompt, but I couldn't see it and had no idea what was going on. At this point, as that I hadn't ejected the floppy, it got ejected as part of the reboot process (without me noticing), and OpenFirmware just baulked at a command to boot from a floppy disk when there was nothing in the drive.
What to do? Either reboot again with the disk in the drive, or just slap the disk back in, blindly type boot and hit enter.
Nostalgique RedHat 2.0 (I mean TurboLinux) Installation Process!
If you've made it this far, then you're doing well! My gosh... I remember sitting on the floor of a friend's house (Hi Nathan!) back in maybe 1997 installing RedHat 5.x and running through these screens. Back then the IP configuration confused the crap outta me... doesn't this come with a DHCP client? Anyway, this time around it was entirely painless... just follow the usual prompts...
Next up, partitioning! Make sure to highlight the correct SCSI device in the top list... use the tab key to get up there and select with up/down arrows.
If you skipped the partitioning step above, then you'll need to hit Edit and follow the next block. If you have already partitioned your disk, then hit Done and skip it with gleeeeeee...!
Partitioning with pdisk
Yeah, not fdisk, pdisk! Note that fdisk is also on the distro, but pdisk is a wrapper for PowerPC-style partitioning which knows how to create Apple Partition Maps.
If you've really keen to do it this way, then I'll assume that the installer has listed your drive and you've tabbed over and chosen Edit. From here, you're thrown to a console prompt at the bottom of the screen and you'll need to navigate pdisk carefully. Please make sure to chose the correct partition first, before hitting Edit!
Disregard that it tells you you've chosen one device in the /dev folder and that its actually loaded the same device from the /tmp folder. This is just the way it seems to work and you'll need to find the device in /tmp later if you want to switch to another console and hack behind-the-scenes.
Anyway, pdisk accepts most of the fdisk commands, such as p to list the partition table. If you want to mangle it yourself, then use d # to delete individual partitions or i to completely re-write the partition map and start fresh.
Once you've got space to create your root and swap partitions, you'll want to use the command c to create them. If you're feeling professional, then split everything up into usr/home/root into partitions (this stops one of them from stealing all of the disk space from another and causing system failure). But, if you're lazy like me, then you only need to create a 64mb swap partition and then another partition for root, filling up the rest of the drive.
The basic structure to create a partition is as follows:
c 2p 64m swap
The command above will create a 64mb partition with the name swap at position 2. You can then type p and hit enter to see the new listing. Specifically you can see how much space is left on the disk. I had 1.9g available, so I then created root:
c 3p 1900m root
As opposed to fdisk, you don't need to specify the partition types here. You just need to name them accordingly: swap for swap, root for root. After creating the root partition, I went ahead and checked out the table via the command: p.I was happy with it and wrote the changes to disk via w. Finally, q took me back to the installer and tabbing in a loop back to OK allowed me to proceed to the formatting stage.
Formatting and Package Selection
From here, if you haven't low-level formatted your drive, then I'd recommend bad-block checking on both formatting runs.
You'll then be asked the packages you want to install. Choose what you feel is relevant. You can always mount the CD-ROM at a later stage and individually install RPMS at a later date.
If you've chosen a miriad of groups, then there might be dependencies that need to be installed... please consider and then accept... otherwise your packages will fail to install.
The install will then make the filesystem on the root partition and install the selected packages. If you selected Everything, then expect the following errors during installaion! The packages seem to be corrupt on both the original CD and my copy!
Aww... no Mahjongg!? Note that the packages aren't really important... the machine still worked fine afterwards.
Finally it'll ask a few questions about mice, networking, printers and boot parameters. You really should take a photo of the final window to record the boot-device and boot-file settings required for OpenFirmware!
Once all is done, the machine will reboot, ejecting the floppy. I'd installed TurboLinux around 6 times by the time I'd gotten to this part of writing this article and every-so-often one wouldn't boot at this point... the machine would restart, chime and hang at a black screen. I had to use the magic 4-finger-salute: Option+Command+P+R to get back to Mac OS and then re-enter the boot params from the final step of the installation process back into the Boot Variables control panel and Write & Reboot. It would then boot without fail!
TurboLinux is starting for the first time...
Shit, it booted! But I got a lot of crappy errors in the boot log.. which zoomed past and landed me at the boot prompt.
I logged in as root (as the installer didn't let me create any other users) and checked dmesg...
Not good.. seems that anything network-related just crashed?
Let's check X-Windows: startx got me to a very mustard-flavoured OpenStep desktop, but the Netscape icon from the launcher did nothing... I then tried netscape from xterm and got a segfault! Why is all network-related code throwing exceptions? Oh wait, I have two PCI cards installed in this system doing nothing. One is a 'bootable' Sonnet IDE card and another is a Kingston KNE100TX LAN card. Maybe TurboLinux can't work out if it should be using the onboard LAN or PCI LAN? Let's remove both cards...
A clean boot! I can even ping!
Netscape then even wanted to load... but got sad when it couldn't phone home. Poor thing... a few decades too late!
Screen Resolution
TurboLinux will use the resolution that you had Mac OS configured to. That value is store as a mode-number in PRAM and, unless you've reset it recently, should therefore display how you expect. If you want to override this, then choose a value from the list below...
# 1 512 x 386 60Hz (interlaced, NTSC) # 2 512 x 386 60Hz # 3 640 x 480 50Hz (interlaced, PAL) # 4 640 x 480 60Hz (interlaced, NTSC) # 5 640 x 480 60Hz # 6 640 x 480 67Hz # 7 640 x 870 75Hz (portrait) # 8 768 x 576 50Hz (interlaced, PAL) # 9 800 x 600 56Hz # 10 800 x 600 60Hz # 11 800 x 600 72Hz # 12 800 x 600 75Hz # 13 832 x 624 75Hz # 14 1024 x 768 60Hz # 15 1024 x 768 72Hz # 16 1024 x 768 75Hz # 17 1024 x 768 75Hz # 18 1152 x 870 75Hz # 19 1280 x 960 75Hz # 20 1280 x 1024 75Hz
And replace the value '20' in the command below...
startx -- -mode 20
You'll then get the resolution you desire... as long as you have a monitor that supports what get's output. And maybe as long as you have the VRAM? This unit is decked out, so mode 20 worked fine. You can also pass -DEPTH with the value 8, 16 or 24.
Mounting HFS Extended Partitions
No-can-do out of the box! hfsutils can't mound HFS Extended partitions. Instead you'll just get the HFS shim with the Where_have_all_my_files_gone? file explaining that your data is still on the drive, but your current software is perfectly rubbish. I haven't found a solution to this yet... it seems that hfsprogs is open-source from Apple, but this OS may be way too old to compile it.
Getting back into Mac OS
There's a Linux tool called nvsetenv that will allow you to set the OpenFirmware boot-device setting inside Linux so that you can get back to MacOS on the next reboot:
nvsetenv boot-device "/AAPL,ROM"
Using BootX?
BootX (download it here) got installed whilst I was mucking around with Linux 1999 (mentioned below, and I'll write up a HOWTO on that also) during failed installs of TurboLinux. Just like BeOS, it throws a system extension in Mac OS with a symbol as the first character of its name to make it get loaded first. It then pops up a cute boot dialog to let you choose Mac OS or Linux with a configurable default. This is much nicer than the OpenFirmware prompt as it actually displays!
Unfortunately, there's an issue when you want to try and use it for TurboLinux. We'd need a vmlinux bootstrap kernel available for it to boot that matches the 2.1.x kernel in TurboLinux 1.1, otherwise there'll be a version mismatch. I tried all vmlinux files I could find on the CD; I even copied the exact file from the root partition... but BootX would just display a black screen each time I tried to boot it! Just for fun, I then used the 'Standard LinuxPPC' kernel with /dev/sda4 as the root and the bloody thing booted! But there was no sound and I had no idea what other damage might occur with a mismatched body vs. head.
So this is a really old version of Linux....
I went a'googlin and tried to find something newer, but there doesn't seem to be one! That site also doesn't have these ISOs, so I'll contribute those in due course. PowerISO on Win10 just threw a CRC error reading them? I might try Toast on the actual Mac. And then? Let's try LinuxPPC 1999 or LinuxPPC 2000.
But does it run OpenTTD?
There's no un-emulated version of A-Train to get running on here, so let's aim for OpenTTD. I've actually made this topic a new post as I nearly tripled the draft of this one with my moaning as to how hard it is to find a correct collection of libraries to build anything!
Smushing JSON into submission!
I don't even know how to describe this operation on JSON. The basic idea is that we want to deserialise a stream into something legible, without creating a class for each item in an array. json2csharp believes that each item should be an array since it sees them all as individually named classes. Let me prove it! Here's a chunk'o'data:
{ "trainCount":122, "requestTimestamp":1601124556789, "responseTimestamp":1601128156789, "nextUrl":"https://junatkartalla-cal-prod.herokuapp.com/trains/1601128156789", "trains":{ "8":{ "id":"8", "from":"LR", "to":"HKI", "title":"IC8", "latitude":60.172097, "longitude":24.941249, "speed":0, "direction":0, "category":"IC", "status":"1", "delta":60, "trainType":"LONGDISTANCE", "updated":1601127783841, "action":"deleted" }, "9":{ "id":"9", "from":"HKI", "to":"LR", "title":"S9", "latitude":60.571148, "longitude":25.199523, "speed":0, "direction":0, "category":"S", "status":"1", "delta":60, "trainType":"LONGDISTANCE", "updated":1601128143878, "action":"modified" } } }
So, if you slam that JSON into json2csharp, you'll get the following:
public class 8 { public string id { get; set; } public string from { get; set; } public string to { get; set; } public string title { get; set; } public double latitude { get; set; } public double longitude { get; set; } public int speed { get; set; } public int direction { get; set; } public string category { get; set; } public string status { get; set; } public int delta { get; set; } public string trainType { get; set; } public long updated { get; set; } public string action { get; set; } } public class 9 { public string id { get; set; } public string from { get; set; } public string to { get; set; } public string title { get; set; } public double latitude { get; set; } public double longitude { get; set; } public int speed { get; set; } public int direction { get; set; } public string category { get; set; } public string status { get; set; } public int delta { get; set; } public string trainType { get; set; } public long updated { get; set; } public string action { get; set; } } public class Trains { public 8 8 { get; set; } public 9 9 { get; set; } } public class Root { public int trainCount { get; set; } public long requestTimestamp { get; set; } public long responseTimestamp { get; set; } public string nextUrl { get; set; } public Trains trains { get; set; } }
So, that's actually uncompilable code. Is uncompilable a word? Dunno... this is actually the first time that json2csharp has failed me! No matter the options selected on the site, the output was always bad code... json2csharp doesn't work with ALL json! So, what to do? Well, we actually need to mangle this JSON into submission. The best bet would be to move that train id/number into the array object as a parameter, rather than having it as the dictionary key. We have two methods to do this...
Using jQuery MAP Function
If you are pulling JSON from a hosted browser, then you can run JS in the browsers console and produce cleaner JSON. In this case, you want to use jQuery's MAP function to rewrite each array object:
json_data.trains = $.map(json_data.trains, function (data, idx) { return data; });
If you feed the JSON at the top of this post into that function, you'll get the following:
{ "trainCount": 122, "requestTimestamp": 1601124556789, "responseTimestamp": 1601128156789, "nextUrl": "https://junatkartalla-cal-prod.herokuapp.com/trains/1601128156789", "trains": [{ "id": "8", "from": "LR", "to": "HKI", "title": "IC8", "latitude": 60.172097, "longitude": 24.941249, "speed": 0, "direction": 0, "category": "IC", "status": "1", "delta": 60, "trainType": "LONGDISTANCE", "updated": 1601127783841, "action": "deleted" }, { "id": "9", "from": "HKI", "to": "LR", "title": "S9", "latitude": 60.571148, "longitude": 25.199523, "speed": 0, "direction": 0, "category": "S", "status": "1", "delta": 60, "trainType": "LONGDISTANCE", "updated": 1601128143878, "action": "modified" }] }
Very nice.
Using C# Regex
I've never thoroughly learnt Regex and it still makes me sad. One day I'll sit down and go through a course. For now, googlin' works nicely to find an example for this scenario. Effectively we want to remove the "NUM": and just leave the curly braces. We then also need to remove a curly brace at the end.
var data = (new System.Net.WebClient()).DownloadString(nextUrl); data = new Regex("\"([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9])\":").Replace(data, ""); data = data.Replace("\"trains\":{", "\"trains\":["); data = data.Replace("}}}", "}]}");
So, the first line downloads the data. The second uses Regex to find anything in double-quotes that's a number from 0-9. I actually wanted 0-9999, but it seems you need to match each character 1-by-1, so I gave it options with | (pipe) up to 99999. From there, the third line turns the trains object into an array and the final line closes that array with a square bracket instead of the existing curly brace.
Final C# Class Output
With either of the methods above, you end up with cleaned JSON. From here, slapping that back in json2csharp gets you the following:
public class Train { public string id { get; set; } public string from { get; set; } public string to { get; set; } public string title { get; set; } public double latitude { get; set; } public double longitude { get; set; } public int speed { get; set; } public int direction { get; set; } public string category { get; set; } public string status { get; set; } public int delta { get; set; } public string trainType { get; set; } public object updated { get; set; } public string action { get; set; } } public class Root { public int trainCount { get; set; } public long requestTimestamp { get; set; } public long responseTimestamp { get; set; } public string nextUrl { get; set; } public List<Train> trains { get; set; } }
Thank you json2charp, that's exactly the reusability that I was looking for!
Repairing Atari 2600 Original Wireless Controllers
So, I've recently been repairing a large selection of Atari paraphenalia and, included in the container-load, was an official Atari-branded CX-42 wireless controller kit! The setup is pretty awesome; the base unit has a power input and then an output to go to the console. This means it doesn't need a separate power adapter as it chains into the power for your Atari. It then has the two controller plugs which you simply insert into the left and right controller ports on your console. Finally, the joysticks are more-or-less standard one-button Atari joysticks with extra 4cm bases to contain a 9v battery and radio circuitry.
Of course, this came to me due to being unhealthy. One of the controllers wouldn't go left! I'd usually associate this to cable failure, but... well... they don't really get much abuse in this scenario! They needed a good clean anyway, so the tear-down and diagnosis begun.
Is it the controller? (Hard way!)
So, just because I'd previously torn 100s of these apart, I went straight to the controller to check the internal switches. The construction of these is relatively simple, until you try to separate the joystick circuit board from the actual joystick... so many screws and springs fly everywhere. Regardless, once the unit was open, all switches were tested and found to be functional. I didn't think of taking a photo at the time, so you'll just have to imagine.
Is it the controller? (Easy way!)
After a little googlin', I stumbled across this hint stating that you could 'hear' the controllers using an FM radio. Hah, of course you can... It seems that they use frequencies down around ~40mhz, but somehow you can hear this at ~100mhz on your FM radio. So, what to do? Find an FM radio first. Fortunately I had some on the shelf thanks to wanting to listen to tapes a few months back.
On Windows 10, you'll find there's no more sndrec32. Instead you need to browse over here and Voice Recorder. Yey for anti-monopolistic effort! Anyway, I managed to record the following:
What you'll hear above is: Static -> radio station -> static -> radio station -> static -> weak carrier signal! -> misc. tuning -> STRONG CARRIER SIGNAL! -> 5 presses of the fire button -> ~7 full rotations of the joystick -> 6 presses of the fire button (the last one is longer) -> static. Totally random! But it's a great way to test.
As you can hear above, I started just above ~102mhz FM and scrolled down until I found the carrier signal. Note that I had difficulty originally finding the signal as it's not that strong. Make sure you hold the joystick against whatever FM receiver you're using.
Once the carrier signal was found, I then fine-tuned it until the signal was the strongest and began mashing buttons. Of course, just because LEFT is transmitting something, doesn't mean it's transmitting the correct signal! But hey, we can now check the base to see if there's any obvious issue.
Is it the base unit?
The circuitry inside this unit is, thankfully, quite easy to trace and diagnose. The unit consists of two individual circuits, decoding each controller independently. This is actually a life-saver, thanks to one of the joysticks being 100% functional! With my multimeter in-hand, I went ahead reviewing the circuit and measuring signals along the way. Doing this for both joysticks and both circuits meant that it was straight-forward to determine where the signal started going funny!
Starting from the output, there are two hex-inverter chips on each side. All 6 inverters (2chips x 3inverters) on each side are used and these flip the signal before sending it out to the controller port. The left button was seeing a twitch in the voltage, but not enough to flip the inverter to full +5v. The input was meant to drag to ground, sending the full signal out, but it wasn't happening.
Tracing the signal back, there is an OKI MSM4015RS IC and, for the life of me, I still can't find a datasheet online. I thought this would be a show-stopper, but after testing the signals on this IC for both joysticks when the fire button was pressed, it turns out they're both reporting the same values.
I therefore traced the value back up towards the output and found that the output after the first inverter wasn't being dragged low enough. It was 0.6v on the working joystick and 0.7v on the failing joystick. The output of the inverter is tied to ground with a green-cap and tied high with a 4.7k resistor.
The resistor checked out, but I had no way to test the capacitor with my multimeter. Instead, I swapped the capacitor from joystick one's side to joystick two's. Surprisingly, this now saw joystick one's LEFT button working and joystick two's was now faulty. Nice!
Replacing all green-caps
You'll find three different-valued sets of green-caps on this board: 10x 183k100v (18nf), 10x 223k100v (or 2A223K) (22nf) and 6x 104k100v (100nf). I went ahead and purchased a full set of them from Jaycar with the goal to replace every one of them.
Who knows how close another is to frying?
The aftermath... (did I say only the green-caps? Ooops.. I didn't discriminate and took out the electros as well.)
Removing and replacing was easy enough. I really recommend Goot-Wick desoldering braid for cleaning up the PCB whilst you're doing things like this.
Now up doesn't work?
Hah, seems that enough plugging-and-un-plugging of the controller output cables from the main board caused one pin to fail. Thanks to standard technology, there were plenty of these plugs in my junk box, although not with the same pin count...
So I borrowed an internal connector from a three-pin plug and soldered it in. Worked perfectly!
A minor note on the usage of these wireless controllers
With the wireless base unit powered-on and fully-connected to your Atari, it'll send spurious/erratic/totally-crazy signals to the console on the joystick cable of any joystick that is turned off! There is therefore a correct sequence for powering everything up... Turn the joysticks on first and then the base unit. Note that the base unit doesn't have a power switch, so I'd recommend always turning it off at the wall. I suppose you could then leave the Atari power switch on, as you'll be using the wall switch as the power cable is chained through the wireless controller receiver. Just make sure that both controllers are powered on BEFORE you turn on the wall switch!
When I was first diagnosing this kit, I thought all was pointless after seeing the random signals coming out of the base unit. I was very happy to see the signals settle once the joysticks were powered up!
Testing
This unit worked splendidly with 2600-series consoles and games.
Even 2600 games in a 7800 console. What didn't work was the built-in asteroids for/on the 7800.
For some reason, the down and fire buttons won't work. Of course, a standard 1-button Atari 2600 joystick works fine on 7800-Asteroids, but this unit doesn't. I did a little digging and found that the pins aren't brought straight to ground... instead they hover around 150-250 ohms... I wonder if that's enough to not send through a proper button press? Also, they seem to 'repeat'... the multimeter actually goes pretty damn crazy when a button is pressed, beeping on and off as the resistance floats near-zero. As mentioned above, each output is tied high by a 4.7k resistor and low by a 22nf green-cap capacitor. I assume the cap is there to de-bounce the incoming signal, but maybe it's not big enough to trigger a single press for the 7800? I don't want to modify this unit as it's very original, so I'll just suggest that if anyone else wants to use this on a 7800 then they should tinker with the pull-down capacitors on the output lines.
Again, they worked 100% perfectly with all 2600-series equipment I tested.
Battery Cover
One was missing, so I used my Creality CR6-SE to bring a replacement. It didn't turn out toooooo bad. Works well when there's a battery inside... falls out when there's no battery!