| 
                                                         This section is broken into two parts: The
                                                                      ZX Spectrum 128K / +2 and
                                                               ZX Spectrum +2A / +3.
                                                               Each of
                                                               these
                                                               may have several sub-sections. Within each
                                                               section, you
                                                               may find links to additional information
                                                               elsewhere
                                                               in
                                                               this FAQ, or to other reference documents.
                                                               Several
                                                               original User
                                                               and Technical Manuals are available - these
                                                               are
                                                               listed in
                                                               the
                                                               documentation
                                                               section. 
                                                        The ZX Spectrum 128K /
                                                                             +2: 
                                                               The 128K machine is similar to the 48K
                                                               machine,
                                                               but with
                                                               extra memory accessed by paging it into the
                                                               top
                                                               16K of
                                                               RAM. There are
                                                               also some timing differences: 
                                                        
                                                               - The main processor runs at 3.54690 MHz,
                                                                      as
                                                                      opposed to
                                                                      3.50000 MHz.
 
                                                               - There are 228 T-states per scanline, as
                                                                      opposed to
                                                                      224.
 
                                                               - There are 311 scanlines per frame, as
                                                                      opposed
                                                                      to 312.
                                                               
 
                                                               - There are 63 scanlines before the
                                                                      television
                                                                      picture,
                                                                      as opposed to 64.
 
                                                               - To modify the border at the position of
                                                                      the
                                                                      first
                                                                      byte of the screen (see the 48K
                                                                             ZX
                                                                             Spectrum section for
                                                                      details),
                                                                      the OUT
                                                                      must finish after 14365, 14366,
                                                                      14367 or
                                                                      14368 T
                                                                      states have passed since interrupt.
                                                                      As with
                                                                      the
                                                                      48K machine, on some machines all
                                                                      timings
                                                                      (including contended memory timings)
                                                                      are
                                                                      one T
                                                                      state later.
 
                                                         
                                                        Note that this means that there are 70908 T states
                                                        per
                                                        frame,
                                                        and the '50 Hz' interrupt occurs at 50.01 Hz, as
                                                        compared
                                                        with 50.08 Hz on the 48K machine. The ULA bug which
                                                        causes
                                                        snow when
                                                        I is set
                                                        to point to contended memory still occurs, and
                                                        also
                                                        appears to
                                                        crash the machine shortly after I is set to point
                                                        to
                                                        contended
                                                        memory.
  
                                                        There are 4 subsections available:
                                                        Memory,
                                                        Keypad,
                                                        Sound and
                                                        Joysticks.
                                                        
                                                               - 
                                                                      
Memory
                                                                       
                                                                      The additional memory features of
                                                                             the
                                                                             128K/+2
                                                                             are controlled to by writes
                                                                             to port
                                                                             0x7ffd.
                                                                             As normal on Sinclair
                                                                             hardware, the
                                                                             port
                                                                             address is in fact only
                                                                             partially
                                                                             decoded
                                                                             and the hardware will respond
                                                                             to any
                                                                             port
                                                                             address with bits 1 and 15
                                                                             reset.
                                                                             However,
                                                                             0x7ffd should be used if at
                                                                             all
                                                                             possible to
                                                                             avoid conflicts with other
                                                                             hardware.
                                                                       
                                                                      When memory is being paged,
                                                                             interrupts
                                                                             should
                                                                             be disabled and the stack
                                                                             should be
                                                                             in an
                                                                             area which is not going to
                                                                             change.
                                                                             If normal interrupt code is
                                                                             to run,
                                                                             then
                                                                             the system variable at 0x5b5c
                                                                             (23388) must
                                                                             be kept updated with the last
                                                                             value
                                                                             sent to
                                                                             port 0x7ffd. Reading from
                                                                             0x7ffd
                                                                             produces
                                                                             no special results: floating
                                                                             bus
                                                                             values
                                                                             will be returned as would be
                                                                             returned from
                                                                             any other port not attached
                                                                             to any
                                                                             hardware. 
                                                                      The byte output will be
                                                                             interpreted as
                                                                             follows:
                                                                       
                                                                      Bits 0-2: RAM
                                                                             page
                                                                             (0-7) to
                                                                             map into memory at 0xc000.
                                                                       
                                                                      Bit 3: Select
                                                                             normal
                                                                             (0) or
                                                                             shadow (1) screen to be
                                                                             displayed.
                                                                             The
                                                                             normal screen is in bank 5,
                                                                             whilst
                                                                             the
                                                                             shadow screen is
                                                                             in bank 7. Note that this
                                                                             does not
                                                                             affect
                                                                             the memory between 0x4000 and
                                                                             0x7fff, which
                                                                             is always bank 5. 
                                                                      Bit 4: ROM
                                                                             select. ROM
                                                                             0 is
                                                                             the 128k editor and menu
                                                                             system; ROM
                                                                             1
                                                                             contains 48K BASIC. 
                                                                      Bit 5: If set,
                                                                             memory
                                                                             paging
                                                                             will be disabled and further
                                                                             output
                                                                             to this
                                                                             port will be ignored until
                                                                             the
                                                                             computer is
                                                                             reset. 
                                                                      The memory map of these computers
                                                                             is:
                                                                       
                                                                      0xffff +--------+--------+--------+--------+--------+--------+--------+--------+
       | Bank 0 | Bank 1 | Bank 2 | Bank 3 | Bank 4 | Bank 5 | Bank 6 | Bank 7 |
       |        |        |(also at|        |        |(also at|        |        |
       |        |        | 0x8000)|        |        | 0x4000)|        |        |
       |        |        |        |        |        | screen |        | screen |
