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.
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"))
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)
So can we display the mouse pointer coordinates in real time?
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)
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).
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.
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.
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.
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.
(loaded from a saved cassette picture)
(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.
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.
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.
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!
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%.
(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)
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.
3 tracks in audacity, top = normalized demo.wav, middle = original demo.wav, bottom = demo.wav loaded into mame, then saved out
length of mame loaded/saved wav is really close to original
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.
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.
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.
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!"
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.
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!"