Cleaned up formatting in Thumb ARM emulation code.

Wrapped THUMB ARM emulation in a define, so that it can be excluded
from builds.  To enable it, the 'THUMB_SUPPORT' directive must be
included in the build process.  This has been added to the OSX
project files, but is still TODO for Linux and Windows.

Removed some obsolete include paths from the OSX project files,
dating back about 5 years or so.


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@2215 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2011-04-16 16:53:41 +00:00
parent bcb8dfbc2b
commit 72185d0848
6 changed files with 1120 additions and 1067 deletions

View File

@ -62,9 +62,11 @@ CartridgeDPCPlus::CartridgeDPCPlus(const uInt8* image, uInt32 size,
myFrequencyImage += offset;
}
#ifdef THUMB_SUPPORT
// Create Thumbulator ARM emulator
myThumbEmulator = new Thumbulator((uInt16*)(myProgramImage-0xC00),
(uInt16*)myDPCRAM);
#endif
// Copy DPC display data to Harmony RAM
memcpy(myDisplayImage, myProgramImage + 0x6000, 0x1000);
@ -89,7 +91,9 @@ CartridgeDPCPlus::~CartridgeDPCPlus()
delete[] myImage;
delete[] myDPCRAM;
#ifdef THUMB_SUPPORT
delete myThumbEmulator;
#endif
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -194,12 +198,13 @@ inline void CartridgeDPCPlus::callFunction(uInt8 value)
myDisplayImage[myCounters[myParameter[2]]+i] = myParameter[0];
myParameterPointer = 0;
break;
#ifdef THUMB_SUPPORT
case 254:
case 255: // Call user writen ARM code (most likely be C compiled for ARM).
// ARM code not supported by Stella at this time.
case 255:
// Call user written ARM code (most likely be C compiled for ARM)
myThumbEmulator->run();
break;
#endif
// reserved
}
}

View File

@ -21,7 +21,9 @@
#define CARTRIDGE_DPC_PLUS_HXX
class System;
#ifdef THUMB_SUPPORT
class Thumbulator;
#endif
#include "bspf.hxx"
#include "Cart.hxx"
@ -182,8 +184,10 @@ class CartridgeDPCPlus : public Cartridge
// Pointer to the DPC 8k RAM image
uInt8* myDPCRAM;
#ifdef THUMB_SUPPORT
// Pointer to the Thumb ARM emulator object
Thumbulator* myThumbEmulator;
#endif
// Pointer to the 1K frequency table
uInt8* myFrequencyImage;

View File

