Revealing the SpectraVideo SV-318/328 Cartridge Slot: The Hardware

By Greg Vigneault   (Former Spectravideo employee)

For the while that I studied the SV-318/328, some years ago, I focused on implementing my CP/M-clone; the keyboard, display, memory mapping, I/O, etc. Until Tomas Karlsson asked about the cartridge slot, I hadn't given it any attention. Maybe its association with games made me think that it didn't warrant serious thought (the slot is labelled "Game Cartridge" in technical documents; I don't play computer games). But, as I researched an answer to Tom's question, I was surprised at how the cartridge slot ties into SV resources; and, I was reminded at how satisfying it can be to delve into the internals of a fun machine.

This article discusses the SV-318/328 hardware implementation and control of the cartridge slot; it doesn't cover how the SV detects and engages cartridge ROM code -- that's a software subject for another chapter. I assume the reader is familiar with some computer electronics, the Z80 in particular (e.g. ~MREQ), so I don't explain such common things as "bus transceivers" and "nand gates." If you're strictly a software guru there may be things here that don't have meaning for you. If you're a hardware project maker, these details can allow you to create accessory items that interface to the SV-3x8 cartridge slot.

I'd like this text to be considered as a work-in-progress, and the information herein at a "beta" level. This is an exercise in back-engineering; my SV material is aged and fading (as, perhaps, am I!), so I could overlook some detail, until I or someone else stumbles over it -- my previous text about the slot signals has such an error,
which I correct here.

So, without further ado, let's look at the SV-3x8 "Game Cartridge"...

  +-----+---------+ +------+---------+
  | Pin | Name    | | Pin  | Name    |
  +-----+---------+ +------+---------+
  |  1  | +5 VDC  | |   2  | +5 VDC  |
  +-----+---------+ +------+---------+
  |  3  | A7      | |   4  | A12     |
  +-----+---------+ +------+---------+
  |  5  | A6      | |   6  | A13     |
  +-----+---------+ +------+---------+
  |  7  | A5      | |   8  | A8      |
  +-----+---------+ +------+---------+
  |  9  | A4      | |  10  | A9      |
  +-----+---------+ +------+---------+
  | 11  | A3      | |  12  | A11     |
  +-----+---------+ +------+---------+
  | 13  | A10     | |  14  | A2      |
  +-----+---------+ +------+---------+
  | 15  | A0      | |  16  | A1      |
  +-----+---------+ +------+---------+
  | 17  | D0      | |  18  | D7      |
  +-----+---------+ +------+---------+
  | 19  | D1      | |  20  | D6      |
  +-----+---------+ +------+---------+
  | 21  | D2      | |  22  | D5      |
  +-----+---------+ +------+---------+
  | 23  | D3      | |  24  | D4      |
  +-----+---------+ +------+---------+
  | 25  | ~CCS3   | |  26  | ~CCS4   |
  +-----+---------+ +------+---------+
  | 27  | ~CCS1   | |  28  | ~CCS2   |
  +-----+---------+ +------+---------+
  | 29  | Gnd     | |  30  | Gnd     |
  +-----+---------+ +------+---------+

The slot has the Z80's eight data bits (D0..D7) and bottom fourteen address lines (A0..A13), four cartridge chip-selects (~CCS1..~CCS4) which I refer to collectively as ~CCSx, +5 Volts DC, and Ground.

The ~CCSx signals can be used to select up to 4 separate cartridges, e.g. in a piggy-back, daisy-chain, or expansion-bus configuration; or, one cartridge could use any/all ~CCSx signals for its own purposes.

The ~CCSx decode logic has the following signal dependencies ...

    ~CCS1 ---+
             |---------------------+
    ~CCS2 ---+                     |
                                   +-- ~CART, ~MREQ, A15, A14.
    ~CCS3 ------ ~ROMEN0 --+       |
                           |-------+
    ~CCS4 ------ ~ROMEN1 --+

The ~CART, ~ROMEN0, and ~ROMEN1 signals are set to 1 or 0 by your code modifying the bit-mapped "Port B" of the AY-3-8910 PSG ...

  ~CART:    Bit-0 of PSG Port B (register 15).
  ~ROMEN0:  Bit-6 of PSG Port B (register 15).
  ~ROMEN1:  Bit-7 of PSG Port B (register 15).

A pair of logic ICs (74LS32,74LS139) ensure that ~CART and ~MREQ are both low (0) to assert any ~CCSx -- but it's up to your code to make sure that ~CART is asserted (0) only when you're ready to loose direct access to SV BASIC ROM and/or RAM (as explained below).

Cartridge pins A0..A13 provide up to 16k of address space for each slot. Let's regard each of the four ~CCSx as being a select signal for one 16k-bank of slot space. SV address lines A15 and A14 use a decoder IC (74LS139) to enable one of the four 16k-banks; this maps the four slots into the SV 64k memory space, segmented as...

  ~CCS4:  SV memory addresses C000H..FFFFH  (16k) (A15:1, A14:1)
  ~CCS3:  SV memory addresses 8000H..BFFFH  (16k) (A15:1, A14:0)
  ~CCS2:  SV memory addresses 4000H..7FFFH  (16k) (A15:0, A14:1)
  ~CCS1:  SV memory addresses 0000H..3FFFH  (16k) (A15:0, A14:0)

In order to avoid conflicts between SV system ROM/RAM and the slot addressing segments, the SV BASIC ROM and/or RAM is automatically disabled, depending upon which of the slot enable/select signals are being asserted. The BASIC ROM/RAM is automatically re-enabled when there are no conflicting slot segments being accessed.

Even though the slots are just 16k each, they disable all of the 32k BASIC ROM, and/or all of the 64k+ RAM, as explained below.

The ~CART signal disables the BASIC ROM, at addresses 0..7FFFH, regardless of which of the four slot-select signals (~CCSx) is to be asserted. This was done by feeding ~CART into a Nand IC (74LS20) to enable/disable the address decoder IC (74LS139) that either allows or inhibits access to BASIC ROM.

Before putting ~CART low, your code should disable Z80 interrupts, because each interrupt causes the Z80 to call address 0038H (at either 50Hz or 60Hz, depending on which country you live in). So, your slot code should do its business as quickly as possible, then put ~CART inactive (1) to re-enable BASIC ROM, and then re-enable Z80 interrupts so that it may continue with its interrupt-driven "house-keeping" activities, such as scanning the keyboard (at about 20 times-per-second). Otherwise your code would need to have its own interrupt service routine (ISR) starting at address 0038H of slot #1 (~CSS1).

The cartridge connector doesn't have Read, Write, or bus-direction signals, so the selected slot memory/device logic must determine whether it should read the Z80 data lines, or load the data lines. This can be done with memory-mapped I/O (~MREQ), with some address ranges being assigned as Read-Only and some as Write-Only in the 16k slot space. However, the lack of a Read/Write signal presents a challenge when enabling ~CCS3 or ~CCS4 (see the Caution, below).

In addition to ~CART, your code must assert ~ROMEN0 (set it to 0) to enable ~CCS3; ~ROMEN1 must be asserted (0) to enable ~CCS4.

CAUTION: If either ~CCS3 or ~CCS4 is enabled, _all_ banks of SV RAM are automatically disabled, including RAM at 8000H..0FFFFH, and the "shadow" RAM at 0..7FFFH. This could be a disaster if not handled properly, as the Z80 stack must have enough RAM to accommodate the automatic register-push/pulls caused by interrupts and subroutine calls. This situation is aggravated by the lack of a slot Read/Write signal, which would make it simple to have contiguous read/write memory in any single slot segment.

(RAM is disabled by a SV signal named ~RAMDIS. An asserted ~RAMDIS holds ~CAS high, putting the DRAM chips into tri-state, preventing all Reads and Writes, while the DRAM remains ~RAS-refreshed.)

NOTE: Enabling _any_ slot-select signal (~CCSx) will automatically disable all data transfers to/from the main expansion bus -- the 50-pin edge-connector at the rear of your SV-318/328 that lets you add such goodies as disk drives, more memory, serial & parallel I/O, etc. Address and control signals get buffered out onto the bus, but data bits travel in and out via a bus-transceiver IC (74LS245). The transceiver is governed by a Nand IC (74LS30) that all ~CCSx signals feed into -- so if any of them become active the transceiver closes the data path (by going into high-Z tri-state mode).

Any cartridge that seems to happily co-exist with your expansion accessories is very busy jumping into and out of slot segments!


I welcome your feedback and ideas.


Regards,

Greg Vigneault   (Former Spectravideo employee)

 


 

Source: Tomas Karlsson

 

 
Webmaster: