Subscribe via RSS
22Jan/190

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.

DSC06411

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!

DSC06413 DSC06418 DSC06420

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!

DSC06423

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...

DSC06425

And plugged it in...

DSC06426

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!?

16Jan/190

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.

DSC05334

It also needed a floppy connector... seems that these are for mini-atx boards where floppies are a distant memory...

DSC05364 DSC05366 DSC05372

Thinking that it just needed more amperes... I mounted a new 12v supply inside the monitor housing...

DSC05375 DSC05377 DSC05381

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...

DSC05384 DSC05389 DSC05391

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.

DSC05406

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!

DSC05589 DSC05593 DSC05596

DSC06291

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!

Filed under: Retro No Comments
11Jan/193

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.

DSC06359

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!)

DSC06332

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...

DSC06334

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...

pal-dec

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.

DSC06339

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.

DSC06344 DSC06407 DSC06409

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!

DSC06361

I quickly slapped spacebar... the fish are the screensaver for multemente on MSX...

DSC06363

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!

DSC06367

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...

DSC06373

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)...

DSC06397 DSC06394 DSC06390

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...

DSC06381 DSC06383 DSC06387

DSC06370

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...

DSC06402

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!

Filed under: Retro 3 Comments
10Jan/190

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!

osaka-east-loop-at-shin-osaka

And back again...

osaka-east-loop-at-shin-osaka-2

I don't know if they're revenue services or not... but the line is active!

Filed under: JPN No Comments
8Jan/190

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!

DSC06318

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.

DSC06336

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);
}

DSC06317

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!

DSC06324 DSC06321 DSC06325

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!

Filed under: Retro No Comments
8Jan/190

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.

DSC06312

DSC06315 DSC06314 DSC06316

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.

winlirc-1 winlirc-2 winlirc-3

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...

winlirc-4

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.

DSC06282

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!

DSC06284

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.

DSC06308 DSC06296 DSC06302

DSC06304

Yey! Abe's Odyssey!

Filed under: Retro No Comments