[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