3 Gordon Drive, P.O.Box 1347 Rockland, Maine 04841 U.S.A.
Find Tools for Your Chip


 

© 2004 Avocet Systems, Inc.
Call Us Today at 207-596-7766 ("Picton Press")
Avocet Systems, Inc. : The Complete Solution for Embedded Systems Development Tools
Hints
Banking Z80 Systems

Abstract
A lot of Z80 systems are still around, and are running out of address space. One alternative is to switch to Zilog's Z180, which has a 1 Mb address range. Another is to add banking to your Z80. Here's a way to debug if you select the second option.

Most Z80/Z180 compilers support bank switching on either a Z80 or a Z180, though few users every use this feature on a Z80. In this example we'll look at bank switching with the Software Development Systems C compiler. Note that Softaid supports bank-switching with other compilers as well - call for more information.

SDSI's compiler vectors all banked calls through a short routine they provide that sites in the non-banked ROM. This routine looks like:

_call: push af ; bank part of ret address
push hl
ld hl,_ret
ex (sp),hl
jp (iy) ; ret
_ret: pop bc ; b is return bank ret
SLD needs a little more information about your program to properly track banking on a Z80. In particular, you must provide 3 numbers:

SLD_BANK - Address lines A16-A19
SLD_BSTART - Start address of banked area in the processor's logical space
SLD_BEND - End address of banked area in the processor's logical space.
For example, suppose any reference to logical addresses between 8000 and BFFF are remapped to your hardware to point to an extended address (i.e., your hardware asserts A16-A19). Then, set SLD_BSTART to 8000 and SLD_BEND to 0C000, and make sure your code always keeps the current A16-A19 values in SLD_BANK. Do this by modifying the above code as follows:

SLD_BANK: db 0 ; active bank

SLD_BSTART: dw xxx ; base address of banked area

  SLD_BEND: dw xxx   ; end address (not inclusive) of banked area
_call: push af ; bank part of ret address
push hl
ld a,c ; a=bank number (from linker)
out (port),a ; remap - do what ever your hardware needs
ld (SLD_BANK),a ; save bank
ld hl,_ret
ex (sp),hl
jp (iy) ; ret
_ret: pop bc ; b is return bank
ld a,b
out (port),a ; remap hardware
ret
If you compile with the "-s ptrf=4" option the compiler vectors all function calls through _call. _call is invoked with C=bank number and IY=address of the function being called. Bank numbers are assigned at link time in the linker specification file.

To handle larger address spaces with the UEM-Z80, connect the extra address lines to the Z80 pod (A0-23 are brought to the pod, even though only A0-15 are used for most Z80 systems).

SLD uses physical address to set breakpoints; the SDSI compiler provides SLD with this information. So, if you set a breakpoint on a routine that is not even mapped in, SLD uses the always-valid physical address.

However, when you hit a breakpoint we read the PC, which is only 16 bits, to determine the breakpoint address. This is true if you stop emulation at any random point as well. 16 bits is not enough to tell us where the break was in physical address space. Therefore, SLD will read the bank number from RAM (from the LD (SLD_BANK),A) shown in the code above. This will let SLD correlate physical and logical addresses.

Note that SLD defaults to no banking in Z80 systems. Invoke it with the -BANKZ80 command line option to enable banking. Do this by clicking on the SLDW icon, then selecting FILE:PROPERTIES:COMMAND LINE when in the Windows Program Manager.

Copyright 1994, Softaid, Inc.