Thread Like Summary
Duke, exidyboy, Golden Child, R. Belmont, robcfg
Total Likes: 12
Original Post (Thread Starter)
#120325 01/09/2022 3:30 AM
by Golden Child
Golden Child
I felt inspired to hack on the lx800 and was able to get it to do the self test. It's not perfect, there's still some stray junk, and also some strange vertical blind effects but it's fun to see it do something.

In many ways, it's very similar to the ap2000/lx810l, they're 9 pin printers that do double passes to get NLQ text. It's useful to take some code from the ap2000 and merge it into the lx800.

The lx800 uses a different gate array and things are wired up quite differently. (More gatorade...)

I got the buttons to work, but oddly, if you do a form feed it hangs once it kicks down a page.

[Linked Image from i.imgur.com]
Liked Replies
#120347 Jan 11th a 09:58 PM
by Lord Nightmare
Lord Nightmare
I've confirmed from the UPD78C10 manual that this is a legit bug in MAME's upd7810 core, the number of bytes for LDAX opcodes 29-2f and STAX opcodes 39-3f are wrong.
This might explain random bugs in other devices using the upd78(c)10 cpu core in MAME.
2 members like this
#120445 Feb 5th a 05:56 PM
by Golden Child
Golden Child
Got the color ribbon working on the ex800 self test:

There's a stepper motor for the color ribbon positioner that moves the ribbon up and down along with a switch to tell you when you're at the home position.

The stepper position goes from 0 to 70 to 142 to 216 so just divide by 70 to get an index for the ribbon color.


[Linked Image from i.imgur.com]

[Linked Image from i.imgur.com]
1 member likes this
#120483 Feb 16th a 03:57 AM
by Golden Child
Golden Child
Managed to hook up the centronics interface and try out print shop. The horizontal positioning is inaccurate but it's recognizable.

Regular text seems a little bit screwy still.

[Linked Image from i.imgur.com]
1 member likes this
#120519 Feb 24th a 04:34 AM
by Lord Nightmare
Lord Nightmare
rather than voting the bits to get the correct result, remember this about JEDEC eproms:
if the bit is programmed/set and the floating gate has a non-zero voltage in it, it will read as a 0.
if the bit is unprogrammed or the floating gate voltage has decayed to below the detectable threshold, it will read as a 1.

This effectively means:
if a bit ALWAYS reads as a 1, it should (probably, unless it has decayed past the point where it reads inconsistently) be a 1.
if a bit ALWAYS reads as a 0, it should be a 0.
if a bit SOMETIMES reads as a 0, it should be a 0.


So what you should do is read the bad chip 100 times and binary AND together all of the dumps.

LN
1 member likes this
#120644 Mar 25th a 02:04 PM
by Golden Child
Golden Child
Something that looks a little better:

[Linked Image from i.imgur.com]

The next step is to add some code to i8155.cpp that will handle the ALT 3 port strobed mode for port c which handles the strobed mode for input port A and uses PC3-PC5 as output ports.

Port A is connected to the centronics data and PC0 will trigger an interrupt on the 8049, PC1 will hook up to centronics busy and PC2 hooks up to centronics strobe.

[Linked Image from i.imgur.com]
1 member likes this
#120747 Apr 12th a 02:30 AM
by Golden Child
Golden Child
Finally figured out why it wouldn't print properly, it needed a pts (print timing sensor) pulse adjustment, being multiplied by 1/2. I think it's because the disc has pulses every 1/60 inch but the stepper goes at 120dpi.

[Linked Image from i.imgur.com]
1 member likes this
#120750 Apr 12th a 11:26 AM
by Golden Child
Golden Child
Modeling the stepper as a spring and getting the spring tuning just right gives you clean draft printing:

[Linked Image from i.imgur.com]
[Linked Image from i.imgur.com]
1 member likes this
#120892 May 13th a 11:10 AM
by Golden Child
Golden Child
It has the capability to switch into an IBM character set and I remember that you could hit the print screen key on IBM PCs and send the text screen to the printer:


top print is with regular char set

bottom print is with IBM char set


[Linked Image from i.imgur.com]

You can also toggle the output from the command line with CTRL+printscreen.
1 member likes this
#120893 May 14th a 06:18 PM
by Golden Child
Golden Child
I had so much trouble with making signals work, I made a passthrough centronics device that would let me monitor the status:

[Linked Image from i.imgur.com]