@ -24,6 +24,8 @@
// Code is public domain and used with the author's consent
//============================================================================
#ifdef THUMB_SUPPORT
#include <cstdio>
#include "bspf.hxx"
@ -822,11 +824,13 @@ int Thumbulator::execute ( void )
if((inst&0xF800)==0xE000)
{
rb=(inst>>0)&0x7FF;
if(rb&(1<<10)) rb|=(~0)<<11;
if(rb&(1<<10))
rb|=(~0)<<11;
rb<<=1;
rb+=pc;
rb+=2;
if(DISS) fprintf(stderr,"B 0x%08X\n",rb-3);
if(DISS)
fprintf(stderr,"B 0x%08X\n",rb-3);
write_register(15,rb);
return(0);
}
@ -836,7 +840,8 @@ if(DISS) fprintf(stderr,"B 0x%08X\n",rb-3);
{
rd=(inst>>0)&0x7;
rm=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"bics r%u,r%u\n",rd,rm);
if(DISS)
fprintf(stderr,"bics r%u,r%u\n",rd,rm);
ra=read_register(rd);
rb=read_register(rm);
rc=ra&(~rb);
@ -859,27 +864,28 @@ if(DISS) fprintf(stderr,"bics r%u,r%u\n",rd,rm);
{
if((inst&0x1800)==0x1000) //H=b10
{
if(DISS) fprintf(stderr,"\n");
if(DISS)
fprintf(stderr,"\n");
halfadd=inst;
return(0);
}
else
if((inst&0x1800)==0x1800) //H=b11
else if((inst&0x1800)==0x1800) //H=b11
{
//branch to thumb
rb=halfadd&((1<<11)-1);
if(rb&1<<10) rb|=(~((1<<11)-1)); //sign extend
if(rb&1<<10)
rb|=(~((1<<11)-1)); //sign extend
rb<<=11;
rb|=inst&((1<<11)-1);
rb<<=1;
rb+=pc;
if(DISS) fprintf(stderr,"bl 0x%08X\n",rb-3);
if(DISS)
fprintf(stderr,"bl 0x%08X\n",rb-3);
write_register(14,pc-2);
write_register(15,rb);
return(0);
}
else
if((inst&0x1800)==0x0800) //H=b01
else if((inst&0x1800)==0x0800) //H=b01
{
//fprintf(stderr,"cannot branch to arm 0x%08X 0x%04X\n",pc,inst);
// fxq: this should exit the code without having to detect it
@ -891,9 +897,10 @@ if(DISS) fprintf(stderr,"bl 0x%08X\n",rb-3);
if((inst&0xFF87)==0x4780)
{
rm=(inst>>3)&0xF;
if(DISS) fprintf(stderr,"blx r%u\n",rm);
if(DISS)
fprintf(stderr,"blx r%u\n",rm);
rc=read_register(rm);
//fprintf(stderr,"blx r%u 0x%X 0x%X\n",rm,rc,pc);
//fprintf(stderr,"blx r%u 0x%X 0x%X\n",rm,rc,pc);
rc+=2;
if(rc&1)
{
@ -913,10 +920,11 @@ if(DISS) fprintf(stderr,"blx r%u\n",rm);
if((inst&0xFF87)==0x4700)
{
rm=(inst>>3)&0xF;
if(DISS) fprintf(stderr,"bx r%u\n",rm);
if(DISS)
fprintf(stderr,"bx r%u\n",rm);
rc=read_register(rm);
rc+=2;
//fprintf(stderr,"bx r%u 0x%X 0x%X\n",rm,rc,pc);
//fprintf(stderr,"bx r%u 0x%X 0x%X\n",rm,rc,pc);
if(rc&1)
{
write_register(15,rc);
@ -935,7 +943,8 @@ if(DISS) fprintf(stderr,"bx r%u\n",rm);
{
rn=(inst>>0)&0x7;
rm=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"cmns r%u,r%u\n",rn,rm);
if(DISS)
fprintf(stderr,"cmns r%u,r%u\n",rn,rm);
ra=read_register(rn);
rb=read_register(rm);
rc=ra+rb;
@ -951,10 +960,11 @@ if(DISS) fprintf(stderr,"cmns r%u,r%u\n",rn,rm);
{
rb=(inst>>0)&0xFF;
rn=(inst>>8)&0x07;
if(DISS) fprintf(stderr,"cmp r%u,#0x%02X\n",rn,rb);
if(DISS)
fprintf(stderr,"cmp r%u,#0x%02X\n",rn,rb);
ra=read_register(rn);
rc=ra-rb;
//fprintf(stderr,"0x%08X 0x%08X\n",ra,rb);
//fprintf(stderr,"0x%08X 0x%08X\n",ra,rb);
do_nflag(rc);
do_zflag(rc);
do_cflag(ra,~rb,1);
@ -967,11 +977,12 @@ if(DISS) fprintf(stderr,"cmp r%u,#0x%02X\n",rn,rb);
{
rn=(inst>>0)&0x7;
rm=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"cmps r%u,r%u\n",rn,rm);
if(DISS)
fprintf(stderr,"cmps r%u,r%u\n",rn,rm);
ra=read_register(rn);
rb=read_register(rm);
rc=ra-rb;
//fprintf(stderr,"0x%08X 0x%08X\n",ra,rb);
//fprintf(stderr,"0x%08X 0x%08X\n",ra,rb);
do_nflag(rc);
do_zflag(rc);
do_cflag(ra,~rb,1);
@ -993,7 +1004,8 @@ if(DISS) fprintf(stderr,"cmps r%u,r%u\n",rn,rm);
//UNPREDICTABLE
}
rm=(inst>>3)&0xF;
if(DISS) fprintf(stderr,"cmps r%u,r%u\n",rn,rm);
if(DISS)
fprintf(stderr,"cmps r%u,r%u\n",rn,rm);
ra=read_register(rn);
rb=read_register(rm);
rc=ra-rb;
@ -1001,21 +1013,22 @@ if(DISS) fprintf(stderr,"cmps r%u,r%u\n",rn,rm);
do_zflag(rc);
do_cflag(ra,~rb,1);
do_sub_vflag(ra,rb,rc);
if(0)
{
#if 0
if(cpsr&CPSR_N) fprintf(stderr,"N"); else fprintf(stderr,"n");
if(cpsr&CPSR_Z) fprintf(stderr,"Z"); else fprintf(stderr,"z");
if(cpsr&CPSR_C) fprintf(stderr,"C"); else fprintf(stderr,"c");
if(cpsr&CPSR_V) fprintf(stderr,"V"); else fprintf(stderr,"v");
fprintf(stderr," -- 0x%08X 0x%08X\n",ra,rb);
}
#endif
return(0);
}
//CPS
if((inst&0xFFE8)==0xB660)
{
if(DISS) fprintf(stderr,"cps TODO\n");
if(DISS)
fprintf(stderr,"cps TODO\n");
return(1);
}
@ -1026,7 +1039,8 @@ if(DISS) fprintf(stderr,"cps TODO\n");
//going to let mov handle high registers
rd=(inst>>0)&0x7;
rm=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"cpy r%u,r%u\n",rd,rm);
if(DISS)
fprintf(stderr,"cpy r%u,r%u\n",rd,rm);
rc=read_register(rm);
write_register(rd,rc);
return(0);
@ -1037,7 +1051,8 @@ if(DISS) fprintf(stderr,"cpy r%u,r%u\n",rd,rm);
{
rd=(inst>>0)&0x7;
rm=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"eors r%u,r%u\n",rd,rm);
if(DISS)
fprintf(stderr,"eors r%u,r%u\n",rd,rm);
ra=read_register(rd);
rb=read_register(rm);
rc=ra^rb;
@ -1051,8 +1066,8 @@ if(DISS) fprintf(stderr,"eors r%u,r%u\n",rd,rm);
if((inst&0xF800)==0xC800)
{
rn=(inst>>8)&0x7;
if(DISS)
{
if(DISS)
{
fprintf(stderr,"ldmia r%u!,{",rn);
for(ra=0,rb=0x01,rc=0;rb;rb=(rb<<1)&0xFF,ra++)
{
@ -1064,7 +1079,7 @@ if(DISS)
}
}
fprintf(stderr,"}\n");
}
}
sp=read_register(rn);
for(ra=0,rb=0x01;rb;rb=(rb<<1)&0xFF,ra++)
{
@ -1085,7 +1100,8 @@ if(DISS)
rn=(inst>>3)&0x07;
rb=(inst>>6)&0x1F;
rb<<=2;
if(DISS) fprintf(stderr,"ldr r%u,[r%u,#0x%X]\n",rd,rn,rb);
if(DISS)
fprintf(stderr,"ldr r%u,[r%u,#0x%X]\n",rd,rn,rb);
rb=read_register(rn)+rb;
rc=read32(rb);
write_register(rd,rc);
@ -1098,7 +1114,8 @@ if(DISS) fprintf(stderr,"ldr r%u,[r%u,#0x%X]\n",rd,rn,rb);
rd=(inst>>0)&0x7;
rn=(inst>>3)&0x7;
rm=(inst>>6)&0x7;
if(DISS) fprintf(stderr,"ldr r%u,[r%u,r%u]\n",rd,rn,rm);
if(DISS)
fprintf(stderr,"ldr r%u,[r%u,r%u]\n",rd,rn,rm);
rb=read_register(rn)+read_register(rm);
rc=read32(rb);
write_register(rd,rc);
@ -1111,11 +1128,13 @@ if(DISS) fprintf(stderr,"ldr r%u,[r%u,r%u]\n",rd,rn,rm);
rb=(inst>>0)&0xFF;
rd=(inst>>8)&0x07;
rb<<=2;
if(DISS) fprintf(stderr,"ldr r%u,[PC+#0x%X] ",rd,rb);
if(DISS)
fprintf(stderr,"ldr r%u,[PC+#0x%X] ",rd,rb);
ra=read_register(15);
ra&=~3;
rb+=ra;
if(DISS) fprintf(stderr,";@ 0x%X\n",rb);
if(DISS)
fprintf(stderr,";@ 0x%X\n",rb);
rc=read32(rb);
write_register(rd,rc);
return(0);
@ -1127,7 +1146,8 @@ if(DISS) fprintf(stderr,";@ 0x%X\n",rb);
rb=(inst>>0)&0xFF;
rd=(inst>>8)&0x07;
rb<<=2;
if(DISS) fprintf(stderr,"ldr r%u,[SP+#0x%X]\n",rd,rb);
if(DISS)
fprintf(stderr,"ldr r%u,[SP+#0x%X]\n",rd,rb);
ra=read_register(13);
//ra&=~3;
rb+=ra;
@ -1142,7 +1162,8 @@ if(DISS) fprintf(stderr,"ldr r%u,[SP+#0x%X]\n",rd,rb);
rd=(inst>>0)&0x07;
rn=(inst>>3)&0x07;
rb=(inst>>6)&0x1F;
if(DISS) fprintf(stderr,"ldrb r%u,[r%u,#0x%X]\n",rd,rn,rb);
if(DISS)
fprintf(stderr,"ldrb r%u,[r%u,#0x%X]\n",rd,rn,rb);
rb=read_register(rn)+rb;
rc=read16(rb&(~1));
if(rb&1)
@ -1162,7 +1183,8 @@ if(DISS) fprintf(stderr,"ldrb r%u,[r%u,#0x%X]\n",rd,rn,rb);
rd=(inst>>0)&0x7;
rn=(inst>>3)&0x7;
rm=(inst>>6)&0x7;
if(DISS) fprintf(stderr,"ldrb r%u,[r%u,r%u]\n",rd,rn,rm);
if(DISS)
fprintf(stderr,"ldrb r%u,[r%u,r%u]\n",rd,rn,rm);
rb=read_register(rn)+read_register(rm);
rc=read16(rb&(~1));
if(rb&1)
@ -1183,7 +1205,8 @@ if(DISS) fprintf(stderr,"ldrb r%u,[r%u,r%u]\n",rd,rn,rm);
rn=(inst>>3)&0x07;
rb=(inst>>6)&0x1F;
rb<<=1;
if(DISS) fprintf(stderr,"ldrh r%u,[r%u,#0x%X]\n",rd,rn,rb);
if(DISS)
fprintf(stderr,"ldrh r%u,[r%u,#0x%X]\n",rd,rn,rb);
rb=read_register(rn)+rb;
rc=read16(rb);
write_register(rd,rc&0xFFFF);
@ -1196,7 +1219,8 @@ if(DISS) fprintf(stderr,"ldrh r%u,[r%u,#0x%X]\n",rd,rn,rb);
rd=(inst>>0)&0x7;
rn=(inst>>3)&0x7;
rm=(inst>>6)&0x7;
if(DISS) fprintf(stderr,"ldrh r%u,[r%u,r%u]\n",rd,rn,rm);
if(DISS)
fprintf(stderr,"ldrh r%u,[r%u,r%u]\n",rd,rn,rm);
rb=read_register(rn)+read_register(rm);
rc=read16(rb);
write_register(rd,rc&0xFFFF);
@ -1209,7 +1233,8 @@ if(DISS) fprintf(stderr,"ldrh r%u,[r%u,r%u]\n",rd,rn,rm);
rd=(inst>>0)&0x7;
rn=(inst>>3)&0x7;
rm=(inst>>6)&0x7;
if(DISS) fprintf(stderr,"ldrsb r%u,[r%u,r%u]\n",rd,rn,rm);
if(DISS)
fprintf(stderr,"ldrsb r%u,[r%u,r%u]\n",rd,rn,rm);
rb=read_register(rn)+read_register(rm);
rc=read16(rb&(~1));
if(rb&1)
@ -1231,7 +1256,8 @@ if(DISS) fprintf(stderr,"ldrsb r%u,[r%u,r%u]\n",rd,rn,rm);
rd=(inst>>0)&0x7;
rn=(inst>>3)&0x7;
rm=(inst>>6)&0x7;
if(DISS) fprintf(stderr,"ldrsh r%u,[r%u,r%u]\n",rd,rn,rm);
if(DISS)
fprintf(stderr,"ldrsh r%u,[r%u,r%u]\n",rd,rn,rm);
rb=read_register(rn)+read_register(rm);
rc=read16(rb);
rc&=0xFFFF;
@ -1246,7 +1272,8 @@ if(DISS) fprintf(stderr,"ldrsh r%u,[r%u,r%u]\n",rd,rn,rm);
rd=(inst>>0)&0x07;
rm=(inst>>3)&0x07;
rb=(inst>>6)&0x1F;
if(DISS) fprintf(stderr,"lsls r%u,r%u,#0x%X\n",rd,rm,rb);
if(DISS)
fprintf(stderr,"lsls r%u,r%u,#0x%X\n",rd,rm,rb);
rc=read_register(rm);
if(rb==0)
{
@ -1271,7 +1298,8 @@ if(DISS) fprintf(stderr,"lsls r%u,r%u,#0x%X\n",rd,rm,rb);
{
rd=(inst>>0)&0x07;
rs=(inst>>3)&0x07;
if(DISS) fprintf(stderr,"lsls r%u,r%u\n",rd,rs);
if(DISS)
fprintf(stderr,"lsls r%u,r%u\n",rd,rs);
rc=read_register(rd);
rb=read_register(rs);
rb&=0xFF;
@ -1305,7 +1333,8 @@ if(DISS) fprintf(stderr,"lsls r%u,r%u\n",rd,rs);
rd=(inst>>0)&0x07;
rm=(inst>>3)&0x07;
rb=(inst>>6)&0x1F;
if(DISS) fprintf(stderr,"lsrs r%u,r%u,#0x%X\n",rd,rm,rb);
if(DISS)
fprintf(stderr,"lsrs r%u,r%u,#0x%X\n",rd,rm,rb);
rc=read_register(rm);
if(rb==0)
{
@ -1328,7 +1357,8 @@ if(DISS) fprintf(stderr,"lsrs r%u,r%u,#0x%X\n",rd,rm,rb);
{
rd=(inst>>0)&0x07;
rs=(inst>>3)&0x07;
if(DISS) fprintf(stderr,"lsrs r%u,r%u\n",rd,rs);
if(DISS)
fprintf(stderr,"lsrs r%u,r%u\n",rd,rs);
rc=read_register(rd);
rb=read_register(rs);
rb&=0xFF;
@ -1361,7 +1391,8 @@ if(DISS) fprintf(stderr,"lsrs r%u,r%u\n",rd,rs);
{
rb=(inst>>0)&0xFF;
rd=(inst>>8)&0x07;
if(DISS) fprintf(stderr,"movs r%u,#0x%02X\n",rd,rb);
if(DISS)
fprintf(stderr,"movs r%u,#0x%02X\n",rd,rb);
write_register(rd,rb);
do_nflag(rb);
do_zflag(rb);
@ -1373,9 +1404,10 @@ if(DISS) fprintf(stderr,"movs r%u,#0x%02X\n",rd,rb);
{
rd=(inst>>0)&7;
rn=(inst>>3)&7;
if(DISS) fprintf(stderr,"movs r%u,r%u\n",rd,rn);
if(DISS)
fprintf(stderr,"movs r%u,r%u\n",rd,rn);
rc=read_register(rn);
//fprintf(stderr,"0x%08X\n",rc);
//fprintf(stderr,"0x%08X\n",rc);
write_register(rd,rc);
do_nflag(rc);
do_zflag(rc);
@ -1390,7 +1422,8 @@ if(DISS) fprintf(stderr,"movs r%u,r%u\n",rd,rn);
rd=(inst>>0)&0x7;
rd|=(inst>>4)&0x8;
rm=(inst>>3)&0xF;
if(DISS) fprintf(stderr,"mov r%u,r%u\n",rd,rm);
if(DISS)
fprintf(stderr,"mov r%u,r%u\n",rd,rm);
rc=read_register(rm);
if (rd==15) rc+=2; // fxq fix for MOV R15
write_register(rd,rc);
@ -1402,7 +1435,8 @@ if(DISS) fprintf(stderr,"mov r%u,r%u\n",rd,rm);
{
rd=(inst>>0)&0x7;
rm=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"muls r%u,r%u\n",rd,rm);
if(DISS)
fprintf(stderr,"muls r%u,r%u\n",rd,rm);
ra=read_register(rd);
rb=read_register(rm);
rc=ra*rb;
@ -1417,7 +1451,8 @@ if(DISS) fprintf(stderr,"muls r%u,r%u\n",rd,rm);
{
rd=(inst>>0)&0x7;
rm=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"mvns r%u,r%u\n",rd,rm);
if(DISS)
fprintf(stderr,"mvns r%u,r%u\n",rd,rm);
ra=read_register(rm);
rc=(~ra);
write_register(rd,rc);
@ -1431,7 +1466,8 @@ if(DISS) fprintf(stderr,"mvns r%u,r%u\n",rd,rm);
{
rd=(inst>>0)&0x7;
rm=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"negs r%u,r%u\n",rd,rm);
if(DISS)
fprintf(stderr,"negs r%u,r%u\n",rd,rm);
ra=read_register(rm);
rc=0-ra;
write_register(rd,rc);
@ -1447,7 +1483,8 @@ if(DISS) fprintf(stderr,"negs r%u,r%u\n",rd,rm);
{
rd=(inst>>0)&0x7;
rm=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"orrs r%u,r%u\n",rd,rm);
if(DISS)
fprintf(stderr,"orrs r%u,r%u\n",rd,rm);
ra=read_register(rd);
rb=read_register(rm);
rc=ra|rb;
@ -1457,12 +1494,11 @@ if(DISS) fprintf(stderr,"orrs r%u,r%u\n",rd,rm);
return(0);
}
//POP
if((inst&0xFE00)==0xBC00)
{
if(DISS)
{
if(DISS)
{
fprintf(stderr,"pop {");
for(ra=0,rb=0x01,rc=0;rb;rb=(rb<<1)&0xFF,ra++)
{
@ -1479,7 +1515,7 @@ if(DISS)
fprintf(stderr,"pc");
}
fprintf(stderr,"}\n");
}
}
sp=read_register(13);
for(ra=0,rb=0x01;rb;rb=(rb<<1)&0xFF,ra++)
@ -1504,9 +1540,8 @@ if(DISS)
//PUSH
if((inst&0xFE00)==0xB400)
{
if(DISS)
{
if(DISS)
{
fprintf(stderr,"push {");
for(ra=0,rb=0x01,rc=0;rb;rb=(rb<<1)&0xFF,ra++)
{
@ -1523,10 +1558,10 @@ if(DISS)
fprintf(stderr,"lr");
}
fprintf(stderr,"}\n");
}
}
sp=read_register(13);
//fprintf(stderr,"sp 0x%08X\n",sp);
//fprintf(stderr,"sp 0x%08X\n",sp);
for(ra=0,rb=0x01,rc=0;rb;rb=(rb<<1)&0xFF,ra++)
{
if(inst&rb)
@ -1559,7 +1594,8 @@ if(DISS)
{
rd=(inst>>0)&0x7;
rn=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"rev r%u,r%u\n",rd,rn);
if(DISS)
fprintf(stderr,"rev r%u,r%u\n",rd,rn);
ra=read_register(rn);
rc =((ra>> 0)&0xFF)<<24;
rc|=((ra>> 8)&0xFF)<<16;
@ -1574,7 +1610,8 @@ if(DISS) fprintf(stderr,"rev r%u,r%u\n",rd,rn);
{
rd=(inst>>0)&0x7;
rn=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"rev16 r%u,r%u\n",rd,rn);
if(DISS)
fprintf(stderr,"rev16 r%u,r%u\n",rd,rn);
ra=read_register(rn);
rc =((ra>> 0)&0xFF)<< 8;
rc|=((ra>> 8)&0xFF)<< 0;
@ -1589,7 +1626,8 @@ if(DISS) fprintf(stderr,"rev16 r%u,r%u\n",rd,rn);
{
rd=(inst>>0)&0x7;
rn=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"revsh r%u,r%u\n",rd,rn);
if(DISS)
fprintf(stderr,"revsh r%u,r%u\n",rd,rn);
ra=read_register(rn);
rc =((ra>> 0)&0xFF)<< 8;
rc|=((ra>> 8)&0xFF)<< 0;
@ -1604,7 +1642,8 @@ if(DISS) fprintf(stderr,"revsh r%u,r%u\n",rd,rn);
{
rd=(inst>>0)&0x7;
rs=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"rors r%u,r%u\n",rd,rs);
if(DISS)
fprintf(stderr,"rors r%u,r%u\n",rd,rs);
rc=read_register(rd);
ra=read_register(rs);
ra&=0xFF;
@ -1637,7 +1676,8 @@ if(DISS) fprintf(stderr,"rors r%u,r%u\n",rd,rs);
{
rd=(inst>>0)&0x7;
rm=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"sbc r%u,r%u\n",rd,rm);
if(DISS)
fprintf(stderr,"sbc r%u,r%u\n",rd,rm);
ra=read_register(rd);
rb=read_register(rm);
rc=ra-rb;
@ -1661,9 +1701,8 @@ if(DISS) fprintf(stderr,"sbc r%u,r%u\n",rd,rm);
if((inst&0xF800)==0xC000)
{
rn=(inst>>8)&0x7;
if(DISS)
{
if(DISS)
{
fprintf(stderr,"stmia r%u!,{",rn);
for(ra=0,rb=0x01,rc=0;rb;rb=(rb<<1)&0xFF,ra++)
{
@ -1675,7 +1714,7 @@ if(DISS)
}
}
fprintf(stderr,"}\n");
}
}
sp=read_register(rn);
for(ra=0,rb=0x01;rb;rb=(rb<<1)&0xFF,ra++)
{
@ -1696,7 +1735,8 @@ if(DISS)
rn=(inst>>3)&0x07;
rb=(inst>>6)&0x1F;
rb<<=2;
if(DISS) fprintf(stderr,"str r%u,[r%u,#0x%X]\n",rd,rn,rb);
if(DISS)
fprintf(stderr,"str r%u,[r%u,#0x%X]\n",rd,rn,rb);
rb=read_register(rn)+rb;
rc=read_register(rd);
write32(rb,rc);
@ -1709,7 +1749,8 @@ if(DISS) fprintf(stderr,"str r%u,[r%u,#0x%X]\n",rd,rn,rb);
rd=(inst>>0)&0x7;
rn=(inst>>3)&0x7;
rm=(inst>>6)&0x7;
if(DISS) fprintf(stderr,"str r%u,[r%u,r%u]\n",rd,rn,rm);
if(DISS)
fprintf(stderr,"str r%u,[r%u,r%u]\n",rd,rn,rm);
rb=read_register(rn)+read_register(rm);
rc=read_register(rd);
write32(rb,rc);
@ -1722,9 +1763,10 @@ if(DISS) fprintf(stderr,"str r%u,[r%u,r%u]\n",rd,rn,rm);
rb=(inst>>0)&0xFF;
rd=(inst>>8)&0x07;
rb<<=2;
if(DISS) fprintf(stderr,"str r%u,[SP,#0x%X]\n",rd,rb);
if(DISS)
fprintf(stderr,"str r%u,[SP,#0x%X]\n",rd,rb);
rb=read_register(13)+rb;
//fprintf(stderr,"0x%08X\n",rb);
//fprintf(stderr,"0x%08X\n",rb);
rc=read_register(rd);
write32(rb,rc);
return(0);
@ -1736,7 +1778,8 @@ if(DISS) fprintf(stderr,"str r%u,[SP,#0x%X]\n",rd,rb);
rd=(inst>>0)&0x07;
rn=(inst>>3)&0x07;
rb=(inst>>6)&0x1F;
if(DISS) fprintf(stderr,"strb r%u,[r%u,#0x%X]\n",rd,rn,rb);
if(DISS)
fprintf(stderr,"strb r%u,[r%u,#0x%X]\n",rd,rn,rb);
rb=read_register(rn)+rb;
rc=read_register(rd);
ra=read16(rb&(~1));
@ -1760,7 +1803,8 @@ if(DISS) fprintf(stderr,"strb r%u,[r%u,#0x%X]\n",rd,rn,rb);
rd=(inst>>0)&0x7;
rn=(inst>>3)&0x7;
rm=(inst>>6)&0x7;
if(DISS) fprintf(stderr,"strb r%u,[r%u,r%u]\n",rd,rn,rm);
if(DISS)
fprintf(stderr,"strb r%u,[r%u,r%u]\n",rd,rn,rm);
rb=read_register(rn)+read_register(rm);
rc=read_register(rd);
ra=read16(rb&(~1));
@ -1785,7 +1829,8 @@ if(DISS) fprintf(stderr,"strb r%u,[r%u,r%u]\n",rd,rn,rm);
rn=(inst>>3)&0x07;
rb=(inst>>6)&0x1F;
rb<<=1;
if(DISS) fprintf(stderr,"strh r%u,[r%u,#0x%X]\n",rd,rn,rb);
if(DISS)
fprintf(stderr,"strh r%u,[r%u,#0x%X]\n",rd,rn,rb);
rb=read_register(rn)+rb;
rc=read_register(rd);
write16(rb,rc&0xFFFF);
@ -1798,7 +1843,8 @@ if(DISS) fprintf(stderr,"strh r%u,[r%u,#0x%X]\n",rd,rn,rb);
rd=(inst>>0)&0x7;
rn=(inst>>3)&0x7;
rm=(inst>>6)&0x7;
if(DISS) fprintf(stderr,"strh r%u,[r%u,r%u]\n",rd,rn,rm);
if(DISS)
fprintf(stderr,"strh r%u,[r%u,r%u]\n",rd,rn,rm);
rb=read_register(rn)+read_register(rm);
rc=read_register(rd);
write16(rb,rc&0xFFFF);
@ -1811,7 +1857,8 @@ if(DISS) fprintf(stderr,"strh r%u,[r%u,r%u]\n",rd,rn,rm);
rd=(inst>>0)&7;
rn=(inst>>3)&7;
rb=(inst>>6)&7;
if(DISS) fprintf(stderr,"subs r%u,r%u,#0x%X\n",rd,rn,rb);
if(DISS)
fprintf(stderr,"subs r%u,r%u,#0x%X\n",rd,rn,rb);
ra=read_register(rn);
rc=ra-rb;
write_register(rd,rc);
@ -1827,7 +1874,8 @@ if(DISS) fprintf(stderr,"subs r%u,r%u,#0x%X\n",rd,rn,rb);
{
rb=(inst>>0)&0xFF;
rd=(inst>>8)&0x07;
if(DISS) fprintf(stderr,"subs r%u,#0x%02X\n",rd,rb);
if(DISS)
fprintf(stderr,"subs r%u,#0x%02X\n",rd,rb);
ra=read_register(rd);
rc=ra-rb;
write_register(rd,rc);
@ -1844,7 +1892,8 @@ if(DISS) fprintf(stderr,"subs r%u,#0x%02X\n",rd,rb);
rd=(inst>>0)&0x7;
rn=(inst>>3)&0x7;
rm=(inst>>6)&0x7;
if(DISS) fprintf(stderr,"subs r%u,r%u,r%u\n",rd,rn,rm);
if(DISS)
fprintf(stderr,"subs r%u,r%u,r%u\n",rd,rn,rm);
ra=read_register(rn);
rb=read_register(rm);
rc=ra-rb;
@ -1861,7 +1910,8 @@ if(DISS) fprintf(stderr,"subs r%u,r%u,r%u\n",rd,rn,rm);
{
rb=inst&0x7F;
rb<<=2;
if(DISS) fprintf(stderr,"sub SP,#0x%02X\n",rb);
if(DISS)
fprintf(stderr,"sub SP,#0x%02X\n",rb);
ra=read_register(13);
ra-=rb;
write_register(13,ra);
@ -1872,7 +1922,8 @@ if(DISS) fprintf(stderr,"sub SP,#0x%02X\n",rb);
if((inst&0xFF00)==0xDF00)
{
rb=inst&0xFF;
if(DISS) fprintf(stderr,"swi 0x%02X\n",rb);
if(DISS)
fprintf(stderr,"swi 0x%02X\n",rb);
fprintf(stderr,"\n\nswi 0x%02X\n",rb);
return(1);
}
@ -1882,7 +1933,8 @@ if(DISS) fprintf(stderr,"swi 0x%02X\n",rb);
{
rd=(inst>>0)&0x7;
rm=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"sxtb r%u,r%u\n",rd,rm);
if(DISS)
fprintf(stderr,"sxtb r%u,r%u\n",rd,rm);
ra=read_register(rm);
rc=ra&0xFF;
if(rc&0x80) rc|=(~0)<<8;
@ -1895,7 +1947,8 @@ if(DISS) fprintf(stderr,"sxtb r%u,r%u\n",rd,rm);
{
rd=(inst>>0)&0x7;
rm=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"sxth r%u,r%u\n",rd,rm);
if(DISS)
fprintf(stderr,"sxth r%u,r%u\n",rd,rm);
ra=read_register(rm);
rc=ra&0xFFFF;
if(rc&0x8000) rc|=(~0)<<16;
@ -1908,7 +1961,8 @@ if(DISS) fprintf(stderr,"sxth r%u,r%u\n",rd,rm);
{
rn=(inst>>0)&0x7;
rm=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"tst r%u,r%u\n",rn,rm);
if(DISS)
fprintf(stderr,"tst r%u,r%u\n",rn,rm);
ra=read_register(rn);
rb=read_register(rm);
rc=ra&rb;
@ -1919,10 +1973,11 @@ if(DISS) fprintf(stderr,"tst r%u,r%u\n",rn,rm);
//UXTB
if((inst&0xFFC0)==0xB2C0)
{
{
rd=(inst>>0)&0x7;
rm=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"uxtb r%u,r%u\n",rd,rm);
if(DISS)
fprintf(stderr,"uxtb r%u,r%u\n",rd,rm);
ra=read_register(rm);
rc=ra&0xFF;
write_register(rd,rc);
@ -1934,7 +1989,8 @@ if(DISS) fprintf(stderr,"uxtb r%u,r%u\n",rd,rm);
{
rd=(inst>>0)&0x7;
rm=(inst>>3)&0x7;
if(DISS) fprintf(stderr,"uxth r%u,r%u\n",rd,rm);
if(DISS)
fprintf(stderr,"uxth r%u,r%u\n",rd,rm);
ra=read_register(rm);
rc=ra&0xFFFF;
write_register(rd,rc);
@ -1954,9 +2010,9 @@ int Thumbulator::reset ( void )
reg_svc[13]=0x40001fb4; //sp
reg_svc[14]=0x00000c00; //lr (duz this use odd addrs)
reg_sys[15]=0x00000c0b; // entry point of 0xc09+2
// reg_sys[15]+=2;
// reg_sys[15]+=2;
// fxq: don't care about below so much (maybe to guess timing???)
// fxq: don't care about below so much (maybe to guess timing???)
instructions=0;
fetches=0;
reads=0;
@ -1964,3 +2020,5 @@ int Thumbulator::reset ( void )
return(0);
}
#endif

View File

@ -24,6 +24,8 @@
// Code is public domain and used with the author's consent
//============================================================================
#ifdef THUMB_SUPPORT
#include "bspf.hxx"
#define ROMADDMASK 0x7FFF
@ -110,3 +112,5 @@ class Thumbulator
Int32 DBUG; // dump detailed execution trace
Int32 DISS; // dump Thumb instruction trace
};
#endif

View File

@ -1765,23 +1765,20 @@
DISPLAY_OPENGL,
CHEATCODE_SUPPORT,
DEBUGGER_SUPPORT,
THUMB_SUPPORT,
HAVE_GETTIMEOFDAY,
BSPF_MAC_OSX,
HAVE_INTTYPES,
);
HEADER_SEARCH_PATHS = (
./SDL.framework/Headers,
../emucore,
../emucore/m6502/src/bspf/src,
../emucore/m6502/src,
../ui/sound,
../cheat,
../common,
../debugger,
../debugger/gui,
../yacc,
../../../../debugger,
./gui,
../emucore,
../gui,
../yacc,
.,
);
INFOPLIST_FILE = "Info-Stella.plist";
@ -1822,23 +1819,20 @@
DISPLAY_OPENGL,
CHEATCODE_SUPPORT,
DEBUGGER_SUPPORT,
THUMB_SUPPORT,
HAVE_GETTIMEOFDAY,
BSPF_MAC_OSX,
HAVE_INTTYPES,
);
HEADER_SEARCH_PATHS = (
./SDL.framework/Headers,
../emucore,
../emucore/m6502/src/bspf/src,
../emucore/m6502/src,
../ui/sound,
../cheat,
../common,
../debugger,
../debugger/gui,
../yacc,
../../../../debugger,
./gui,
../emucore,
../gui,
../yacc,
.,
);
INFOPLIST_FILE = "Info-Stella.plist";
@ -1878,23 +1872,20 @@
DISPLAY_OPENGL,
CHEATCODE_SUPPORT,
DEBUGGER_SUPPORT,
THUMB_SUPPORT,
HAVE_GETTIMEOFDAY,
BSPF_MAC_OSX,
HAVE_INTTYPES,
);
HEADER_SEARCH_PATHS = (
./SDL.framework/Headers,
../emucore,
../emucore/m6502/src/bspf/src,
../emucore/m6502/src,
../ui/sound,
../cheat,
../common,
../debugger,
../debugger/gui,
../yacc,
../../../../debugger,
./gui,
../emucore,
../gui,
../yacc,
.,
);
INFOPLIST_FILE = "Info-Stella.plist";

View File

@ -1753,23 +1753,20 @@
DISPLAY_OPENGL,
CHEATCODE_SUPPORT,
DEBUGGER_SUPPORT,
THUMB_SUPPORT,
HAVE_GETTIMEOFDAY,
BSPF_MAC_OSX,
HAVE_INTTYPES,
);
HEADER_SEARCH_PATHS = (
./SDL.framework/Headers,
../emucore,
../emucore/m6502/src/bspf/src,
../emucore/m6502/src,
../ui/sound,
../cheat,
../common,
../debugger,
../debugger/gui,
../yacc,
../../../../debugger,
./gui,
../emucore,
../gui,
../yacc,
.,
);
INFOPLIST_FILE = "Info-Stella.plist";
@ -1810,23 +1807,20 @@
DISPLAY_OPENGL,
CHEATCODE_SUPPORT,
DEBUGGER_SUPPORT,
THUMB_SUPPORT,
HAVE_GETTIMEOFDAY,
BSPF_MAC_OSX,
HAVE_INTTYPES,
);
HEADER_SEARCH_PATHS = (
./SDL.framework/Headers,
../emucore,
../emucore/m6502/src/bspf/src,
../emucore/m6502/src,
../ui/sound,
../cheat,
../common,
../debugger,
../debugger/gui,
../yacc,
../../../../debugger,
./gui,
../emucore,
../gui,
../yacc,
.,
);
INFOPLIST_FILE = "Info-Stella.plist";
@ -1866,23 +1860,20 @@
DISPLAY_OPENGL,
CHEATCODE_SUPPORT,
DEBUGGER_SUPPORT,
THUMB_SUPPORT,
HAVE_GETTIMEOFDAY,
BSPF_MAC_OSX,
HAVE_INTTYPES,
);
HEADER_SEARCH_PATHS = (
./SDL.framework/Headers,
../emucore,
../emucore/m6502/src/bspf/src,
../emucore/m6502/src,
../ui/sound,
../cheat,
../common,
../debugger,
../debugger/gui,
../yacc,
../../../../debugger,
./gui,
../emucore,
../gui,
../yacc,
.,
);
INFOPLIST_FILE = "Info-Stella.plist";