• Please review our updated Terms and Rules here

Simple, generic 80x24(25) display card

I'm not much of an S-100 fan--Multibus is more my speed for the era.

I suspect a few budget terminals of the time used an 8275 or76. Add some memory and a CPU and you're pretty much most of the way there.
I cut my teeth on the Intel SBC 80/20 when I worked at Dictaphone. It was their very first computer system used for logging dictation in large pools, like government agencies. It had a thermal printer and two ADM-3A terminals and the computer contained two Shugart SA-400 disk drives. If I had some good documentation for a Z-80 based Multibus system, I probably would have gone that route. But since my first personal computer was S-100, I went down that road.....
 
Wow, I wish I could remember the system name for that first computer. Best I can remember, that was the only one that used 5.25" floppy drives. Would be nice if you could read what is on that thing. Sure would be worth looking at.
 
I'm presently building a video card also, and recently got a display on an analog monitor using one data bit and the Osborne 1 composite video encoder to drive the output, but I'm waiting for 1984 era RAM chips to arrive so I can make it entirely out of 1985 level technology - though I am aiming at 256/512 x 192 with 8 bits per pixel, which would have been pretty decent for a 1985 era machine, and an asynchronous interface to a z80 at up to 16 MHz with zero wait at 6-7 read/write ops per second using multiplexed static rams and latched read and write data through an arbiter between the bus and the video memory.

It might be too bit-oriented for this intent, but what might be of interest was that the raster generator was only two GAL chips, giving 312 lines with both sync's being generated and mixed and blanking outputs, so the logic code is pretty tight on something like a 22v10, but they existed as PAL22V8 and were relatively usable even in 1985.

The same approach would work with just counters and normal dual-port RAM though - Five counter ICs would be sufficient, with reset and sync outputs generated by combinatorial logic, and all counts and signals latched by three 74LS374's with the clock - and wouldn't be that bad if it was driving output to a ROM, with a reasonable access speed- though if it's latched, any ROM would probably be OK

IDT make 2K and 4K Dual-port RAMs that are cheap and would fit Myke's BUS. So the whole lot wouldn't take too many logic chips...

But GALs do make it easier, and are necessary if you want to build interleaved video arbitration logic. Unless you do something like use a static ram and disable the video address generators when the video RAM is selected.

I don't have it connected to a chip bus yet and the memory chips are still in transit ( I'm aiming at 64K x 1 bit chips @ 55 or 70 ns ) but feeding a few address lines into the data output does drive dots and lines and gives a good raster.

A dot clock can be doubled to push 256 dots to 512, but then it's limited to a 6x8 raster which is only a tiny bit smaller than the ADM3A. It's certainly doable though, and would not need many chips. IMG_20230627_190134.jpg


This is the POC - You can tell I have a thing about single sided PCBs. ( I intend to make a Serial to Video converter as the next POC, using an 8051 and something like the above, but with the changes where I learnt things while building it ).

The top two GALs are the Vertical Counter and Horizontal Counter, and the one on the right latches the video output. The middle sockets (empty) are for a 62256, but I'm moving to 1 bit RAMs for the next design, as 62256's weren't easily obtainable at 70ns in 1985.

The lower two left sockets were for arbiter chips - ie, separate the data but to allow interleaving of video and CPU access, and to latch writes and reads so that the CPU bus can operate asynchronously to the video system. The address bus buffers aren't installed, and the tristating of the Video counters is handled within the two GALs on the left. I'm also using the GAL on the right as a two-stage /4 counter to drive the video clock ( 7 MHz, but could also be changed to 6 with some timing variation in the GAL code ) so the dot-clock is 7 MHz, but because the latching GAL for the output data has a 14MHz and 28 MHz clock, it can also change the output - eg, it can split up the video data into two 4 bit pixels and display two dots instead of 1 - effectively turning the 256 pixels into 512 pixels... Enough to get a reasonable 80 column display.

As I said, could be done with TTL logic too, but would need a few more chips since there would be at least 5 counters required, and some combinatorial logic to generate blanking and sync, but use of a dual ported RAM and character ROM would eliminate the need for bus arbiters, and the video card would operate without any configuration.
 
Just as a side note, if you used two ROMs, then one rom could store character data, and the other could be used to generate timing related signals - eg, Blanking, Resets for counters, Sync signals etc. The added flexability like that, with video timing programmed into a second ROM would make it easy to change resolution, and simplify the main logic down to 5 counters, some latches, two ROMs and a dual-ported RAM... And some basic video generation circuitry to mix the pixels and sync. Using an EPROM like a big 16 input "GAL" would be quite practical... Since GALs and ROMs are often compared in that way. Those 8 output bits could do anything like generate resets for counters, mark blanking etc. And could be adjusted easily too.
 
Well, as luck would have it (I hope), I was digging around my bookmarks to see if I could find something similar to what I'm looking for, and came across Deramp's link. Under his Vector Graphics link, I noticed Vector Graphics and saw that he had the Flashwriter II listed as a video card... Hmm, I had always assumed, from the name, that that was an EPROM programmer. Well, much to my delight, he has a very good .tiff image that I was able to bring up and do some editing on to get rid of the keyboard and POJ Monitor chip circuitry. This looks promising. It is 80x24, standard chips, true descenders in the ROM character Generator. Downside is that I will have to come up with the hex file to burn in the 2716 EPROM. I need to re-visit Deramp's site, and maybe a few others, to get a ROM image..... Anyway, here is the cleaned up schematic....
 

Attachments

  • Flashwriter II Schematic Rev 4(updated).pdf
    1.5 MB · Views: 9
Nice - looks like a 14 MHz dot clock, with a /8 counter ( /16 set to start at 8 ) - And uses this for the address counter and it cascades up from there.

They have used a ROM to generate some of the address decoding also, and affect the timing - so the bipolar PROM is going to be a challenge - If you can find one and program it. A normal ROM may not be fast enough the way they've wired that one up. It looks like it's probably 5 to 10 times faster than a normal ROM. You might be better with wasting the character positions after the 80th character and using a ROM for timing of sync and blanking, and resetting of the Horizontal timer ( 9 bit timer will be needed for 14 MHz ) - Then speed is not an issue.

I like that it has a timer to adjust the horizontal sync, but it's a shame it's controlled by timers and not locked to the clock. Still it should work OK and be easy to adjust and tune if necessary.

I can't see where it arbits access to the RAM outside of simply giving the CPU BUS priority, so it might cause some video loss on write, but that will be minimal and probabilistic.

You could try using a GAL instead of the Bipolar ROM... Is it even possible to procure and program a bipolar PROM any more?
 
Yes, the Position ROM (74S471) is gonna be the chink in the armor. That will take some thinking to understand how it works. Even if I could get the chip, and the code for it, programming it might be a challenge.....
 
Isn't there something (still) around for the PIC microcontroller that was quite simple to make?

A serial interface (if I remember correctly)...

I came across my notes the other day when I tidied up a room. I did keep them...

Dave
The Geoff VT100 terminal? It is a good solution.
 
I was going through my list of S-100 board manuals & schematics, looking for a generic 80 charater by 24, or 25, line board. Something simple and generic that used a common Character Generator ROM that has descenders. But came up empty handed. Anyone have any thoughts or suggestions? I'm not looking for anything that has graphics capabilities, or requires a special character ROM, or uses PAL/GAL chips. Just something I can wire up with common off the shelf. albeit vintage, chips. Just another project idea....

I'm kinda' surprised that nobody has mentioned the ZRT-80! Pretty simple. I think it was developed by Digital Research Computers? I have schematics, but I'm pretty sure that they are available on-line. It is stand-alone -- *NOT* an S-100 card.

Roger
 
Look at the WHOLE thread before suggesting stand-alone terminals
Myke's last post pointing to the Flashwriter II makes it clear he wants something the S-100 CPU talks to DIRECTLY
 
Yes, the Position ROM (74S471) is gonna be the chink in the armor. That will take some thinking to understand how it works. Even if I could get the chip, and the code for it, programming it might be a challenge.....
There was an extensive Vector Graphic archive at one point on the web.
I would be very surprised if it wasn't dumped or that no one still has a board that it could be dumped from

There are three on eBay right now.
 
I remembered I have one in an MZ system I had in storage
I'll dump the firmware today and put it up on bitsavers
You're also welcome to make an offer for it.
 

Attachments

  • FW_II_r4.JPG
    FW_II_r4.JPG
    1.2 MB · Views: 9
Al's comment about using S100 for this application got me thinking. In our application, the video display shared the PCB with the printer software (hi-res multi-pass dot matrix with downloadable font. The CPU board ran at about 3.5Mhz (8085) and used an 8257 for DMA. The same DMA controller was used for disk access (floppy and hard). There was never a problem with contention. The benefit of the 8275 is that it has an on-chip line buffer.

