[abc80] PIC32_Z80

Anders Jansson andj at hem.utfors.se
Sön Jan 8 06:26:54 PST 2012


Hej!

Jag kollade lite på att emulera ABC80 i en PIC32 igen. Med PIC32 Ethernet 
Starter Kit borde man kunna ta emot kommandon och skicka grafikminnet via 
USB eller Ethernet/UDP. Med expansion board är det nog ganska lätt att 
supporta delar av ABC-bussen. Kanske mindre viktigt med VGA? Här är annars 
ett kort för SD + PS2 + Audio + monokrom VGA. 
http://www.exploringpic32.com/hw.html
Kortet är inte så dyrt (25 USD) men innehåller heller inte mycket mer än 
kontaktdon :-) Koden för VGA-generering finns utförligt beskriven i en bok, 
men man måste förstås översätta ABC bildskärmsminne till pixlar.

>> Jag testade att kompilera en annan Z80 emulator med MPLAB för PIC32.
>> http://fms.komkon.org/EMUL8/
>> Det gick inte med C30-kompilatorn som gav ett felmeddelande om 
>> begränsning i storlek i gratisversionen (trodde inte det fanns en sådan 
>> begränsning). Testade HITECH istället och det gick bättre. Med 
>> Lite-versionen blev det ca 80 instruktioner för avkodning av en Z80 NOP. 
>> Aktivering av Pro-versionen (45 dagar) gav ca 35 instruktioner för en 
>> NOP. Detta räcker väl ganska bra för ABC80? Den går väl på 3MHz och NOP 
>> tar 4 klockcykler?
>>

Det funkar bra med Microchips (gcc) C32-kompilator också. Jag hade bara inte 
sagt åt MPLAB att använda den senast installerade versionen! Denna 
kompilator klarar NOP på 24 instruktioner om man bara definierar INLINE lite 
extra i Z80.h
#define INLINEvoid  __inline__ static void __attribute__((always_inline))
#define INLINEunsigned  __inline__ static unsigned 
__attribute__((always_inline))

I Z80.c finns några funktioner
INLINE void ... och INLINE unsigned ... tag bort mellanslag så det blir 
enligt #define.
Sedan kompilera med alternate settings: -g -O -finline -Winline.
Totalt 84k programminne och 6k ram.
---------------------------------

Här är de funktioner man får skriva själv för att kunna kompilera:

int Z80_IRQ = 0;
// int Z80_IPeriod = 10000;

byte Z80_In (byte Port)
{ return 0x00;
}

void Z80_Out (byte Port,byte Value)
{
}

void Z80_WRMEM(dword A,byte V)
{
}

unsigned Z80_RDMEM(dword A)
{ return 0x00; //NOP

void Z80_Patch (Z80_Regs *Regs)
{ /*Called when ED FE occurs. Can be used
     to emulate disk access etc. */
}

int Z80_Interrupt(void)
{   /* This is called after IPeriod T-States
    have been executed. It should return
    Z80_IGNORE_INT, Z80_NMI_INT or a byte
    identifying the device (most often 0xFF) */
 return Z80_IGNORE_INT;
}

void Z80_Reti (void)
{ /* Called when RETI occurs               */
}

void Z80_Retn (void)
{ /* Called when RETN occurs               */
}
----------------------------------

Hälsn.
Anders.J





More information about the ABC80 mailing list