0xc000 +--------+--------+--------+--------+--------+--------+--------+--------+
       | Bank 2 |        Any one of these pages may be switched in.
       |        |
       |        |
       |        |
0x8000 +--------+
       | Bank 5 |
       |        |
       |        |
       | screen |
0x4000 +--------+--------+
       | ROM 0  | ROM 1  | Either ROM may be switched in.
       |        |        |
       |        |        |
       |        |        |
0x0000 +--------+--------+
                                                                      RAM banks 1,3,4,6 and most of 7 are
                                                                      used
                                                                      for the
                                                                      silicon disc; the rest of 7 contains
                                                                      editor
                                                                      scratchpads.
  
                                                                      An example of a typical bank switch
                                                                      on the
                                                                      128 is:
                                                                           LD      A,(0x5b5c)      ;Previous value of port
     AND     0xf8
     OR      4               ;Select bank 4
     LD      BC,0x7ffd
     DI
     LD      (0x5b5c),A
     OUT     (C),A
     EI
                                                                      The principle is the same for all
                                                                      bank
                                                                      switching:
                                                                      change only the bits you need
                                                                      to.
  
                                                                      Memory banks 1,3,5 and 7 are
                                                                      contended,
                                                                      which
                                                                      reduces the speed of memory access
                                                                      in these
                                                                      banks
                                                                      as detailed in the Contended
                                                                             Memory section.
                                                                      As on the 48K machine, Port
                                                                             0xfe (and all other even
                                                                      ports)
                                                                      are
                                                                      contended. Port 0x7ffd is not
                                                                      contended as
                                                                      of
                                                                      itself, but the high byte of the
                                                                      port
                                                                      address
                                                                      being 0x7f causes delays. See the Contended
                                                                             Input/Output section for
                                                                      full
                                                                      details.
  
                                                                      The contended memory timings for
                                                                      these
                                                                      machines
                                                                      are similar to that for the 48K
                                                                      machine,
                                                                      except
                                                                      that the 6,5,4,3,2,1,0,0 pattern
                                                                      starts at
                                                                      14361 T
                                                                      states after the interrupt as
                                                                      opposed to
                                                                      14335,
                                                                      and repeats every 228 T states, as
                                                                      opposed
                                                                      to
                                                                      224.
  
                                                                
                                                               - Keypad
 
                                                                      The 128K machine's keypad extra
                                                                      editing
                                                                      facilities
                                                                      are also available via the normal
                                                                      keyboard:
                                                                                       FUNCTION                        KEYS
                 -----------------------------------------
                 Beginning of next word          [E] [S] J
                 Beginning of previous word      [E] I
                 Up ten lines                    [E] P
                 Down ten lines                  [S] I
                 Start of line                   [E] [S] 2
                 End of line                     [E] M
                 First line                      [E] N
                 Last line                       [E] T
                 Screen                          [E] [S] 8
                 Delete this character           [E] [S] K
                 Delete word left                [E] E
                 Delete word right               [E] W
                 Delete to start of line         [E] K
                 Delete to end of line           [E] J
                 [E] = Extended Mode
                 [S] = Symbol Shift
                                                                
                                                               - Sound
                                                                                    Chip
 
                                                                      The AY-3-8912
                                                                      sound
                                                                      chip is a widely used one, to be
                                                                      found in
                                                                      the MSX,
                                                                      Vectrex, Amstrad CPC range, etc. It
                                                                      is
                                                                      controlled
                                                                      by two I/O ports:
                                                                      OUT (0xfffd)   - Select a register 0-14
