Previous Thread
Next Thread
Print Thread
Page 1 of 4 1 2 3 4
Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
I was browsing around and noticed that there was a driver for the atari 2600 POP.

The Sears version was pretty much the same thing, only it had 3 more games. Reading the field service manual says that there's a DIP switch where you can set the number of free rom slots, so why not hook it up so you can set the number of games available.

Also, why not make a lua script layout that gives you the game list.

[Linked Image from i.imgur.com]

Code
gamelist = [[Adventure
Target Fun
Asteroids
Backgammon
Basketball
Bowling
Breakaway
Canyon Bomber
Poker Plus
Circus
Tank Plus
Dodger Cars
Football
Golf
Hangman
Baseball
Cannonman
Maze Mania
Missile Command
Night Driver
Othello
Gunslinger
Soccer
Darediver
Maze
Space Invaders
Speedway II
Superman
Tic-Tac-Toe
Checkers
Chess
Pong Sports
Pinball
Warlords
Berzerk
Haunted House
Math Grand Prix
Defender
Yar's Revenge
Pac-Man
Super Breakout
Demons To Diamonds
Submarine Commander
Stellar Track
Steeple Chase]]

linecount=0
for line in gamelist:gmatch("([^\n]*)\n?") do
  linecount=linecount+1
  print(line,linecount)
end


function opentag(t,i) return "<"..t.." "..i..">" end
function closetag(t) return "</"..t..">" end
function tag(t,i) return '<'..t.." "..i.."/>" end
function attr(a,v) return a.."="..'"'..v..'" ' end


function colorrgb(r,g,b) return tag("color",(attr("red",r)..attr("green",g)..attr("blue",b))) end

color = {}
color[2] = colorrgb(.839,.408,.275)
color[3] = colorrgb(.659,.384,.290)
color[0] = colorrgb(.875,.557,.315)
color[1] = colorrgb(.906,.510,.278)


print()
print([[<?xml version="1.0"?>
<!--
license:CC0-1.0
copyright-holders:
-->]])

print(opentag("mamelayout",attr("version",2)))

for i=0,3 do 
print (opentag("element",attr("name","rectcolor"..i)..attr("defstate","0")))
print (opentag("rect",attr("state","0"))..color[i]..closetag("rect"))
print (closetag("element"))
end

function textelement(n,s) return opentag("element",attr("name",n))..opentag("text",attr("string",s))..colorrgb(1.0,1.0,1.0)..closetag("text")..closetag("element") end

linecount=0
for line in gamelist:gmatch("([^\n]*)\n?") do
  linecount=linecount+1
--  print(line,linecount)
  game=line
  gamecount=linecount
  print(textelement("textgame"..gamecount,game.."  "..gamecount))
end

function elementxywh(r,x,y,w,h) return opentag("element",attr("ref",r))..tag("bounds",attr("x",x)..attr("y",y)..attr("width",w)..attr("height",h))..closetag("element") end

print(opentag("view",attr("name","Game List Panel")))

--<screen index="0"><bounds x="0" y="-500" width="625" height="500" /></screen>

print(opentag("screen",attr("index",0))..tag("bounds",attr("x",0)..attr("y",-500)..attr("width",625)..attr("height",500))..closetag("screen"))


x0 = 0
xwidth = 65
xgap = 5
y0 = 0
yheight=20
ygap = 2
ymax = (yheight+ygap) * (5-1)

x=x0
y=y0

for g=1,gamecount do
print((elementxywh("rectcolor"..g%4,x,y,xwidth,yheight)))
print((elementxywh("textgame"..g,x,y,xwidth,yheight)))
y=y+yheight+ygap
if y>ymax then
  y=y0
  x=x+xwidth+xgap
end
end

print(closetag("view"))
print(closetag("mamelayout"))

Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
I was also trying a layout with the game list on the sides:

[Linked Image from i.imgur.com]

1 member likes this: Guru
Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
It also got me interested in the Basic Programming cartridge (which is terrible by the standards of today, but quite an achievement to make something that could work on a limited system)

I put an image in my layout, and wanted to overlay some buttons, so I made a little lua script so that I could find the coordinates:


