New Project: DoubleVision SE/30 Card

If you stick by Apple's rules, the SE/30 is a single slot computer, hence, I do have the sole choice which resources my card uses, correct? ;-)
Weirdly the SE/30 actually has 3 logical slots in one physical slot (defer to Melkhior on this). I suspect they were considering the possibility of someone making an external expansion chassis with 3 Nubus slots... Which they did :)

But basically even though there is only one physical slot, for your card to play nice with other stacked cards, and other software, it needs to pick a logical slot and stick to it. That includes where it puts it's memory in the map, because it varies by "slot".

Edit - I'll leave more qualified people to answer your questions.
 
Last edited:
I guess I can only cover all possible cases if I, really, do wire all 3 interrupt lines to the FPGA. Maybe this is possible, depending on which answers I get in my previous post. ;-)

By default then, I am using:

Slot #9: $f9000000 / $90000000 - assuming that a card, which allows another one stacked on it, assumes that the card sitting on top is always using the first slot by default. At least that is what I would be assuming. ;-)
 
How would you define an applicable ruleset in a scenario where multiple PDS cards are stacked on top of each other,

Unsupported :-) In practice, stackable cards tend to have switches to choose the slot/irq. It's not very clean nor macintosh-like, but it worked. Apple only ever intended for one card to be used; I suspect in the SE/30 the idea was that a single card could have multiple functions in multiple slots, and perhaps the vendor could sell variants with different subsets of functions by simply not populating some components... but without needing to rewire anything. One PCB fits all :-)

In practice, as long as you card can "play nice" by letting the user pick the slot(s), then it's OK. The actual mechanism is up to the card's designer. It's unsupported anyway... That's for PDS ; for NuBus obeying the rules is more important, as all 6 slots could be populated in a II/IIx/IIfx.

The SE/30 is obviously a special case, since it always has its internal video circuit, which makes me wonder, how the synchronisation is handled in case of 2 screens. I would assume that the "master display" is the source of synchronisation, correct?

As far as I understand how it works, each screen is independent and there is no real "master screen". Any one screen can become the screen carrying the primary menu bar/boot screen, but hardware-wise they are all equal. Each device generates its own interrupt at whatever frequency, and the system software handles everything.

Most later Macs had internal video and additional slots, and earlier ones had multiple slots and were supposed to accept multiple cards from multiple vendors running with different vertical refresh...

I'm talking about custom resulutions, with user definable parameters

OK, so yes you can put that wherever you want as that's a device-specific function. The system only needs to know which resolution was picked, not the implementation details. So all good.

You mean games which (...)
Any and/or all of that, plus games (or other applications that were badly written or just wanted speed at all cost) that bypass some of Apple's mechanism to access the FB more or less directly or doing weird things. Some of them are gonna break no matter what (early B&W games would address the B&W by hardwiring the address, that didn't work on any non-compact Mac).

Which brings me to another question, what purpose do off-screen surface buffers serve in MacOS?

Mostly "clean" refresh (update the off-screen buffer, then blit it on-screen in one go). Usually, they are in main memory, I think, but don't take my word for it; others here are more expert than me on exploiting QD in applications. Some accelerated card had (often optional) off-screen memory, so that's also doable, but I have no idea how much SW is needed to implement the functionality.

The legendary 8*24GC accelerated device was offloading all of QD to its integrated CPU (some AM29000 IIRC), but any misbehaving application would have display issue, and Apple didn't support them in many version of the system software. Too much SW efforts.

I suppose that this can be much simpler on the SE/30. The problem seems clearly that there is no defined ruleset for multiple cards sharing one slot.

The theory is, as long as everyone uses a different (pseudo-)slot, all will be fine, but the SE/30 (or any PDS) wasn't designed for this so doesn't have a "clean" mechanism for like for NuBus.

PDS are hacks, essentially :-)

But not on the SE/30, since the only applicable clock is 15.67MHz, right?

