What is the cbs6000?The CBS6000 is an 6510-based system with lots of interface options including: ADC, UART, FSK modem, Line Printer, Seven segment display.
The system contains 128KB of ram as well as an 8kb eeprom which holds the firmware
The operating system is a customized version of the woz monitor. Added features are:
ACIA input/output, casette load/save, serial load and a seven segment display driver.
Project page:http://8times8.eeems.me/project/computers/65xx/cbs/
Current state:http://codewalr.us/index.php?topic=116.msg17284#msg17284
Old news:[spoiler]
CBS6000 stands for Cartridge Based System 6000 (KB)
The original idea was to make the computer run code from cartridges, but that changed. Now the computer has a built in rom with a bootloader on it.
Specs:
- Cpu: MOS6510 @1MHz (base 2MHz divided /2)
- Ram: 128KB (at the moment only 50k accessible)
- Rom: 8KB
- I/O: 6 pins built in cpu, 16 pins in CIA
Today I finished building and debugging the base-system on a piece of prototyping perfboard.
What's working?The base-system consists of CPU, ROM, RAM and the bootloader software. Everything you need to make an LED blink! This was the first demo program I loaded on the computer.
What is not working yet?I/O: I still have to wire up the CIA. After that I can make the I/O board with various devices such as a Digital-Analog converter and a Serial RS232 port.
[/spoiler]
I thought CBS meant Columbia Broadcasting System? :P
Kidding aside this is coming along pretty nicely. Is the 6510 close to Atari and SNES architecture, by the way, or is it vastly different? Also do you have plans for external storage?
It uses the exact same CPU core as the atari2600. The 6510 can address more memory because it has more address pins. The NES uses a custom 6502 with a soundchip, I/O port and timers built in.
Cool.I wonderif this could run ET if you hooked up a screen on this?
I'd have to wire up 2 additional IC's from an atari2600 as well as re-wire some of the address decoder for that. It could be done, but I don't intend to make this into a video game machine.
Aah ok. Having to hook up that Atari hardware would defeat the point of making 100% custom computer running Atari games anyway x.x
However, the world's laws require that every device that has a screen runs DOOM or a clone of it. :P
So therefore this device does not have a screen :P
Quote from: keoni29 on December 21, 2014, 09:35:40 AM
So therefore this device does not have a screen :P
You are scrapping the screen feature so you don't have to get DOOM to run on it? :trollface:
Exactly :)
I just installed the chip that handles all I/O operations. It has 16 programmable I/O pins as well as some handshaking lines and a serial port.
Cool to hear :D
I wired up the interrupt line from the CIA to the cpu. I have been experimenting with the CIA timers. You can make them trigger an interrupt. I made another blinky LED program that uses timers.
For those interested:
.const DISROM = 16
.const BANKSEL = 32
.const CIA = $D000
.const ledpin = 1
.const delay = 6553//5
.const TAL = CIA + $4
.const TAH = CIA + $5
.const ICR = CIA + $D
.const CRA = CIA + $E
.const CRB = CIA + $F
.pc = $0200
init: lda #$FF
sta CIA + 3 // Set port to all Outputs
lda #DISROM // Disable the ROM
sta $00
ora $01
sta $01
lda #<isr // Set interrupt vector
sta $FFFE
lda #>isr
sta $FFFF
lda #<delay // Set timer delay
sta TAL
lda #>delay
sta TAH
lda #%10000001 // Enable timer A underflow interrupts
sta ICR
lda #%00010001 // Start timer in continuous mode
sta CRA
ldy #0
cli // Enable interrupts
loop: jmp loop
isr: ldx ICR // Acknowledge interrupt
iny
sty CIA + 1 // Blink LED
rti
Darn this ASM looks different from Z80 ASM for sure. Again I don't really understand Z80 ASM but I recognizes certain instructions so it doesn't give me as much of a brain aneuvrism as other ASM forms. >.<
Good thing on those old CPUs you don't have to write your ASM using only binary. O.O
Welp, this looks pretty cool, I like the board color. Can we see the backside tho ? :P
The address and data bus are tidy, but the control lines go all over the place because I built my own address decoder. I could have used programmable logic for the decoder, but I don't have those.
Wow that's quite some wiring and solder routing work. O.O
At least it doesn't look like this :
(http://upload.wikimedia.org/wikipedia/commons/d/d1/Computerplatine_Wire-wrap_backplane_detail_Z80_Doppel-Europa-Format_1977.jpg)
ROFL at that pic Streetwalrus. :D Even in Keoni's pic I would have an hard time remembering what wire goes where and not accidentally desoldering the wrong one, even if I looked in front of the board.
You say that but when it comes to gigantic uncommented source code, you directly know what to do! :p
I guess source code is easier to mess with than hardware. :P
Back in the days engineers did not have access to FPGA technology, so if they needed a custom chip and it was not made yet they built their own simulator board with loose chips and lots of wire. That's probably what that board is, Streetwalrus. I am not using colored wires, so yeah, there is a fair bit of probing and guessing involved in changing the wires around :P
Quote from: Eiyeron on December 23, 2014, 10:43:30 PM
You say that but when it comes to gigantic uncommented source code, you directly know what to do! :p
What I usually do is wire up all pins with long wire and bundle them up with labels on each bundle, so it was somewhat commented. Then I start soldering those wires to where they need to go.
Quote from: Streetwalrus on December 23, 2014, 10:45:03 PM
I guess source code is easier to mess with than hardware. :P
Sourcecode is definitely easier to mess with than hardware, but it can be a pain in the ass to discover software bugs. The hardware on this device was pretty straightforward (in my experience.)
I hooked up a little serial digital to analog converter to the serial port. I can play 256 byte long audio samples now (which is just long enough to generate clicks :P). I will try to make the max length 65536 bytes tomorrow.
Quote from: keoni29 on December 24, 2014, 12:06:51 AM
Back in the days engineers did not have access to FPGA technology, so if they needed a custom chip and it was not made yet they built their own simulator board with loose chips and lots of wire. That's probably what that board is, Streetwalrus. I am not using colored wires, so yeah, there is a fair bit of probing and guessing involved in changing the wires around :P
I wonder if that wasn't what they did with Space Invaders arcade machines at first? :P
I believe early arcade boards such as pong used discrete state-machines. Things like space-invaders probably used a cpu and some off-the-shelf video chip.
Computers like the C128 used many custom chips. Those were first build on large wirewrapped boards.
Original post:
http://8times8.eeems.me:81/blog/?thread=12
Muhahahahahaha
The cbs6000 is making some noise! I hooked up a digital to analog converter to the serial port and wrote some software that plays back sound data in ram. Almost the entire first 64k bank is filled up for about 5 seconds worth of 8000 bytes/sec 8 bit audio.
https://www.youtube.com/watch?v=lt1eCsibU2E
And here I was expecting Rickroll...
That was really awesome. I look forward to progress in the future.
I don't have quite enough memory for that right now :P
All you needed was the drum fill at the beginning and our minds would do the rest.
This almost sounds like the laugh from Lunar Silver Star Story Complete on the PS1. :P Awesome by the way :)
It's the only 8000Hz 8 bit mono sample I could find on the web. It's a public domain audio fragment iirc.
Oh ok lol. Would you mind if I gave you a sample of one of my songs instead? :P
Audacity can generate such audio, but I don't know if you need a WAV format in particular.
Cant get audacity to work oj my pc. Probably a pulseaudio issue.
Oh I was planning to convert the file myself. Hence why I asked what Wav format your device handled.
I need raw uncompressed 8 bit mono PCM @8000Hz samplerate. Max filesize is 55k
Would this unsigned 8 bit PCM do? :P
This still has the WAV header in it. Could you provide me with a headerless file?
How would I do that?
There is an option to export headerless files in audacity. Save a file as uncompressed and go to options. Then select RAW(header-less)
What about this?
Quote from: DJ Omnimaga on December 26, 2014, 09:11:08 AM
What about this?
Thanks! I will test it on hardware in a bit.
I made a debug routine. It's an interrupt service routine that prints human readable info about the CPU state.
Sample output:A=03,X=08,Y=00,P=34,S=FB,PC=0240
It can be called using a brk instruction or by pulling the IRQ pin low. I want to change this to the NMI because I still want to be able to use interrupts.
I want to make it elaborate on the status flags. It will explain what every flag does like so:
Negative number, BRK, INT disabled, Decimal mode enabled
https://raw.githubusercontent.com/keoni29/cbs6000/master/src/main/debug.asm
Edit: I finally fixed a bug in the debugger that prevented it from outputting characters occasionally. I was simply sending characters too fast.
Ooh nifty :D. By the way lda is kinda like ld in Z80, right? I also can't wait to hear how my sound sample sounds like on your hardware device. Do you think longer samples could be done?
It can be done, but it would require bankswitching and/or streaming from a storage device such as a flash chip or sd card.
Edit: Just tried a new kind of digital to analog converter: a bunch of resistors tied to the I/O port. The audio quality is about the same and it takes much less cycles compared to the serial DAC method.
Aaah ok, I sometimes don't realize how limited memory is XD. Still, good job :)
I wrote a faster bootloader that uses the serial port of the CIA instead of a software-defined serial port. With the old bootloader it took about a minute to send 55kb to the computer. With the new one this takes less than 5 seconds.
Wow that's fast! By the way is it the time it takes to startup the computer as well or does it startup instantly like non-TI calculators?
It does not have an operating system, so loading depends on the size of the file you send to it. The bootloader is ready to receive data a few miliseconds after turning it on.
Wow that's some crazy awesome stuff right there Keoni. o.o
ALL HAIL THE KEONI !
I am now populating the I/O board. The board connects via a system bus connector to the cpu. The first chip I put on there is a UART. This allows for bi-directional serial communication with a terminal/PC.
Edit: I just tested it and the transmitter seems to work fine. I just sent: Hello World :D
Edit2: Both sending and receiving characters works. The input is buffered in a 64 byte long buffer. It stops accepting bytes when the buffer is full.
Nice to see you back in action. :D This is looking nicer and nicer. Are you using those chips you got in an huge bag and showed to us on Telegram earlier?
Yes, I found a lot of UART chips. I used one for the serial communication in the CBS. I might add more things such as an Analog to Digital converter and an FSK modem.
Internet capabilities would be great. :D I wonder what kind of use you could make of this computer online? :)
I just managed to port a modified version of the famous WOZ monitor. The original was written by Steve "the woz" Wozniak in the 70's for the Apple I. I found a version with some enhancements and I modified it to work on my system. It allows me to read and change bytes in memory as well as loading Intel Hex files from the PC.
Do you need to use that for pretty much everything including changing the screen content?
The woz monitor is used for entering programs in the machine as well as troubleshooting I/O devices. This monitor will be very useful for when I hook up more peripherals such as analog to digital converters, video and audio chips and maybe a disk controller or casette interface.
To read from memory:
Type 0200(return)
Get 0200:FF
To write to memory:
Type 0200:AB(return)
Get 0200:FF (previous value)
You can also do block reads and writes, execute programs and more fancy stuff.
Ah ok thanks for the info. :) Keep us updated with your finds and progress :)
and Herocore <.<
I have worked for 10 hours today on a project to show off at school this saturday. It's a wfrng with the cbs as the brain, phone dial as input and seven segment displays as output. I will show the result as soon as it's done! (I hope it's done in time)
Interesting, I hope you can manage to finish this in time. :)
oh, that's cool Keoni :D You gotta show that to me when we meet up next time :)
I kinda made it in time. The school was open to public from 10 AM till 2 PM. I finished programming, debugging and soldering at 12PM and rushed to school. I arrived around 12:45 so the day was almost over, but there were still some people around who got to try my computer. 3 people guessed the number :)
Last sunday I added a new feature: The phone rings when you guess the number! I could not add this feature in time because it required some (relatively) high voltage to be switched on and off.
Today I added 16 additional I/O pins, more handshake lines and an Analog to Digital converter I got from the lab at school.
That is awesome. :D You should put the video you showed me on Youtube :)
Will do in a bit. I want to add some more features to the I/O board until I cant stuff any more on it and then I will make a new demo for it.
Stacked an I/O board on top. Total I/O including the main board:
32 I/O pins
serial RS232
2x SPI-like port
4 16 bit timer/counters
4 handshaking lines
8 bit Analog to Digital converter
6 digit seven segment display
(https://www.omnimaga.org/index.php?action=dlattach;topic=21511.0;attach=18509;image)
(https://www.omnimaga.org/index.php?action=dlattach;topic=21511.0;attach=18510;image)
Ooh this is looking cooler and cooler. You should design a case for it :D
I designed it so it does not require a case. I accidentally dropped it from my desk and it was still running without problems.
I tested the FSK modem chip and I can confirm that sending data works! There are a couple of glitches, but those are probably because of the low bitrate I used for recording the audio to my pc.
Listen to audio sample here. (http://codewalr.us/index.php?action=dlattach;topic=116.0;attach=168)
minimodem -f file.wav --rx 1200
### CARRIER 1200 @ 1200.0 Hz ###
�
### NOCARRIER ndata=1 confidence=2.883 ampl=0.166 bps=1194.03 (0.5% slow) ###
### CARRIER 1200 @ 1200.0 Hz ###
�
### NOCARRIER ndata=1 confidence=3.147 ampl=0.165 bps=1194.03 (0.5% slow) ###
### CARRIER 1200 @ 1200.0 Hz ###
�
### NOCARRIER ndata=1 confidence=3.282 ampl=0.168 bps=1194.03 (0.5% slow) ###
### CARRIER 1200 @ 1200.0 Hz ###
CBS Computer
CBS Computer
CBS COmputer
CBS Computer
CBS Computer
BS Computer
CBS Computer
BS Compu|er
CBS om`uter
CBS COmputer
CBS Computer
CBS CoMpu|er
CBS Computer
CBS Computer
BS Computer
CBs COm`uter
CS Computer
CBS Computer
CBS Computer
CBS Computer
CBSCompu|er
CBS Com`uter
CBSCNmputer
�BS Computer
CBS CoMputer
CBS Computer
CBS Compute
CBS Computer
CBS Computer
CBSComputer
CBS Compu|er
CBSComputer
CBS Com�uter
### NOCARRIER ndata=476 confidence=2.697 ampl=0.162 bps=1173.71 (2.2% slow) ###
Haha I haven't heard this dial-up sound in a while. The last time I did was at the Subway restaurant when paying with my debit card a few years ago. I believe it did it when faxing stuff too, right?
Th noise part sounds a lot like Harder Better Faster Stronger intro! :3
New video showcasing the modem.
http://youtu.be/1Kcp99_qsGQ
Dat oscilloscope! O.O
I wonder if you could make a game on it like Tennis for Two but more advanced like Moon Patrol? ;D
I can make scope graphics using a digital two analog converters. (One for x and one for y axis)
Cool. :D If you can you should try and demonstrate it :)
I did once, but that was a test with 3 bit DAC's so only 8x8 pixels. With two 8 bit dacs it should look better, but it would be more cpu intensive also. It takes about 15-25 clock cycles per dot I estimate, so to draw 362 dots (diagonal line across the screen) I need 7200-9000 cycles. This gives me a refresh rate of this line of 100Hz which would be perfect, but as soon as I draw another diagonal line this would reduce the framerate to 50Hz and two more reduces it to 25Hz, so as long as there are not too many lines on the screen I can get pretty good results.
Today I tried sending data from my pc audio card to the modem on the cbs computer and it works great. I should make a more permanent setup for data transfers though, cause it's a mess of wire right now.
I am curious how pixel looks like on an oscilloscope, though :P Also this talk reminds me of Atari 2600 for some reasons :P
Because you have to spoon-feed the dot data to the display. The main difference is that it is not timing-critical. You can send dots whenever you want wherever you want as long as you have a steady rate of displaying pixels. Otherwise you get dim spots and flicker.
With the atari2600 you have to change the graphics in the video chip twice per scanline because there is no video ram. To make matters worse: there are no interrupts so you have to count cycles in order to make these writes occur at the right moment.
Darn I wouldn't want to try programming the Atari 2600 in ASM. >.< (There's Batari Basic which probably takes care of that, although it probably cannot do much more than Princess Rescue and Zippy the Porcupine)
Well you could use a kernel written by someone else and just take care of the game logic during the vblank. (A kernel is the thing that handles all video and possibly sound output of an atari2600 game. It is included in the game's code.)
Just pushed new commits for the woz monitor. I added a save/load feature which allows you to save chunks of memory to a casette tape and load them back into memory. Right now there are no start and end of file markers. It just loads until you hit the esc key and it saves raw data to the casette.
I also tried programming the atari2600 today and I got some simple graphics on the screen, but doing anything with sprites requires crazy tricks :P
Edit: Just saved a program to the casette tape, loaded it back and ran it. Works perfectly! It seems like this method of data storage is more reliable than I thought. If I use parity checks if would be even more reliable!
I am curious if you could port Legand of Zelda: Sord of Atari to an actual 2600 without the text. :P (it would kinda defeat the point since the game goal was a bit to poke fun at Zero Wing for Sega Mega Drive, but you could still intentionally make the game bad such as "emulating" Pacman's Ghost Flicker of Death and keep the title mispelled and bad graphics:
http://codewalr.us/index.php?topic=6.45
Also for the cassette tape program do you mean for your CBS6000 computer or the Atari?
Positioning sprites alone is a hack in its own right so I dunno how I could make a game on this console.
The casette interface is on the cbs.
O.O
Wow, I would definitively use Batari Basic if I was to make an Atari game. >.<
And thanks for the clarification :)
Changelog for firmware version 1.2
+ Added Seven segment driver
+ Added Casette save/load functionality (120 bytes/sec)
+ Added Serial load functionality (~5200 bytes/sec)
+ Added user interrupt vector
- Removed Intel HEX Loader
I am looking for a better name for the computer. CBS6000 is a project name and a temporary name for the computer.
Is 120 bytes/seconds the standard loading speed for cassette saving/loading?
As for a name, Walriicomp, Koeniga (in reference to Amiga :P) are names I am thinking of, but I don't have any other idea right now. >.<
It is the maximum data rate of the modem chip I am using to encode the data. I bet you could go higher than this on casette tape as long as your sample rate is a few factors higher than the period of the signal. I'd need a different chip for a higher data rate.
Ah ok. I assume cassette load/save and serial load use different chips then?
There are two chips for serial communication on the I/O board. One is hooked up to a terminal and the other is connected to the modem chip.
Aah ok. Would one chip be able to handle both at once?
The logic required to make that work would take up more space than a second chip. I have plenty of these chips, so I don't mind using 2 of them.
I wrote a piece of code that allows me to print text to my laser printer. https://github.com/keoni29/cbs6000/blob/master/src/printertest/print.asm
It has a standard parallel printer port interface which makes if really easy to write data to. Printing text to it is as easy as printing it over serial. You can just send a string of text followed by 0x0C and it prints the page.
Aah ok. That said if you ever decided to publish the hardware schematic for this so people can build one or if you even tried to sell such device in multiple copies, wouldn't using more chips increase the cost a bit? Also nice to see new updates :D
I do not intend to release schematics or to sell these. I don't have any full schematics myself you see. If one attempts to build such a computer I think it's best if they designed it themselves. The base system is fairly simple to design and there are lots of schematics for building a simple 6502/6510 computer out there. Mine is fairly standard apart from the bankswitching mechanism. The I/O board was not really designed as a whole. I added parts I could get my hands on as I went on. I have not bought any new parts for this project. It's all old stock from the 80's and some 90's.
That said: the source code is still publicly available and it is quite easy to port it to different 6502 machines.
Aah I wasn't sure, since many people tend to make projects that are available for use by other people as opposed to personal use. It's still cool nonetheless, though. I personally would probably not attempt designing such old school computer, since I am horrible at understanding lower-level languages. I would end up with just a pile of hardware I cannot program. <_<
But yeah it's good you managed to get many old parts recently so you can build whatever you want :)
A lot of these parts are pretty hard to come by, so even if I did publish schematics people would still not be able to build one of their own. Building these 8 bit computers is an art. You take whatever components you have lying around and you make them work together to perform tasks.
I hooked up a vga board to it recently. It is driven via a serial port so it is a bit slow. It works tho
What if every part you used were so rare that your computer is worth $18,000? O.O
I don't think so, but the parts are from c64's and stuff, so you'd need to disassemble a c64 to get these parts. I got mine from broken c64's. These chips were not damaged of course.
Ooh I see lol. And at first I was worried when I started reading your post because I thought you decided to dismantle a C64, then I breathed a sigh of relief when I saw you did it with only broken ones. :P
Quote from: Keoni29 on February 27, 2015, 08:00:07 PM
I don't think so, but the parts are from c64's and stuff, so you'd need to disassemble a c64 to get these parts. I got mine from broken c64's. These chips were not damaged of course.
bottom line is: Your chips are as expensive as these broken c64's are. Which can be quite expensive.
Not really. Broken c64's are worth €7-10
I was sure they were more because I always had the impression that a working c64 was about $200-400 due to rarity, but I just checked Ebay and while they seem scarce, it seems we can easily get a working one for $100-150.
Over here they are dirt cheap. Europe ftw.
That is probably because in North America, personal computers were never popular to begin with in the 80's. Video game consoles were the thing early on, and even when the video game crash of America occured, personal computers never really took off. Then Nintendo came with their NES and you know the rest of the story.
Yeah I figured. In europe used (and new) consoles are more expensive compared to america.
I wrote up some documentation today. For those who are interested in lots of tech talk:
http://8times8.eeems.me:81/project/computers/65xx/cbs/
Also some new pics:
(http://8times8.eeems.me:81/project/computers/65xx/cbs/media/stack.jpg)
(http://8times8.eeems.me:81/project/computers/65xx/cbs/media/parts.jpg)
Looks awesome! :D
It's pretty awesome to see you can do a such small computer with these chips!
Yup. Old school PCs are tiny. Most of the size was due to the keyboard back then. And the power supply.
Also, neat machine Keoni. I already saw it working and I must say you did a great job.
I wanted this computer to be on par with modern microcontrollers, so I stuffed as many peripherals in it as possible. I still have the address space to add 4 more peripherals on the I/O board. I don't have enough physical space though :P I can maybe fit stuff like a realtime clock on it.
This looks even better than before now :D But so much stuff O.O
I made new back-boards for the computer. These do the same, but instead of stacking the boards I layed them side by side for a flatter form-factor. This allows me to build these into a case with perhaps a keyboard on top. The biggest problem I faced with the old back-boards was the lack of space. The board on the left will have the (relatively) slow peripherals on it such as serial flash roms, realtime clocks, character display drivers and so on.
Good to see you're still going strong with this project! I'll hope to see the machine in real life action one day ;)
Awesome to see you back into action Keoni29! :walrii: