The Annual Christmas Pilgrimage – December, 2018
As per usual, it was another trip to Canberra via Cootamundra over the Christmas break. This time was a little different though... no holiday pay! I'm now a contractor! Regardless, both trains and family needed to be visited! The trip started at the usual sparrow-fart-o'clock and I caught the up Albury somewhere along the parallel stretches of highway and railway.
Awful lighting and a bad angle... I then totally missed the southbound XPT. I heard it growling through as I was filling the tank at a service station. From there, there was nothing on the rails. I grabbed a pie or two at Culcairn, but wasn't impressed at all... maybe the baker had been in a hurry. The first sign of movement was the southbound Harefield shuttle prepped at Junee. Of course... just as I approached it started to head south!
I then whipped the MR-2 around and got to the favourite position... The train had crawled out of Junee, but nearly beat me up the hill? Nice effort!
Crap lighting... the clouds really didn't want to play ball. From there it was more quiet rails. After checking in at the usual motel I was told the pool had a leak and had been emptied. The MR-2 hadn't had aircon for a few years, but it was ~35 outside and I was looking forward to a swim. Instead it was aircon in the motel room whilst I got a bit of work done.
The rest of the afternoon was spent with good friends from Cootamundra. Thanks Laurie for driving and knowing all the good spots to get the SSR grain rake! The proof is as follows...
I hear they're now calling the Qube QBX locomotives 'Chiko Rolls'... pretty hilarious actually. Two separate consists came through in quick succession! We then retired for the afternoon before a great meal at the local.
The next morning was spent getting in front of a northbound SCT service. It'd beaten me out of Cootamundra, but I got it before Yass. I hereby dedicate the next block of photos to my favourite location: Yass Junction Station.
I expected to then just dawdle back into Canberra... but instead found the SCT pulling to a halt in the station area. The drivers then inspected all axles... they must've triggered a sensor somewhere and been told to check if anything was actually wrong? They held there for 10 minutes and then pushed off again.
That was it for the trip towards Canberra. Whilst there I swapped the AW11 MR2 for a 2015 ZRE182R Corolla and, well, it's not the pocket rocket that the MR2 was, but it's got enough of it's character and so much more comfort! The return trip was therefore a quick one, going through to Melbourne in one day.
There's the 'rolla at Jindalee. Collecting rock-chips on the bonnet that I wouldn't realised until I washed it in Melbourne. Damnit. Anyhoo... on the way back, QBXs were seen bolting into Junee...
And then the XPT passed a CK grain at Gerogery?
And that was another wrap. Home just in time to catch the Air Asia X flight to KL the next morning!
PCI 64-Bit Backwards Compatibility
Picked up this awesome external SCSI HDD enclosure last week but was perplexed by the cable. There's an ultra-tiny plug on one end and a standard-sized external 68-pin plug on the other. So far I've only seen this plug on internal cables and didn't know it was built in an external format also.
I was already in trouble. All of my standard ISA or PCI cards are either Centronics, DB25 or ultra-tiny plug and the only card I have with a full-width 68-pin external socket is a 64-bit PCI card!
The last motherboard I had with 64-bit PCI slots was the Apple G4 Graphite and that's long gone. I realised I could plug the cable into the internal side of the card... but that wasn't optimal!
A quick google then lead me to understand that 64-bit cards are backwards compatible with 32-bit slots! Supposedly there's an 'enable' pin on the extra 64-bit edge connector section where, if not brought down, the cards are expected to work in 32-bit mode!
So I lined it up...
And plugged it in...
And the world was a happier place! The drives came online (with extended IDs 14 and 15) and their contents happily displayed. They turned out to be a RAID pair of NT Server NTFS drives with home directories from an old Radio/TV company. Very random stuff in here!? Is data archeology a thing!?
IBM PS/55 Z – ATX Motherboard
So, this ended up being a bigger hack than expected... but I'm happy with the result! I picked up this unit from eBay and hoped to use it as-is, but the motherboard wasn't healthy and Microchannel anything is impossible to find. I therefore replaced the guts with a DX2/66 motherboard! It all worked perfectly and I was happily playing games... but then I found a P166 at the markets and felt it was time for an upgrade.
Power Supplies
I picked up a Pico-ATX adapter on eBay rated at '120w' and had very little success with it. I could get it to boot without any cards... but as soon as I added anything on the ISA bus, let alone actual drives, I had zero action. Seems that it's just not up for the current required. I was also feeding it power from the internal 12v on the IBM's motherboard and this may have been overloading a single 12v rail.
It also needed a floppy connector... seems that these are for mini-atx boards where floppies are a distant memory...
Thinking that it just needed more amperes... I mounted a new 12v supply inside the monitor housing...
I grafted this onto the power rail to the front switch of the machine... it was rated at 110-240v, so there were no issues with step-downs...
This then meant the front power led was no longer lighting up, as the internal power supply had no current draw... I had to then use a resistor and put it on the 5v output of the new supply.
But... it still just didn't work... the actual Pico-ATX unit just wasn't up to the challenge of the old P166 motherboard! I then purchased the '160w' version off eBay, but it was EXACTLY THE SAME unit?
Slightly-larger ATX supply
I happened to be near an old PC shop in the city where I'd previously sourced a 'smaller' ATX power supply. Turns out they still had stock! I wasn't overly sure if it'd fit, but I was happy to have a spare in stock regardless. To my happiness, it fit perfectly!
I mounted it under the lid, as per the previous power supply, and ran the 110v in (flicking the voltage selector switch!) from the main power supply. The ATX cable was then fed straight down the back into the motherboard 'compartment'. It booted and the machine was back to normal... this time with W98SE and more horses!
B&O BeoVision MX 7000 RGB SCART
It all started by finding this beast on the footpath. I saw that it had two scart inputs and had to have it. I built an RGB cable for my MSX a long time back but have always been disappointed by its performance via a scart-to-HDMI converter. So, I set about testing and hooking it all up. Of course, it didn't have a remote, so I had to use an Arduino to translate another remote into the appropriate codes.
With access to all the menus, I started toying with values, but the picture from the MSX was still broken!
What can be configured?
Via the front main menu? Nothing. Via the service menu? A lot more. With my model, I had to pull off the back case and short the service pin header (I'd actually really like to just install a pushbutton switch onto that!)
Once off, and with the TV on TV mode, use something metal to short those two pins in the middle that say Service Mode. You'll then get the following message on the TV...
Last error was a pf? Sure was... I just pulled the plug... total power failure! Here's the other error descriptions...
Code | Description |
---|---|
No | no error registered |
PF | Power Fail |
00 till FF | Error address on the I2C bus |
DF | Data failure (maybe EEPROM 6IC6 on the cpu board defect) |
4E | 1/38IC6 Tuner & IF port expander |
84 | 1/38IC2 A2 Stereo decoder |
40 | 31IC7 NICAM stereo decoder |
42 | 41IC5 D/A converter for cut-off and drive |
22 | 37IC2 Teletext decoder |
8C | 13IC2 Deflection controller |
82 | 14IC1 Audio Controller |
86 | 14IC9 Video Controller (14IC9 means Board 14 Chip IC9) |
Anyway, using the arrow keys, you'll be able to configure the following settings. There's an awesome thread post here on BeoWorld from Die Bogener explaining all sorts of troubleshooting for the TV!
Code | My Default Value | Description |
---|---|---|
Rdr | 50 | Red drive |
Gdr | 45 | Green drive |
Rcu | 28 | Red cut off balance |
Gcu | 29 | Green cut off balance |
BRI | 03 | Brilliance Preset |
COL | 03 | Color Preset |
Hfq | 37 | Horizontal frequency |
Hph | 35 | Horizontal phase |
Ham | 22 | Horizontal amplitude |
Vam | 29 | Vertical amplitude |
Vsc | 32 | Vertical S-correction |
Vsh | 30 | Vertical shift for centering |
Vli | 18 | Vertical linearity |
EWc | 05 | EastWest corner |
EWp | 1 | EW parabola |
EWt | 41 | EW tilt |
With all these settings being adjusted (and then reverted) to no avail... I started to wonder if it wasn't a Japan vs. Australia thing... NTSC vs. PAL? Does the RGB signal have a 50hz/60hz rate or other 'remnants' from the units output? Is it Australia's fault for successfully implementing only one standard? (For once!)
Does RGB care about NTSC or PAL?
Wherever you read, you'll find hot debates over RGB and how the signal differs from a PAL or NTSC console. From what I understand, it's a NO. Any TV with SCART that is RGB capable will take an RGB signal from any device. Do correct me on this, thought!
Can My TV Decode NTSC?
Here's the service manual which points out the following difference between the PAL and PAL/SECAM versions...
Yeah, that's not just PAL/SECAM... it's PAL/SECAM/NTSC! But wait... the MSX works over Composite? Which has to be NTSC-J Composite? What gives?
Maybe it's my RGB Cable?
There's a good bit of information at this post regarding RGB cable issues and required voltages. Supposedly the SYNC signal on the SCART plug can just be fed Composite video, but it needs to be within tolerance. This also goes for the switching which declares what video format is expected on the SCART plug. So, after reading more on Sync for SCART , Sync Strippers and types of Sync from random consoles.. I ended up slightly more confused, but decided to rebuild my cable.
Thankfully, my junk box had a beautiful SCART-to-SCART cable... I didn't know these existed, but it makes total sense that they do. It's wired as a 'crossover' as the output from one machine needs to be fed to the input from another. I'll never be outputting via a SCART plug, so I decided this hefty cable would shield me nicely from interference and provide a great base for a proper RGB cable for the MSX.
With the SCART pinout in one hand and the Japanese MSX RGB pinout, I set out to rebuild the cable... I hooked up the minimal wires: R,G,B and Sync + all their required grounds. This got me nowhere. So I then hooked up Ys to the 'output select' and I received a mis-coloured picture!
I quickly slapped spacebar... the fish are the screensaver for multemente on MSX...
Oh right, I've swapped G and B around... wait... it's reading the RGB channels? But wait... if I then switch the TV to DVD... bang... wrong format!? Wait... this has worked all the time? I hadn't noticed the clearer picture... I'd just thought it was pulling composite over SCART... instead it was actually displaying the correct picture. For some reason, the TV is expecting a different format on V.Aux and that's where it's screwing up. RGB WORKS!
It turns out that, if you have your SCART-connected device turned ON, then the TV tries to switch to its input, even if you've selected the wrong input? Seems to be a bug? Or a problem with my TV configuration? The TV was configured as follows...
I set out to test: PS1 in AV1 and MSX in AV2. The PSX worked perfectly when the MSX was off and the TV was set to 'DVD' (which was the setting of AV1)...
But as soon as I turned on both consoles, the MSX would trigger the AV1 channel to distort. Switching to V.AUX (or AV2, where the MSX was plugged in) worked! So, all this time... everything was working, I just didn't understand (still don't!) how the inputs work on the MX 7000. All I know is that you should only have one input powered up at one time! So, here's some RGB goodness...
SCART cable quality!
This has all occurred because I saw the quality of the original SCART cable and thought it was composite! Here is the old cable plugged back in again. Note that it's just 8-core wire, no shielding... so the quality sorta makes sense...
Compared to the shots above, you can see the distortion. But I admit, it's really hard to take a proper photo of a CRT! So.. it was nice to build a real cable.. although, dealing with the gauge of wire was a little tough. It seriously had a mind of its own!
Both units need an overhaul
Whilst doing all this research, I found notes on both items for overhauls! Seems that an urgent capacitor replacement should be carried out on any Japanese MSX with a specific daughterboard. Also, the BeoVision MX Service Guide indicates a whole bunch of capacitors that could be life-expired!
JR West – Osaka Higashi Line Update!
I've mentioned this line before and have been eagerly awaiting its completion. Recently, JR West advised that the new year (2019) would see the opening of the line. 4 days ago, JR West announced the line would be fully open on the 16th of March 2019. Awesome!
So I went looking at the Shin-Osaka Webcam and it didn't take long to see the following!
And back again...
I don't know if they're revenue services or not... but the line is active!
B&O BeoVision MX 7000 Homebrew Remote
After picking this TV up off the footpath, I found it to be a little tedious without a remote. A quick google saw that it needs a specific B&O remote and not just any universal contraption. From here, I managed to use my PC's serial port and WinLIRC to control the TV, albeit rudimentally. The MSX, whilst over SCART, wasn't displaying a proper picture, so I knew I needed a proper remote to flick through the settings quickly.
Arduino as a remote translator
I found a neat little Arduino Remote at Jaycar and decided on the spot that I'd use an Arduino to translate its buttons to those of the TV. This would require an IR Receiver and an IR Transmitter. I know the B&O tranmission needs to be fast, but the receiver can be anything off-the-shelf as long as it works with this remote below!
Thanks to Sparkfun's great IR tutorial, the build of the actual circuit was very simple. Two modules and a resistor! Make sure you point them in different directions so as to prevent one remote from interfering with the other.
Ken Shirrif's IRRemote Library is the only code library needed to get up and running. I then started searching for help on timings... It turns out that someone else has already requested this functionality but there's no confirmed results. Fortunately, there's a few good hints towards the bottom regarding transmission signal timing. Supposedly the library can be tuned to just output the data at the right frequency... so... let's try! We do get another hint here about setting the right timing, but with a warning that the timing might not be 100%. It seems that the unit can deal with a 10khz difference.
Anyway... I was going to go long-winded with a simple chunk of code to just send a power-on, then a chunk to receive the data from the cheap remote, then a bridge to bring it all together... but instead, here's the answer.
#include <IRremote.h> #define TV_ON 0 #define DVD_ON 1 #define TV_SAT_DVD_GO 2 #define ARROW_UP 3 #define ARROW_DOWN 4 #define ARROW_LEFT 5 #define ARROW_RIGHT 6 #define TV_MENU 7 #define VOL_UP 8 #define VOL_DOWN 9 #define KEY_ZERO 10 #define KEY_ONE 11 #define TAPE_ON 12 #define ALL_OFF 13 #define CHAN_DOWN 14 #define SAT_ON 15 #define V_AUX 16 //now for the button data, each is 2 bytes, but only the second is used, //to use the indexes above to store the second bytes in a 8-bit padded array. unsigned int button_bytes[] = { 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, //TV_ON 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, //DVD_ON 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 3125, 200, 9375, //TV_SAT_DVD_GO 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 6250, 200, 3125, //ARROW_UP 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 6250, 200, 6250, //ARROW_DOWN 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 9375, 200, 3125, //ARROW_LEFT 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 3125, 200, 6250, //ARROW_RIGHT 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 6250, 200, 6250, 200, 3125, 200, 6250, //TV_MENU 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, //VOL_UP 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 9375, 200, 3125, 200, 6250, //VOL_DOWN 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, //KEY_ZERO 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, //KEY_ONE 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, //TAPE_ON 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 6250, //ALL_OFF 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 3125, //CHAN_DOWN 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 3125, //SAT_ON 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, //V_AUX }; //the following list are the full button suite... I need to update and repair this code... the first 8 bits don't always match above! unsigned int beo4_tv_left[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 9375, 200, 3125, 200, 12500, 200}; unsigned int beo4_tv_right[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_tv_up[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 6250, 200, 3125, 200, 12500, 200}; unsigned int beo4_tv_down[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_tv_green[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 3125, 200, 9375, 200, 2800, 200, 9375, 200, 12500, 200}; unsigned int beo4_tv_yellow[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_tv_red[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 9375, 200, 12500, 200}; unsigned int beo4_tv_blue[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_tv_exit[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_tv_menu[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 6250, 200, 6250, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_tv_stop[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 12500, 200}; unsigned int beo4_tv_0[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_tv_1[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 12500, 200}; unsigned int beo4_tv_2[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 12500, 200}; unsigned int beo4_tv_3[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 12500, 200}; unsigned int beo4_tv_4[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_tv_5[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 12500, 200}; unsigned int beo4_tv_6[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 12500, 200}; unsigned int beo4_tv_7[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_tv_8[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_tv_9[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 9375, 200, 12500, 200}; unsigned int beo4_video_vol_up[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_video_vol_down[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_video_record[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_tv_on[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_dvd_on[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 12500, 200}; unsigned int beo4_sat_on[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 12500, 200}; unsigned int beo4_cd_on[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 9375, 200, 3125, 200, 12500, 200}; unsigned int beo4_text_on[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_atape_on[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 9375, 200, 12500, 200}; unsigned int beo4_radio_on[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 12500, 200}; unsigned int beo4_vtape_on[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 6250, 200, 2800, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 12500, 200}; unsigned int beo4_audio_poweroff[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_video_poweroff[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_all_power_off[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_tv_sat_dvd_go[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 3125, 200, 9375, 200, 12500, 200, unsigned int beo4_vtape_left[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 9375, 200, 3125, 200, 12500, 200}; unsigned int beo4_vtape_right[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 9375, 200, 6250, 200, 2800, 200, 9375, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_vtape_up[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 6250, 200, 3125, 200, 12500, 200}; unsigned int beo4_vtape_down[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_vtape_green[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 6250, 200, 6250, 200, 3125, 200, 9375, 200, 3125, 200, 9375, 200, 2800, 200, 9375, 200, 12500, 200}; unsigned int beo4_vtape_yellow[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 6250, 200, 6250, 200, 3125, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_vtape_red[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 6250, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 9375, 200, 12500, 200}; unsigned int beo4_vtape_blue[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 6250, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_vtape_exit[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 2800, 200, 9375, 200, 3125, 200, 9375, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6200, 200, 6250, 200, 12500, 200}; unsigned int beo4_vtape_menu[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 9375, 200, 6250, 200, 6250, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_vtape_stop[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 2800, 200, 9375, 200, 3125, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 2800, 200, 12500, 200}; unsigned int beo4_vtape_0[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_vtape_1[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 2800, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 12500, 200}; unsigned int beo4_vtape_2[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 2800, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 12500, 200}; unsigned int beo4_vtape_3[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 12500, 200}; unsigned int beo4_vtape_4[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 2800, 200, 6250, 200, 12500, 200}; unsigned int beo4_vtape_5[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 2800, 200, 9375, 200, 12500, 200}; unsigned int beo4_vtape_6[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 12500, 200}; unsigned int beo4_vtape_7[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_vtape_8[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_vtape_9[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 9375, 200, 12500, 200}; unsigned int beo4_light_on[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 6250, 200, 3125, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 12500, 200}; unsigned int beo4_light_left[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 9375, 200, 3125, 200, 12500, 200}; unsigned int beo4_light_right[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_light_up[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 6250, 200, 3125, 200, 12500, 200}; unsigned int beo4_light_down[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_light_green[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 6250, 200, 6250, 200, 3125, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 9375, 200, 12500, 200}; unsigned int beo4_light_yellow[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 6250, 200, 6250, 200, 3125, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_light_red[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 6250, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 9375, 200, 12500, 200}; unsigned int beo4_light_blue[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 6250, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_light_menu[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 3125, 200, 9375, 200, 6250, 200, 6250, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_light_stop[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 12500, 200}; unsigned int beo4_light_0[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_light_1[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 12500, 200}; unsigned int beo4_light_2[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 12500, 200}; unsigned int beo4_light_3[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6350, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 12500, 200}; unsigned int beo4_light_4[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_light_5[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 12500, 200}; unsigned int beo4_light_6[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 12500, 200}; unsigned int beo4_light_7[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_light_8[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_light_9[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 9375, 200, 12500, 200}; unsigned int beo4_audio_left[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 9375, 200, 3125, 200, 12500, 200}; unsigned int beo4_audio_right[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_audio_up[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 6250, 200, 3125, 200, 12500, 200}; unsigned int beo4_audio_down[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_audio_green[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 3125, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 9375, 200, 12500, 200}; unsigned int beo4_audio_yellow[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 3125, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_audio_red[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 9375, 200, 12500, 200}; unsigned int beo4_audio_blue[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_audio_menu[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 3125, 200, 9375, 200, 6250, 200, 6250, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_audio_stop[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 12500, 200}; unsigned int beo4_audio_record[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 9375, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_audio_0[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_audio_1[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 12500, 200}; unsigned int beo4_audio_2[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 12500, 200}; unsigned int beo4_audio_3[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 12500, 200}; unsigned int beo4_audio_4[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 12500, 200}; unsigned int beo4_audio_5[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 12500, 200}; unsigned int beo4_audio_6[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 3125, 200, 12500, 200}; unsigned int beo4_audio_7[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_audio_8[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_audio_9[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 9375, 200, 12500, 200}; unsigned int beo4_audio_exit[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_audio_vol_up[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 12500, 200}; unsigned int beo4_audio_vol_down[] = {200, 3125, 200, 3125, 200, 15625, 200, 3125, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 9375, 200, 3125, 200, 9375, 200, 6250, 200, 3125, 200, 6250, 200, 9375, 200, 3125, 200, 6250, 200, 12500, 200}; int RECV_PIN = 9; int khz = 455; IRrecv irrecv(RECV_PIN); decode_results results; IRsend irsend; unsigned int irHeader[] = { 200, 3125, 200, 3125, 200, 15625, 200, 3125, //4 start bits 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250, 200, 6250 // 8 0 data bits }; unsigned int irFooter[] = {200, 12500, 250}; void setup() { Serial.begin(9600); Serial.print("Enabling IRin..."); irrecv.enableIRIn(); Serial.println("Done"); } void sendCommand(int cmd) { irsend.sendRaw(irHeader, sizeof(irHeader) / sizeof(irHeader[0]), khz); irsend.sendRaw(button_bytes + (cmd * 16), 16, khz); irsend.sendRaw(irFooter, sizeof(irFooter) / sizeof(irFooter[0]), khz); } int z = 0; unsigned long lastCode = 0; void loop() { if (irrecv.decode(&results)) { switch(results.value) { case 0x00FFA25D: // CH- case 0xE318261B: sendCommand(DVD_ON); break; case 0x00FF629D: // CH case 0x00511DBB: sendCommand(TV_ON); break; case 0x00FFE21D: // CH+ case 0xEE886D7F: sendCommand(V_AUX); break; case 0x00FF22DD: // |<< case 0x52A3D41F: sendCommand(ALL_OFF); break; case 0xD7E84B1B: // >>| case 0x00FF02FD: sendCommand(SAT_ON); break; case 0x20FE4DBB: // >|| case 0x00FFC23D: sendCommand(TAPE_ON); break; case 0x00FFE01F: // VOL- case 0xF076C13B: sendCommand(VOL_DOWN); break; case 0x00FFA857: // VOL+ case 0xA3C8EDDB: sendCommand(VOL_UP); break; case 0x00FF906F: // EQ case 0xE5CFBD7F: sendCommand(TV_MENU); break; case 0x00FF6897: // 0 case 0xC101E57B: sendCommand(KEY_ZERO); break; case 0x00FF9867: // 100+ case 0x97483BFB: sendCommand(KEY_ONE); break; case 0x00FFB04F: // 200+ case 0xF0C41643: break; case 0x00FF30CF: // 1 case 0x9716BE3F: break; case 0x00FF18E7: // 2 case 0x3D9AE3F7: sendCommand(ARROW_UP); break; case 0x00FF7A85: // 3 case 0x6182021B: break; case 0x00FF10EF: // 4 case 0x8C22657B: sendCommand(ARROW_LEFT); break; case 0x00FF38C7: // 5 case 0x488F3CBB: sendCommand(TV_SAT_DVD_GO); break; case 0x00FF5AA5: // 6 case 0x449E79F: sendCommand(ARROW_RIGHT); break; case 0x00FF42BD: // 7 case 0x32C6FDF7: break; case 0x00FF4AB5: // 8 case 0x1BC0157B: sendCommand(ARROW_DOWN); break; case 0x00FF52AD: // 9 case 0x3EC3FC1B: break; case 0xffffffff: //this means we've had a repeat... use the last code and allow volume up/down if (lastCode == 0x00FFE01F || lastCode == 0xF076C13B) sendCommand(VOL_DOWN); if (lastCode == 0x00FFA857 || lastCode == 0xA3C8EDDB) sendCommand(VOL_UP); break; default: if (results.value > 0xF0FFFF and results.value <= 0xffffffff) Serial.println(results.value, HEX); break; } //don't enter on 0xffffffff here, otherwise we'll whack our repeat! if (results.value > 0xF0FFFF and results.value < 0xffffffff) { lastCode = results.value; } //restart the receiving after sending! irrecv.enableIRIn(); irrecv.resume(); } delay(100); }
You'll note that I have a V.Aux button configured up there. Turns out that I couldn't set both SCART plugs to DVD and cycle through... one would default to V.AUX automatically when trying to set the first to DVD. I therefore had to be able to press the button. The base configuration didn't have this coded! Ah! Found the button here. I have a suspicion there's a host of other buttons to map... Maybe I should go and buy a remote.
Meanwhile, turns out that this thread is the source of the correct configuration. Doesn't seem to have all the buttons though!
With all this done, attempting to get to the service menu with MENU,1,1,GO doesn't work. I do get the software version with MENU,0,0,GO... So I may be locked out. Regardless... I wasn't able to fix the issue I actually wanted to: the MSX still hates RGB. Loves Composite though!
B&O BeoVision MX 7000 TV
So this is nothing short of weird... After having to walk half-way across Melbourne to get home (thanks to the train lines being shut for upgrades), I find this unit sitting out the front of my apartment building. The weird part is this: I swear this is the exact same TV I saw in a 'vintage shop' in Geelong around a year ago. Geelong is a long way away... and for this ridiculously heavy unit to appear in front of my apartment... in dirty-but-OK condition, is totally surprising.
Of course, this is Melbourne and just maybe there's a lot of rich people with expensive+vintage TV sets just sitting around...
Does it work?
I threw caution to the wind and found a protected power board to plug it in to. A quick visual inspection before hitting the switch and click... we have a red stand-by light! A quick search of the front panel found a power button bottom-right and, tapping this, the unit came to life!
No remote control
Not a deal-breaker... or so I first thought. Turns out B&O decided to use a non-standard IR frequency and standard universal remotes just won't work. LIRC was fun back in the day, so I installed WinLIRC and tried to load up the easy-to-find Beo4 Configuration. Before even trying to hack together a transmitter, I was hit with errors trying to load the configuration.
Not very helpful at all! I hacked around with configuration file and found that it didn't seem to like the area between the raw_codes begin and end. Darn... maybe it's an archaic Windows version... so I installed Mint on the old Intellistation Z and tried again...
After booting into Linux Mint, I installed lirc with sudo apt install lirc. No issues here, so I downloaded and copied the Beo4 configuration to /etc/lirc/lircd.conf. A quick sudo service lirc restart and syslog tells me:
steven@intelli ~/Downloads $ sudo cp Beo4 /etc/lirc/lircd.conf steven@intelli ~/Downloads $ sudo service lirc restart steven@intelli ~/Downloads $ tail /var/log/syslog Jan 7 19:11:47 intelli lirc[3220]: * Loading LIRC modules Jan 7 19:11:47 intelli lirc[3220]: ...done. Jan 7 19:11:47 intelli lirc[3220]: * Starting remote control daemon(s) : Jan 7 19:11:47 intelli lircd-0.9.0[3230]: error in configfile line 45: Jan 7 19:11:47 intelli lircd-0.9.0[3230]: "KEY_0": must be a valid (unsigned int) number Jan 7 19:11:47 intelli lirc[3220]: ...done. Jan 7 19:11:47 intelli lircd-0.9.0[3230]: reading of file '/etc/lirc/lircd.conf' failed Jan 7 19:11:47 intelli lircd-0.9.0[3230]: reading of config file failed Jan 7 19:11:47 intelli lircd-0.9.0[3231]: lircd(dsp) ready, using /run/lirc/lircd Jan 7 19:11:47 intelli systemd[1]: Started LSB: Starts LIRC daemon..
Oh! Right! Here's the actual error! WinLIRC just 'failed', whereas I get proper verbose logging in Linux. Turns out the configuration file is just no good. I ended up browsing back to the lirc page, in a vain attempt to find a forum or mailing list to whinge to... but then... I found the real remote repo! Scrolling down... lo'n'behold is the Beo4 LIRC Configuration File with happy 'compatible' ticks. Opening it, I can see it's a completely different file!
steven@intelli ~/Downloads $ sudo cp Beo4.lircd.conf /etc/lirc/lircd.conf steven@intelli ~/Downloads $ sudo service lirc restart steven@intelli ~/Downloads $ tail /var/log/syslog Jan 7 19:13:39 intelli lircd-0.9.0[3231]: caught signal Jan 7 19:13:39 intelli lirc[3467]: ...done. Jan 7 19:13:39 intelli systemd[1]: Stopped LSB: Starts LIRC daemon.. Jan 7 19:13:39 intelli systemd[1]: Starting LSB: Starts LIRC daemon.... Jan 7 19:13:39 intelli lirc[3478]: * Loading LIRC modules Jan 7 19:13:39 intelli lirc[3478]: ...done. Jan 7 19:13:39 intelli lirc[3478]: * Starting remote control daemon(s) : Jan 7 19:13:39 intelli lirc[3478]: ...done. Jan 7 19:13:39 intelli lircd-0.9.0[3489]: lircd(dsp) ready, using /run/lirc/lircd Jan 7 19:13:39 intelli systemd[1]: Started LSB: Starts LIRC daemon..
Ok, neat... we loaded! What can we send?
steven@intelli ~/Downloads $ irsend list "Bang&Olufsen_Beo4" "" irsend: 0000000000000001 beo4-tv-on irsend: 0000000000000002 beo4-video-poweroff irsend: 0000000000000003 beo4-tv-left irsend: 0000000000000004 beo4-tv-right irsend: 0000000000000005 beo4-tv-up irsend: 0000000000000006 beo4-tv-down irsend: 0000000000000007 beo4-tv-green irsend: 0000000000000008 beo4-tv-yellow irsend: 0000000000000009 beo4-tv-red irsend: 000000000000000a beo4-tv-blue irsend: 000000000000000b beo4-tv-exit irsend: 000000000000000c beo4-tv-menu ....
And that's as far as I got on Linux... For the life of me it wasn't worth the effort trying to work out how to use /dev/ttyS0. It seems that the kernel hogs it and you have to setserial and stuff... so I just re-booted back into windows... on a machine closer to the TV...
Just because Windows is easier and I'm lazy, I plugged the file into WinLIRC... It worked! We're set... time for some actual hardware to get the IR transmitting.
Transmitting signals...
I found some IR sensors that I had lying around... they're TCRT5000s and I only need the transmitting half. That's the half with the bevelled side (when you're looking at it) and the anode is up top. A 220ohm resistor was tied in-line to prevent excess serial current draw.
The contraption was pointed at the TV, but no amount of clicking would work to turn the TV on. I was about to give up, but decided that the transmit power could be an issue and held the IR LED 5cm from the receiver. Presto! Power-On worked!
I plugged the MSX into the SCART plug and got the following... more research to be done! I also need a better mechanism for pressing remote buttons if I'm going to go through the menu and adjust settings.
What about Arduino?
Having a whole computer to control a TV isn't optimal... so...Arduino time! Well.. it will be in the future... after I read this, this, this, this and this. The goal will be to build a controller with enough buttons to re-configure the input... hopefully... to get the MSX to display!
UPDATE: Arduino Remote works like a charm!
Sony Playstation
I suddenly realised that I actually did have a device to plug into this monstrosity. The original Sony Playstation gathering dust under my coffee table has Composite out! Of course, the TV does not have Composite in... so I had to improvise with a Composite-to-SCART adapter.
Yey! Abe's Odyssey!