IN  (0xfffd)   - Read the value of the selected register
OUT (0xbffd)   - Write to the selected register 
                                                                
                                                               - 
                                                                      
Joysticks
                                                                       
                                                                      The +2 (but not the 128K) had two
                                                                             Sinclair-type
                                                                             joystick ports built in (see
                                                                             the Peripherals
                                                                             section for technical details
                                                                             on the
                                                                             Sinclair joysticks). These
                                                                             used the
                                                                             normal
                                                                             9-pin connector, but, in an
                                                                             attempt
                                                                             to
                                                                             produce vendor lock-in, wired
                                                                             the
                                                                             pins
                                                                             differently to the standard
                                                                             used by
                                                                             other
                                                                             manufacturers. Cross-over
                                                                             cables to
                                                                             work
                                                                             around this were very quickly
                                                                             available, or
                                                                             Sinclair User published an
                                                                             article
                                                                             on how
                                                                                    to make your own.
                                                                       
                                                                
                                                         
                                                        ZX Spectrum +2A /
                                                                             +3: The
                                                               +2A/+3
                                                               share the
                                                               same timing information, sound chip, etc as
                                                               the 128K/+2 machines; see above for
                                                               details.
  
                                                               Bit 6 of Port
                                                                      0xfe
                                                               of the +2A/+3 does not show the same
                                                               dependence on
                                                               what
                                                               was
                                                               written to Port
                                                                      0xfe as it does on the other
                                                               machines,
                                                               and
                                                               always returns 0 if there
                                                               is no signal. Finally, reading from a
                                                               non-existing
                                                               port
                                                               (eg 0xff) will always return 255, and not
                                                               give any
                                                               screen/attribute bytes as it does on
                                                               the 48K/128K/+2: 
                                                        
                                                               - 
                                                                      
