that HD63484 ACRTC is looking pretty damn good. Utsource has lots of them in stock it seems, at pretty good prices too.
plus you can apparently chain them together... though i still don't fully understand how that would work in terms of VRAM and accessing it.
But besides that, i'm a bit confused about it's operating speed.
for example if you were to try and generate 640x480 @ 8bpp, each memory access would grab 2 bits worth of data (16-bit VRAM bus), and it takes 2 cycles per memory access. that works out to 1 pixel per cycle, which at a pixel clock of 25MHz would mean the chip would need to run at 25MHz as well.
that's a bit of an issue considering that it's rated for at most 8MHz... and it boasts resolutions 4096x4096 @ 1bpp or 1024x1024 @ 16bpp. but how? are they just running the display itself much slower? or is it just marketing handwavy "technically it can do this, but noone does" non-sense?
either way there seem to be pretty much no projects around this chip online, so i'd love to see someone throw something together and see how well it works.
drogon wrote:
Hardware scrolling isn't difficult... For a certain level of difficulty! It was done back in the day on some systems too (BBC Micro?) You need the video generator to have a programmable "base" address and to be able to wrap the address output after a certain number of screen lines. Then you can scroll up by simple adding 8 lines worth of width to the base address and clear what was the top 8 lines which are now the bottom 8 lines (lines being pixel high lines, assuming an 8 pixel high font - change as required). Horizontal scrolling can be achieved in a similar manner.
Yes Vertical scrolling can be done by offsetting all memory accesses by some fixed amount multiplied by the amount of bytes that make up 1 line of pixels (or one line of characters). but horizontal scrolling is basically impossible if your frame buffer is linearly stored in memory, which it likely is in basic video circuits.
what i was thinking for both vertical and horizontal scrolling is making a canvas that is larger than the screen, and map that linearly into memory. the screen is then defined as a movable section within the canvas' limits. so now you got 2 sets of coordinates. the local screen coordinates that say where everything is relative to the screen, and the global screen coordinates which say where the screen sits on the canvas.
so to get the memory address you want to access you need to add the local and global screen coordinates together, and then convert the result to a linear address.
ultimately it's just 1 step more than when the screen itself is directly mapped to memory... but by adjusting the global screen coordinates you scroll around however you want.
of course smooth scrolling is a completely different can of worms that requires bit manipulation and accessing variable amount of bytes per line, and a lot of headaches.
drogon wrote:
So I'd suggest working on a single cycle read or write 2D block move "blit" engine... Beats the 7 cycles per byte on the '816 block move instructions....
hmm, i wonder how useful a CPLD based blitter would be if it's limited to moving whole bytes only, so if 1 byte contains multiple pixels you wouldn't be able to move individual columns of pixels.
it might take a lot of counters and adders to pull of a blitter so i'm not sure if you could squeeze one into a CPLD in the first place.