The PDS also has other clocks, but yes the bus clock is the ~16 MHz one (15.67 sounds correct, but Apple was claiming 16, any companies did that kind of "rounding") that must be used for synchronous bus transaction (/STERM), you can get away with using another clock if you want to deal with the timing requirements of the asynchronous stuff (/DSACK[1..0]). The same pin has the 20 MHz clock on the IIsi. It's not a clock on the IIfx, because Apple... its 20MHz clock (half the real system clock) is on a different pin. The IIfx PDS is almost, but not quite, the same as the IIsi & SE/30. The cache slot in the IIci is completely different, but physically identical, presumably so people would blow up their Macs more easily :-( (let's always call it "cache slot" and not the P-acronym to avoid confusion, and it doesn't have an IRQ signal at all so is useless for framebuffers).

Also, just for giggles, if you want to do DMA (e.g. to do main-memory to FB-memory blitting), then the SE/30 memory controller answers asynchronously via /DSACK[1..0] (same than older systems going back the II with a MC68020), but the IIsi memory controller answers synchronously with /STERM (same as the IIci and later IIRC). Progress, but not super convenient for device developer!
 
I guess I can only cover all possible cases if I, really, do wire all 3 interrupt lines to the FPGA

If you need a level switcher (the IRQ will be pulled up to 5V), then you can use a silicon switch as a shifter and a physical switch to control the silicon switch (or if you don't mind the extra noise on the signal, just send the IRQ through the physical switch!). Just one FPGA pin but 2 or 3 different IRQ supported.

The IIsiFPGA uses a 74CB3T switch to choose between routing some signals to a PMod extension slot, or supporting bus mastering (on the IIsi by connecting /BR & friends ) and the IIfx (by connecting the extra clock). It's not super pretty, but it did allow the IIsiFPGA to work in a IIfx (at the slowed down 20 MHz clock, I don't have a IIfx myself to try and support the non-slowed down address range).
 
but I have no idea how much SW is needed to implement the functionality.
(Edit misread - read as "how much software needed the functionality)

Always start any such answer with "Photoshop..."

Basically Photoshop was the power app for years and a lot of fancy hardware was mainly used to make Photoshop faster. GWorld RAM, dual processors... DSPs....

Photoshop will store a full loaded image in fast local memory on a card and when you're viewing a cropped area, it will accelerate panning around by, I'm not sure, blitting locally or moving that part of the frame buffer? I've no idea. Might be card specific. We're in vendor specific realms.
 
Last edited:
Regarding sync and interrupts: the Mac OS wants a VBlank IRQ from each video card, which it uses to update the mouse pointer "flicker free" when it's on that card's framebuffer. If a card doesn't have an IRQ, the pointer will freeze and not move forever when it goes onto that monitor. (The multi-monitor support was really well thought out even in 1987 and System 6.0.x).

There are ways around that (some Macs had a not working or not reliable VBL IRQ and the ROM installed a timer task that calls the VBL interrupt handler) but if you're not Apple you'll need to do that in an INIT.
 
Regarding sync and interrupts: the Mac OS wants a VBlank IRQ from each video card, which it uses to update the mouse pointer "flicker free" when it's on that card's framebuffer. If a card doesn't have an IRQ, the pointer will freeze and not move forever when it goes onto that monitor. (The multi-monitor support was really well thought out even in 1987 and System 6.0.x).

So it really is the case that, if the mouse pointer is on Screen #1, the INT handler from video hardware #1 is used, and once the pointer is on screen #2, it switches the int handler.

Hmmm, simple and straightforward. And the "edge" case that some "non-static" content might occupy both screens can be neglected.
In any case, I got it, I want the card to be fully software configurable, so I will find a way to connect all 3 IRQ lines (currently, I can select either of the 3 via solder blob for experimenting).

There are ways around that (some Macs had a not working or not reliable VBL IRQ and the ROM installed a timer task that calls the VBL interrupt handler) but if you're not Apple you'll need to do that in an INIT.

I think I want to avoid this. :-)