Do I think it would work on an S100 bus? Yes, but note the requirement for DMA.
 
This is the POC - You can tell I have a thing about single sided PCBs. ( I intend to make a Serial to Video converter as the next POC, using an 8051 and something like the above, but with the changes where I learnt things while building it ).

Just for laughs here's my POC. It's a bit more elaborate.

dinologo.jpg

This also has three GALs, although most of the video related foo lives in just one of them. (The other two are a 16v8 being a multi-speed clock generator and a 22v10 that's acting both a bus arbiter to timeslice memory access between video and the WD65C02 CPU that's next to the red LED in row 4 and as the memory map/chip select generator for said CPU.) The two 32 pin wide DIPs in row 3 are a 128Kbyte ROM and 128Kbyte SRAM chip; the SRAM is shared between the CPU and video, and the ROM likewise is both CPU ROM and a "character generator". (That's in quotes for reasons.) Row 2 has two '245 buffers for tristating the video address generator and two '573 latches that are used for "magic", and Row 1 has an Atmel 324P that's essentially programmed as a CRTC, generating sync signals based on a timer and on the active video rows running a tight SW loop to output VRAM addresses for the frame/character buffer.

Obviously this is way more complicated than it would need to be for a simple text-only display, but the software defined counters allow this system to implement fairly arbitrary video memory maps; it can do character text modes an arbitrary number of rows tall, linear bitmap modes, or even emulate really oddball interlacing schemes or multi-byte character strides. (You could program it to look like an Apple II, for instance, with its positively Byzantine memory map. Or it can do a TRS-80 32 character mode, where each character that's displayed are 2 bytes apart. Per-line stride values can be up to 8 bits, and it would be possible to even switch maps mid-line to emulate really oddball things like a Cromemco Dazzler.)

The "magic" I referred to when describing the buffers on line 2 relates to dot generation: One of those buffers is loaded with an 8-bit value that acts as the high byte of a 16 bit memory address, which is set at the beginning of each line; for each "character" position in that line there are *two* memory accesses to resolve the dots that go into the output shift register. The first read goes into the second latch, and in the second read window the contents of the that latch are combined with "row latch" to fetch the actual dots. This allows the system to, as noted, support characters of arbitrary height, and the dot values can be read from either RAM *or* ROM, allowing user defined character sets. Timing would be a little tight to seamlessly switch character sets within a single active line, but switching character sets (or switching between character and graphics modes) between lines would be easy.

Also, FWIW, because the sync timing is software defined I was recently able to add interlaced support to this with no component changes, so on NTSC 50+ line text displays are possible. (And look fine on a long persistence green monitor or through a digital converter; the flickering will murder you on a color monitor.) I've been using a 12mhz pixel clock for a nicely proportioned 512x384 (or 192) display, but it works fine with crystals up to at least 20mhz so 80 or more 8-bit wide characters wide aren't a problem.

The next step I've been planning for this is replacing the 6502 CPU (which does mostly work, I've run simple programs launched out of ROM; I think I need to tweak the timing a little to make it less glitchy... although those glitches might also be because it's running from a breadboard) with glue to interface it to a Z80-style bus. (My initial target is hanging it off a TRS-80, but ultimately I'd like to try putting this on an S-100 card to stick in my very-much-in-need-of-restoration NorthStar Horizon. First crack is I'll just let it produce snow if there's CPU contention, but I think with some clever fourth-dimensional thinking it might be possible to achieve nearly wait-state-less full arbitration.) Wish I could say I was further along on that, but, eh, these things move at their own pace.
 
Just for laughs here's my POC. It's a bit more elaborate.

I'm not laughing at all - that looks pretty cool.

I'm in two minds over the Interlace - I can probably fit it into the GAL logic, which would let me access twice the memory for very little image gain. All I need is an external count deciding with bank it will get the frame from... Which is useful for having a video buffer I can write while the other is displaying also.. I just need to adjust the sync timing in the second GAL if I go that way, which means moving pins as I don't have enough logic terms in a 22V10 to cover doing that on the outside pins - and may need to move sync to the middle pins. I have no idea why they put 8 OR gates in the peripheral pins and 16 OR gates in the middle ones! Anyway the only downside of ignoring the interlace is I miss a line one time in 312 frames and I run at 50.1 Hz instead of 50, so my timing is a little out on vertical...

And the BUS arbitration is interesting. I still have to test my design, but generally I'm running memory clock at 7 MHz, Dot clock at 7 or 14 MHz, and that gives me every second half of the 7MHz cycle for CPU access, which if accessed asynchronously means I shouldn't have to wait more than 210ns for a "slot" to appear to either read or write, and the z80 only reads or writes once per three cycles, so that would theoretically let me run at 20 MHz or close to it - as long as I stretch the read timing by latching the data first opportunity when RD goes low and maintain on the CPU side bus until RD goes high again.

Likewise, a write pulse is going to be somewhere around 30ns or so for a write cycle at those kinds of speeds, so I would need to latch the write data until the timeslot comes around again, though on subsequent writes, it's ready again in 140ns, since a degree of co-incidental synchronisation occurs out of a worst-case read/write scenario, and if not, then it's going to latch the write and it won't be any worse than 210ns. Offering half of the memory time to the CPU and half to the video counters seems like an elegant way of doing it and seems to be reflected in speeds of 70 and 55ns coming out in single-port video-ram chips around 1984.

But there seems to be two choices for Myke unless he finds a ready-to-go schematic for a S100 design that he can replicate. ( I'm kind of amazed he has an archive of S100 designs... I never knew such existed. Then again, I never really got involved with S100 back in the day... I ended up going straight to ISA from a small home computer. ). -

The question otherwise, is whether it's better to design a card from scratch using a 6845 or similar, which gives some control over timing, or to do it in logic, with or without GALs or other PLDs, which remove CPU overhead in managing the video circuit, but increases chip count and complexity.

And then the decisions are whether to let the video bus arbitration method generate snow, wait-states or fully arbitrate the bus.

@MykeLawson , I know you like the wire wrap - and your digital logic is pretty good - You could probably design one from scratch to interface with your S100 bus.. And the IDT 4K memory chips are dirt cheap. - eg; the IDT7134SA55P - Which will give you a dual-ported static ram that will connect right up to your other memory access designs, so will be easy to interface and test from your PC.

After that, you don't need any arbitration logic, and you can even forego the buffers since it's only driving a single chip, and then you can build the video driver on the other side of the chip - Just a few counters and some sync generation logic.

If you wanted to keep it really simple, you could generate ALL of the sync timing from a few analog RC timers with potentiometers to adjust the delay and that would provide both sync and blanking, then you could just add in some counters driving the address and shift register directly. If you wanted to go really simple, even the dot clock could be analog and variable in origin. Then you could adjust both position and width via pots. After that, you just need an encoder - but there's plenty of composite output encoder designs around and you could pursue RS170 as a timing baseline.

Alternately, if you use a clock, then RS170 defines a 64uS scan line, which fits beautifully with Base2 timing, so a 12 MHz dot clock means you can use the 8th and 9th bit on the horizontal counter to reset the counter, or a 14MHz dot clock means you can use the 7th, 8th and 9th bit together to reset the horizontal clock, which makes for some pretty clean circuitry and minimal AND/OR with the 9th bit providing blanking, and initial sync timing. You can generate horizontal sync from a combination of bits, or you can just use an analog timer like the Vector Graphics circuit does... In fact, you could copy most of the Vector Graphics circuit and modify it to use with an IDT 7134 and really simplify things... There's no need for the PROM if you do things like generate the timing separately, and use direct counter-to-RAM connection. You can waste the character memory above the 80th character on each line if you like.

The starting point with your own design is to work out what timing you want to use, and whether you want controllable timing (eg, 6845 ) or fixed logic timing.

David
 
Here is a text VGA prototype I built a couple years ago. The basic idea is replacing existing 128KX8 RAM with VGA piggybacked on 128K RAM. Monochrome text VGA is simple enough that it can be done with 25MHz clock, 4K dual-port RAM and a small CPLD in PLCC44 package. Somewhere in the 128K memory space is a 4K write-only window that maps to the dual-port RAM. dual-port RAM allows access to video RAM anytime without creating the "snow" effect. The font table reside in the dual port RAM so it can be reprogrammed anytime. In this particular design the screen is 64 columns and 48 rows but there is a similar design with 100 columns and 32 rows.

The problem is it uses programmable logic which MyKeLawson wants to avoid.
Bill
 

Attachments

  • piggybackVGA.jpg
    piggybackVGA.jpg
    543.2 KB · Views: 11
  • PiggybackVGA_on_Z80SBC.jpeg
    PiggybackVGA_on_Z80SBC.jpeg
    1.3 MB · Views: 10
Back
Top