Code
function mypointercb(type,id,devid,hpos,vpos,mask,clickcount) 
cvb=manager.machine.render.targets:at(1).current_view.bounds 
if clickcount > 0 then print(hpos,vpos,"COORDS "..(cvb.x1-cvb.x0) * hpos + cvb.x0..","..(cvb.y1-cvb.y0)*vpos+cvb.y0) end end

manager.machine.render.targets:at(1).current_view:set_pointer_updated_callback(mypointercb)

0.49349498748779 0.39370077848434 COORDS 343.65199375153,-287.40157961845
0.0026611471548676 0.0068897637538612 COORDS -97.607628707774,-496.27952757291


Entering a program on the keypad really makes you appreciate a real computer keyboard.

[Linked Image from i.imgur.com]

1 member likes this: robcfg
Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
So can we display the mouse pointer coordinates in real time?


[Linked Image from i.imgur.com]


Code
function drawframe() 
x=x or 0 y = y or 0 
manager.machine.render.ui_container:draw_box(0,0,.3,.1,0xffffffff,0x80ff0000)
manager.machine.render.ui_container:draw_text(0,0,"Coords = "..string.format("%3.2f",x)..","..string.format("%3.2f",y))
end

emu.register_frame_done(drawframe)



function mypointercb(type,id,devid,hpos,vpos,mask,clickcount)
 cvb=manager.machine.render.targets:at(1).current_view.bounds
 x,y=(cvb.x1-cvb.x0) * hpos + cvb.x0,(cvb.y1-cvb.y0)*vpos+cvb.y0 
end

manager.machine.render.targets:at(1).current_view:set_pointer_updated_callback(mypointercb)

Joined: Jan 2021
Posts: 193
Likes: 10
=
Senior Member
Senior Member
= Offline
Joined: Jan 2021
Posts: 193
Likes: 10
Originally Posted by Golden Child
It also got me interested in the Basic Programming cartridge (which is terrible by the standards of today, but quite an achievement to make something that could work on a limited system)
...
Entering a program on the keypad really makes you appreciate a real computer keyboard.
MAME should emulate the Spectravideo CompuMate (I own one).

https://en.wikipedia.org/wiki/CompuMate

This was an actual "homecomputer" addon for Atari 2600, containing a rather basic BASIC, a simple music sequencer with melodies, a paint program etc. Although it was still more like a toy laptop, this technical marvel deserves to be supported. It even could save data on cassette. Likely the address bus was routed through cables in both joystick ports, because it immediately crashes when unplugging.


MAY THE SOFTWARE BE WITH YOU!

{weltenschule.de}
Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
The compumate looks interesting.


From the source of the z26 emulator, it controls its banking through the controller ports.

Code
/*
	10 -- Compumate [CM]

	there are 4 4K banks selectable at $1000 - $1FFFF
	bankswitching is done though the controller ports
	INPT0: D7 = CTRL key input (0 on startup / 1 = key pressed)
	INPT1: D7 = always HIGH input (tested at startup)
	INPT2: D7 = always HIGH input (tested at startup)
	INPT3: D7 = SHIFT key input (0 on startup / 1 = key pressed)
	INPT4: D7 = keyboard row 1 input (0 = key pressed)
	INPT5: D7 = keyboard row 3 input (0 = key pressed)
	SWCHA: D7 = tape recorder I/O ?
	       D6 = 1 -> increase key collumn (0 to 9)
	       D5 = 1 -> reset key collumn to 0 (if D4 = 0)
	       D5 = 0 -> enable RAM writing (if D4 = 1)
	       D4 = 1 -> map 2K of RAM at $1800 - $1fff
	       D3 = keyboard row 4 input (0 = key pressed)
	       D2 = keyboard row 2 input (0 = key pressed)
	       D1 = bank select high bit
	       D0 = bank select low bit
	
	keyboard collumn numbering:
	collumn 0 = 7 U J M
	collumn 1 = 6 Y H N
	collumn 2 = 8 I K ,
	collumn 3 = 2 W S X
	collumn 4 = 3 E D C
	collumn 5 = 0 P ENTER SPACE
	collumn 6 = 9 O L .
	collumn 7 = 5 T G B
	collumn 8 = 1 Q A Z
	collumn 9 = 4 R F V
*/


Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
Working with the Basic Programming is an exercise in frustration due to how hard it is to enter a program.

I want to make an onscreen keyboard that will allow you to avoid all of the mode switching.