It's pretty simple, just watching the signals flowing forward and backwards, but useful to help see what's happening.
Code
	virtual DECLARE_WRITE_LINE_MEMBER( input_strobe ) override { m_ctx->write_strobe(state); m_input_strobe = state;}
	virtual DECLARE_WRITE_LINE_MEMBER( input_data0 ) override { if (state) m_data |= 0x01; else m_data &= ~0x01; m_ctx->write_data0(state);m_input_data0 = state;}
	virtual DECLARE_WRITE_LINE_MEMBER( input_data1 ) override { if (state) m_data |= 0x02; else m_data &= ~0x02; m_ctx->write_data1(state);m_input_data1 = state;}
	virtual DECLARE_WRITE_LINE_MEMBER( input_data2 ) override { if (state) m_data |= 0x04; else m_data &= ~0x04; m_ctx->write_data2(state);m_input_data2 = state;}
	virtual DECLARE_WRITE_LINE_MEMBER( input_data3 ) override { if (state) m_data |= 0x08; else m_data &= ~0x08; m_ctx->write_data3(state);m_input_data3 = state;}
	virtual DECLARE_WRITE_LINE_MEMBER( input_data4 ) override { if (state) m_data |= 0x10; else m_data &= ~0x10; m_ctx->write_data4(state);m_input_data4 = state;}
	virtual DECLARE_WRITE_LINE_MEMBER( input_data5 ) override { if (state) m_data |= 0x20; else m_data &= ~0x20; m_ctx->write_data5(state);m_input_data5 = state;}
	virtual DECLARE_WRITE_LINE_MEMBER( input_data6 ) override { if (state) m_data |= 0x40; else m_data &= ~0x40; m_ctx->write_data6(state);m_input_data6 = state;}
	virtual DECLARE_WRITE_LINE_MEMBER( input_data7 ) override { if (state) m_data |= 0x80; else m_data &= ~0x80; m_ctx->write_data7(state);m_input_data7 = state;}

	DECLARE_WRITE_LINE_MEMBER( busy_w ) { output_busy(state); m_busy = state;}   // centronics output busy
	DECLARE_WRITE_LINE_MEMBER( ack_w )  { output_ack(state); m_ack = state;} ;    // centronics output ack
	DECLARE_WRITE_LINE_MEMBER( perror_w ) { output_perror(state); m_perror = state;}; // centronics perror
	DECLARE_WRITE_LINE_MEMBER( select_w ) { output_select(state); m_select = state;}; // centronics select out
	DECLARE_WRITE_LINE_MEMBER( fault_w ) { output_fault(state); m_fault = state;};  // centronics fault
1 member likes this
#120910 May 18th a 04:01 AM
by Lord Nightmare
Lord Nightmare
Up to MUL now.
I found 2 bugs in the upd7810_table.cpp file while fixing cycle timings:
1. The first few prefix 40 opcodes are calling the 1-byte &upd7810_device::illegal handler instead of the 2-byte &upd7810_device::illegal2 handler, I don't know what sort of havoc this would cause since it only affects illegal opcodes. Because the opcodes have a prefix byte, they are 2 bytes long, so it should (if I'm understanding this right) call the illegal2 handler.
2. The more serious issue is a probable bug with the prefix 4D opcodes MOV_TXB_A, MOV_TM0_A, MOV_TM1_A, and MOV_ZCM_A which I'm pretty sure (based on the upd7810 instruction set databook) are in the wrong order in the table, causing the wrong opcodes to execute!
EDIT: scratch #2, the documentation conflicts with itself; I suspect the current order of things are correct since otherwise I suspect stuff would work much worse than it already does, if it has to do with serial communications and zero cross timing. Golden Child, correct me if I'm completely wrong here.

LN
1 member likes this
Who's Online Now
6 members (R. Belmont, Revenant, crazyc, robcfg, 2 invisible), 29 guests, and 7 robots.
Key: Admin, Global Mod, Mod
ShoutChat
Comment Guidelines: Do post respectful and insightful comments. Don't flame, hate, spam.
Forum Statistics
Forums9
Topics9,086
Posts119,088
Members5,014
Most Online890
Jan 17th, 2020
Our Sponsor
These forums are sponsored by Superior Solitaire, an ad-free card game collection for macOS and iOS. Download it today!

Superior Solitaire
Forum hosted by www.retrogamesformac.com