Memory
                                                                       
                                                                      The basic principle of paging on
                                                                             the +2A
                                                                             and +3
                                                                             is the same as for the
                                                                             128K/+2.
                                                                             However,
                                                                             the +2A and +3 have four ROMs
                                                                             rather than two, and certain
                                                                             extra
                                                                             memory
                                                                             configurations. 
                                                                      Port 0x7ffd behaves in the almost
                                                                             exactly the
                                                                             same way as on the 128K/+2,
                                                                             with two
                                                                             exceptions: 
                                                                      
                                                                             - Bit 4 is now the low bit
                                                                                    of the
                                                                                    ROM
                                                                                    selection.
 
                                                                             - The partial decoding used
                                                                                    is now
                                                                                    slightly different:
                                                                                    the
                                                                                    hardware
                                                                                    will respond only to
                                                                                    those
                                                                                    port
                                                                                    addresses with bit 1
                                                                                    reset,
                                                                                    bit 14
                                                                                    set and bit 15 reset
                                                                                    (as
                                                                                    opposed to
                                                                                    just bits 1 and 15
                                                                                    reset on
                                                                                    the
                                                                                    128K/+2).
 
                                                                       
                                                                      The extra paging features of the
                                                                             +2A/+3
                                                                             are
                                                                             controlled by port 0x1ffd
                                                                             (again,
                                                                             partial
                                                                             decoding applies here: the
                                                                             hardware
                                                                             will
                                                                             respond to all port addresses
                                                                             with
                                                                             bit 1
                                                                             reset, bit 12 set and bits
                                                                             13, 14
                                                                             and 15
                                                                             reset). This port is also
                                                                             write-only, and
                                                                             its last value should be
                                                                             saved at
                                                                             0x5b67
                                                                             (23399). 
                                                                      Port 0x1ffd responds as follows:
                                                                       
                                                                        Bit 0: Paging mode. 0=normal, 1=special
  Bit 1: In normal mode, ignored.
  Bit 2: In normal mode, high bit of ROM selection. The four ROMs are:
          ROM 0: 128k editor, menu system and self-test program
          ROM 1: 128k syntax checker
          ROM 2: +3DOS
          ROM 3: 48 BASIC
  Bit 3: Disk motor; 1=on, 0=off
  Bit 4: Printer port strobe.
                                                                      When special mode is selected, the
                                                                      memory
                                                                      map
                                                                      changes to one of four
                                                                      configurations
                                                                      specified in
                                                                      bits 1 and 2 of port 0x1ffd:
                                                                               Bit 2 =0    Bit 2 =0    Bit 2 =1    Bit 2 =1
         Bit 1 =0    Bit 1 =1    Bit 1 =0    Bit 1 =1
 0xffff +--------+  +--------+  +--------+  +--------+
        | Bank 3 |  | Bank 7 |  | Bank 3 |  | Bank 3 |
        |        |  |        |  |        |  |        |
        |        |  |        |  |        |  |        |
        |        |  | screen |  |        |  |        |
 0xc000 +--------+  +--------+  +--------+  +--------+
        | Bank 2 |  | Bank 6 |  | Bank 6 |  | Bank 6 |
        |        |  |        |  |        |  |        |
        |        |  |        |  |        |  |        |
        |        |  |        |  |        |  |        |
 0x8000 +--------+  +--------+  +--------+  +--------+
        | Bank 1 |  | Bank 5 |  | Bank 5 |  | Bank 7 |
        |        |  |        |  |        |  |        |
        |        |  |        |  |        |  |        |
        |        |  | screen |  | screen |  | screen |
 0x4000 +--------+  +--------+  +--------+  +--------+
        | Bank 0 |  | Bank 4 |  | Bank 4 |  | Bank 4 |
        |        |  |        |  |        |  |        |
        |        |  |        |  |        |  |        |
        |        |  |        |  |        |  |        |
 0x0000 +--------+  +--------+  +--------+  +--------+
                                                                      RAM banks 1,3,4 and 6 are used for
                                                                      the disc
                                                                      cache
                                                                      and RAMdisc, while Bank 7 contains
                                                                      editor
                                                                      scratchpads and +3DOS
                                                                      workspace.
  
                                                                      The contended memory timings differ
                                                                      on the
                                                                      +2A/+3
                                                                      from the earlier machines; firstly,
                                                                      the
                                                                      timing
                                                                      differences mean that
                                                                      the top-left pixel of the screen is
                                                                      displayed
                                                                      14364 T-states after the 50 Hz
                                                                      interrupt
                                                                      occurs,
                                                                      as opposed to 14336. The T-states
                                                                      (relative to the interrupt) at which
                                                                      delays
                                                                      occur
                                                                      are given in the following table:
                                                                            Cycle #    Delay
      -------    -----
       14365       1
       14366   No delay
       14367       7
       14368       6
       14369       5
       14370       4
       14371       3
       14372       2
       14373       1
       14374   No delay
       14375       7
       14376       6
                                                                      and so on, until cycle 14494, when
                                                                      the
                                                                      display of
                                                                      the first scanline on the screen has
                                                                      been
                                                                      completed, and no more delays are
                                                                      inserted until 14593 (=14365+228)
                                                                      when the
                                                                      cycle
                                                                      repeats. The other difference occurs
                                                                      for
                                                                      instructions which have multiple
                                                                      'pc+1' or 'hl' entries in the
                                                                      breakdown for
                                                                      the
                                                                      other machines: on the +2A/+3, these
                                                                      entries are
                                                                      combined into just one. This
                                                                      means that, for example, JR becomes
                                                                      pc:4,pc+1:8.
  
                                                                      Unlike the base 128K machine, RAM
                                                                      banks 4,
                                                                      5, 6
                                                                      and 7 are contended. However,
                                                                      Port
                                                                             0xfe is
                                                                      not; whether ports 0x7ffd and 0x1ffd
                                                                      are
                                                                      contended is currently
                                                                      unknown.
  
                                                                
                                                               - Disk
                                                                                    Drive
 
                                                                      Please refer to the Disk
                                                                             Reference page for
                                                                      details of
                                                                      the +3
                                                                      Disk Drive. 
                                                         
                                                        
                                                        
        |