The idea is to look at the COLUPF register. The different colors are white (0xe), red(0x36), blue (0x86) and green (0xc8).


[Linked Image from i.imgur.com]


Code
[MAME]> print(string.format("%x",emu.item(manager.machine.devices[":tia_video"].items["0/COLUPF"]):read()))
e
[MAME]> print(string.format("%x",emu.item(manager.machine.devices[":tia_video"].items["0/COLUPF"]):read()))
36
[MAME]> print(string.format("%x",emu.item(manager.machine.devices[":tia_video"].items["0/COLUPF"]):read()))
86
[MAME]> print(string.format("%x",emu.item(manager.machine.devices[":tia_video"].items["0/COLUPF"]):read()))
c8

Joined: Jan 2006
Posts: 3,694
Very Senior Member
Very Senior Member
Joined: Jan 2006
Posts: 3,694
Compumate controller plugs into both joy ports at once, and this was not possible to be done (maybe it still isn't) in MAME :-(

Joined: Jan 2021
Posts: 193
Likes: 10
=
Senior Member
Senior Member
= Offline
Joined: Jan 2021
Posts: 193
Likes: 10
Is the problem the menu structure to assign controllers to emulators? The Compumate can never make use of different game controllers anyway. So it should be easy to simply make the a2600 emulator ignore things plugged into joyports when the rom mapper is of the type "Compumate", and instead route the additional signals internally. So despite within the menu something else stays formally plugged into joyports, Compumate just won't see it but send its address signals to the chip.


MAY THE SOFTWARE BE WITH YOU!

{weltenschule.de}
Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
[Linked Image from i.imgur.com]

I figured that maybe it'd be a little easier to create a subclass of a2600 and watch the writes to the controller ports to do the bank switching.

The compumate basic is super quirky and really limited, but is interesting as a curiosity.

You don't type RUN, that won't work, you have to use the keycodes like CTRL+R. This makes the special Run token. It helps you out by treating the first character that you type as if you were holding CTRL.

Line numbers can go from 1 to 99.

1 member likes this: =CO=Windler
Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
ok, after getting the compumate to work, I thought why not see if I could get the cassette running?

taking the cassette code from the apf and patching it in and after a day of trying to figure out why it didn't work



[Linked Image from i.imgur.com]

[Linked Image from i.imgur.com]


[Linked Image from i.imgur.com]

[Linked Image from i.imgur.com]

Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
Testing out the cassette on the Compumate, saving/loading basic programs seems to work, saving/loading pictures and saving/loading music seems to work.

(The Compumate has 3 different modes, basic, graphics and music mode.

[Linked Image from i.imgur.com]

(loaded from a saved cassette picture)

[Linked Image from i.imgur.com]

(loaded from a saved music file)

One thing I think that the Compumate could have done was to allow assembly language programs to be loaded into the 2k memory, like the Commavid Magicard. That would have been interesting.


Recently, I've been hearing about the Frob which was a development system for the 2600 which had 4k of memory and hooked up to the Apple II. You could write the 4k ram from the Apple II and then let the Atari 2600 have access. It could also pass data back and forth between the Apple and the 2600. I've been thinking about how to do something like that in mame, converting the a2600 into an apple slot card.

1 member likes this: =CO=Windler
Joined: Jan 2021
Posts: 193
Likes: 10
=
Senior Member
Senior Member
= Offline
Joined: Jan 2021
Posts: 193
Likes: 10
Originally Posted by Golden Child
One thing I think that the Compumate could have done was to allow assembly language programs to be loaded into the 2k memory, like the Commavid Magicard. That would have been interesting.

As a kid I expected the Compumate to be crippled by design with intentionally blocking joystick ports and lacking machine code support (unlike my ZX81 it had no poke, peek, usr) due to somekind of contract with Atari to prevent hobbyists from making actual games for the 2600 that could potentially compete with commercial ones. (Much later Apple banned from their appstores everything that could load external code (including C64 emulators) to protect the monopoly on selling iPhone software.)

But may be they just cheapened the thing with simplified hardware (blocking joyports as address lines, keeping BASIC rom smaller), much like most toy laptops did and so prevented hobbyists from serious programming on it. The atrocious manual of the Sound FX Phasor shows what attitude electronic toy companies had.

https://forums.bannister.org/ubbthreads.php?ubb=showflat&Number=121640#Post121640

Last edited by =CO=Windler; 04/10/25 02:49 AM.

MAY THE SOFTWARE BE WITH YOU!

{weltenschule.de}
Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
[Linked Image from i.imgur.com]

Thought I'd try to see if I could get the frob going, I can get the explorer running, don't know what I'm doing but it does seem to be able to change some of the values.

Joined: Jul 2011
Posts: 171
Likes: 7
T
Senior Member
Senior Member
T Offline
Joined: Jul 2011
Posts: 171
Likes: 7
Originally Posted by Golden Child
[Linked Image from i.imgur.com]

Thought I'd try to see if I could get the frob going, I can get the explorer running, don't know what I'm doing but it does seem to be able to change some of the values.

The Frob support is USEFUL, because I am smack dab in the middle of making a comprehensive deep dive video on it (4+ hrs long), and this makes the interactive portions a whole lot more straightforward!

-Thom

Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
Ok, I put up my Frob stuff on a github branch if you'd like to give it a spin.



https://github.com/goldnchild/mame/tree/frob



Once you compile it, then you can add -sl1 frob to put the frob in slot 1 for example.



./mame apple2e -sl1 frob -flop1 FROBDV13.DSK



and once the frob code is loaded, you can use numpad minus to reset the a2600.



Also you may want to turn down your sound (the sliders in mame are useful for this) because the a2600 will screech when you start up.

Joined: Jul 2011
Posts: 171
Likes: 7
T
Senior Member
Senior Member
T Offline
Joined: Jul 2011
Posts: 171
Likes: 7
The Frob even works with the AMON/FMON debugger.

Thank you, this is actually useful, and I will be able to vastly improve the video I am making, because of it.


Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
I thought I'd see if I could make the Compumate load a cassette file that's already been converted into binary,

It took a lot of fiddling, but I think I've finally got it!

Using the Apf as a model,

Code
static int compumate_output_bit(int16_t *buffer, int sample_pos, bool bit)
{
	int samples = 0;
	int samples_per[] = {8, 5};  // 10,5 works, 8,5 is close to actual timing (samples per half cycle)
	int cycles_per[] = {1, 2};   // compumate has 1 cycle for a 0 bit, 2 cycles for a 1 bit

	for (int i = 0; i < cycles_per[bit]; i++)
	{
		samples += compumate_put_samples(buffer, sample_pos + samples, samples_per[bit], WAVEENTRY_LOW);
		samples += compumate_put_samples(buffer, sample_pos + samples, samples_per[bit], WAVEENTRY_HIGH);
	}
	return samples;
}

static int compumate_output_byte(int16_t *buffer, int sample_pos, uint8_t byte)
{
	int samples = 0;
	uint8_t i;

	samples += compumate_output_bit (buffer, sample_pos + samples, 0);  // 1 start bit of zero

	/* data */
	for (i = 0; i<8; i++)
		samples += compumate_output_bit (buffer, sample_pos + samples, ((byte >> i) & 1));

	for (i = 0; i<4; i++)
		samples += compumate_output_bit (buffer, sample_pos + samples, 1);  // 4 stop bits

	return samples;
}





I couldn't figure out what was happening when it didn't work, so I saved out the wave data to examine it in Audacity, importing it as raw data.


Code

static int compumate_bin_handle_cassette(int16_t *buffer, const uint8_t *bytes)
{
	uint32_t sample_count = 0;

	/* start */
	for (int i = 0; i < HEADER_LENGTH; i++)  // roughly 900 bytes of 0xff as header for 10 seconds (can be much much less)
		sample_count += compumate_output_byte(buffer, sample_count, 0xff);

	/* data */
	for (int i = 0; i < compumate_image_size; i++)
	{
		sample_count += compumate_output_byte(buffer, sample_count, bytes[i]);
	}	

	if (buffer)
	{
		FILE* fp=fopen("RAWDATA","wb");
		if(fp)
		{	
			fwrite(buffer,sample_count*2,1,fp);
			fclose(fp);
		}
	}
	return sample_count;
}





[Linked Image from i.imgur.com]


Then I could compare it to data that was saved out by the compumate.

Comparing an actual save (top) with the generated wave data (bottom):

(start bit) 0 (end start) (data, lsb first) 1 1 0 0 1 0 1 0 (stop bits begin) 1 1 1 1 (stop bits end)

[Linked Image from i.imgur.com]

Last edited by Golden Child; 04/20/25 03:02 AM.
1 member likes this: =CO=Windler
Joined: Jan 2021
Posts: 193
Likes: 10
=
Senior Member
Senior Member
= Offline
Joined: Jan 2021
Posts: 193
Likes: 10
The datasette frequency/pitch seems to differ. Is perhaps one version PAL and the other NTSC with a different quartz?


MAY THE SOFTWARE BE WITH YOU!

{weltenschule.de}
Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
The difference between the NTSC and PAL a2600 is < 1%.

One of the things that makes it look different is that the top track is 44100 and the lower track is 22050 and that can make it not quite line up graphically.

It's close, but not 100% exact.

I wanted to use round numbers, to get it 100% exact I'd have to go to floating point numbers or keep track of fractional parts.

The 1 bits are probably just a bit too long and the 0 bits are probably a bit too short.


Over a typical load, the difference in length is < 1%.

[Linked Image from i.imgur.com]


(on this picture, the top is 44100 that is an actual save, the second track is 22050, and the third track is 11025, the length difference is 16.204 versus 16.140 seconds)

Last edited by Golden Child; 04/20/25 08:58 AM.
Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
Ok, I put up my compumate branch if you would like to have a look:

https://github.com/goldnchild/mame/tree/compumate

Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
I read about a computer that was based on the Atari 2600 called the BIT60. It had a an "enhanced" mode that would run a version of basic.

Unfortunately, there's very little information to be found on the BIT60.

However, in searching for info on the BIT60 I happened upon a lot of information on the BIT90 which is a colecovision clone, and there's a mame driver for it even!

Since I was able to hack in cassette support for the Compumate, why not try to do the BIT90?


After adding a few lines of code, I was able to load a save.


Using a demo.wav as reference, the system seemed a little slow, removing the wait state seemed to get it closer.

I had to clean up demo.wav by running a bunch of normalization in Audacity because the beginning was too quiet and DC biased.

The demo program was pretty nicely done showing off the capabilities of the BASIC with sprites and music.

[Linked Image from i.imgur.com]

[Linked Image from i.imgur.com]


3 tracks in audacity, top = normalized demo.wav, middle = original demo.wav, bottom = demo.wav loaded into mame, then saved out

[Linked Image from i.imgur.com]

length of mame loaded/saved wav is really close to original

[Linked Image from i.imgur.com]

Last edited by Golden Child; 04/22/25 12:33 PM.
1 member likes this: =CO=Windler
Joined: Jan 2021
Posts: 193
Likes: 10
=
Senior Member
Senior Member
= Offline
Joined: Jan 2021
Posts: 193
Likes: 10
I own a BIT90 (from fleamarket, no accessories). The thing could play Colecovision carts, but had a hardware flaw that prevents proper use of the keypad of my original Coleco joysticks due to mux with the computer keyboard in some games ("Rocky"?). In 1990th I had wired an inductor (coil) into one of the data lines to the joyport to distort a signal enough to delay its recognition and so prevent the clash. I don't remember the details, but the coil is still inside.


MAY THE SOFTWARE BE WITH YOU!

{weltenschule.de}
Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
Ok, I put my branch on github if you'd like to take a look:

https://github.com/goldnchild/mame/tree/bit90_cassette





I also made a softlist for the Spectravideo Compumate cassettes, and that was actually much harder than I thought it would be to make one from scratch.

Props to the softlist makers.

Last edited by Golden Child; 04/23/25 04:25 PM.
Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
Ok, I think I managed to get the cart/ram switching working properly on the BIT90 using a view.


with cart:

[Linked Image from i.imgur.com]


and with no cart, you get the basic screen, with ramsizes of 1024, 16k and 32k working.

The FRE command says that you have 761 bytes, 16377 bytes and 32760 bytes free for the various ram sizes.


[Linked Image from i.imgur.com]

Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
Trying to get the BIT90 printer to do something, it's a total hack but it looks recognizable.

[Linked Image from i.imgur.com]

Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
I came across the TI-99 PHP1900 Thermal Printer and thought I'd give it a try.

I made a thread over at atari age forums if you're curious.

https://forums.atariage.com/topic/381636-php1900-printer-emulation/

2 members like this: robcfg, exidyboy
Joined: Feb 2008
Posts: 178
Likes: 15
G
Senior Member
Senior Member
G Offline
Joined: Feb 2008
Posts: 178
Likes: 15
I never bother with that forum now since it's owned and run by the new Atari owners. Too much censorship going on there. To them emulation is evil and roms are illegal.
Not sure why you would even bother posting TI99 stuff there, let alone anything MAME related.
Keep MAME wip here where there are people interesting in emulation.


Dumping ROMs for MAME since 1999!
https://gurudumps.otenko.com
Joined: Mar 2006
Posts: 1,082
Likes: 7
L
Very Senior Member
Very Senior Member
L Offline
Joined: Mar 2006
Posts: 1,082
Likes: 7
The printer in the Rockwell (later Dynatem) AIM-65 might also be using the EPN3116C, but I can't find schematics of the printer itself offhand.
(This is also not yet hooked up in MAME)


"When life gives you zombies... *CHA-CHIK!* ...you make zombie-ade!"
Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
Schematics of the AIM-65 printer

http://retro.hansotten.nl/6502-sbc/aim-65/aim-65-40/

edit: oh that's a different unit

from an article:

The AIM-65 computer motherboard also sports a very interesting and compact Thermal
Printer module, made by Shimadzu in Kyoto, Japan. Their company goes back to the
1870’s and they became experts in high quality medical electronics. This extraordinary,
compact and brilliant printer module was also used in equipment made by Tektronix. It
is the subject of another article I’m working on, under construction. This printer is worthy
of an article all on its own. It is quite an exceptional little machine).



Schematic of the aim65 printer interface is in the user's guide, page 7-21 along with a detailed explanation of how the printhead works.


https://www.commodore.ca/wp-content/uploads/2018/11/rockwell-aim65-user-manual.pdf


how to print graphics on the aim65 printer:

http://archive.6502.org/publications/aiminteractive/aim_interactive_2.pdf

Last edited by Golden Child; 05/12/25 05:13 PM.
1 member likes this: exidyboy
Joined: Mar 2006
Posts: 1,082
Likes: 7
L
Very Senior Member
Very Senior Member
L Offline
Joined: Mar 2006
Posts: 1,082
Likes: 7
So we don't know if that really is the EPN3116C in the AIM-65... Whatever it is in the AIM-65, it has 10 input lines, and an odd/even select set of two enable pins to choose one set of 10 of the 20 thermal heads; the aim-65 printer has a motor which oscillates the 20 heads back and forth in a serpentine pattern, and has a sort of 'hblank' state from the motor showing either a tachometer style feedback, and/or a pulse when it reaches the beginning of its cycle.


"When life gives you zombies... *CHA-CHIK!* ...you make zombie-ade!"
Joined: Feb 2014
Posts: 1,220
Likes: 223
G
Very Senior Member
Very Senior Member
G Offline
Joined: Feb 2014
Posts: 1,220
Likes: 223
Came across the TRS-80 Portable Terminal PT-210 and so far I'm able to type on it.

Oddly, the keyboard matrix is basically "in order", seeming to match the table in rom.

Code

      300  30 31 32 33 34 35 36 37 38 39 3A 3B 2C 2D 2E 2F   0123456789:;,-./
      310  1B 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F   .ABCDEFGHIJKLMNO
      320  50 51 52 53 54 55 56 57 58 59 5A 20 0D 0A 7F 00   PQRSTUVWXYZ ....
      330  08 B8 2F F0 43 04 A0 FE B8 32 A0 83 B8 2F F0 83   .8/pC. ~82 .8/p.


It uses the i8039, the i8251, the i8279, and the i8243.

[Linked Image from i.imgur.com]

Page 1 of 4 1 2 3 4

Link Copied to Clipboard
Who's Online Now
0 members (), 149 guests, and 0 robots.
Key: Admin, Global Mod, Mod
ShoutChat
Comment Guidelines: Do post respectful and insightful comments. Don't flame, hate, spam.
Forum Statistics
Forums9
Topics9,373
Posts122,615
Members5,085
Most Online1,529
Jun 7th, 2025
Our Sponsor
These forums are sponsored by Superior Solitaire, an ad-free card game collection for macOS and iOS. Download it today!

Superior Solitaire
Powered by UBB.threads™ PHP Forum Software 8.0.0