Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: BZ80.c
- Revision:
- 1:bd86d49d7622
- Parent:
- 0:40cf46d9746d
--- a/BZ80.c Sun May 01 08:21:23 2011 +0000
+++ b/BZ80.c Sat May 07 19:06:35 2011 +0000
@@ -1,40 +1,20 @@
/**************************************************************************/
/*** ***/
-/*** yWOV[PT ***/
-/*** ***/
-/*** ̧ٖFBZ80.C ***/
+/*** Z80 compatible cpu ***/
/*** ***/
-/*** Origin1 : MAME Z80RA ***/
-/*** Origin2 : CP/M Player for Win32 Takeda.Toshiya 2004.03.05 ***/
-/*** MODIFY : Y.ABE 2007.11.05 sh2ɈڐA BIG ENDIAN ***/
-/*** MODIFY : Y.ABE 2011.04.29 mbedɈڐA ***/
+/*** Original1 : MAME Z80 ***/
+/*** Original2 : CP/M Player for Win32 Takeda.Toshiya 2004.03.05 ***/
+/*** MODIFY : Y.ABE 2007.11.05 Renesas sh2 BIG ENDIAN ***/
+/*** MODIFY : Y.ABE 2011.04.29 mbed ***/
/*** ***/
-/*** Fgb ***/
-/*** ***/
/**************************************************************************/
#include <stdio.h>
#include "define.h"
-// SH2 SERIAL PORT CH
-#define SCU_SYS_PORT 0
-#define SCU_Z80_PORT 2
-
-// CP/M BASE ADDRESS
-#define TPA_BASE 0x100
-#define CPP_BASE 0xfd00
-#define BDOS_BASE 0xfe00
-#define BIOS_BASE 0xff00
-#define CpmBootTop 0xDC00
-#define CpmBootBot 0xF200 // bios
-
-#define MAX_FIND_FILE 256
-
-#define IRQ_ENTRY_MAX 8
-
// Z80 register
#define AF regs[0].w
#define BC regs[1].w
-#define DE regs[2].w
+#define DE regs[2].w
#define HL regs[3].w
#define IX regs[4].w
#define IY regs[5].w
@@ -84,27 +64,14 @@
#define ZF 0x40
#define SF 0x80
-// sh2 FAT
-extern void CpmDiskFlashAll(void);
-extern void ExportFileStep1( char *filename );
-extern void ExportFileStep2( char *dskbuf, unsigned long siz );
-extern void ExportFileStep3( void );
-
-// sh2 serial
+// mbed serial
extern void SendZ80( char data );
extern short RecvZ80( void );
extern short BusySioZ80( void );
+
// mbed led
extern void OutLedZ80( unsigned char data );
-extern void b2a2(uint32 data, int8 *buf);
-extern void b2a4(uint32 data, int8 *buf);
-
-extern uint16 dsk10( uint16 io, uint16 data);
-extern uint16 dsk11( uint16 io, uint16 data);
-extern uint16 dsk12( uint16 io, uint16 data);
-extern void wsend( unsigned short ch, char *pnt );
-
void Z80Init( void );
void Z80Reset( void );
@@ -117,7 +84,7 @@
void execute_opXY( void );
-// yWObotWX^
+// cpu register
union REGTYPE {
uint8 b[2];
uint16 w;
@@ -130,20 +97,17 @@
uint8 IM, IFF1, IFF2, HALT;
uint16 EA;
-// yWO
-uint8 Z80Memory[Z80_MEM_SIZE]; // yWO
-
-
+// z80 memory
+uint8 Z80Memory[Z80_MEM_SIZE];
int count;
-// fobO֘A
+//
uint16 prvPC;
-
-// e[u
+//
static const char cc_op[0x100] = {
4,10, 7, 6, 4, 4, 7, 4, 4,11, 7, 6, 4, 4, 7, 4, 8,10, 7, 6, 4, 4, 7, 4,12,11, 7, 6, 4, 4, 7, 4,
7,10,16, 6, 4, 4, 7, 4, 7,11,16, 6, 4, 4, 7, 4, 7,10,13, 6,11,11,10, 4, 7,11,13, 6, 4, 4, 7, 4,
@@ -448,14 +412,14 @@
};
/* --------------------------------------------------------------------------
- Cg
+ memory write
-------------------------------------------------------------------------- */
void CPM_WriteMemory( uint16 addr, uint8 data )
{
Z80Memory[addr] = data;
}
/* --------------------------------------------------------------------------
- [h
+ memory read
-------------------------------------------------------------------------- */
uint8 CPM_ReadMemory( uint16 addr )
{
@@ -463,14 +427,14 @@
}
/* --------------------------------------------------------------------------
- o̓|[g
+ output
-------------------------------------------------------------------------- */
void cpm_WriteIO( uint8 laddr, uint8 haddr, uint8 data )
{
switch( laddr ) {
- case 0x00: // VAf[^|[go
+ case 0x00: // serial output data
SendZ80( data );
break;
@@ -479,12 +443,11 @@
break;
case 0xff: // disk flash
-// CpmDiskFlashAll();
break;
}
}
/* --------------------------------------------------------------------------
- [g
+ input
-------------------------------------------------------------------------- */
uint8 cpm_ReadIO( uint8 laddr, uint8 haddr )
{
@@ -492,15 +455,15 @@
switch( laddr ) {
- case 0x00: // VAf[^|[g
+ case 0x00: // serial input data
ret = RecvZ80();
break;
- case 0x01: // VAXe[^X@1FGveB
+ case 0x01: // serial status
if( BusySioZ80() == -1 ) {
- ret = 1;
+ ret = 1; //
} else {
- ret = 0;
+ ret = 0; // Arrival to data
}
break;
@@ -514,7 +477,7 @@
return ret;
}
/* --------------------------------------------------------------------------
- fobO֘A
+ debugger
-------------------------------------------------------------------------- */
void DispAdrDat( uint16 addr, uint8 dt )
{
@@ -533,23 +496,21 @@
void DispReg( void )
{
-#if 0
- int8 buf[128];
-
- wsend( SCU_SYS_PORT, "PC SP IR IX IY AF BC DE HL AF\' BC\' DE\' HL\'\n\r" );
+ char buf[128];
+
+ WSendZ80( "PC SP IR IX IY AF BC DE HL AF\' BC\' DE\' HL\'\n\r" );
sprintf( buf, "%04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x\n\r",
PC, SP, (_I<<8)|_R, IX, IY, AF, BC, DE, HL, exAF, exBC, exDE, exHL );
- wsend( SCU_SYS_PORT, buf );
- if(HALT){
- wsend( SCU_SYS_PORT, "NOW HLAT\n\r" );
+ WSendZ80( buf );
+ if( HALT ) {
+ WSendZ80( "NOW HLAT\n\r" );
}
-#endif
}
/*----------------------------------------------------------------------*/
-/* @\F NA */
-/* */
-/* ߒlF */
+/* */
+/* */
+/* */
/*----------------------------------------------------------------------*/
void ClearZ80Memory( void )
{
@@ -561,36 +522,36 @@
}
/*----------------------------------------------------------------------*/
-/* @\F [h */
-/* */
-/* ߒlF */
+/* */
+/* */
+/* */
/*----------------------------------------------------------------------*/
uint8 ReadMemory( uint16 addr )
{
return Z80Memory[addr];
}
/*----------------------------------------------------------------------*/
-/* @\F Cg */
-/* */
-/* ߒlF */
+/* */
+/* */
+/* */
/*----------------------------------------------------------------------*/
void WriteMemory( uint16 addr, uint8 val )
{
Z80Memory[addr] = val;
}
/*----------------------------------------------------------------------*/
-/* @\F [hPUrbg */
-/* */
-/* ߒlF */
+/* */
+/* */
+/* */
/*----------------------------------------------------------------------*/
uint16 ReadMemory16( uint16 addr )
{
return ReadMemory( addr ) | (ReadMemory( addr + 1 ) << 8);
}
/*----------------------------------------------------------------------*/
-/* @\F CgPUrbg */
-/* */
-/* ߒlF */
+/* */
+/* */
+/* */
/*----------------------------------------------------------------------*/
void WriteMemory16( uint16 addr, uint16 val )
{
@@ -598,18 +559,18 @@
WriteMemory( addr + 1, val >> 8 );
}
/*----------------------------------------------------------------------*/
-/* @\F tFb` */
-/* */
-/* ߒlF */
+/* */
+/* */
+/* */
/*----------------------------------------------------------------------*/
uint8 Fetch( void )
{
return ReadMemory( PC++ );
}
/*----------------------------------------------------------------------*/
-/* @\F tFb` */
-/* */
-/* ߒlF */
+/* */
+/* */
+/* */
/*----------------------------------------------------------------------*/
uint16 Fetch16( void )
{
@@ -660,7 +621,7 @@
-// AhX
+//
void EAX( void )
{
int16 res;
@@ -687,7 +648,7 @@
}
-// Iyh
+//
void JP( void )
{
PC = ReadMemory16(PC);
@@ -758,7 +719,7 @@
void EI( void )
{
- IFF1 = 3; // ̖̎߂ IFF
+ IFF1 = 3; //
IFF2 = 1;
}
@@ -1230,14 +1191,11 @@
void Z80Init( void )
{
- //
+ //
AF = BC = DE = HL = IX = IY = 0;
_I = _R = 0;
exAF = exBC = exDE = exHL = 0;
-// PC = TPA_BASE;
-// SP = CPP_BASE - 1;
-
PC = 0;
IM = IFF1 = IFF2 = HALT = 0;
@@ -1247,24 +1205,13 @@
}
/*----------------------------------------------------------------------*/
-/* @\F yWO Zbg */
-/* */
-/* ߒlF */
/*----------------------------------------------------------------------*/
void Z80Reset( void )
{
- // CP/M Zbg
- // PC = TPA_BASE;
-// SP = CPP_BASE - 1;
-// PUSH(CPP_BASE);
_I = _R = 0;
- // AF = 0xffff;
IM = IFF1 = IFF2 = HALT = 0;
}
/*----------------------------------------------------------------------*/
-/* @\F yWO hqp */
-/* */
-/* ߒlF */
/*----------------------------------------------------------------------*/
void Z80DoIRQ( uint8 vector )
{
@@ -1327,13 +1274,10 @@
}
/*----------------------------------------------------------------------*/
-/* @\F yWO mlh */
-/* */
-/* ߒlF */
/*----------------------------------------------------------------------*/
void Z80DoNMI( void )
{
- // NMI
+ //
if( HALT ) {
PC++;
HALT = 0;
@@ -1345,16 +1289,18 @@
IFF1 = 0;
}
/*----------------------------------------------------------------------*/
-/* @\F yWOV[PT */
-/* */
-/* ߒlF */
/*----------------------------------------------------------------------*/
int Z80Run( void )
{
+#ifdef DBG01
+ char buf[8];
+#endif
+
+
#if 0
- // 1߂
s count = 0;
-
- // IFF1̏
+ count = 0;
+
+ //
if( IFF1 > 1 ) {
if( --IFF1 == 1 ) {
InterruptEnabled();
@@ -1362,18 +1308,27 @@
}
#endif
+
+#ifdef DBG01
+ DispReg();
+#endif
+
if( !HALT ) {
execute_op();
+
+#ifdef DBG01
+ DispReg();
+ WRecvZ80(buf);
+#endif
}
- // TNbN
// return -count;
return 1;
}
/*----------------------------------------------------------------------*/
-/* @\F yWO߂̃tFb`AfR[hƎ
s */
-/* */
-/* ߒlF */
+/* */
+/* */
+/* */
/*----------------------------------------------------------------------*/
void execute_op( void )
{
@@ -2422,9 +2377,9 @@
}
}
/*----------------------------------------------------------------------*/
-/* @\F yWO bavtBbNX */
-/* */
-/* ߒlF */
+/* �@�\�F �y�W�O �b�a�v���t�B�b�N�X */
+/* �� ���� */
+/* �ߒl�F ���� */
/*----------------------------------------------------------------------*/
void execute_opCB( void )
{
@@ -3204,9 +3159,9 @@
}
}
/*----------------------------------------------------------------------*/
-/* @\F yWO ccvtBbNX */
-/* */
-/* ߒlF */
+/* �@�\�F �y�W�O �c�c�v���t�B�b�N�X */
+/* �� ���� */
+/* �ߒl�F ���� */
/*----------------------------------------------------------------------*/
void execute_opDD( void )
{
@@ -3509,9 +3464,9 @@
}
}
/*----------------------------------------------------------------------*/
-/* @\F yWO dcvtBbNX */
-/* */
-/* ߒlF */
+/* �@�\�F �y�W�O �d�c�v���t�B�b�N�X */
+/* �� ���� */
+/* �ߒl�F ���� */
/*----------------------------------------------------------------------*/
void execute_opED( void )
{
@@ -3774,38 +3729,22 @@
OTDR();
break;
-
- // ȉABIOS/BDOSR[p̃_~[ߌQ
+ //////
case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7:
case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef:
case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7:
case 0xf8:
-// if(prvPC >= BIOS_BASE) {
-// if(!cpm->BIOS(cmd - 0xe0, &BC, &DE, &HL, &_A))
-// HALT = 1;
-// }
break;
case 0xfe:
-// if(prvPC == CPP_BASE) {
-// cpm->CPP();
-// HALT = 1;
-// }
break;
case 0xff:
-// if(prvPC >= BDOS_BASE) {
-// if(!cpm->BDOS(_C, &DE, &HL, &_A))
-// HALT = 1;
-// }
break;
}
}
/*----------------------------------------------------------------------*/
-/* @\F yWO ecvtBbNX */
-/* */
-/* ߒlF */
/*----------------------------------------------------------------------*/
void execute_opFD( void )
{
@@ -4113,9 +4052,9 @@
}
}
/*----------------------------------------------------------------------*/
-/* @\F yWO DD(FD),CB vtBbNX */
-/* */
-/* ߒlF */
+/* �@�\�F �y�W�O DD(FD),CB �v���t�B�b�N�X */
+/* �� ���� */
+/* �ߒl�F ���� */
/*----------------------------------------------------------------------*/
void execute_opXY( void )
{