Thanks for your help!
 
If you need a level switcher (the IRQ will be pulled up to 5V), then you can use a silicon switch as a shifter and a physical switch to control the silicon switch (or if you don't mind the extra noise on the signal, just send the IRQ through the physical switch!). Just one FPGA pin but 2 or 3 different IRQ supported.

Thanks, I'm using a simple 74LS05 TTL driver (with level shifter placed in front of it) to "pull-down" the IRQ line.
I probably can forego on the /CBREQ and /CBACK lines, which I connected for testing purposes, to get the additional 2 lines.

Given your description above, I should support at least 2 video pages for each supported mode. Therefore I could, in theory, get one additional pin by supporting only 16MB VRAM, given that the maximum resolution is 1920x1080@32bpp.

Any good reason I should still go with 32MB VRAM? (besides that getting the fast and inexpensive 200MHz chips is easier in this case).

The IIsiFPGA uses a 74CB3T switch to choose between routing some signals to a PMod extension slot, or supporting bus mastering (on the IIsi by connecting /BR & friends ) and the IIfx (by connecting the extra clock). It's not super pretty, but it did allow the IIsiFPGA to work in a IIfx (at the slowed down 20 MHz clock, I don't have a IIfx myself to try and support the non-slowed down address range).

Cool, thanks for sharing your experiences! :-)
 
Hello Mac community,

since I have gotten my first actual Macintosh last month (LC475), I must admit that the "Mac Bug" has bitten me, which is why I have now also pushed the trigger on getting a Macintosh SE/30 yesterday.

In order to have fun with it, I decided to port one of my other Amiga projects to the SE/30, therefore, I would like to announce today that I have started to develop a new graphics card for the SE/30 called:

DoubleVision SE/30

Technically, it is very much a Macintosh port of my Amiga graphics card, the P-Vision, but with some Mac SE/30 specific feature enhancements. ;)

So what can it do? Well, here is the feature List:

  • HDMI video plug using DVI video signalling
  • 32MB VRAM framebuffer, clocked at 165MHz
  • Supports 1bit,2bit,4-bit,8bit,15bit,16,bit and 32bit color depths
  • All standard VGA and MAC resolutions, supporting up to 1280x1024@60p AND 1920x1080@30p
  • Fast 64-bit BitBlt engine, pushing up to 130 Mio Pix/s (8bpp)
  • 32 KB internal ROM for graphics drivers
  • Firmware can be fully upgraded on the host system (via "FlashFPGA App" running on MacOS)
  • Special MAC SE/30 features:
    • Card can work in dual-mode (second monitor to the SE/30 internal monitor) or route the SE/30 internal video output to HDMI
    • If MAC is booted, and no HDMI is connected, framebuffer memory is added as 32 MB system memory
    • Eleborate write-through cache to minimise read/write latency to VRAM
    • Makes full use of 68030 2-cycle 32-bit synchronous bus termination - yielding up to 32MB/s host memory performance using 16MHz bus!
I have seen that MAC SE/30 graphics cards using old and outdated graphics chips fetch high prices on the collector's market, so here is my offer to the community to provide a much more modern and better solution.

The card itself is low-profile and it has an internal HDMI port, which can be put outside of the SE/30 via a small bracket.

As I said, most of the development is already done, as the designs works great on the Amiga, therefore I expect that the most challenging part for me is to write the graphics ROM driver for the MAC in order to enable the display output. I have already started to look into this direction. ;-)

So for now, let's start with a first render of the board PCB, which I expect will be nearly identical to the final PCB.

View attachment 94558

As always, questions, comments, etc are always welcome. :)
Aaah, but does it do HAM mode?
 
Any good reason I should still go with 32MB VRAM? (besides that getting the fast and inexpensive 200MHz chips is easier in this case).
You could possibly map it as System RAM? Or a RAM Disk?

Not needed, just thoughts if you had spare memory floating around.
 
Back
Top