- reverted GME Kss_Cpu.cpp to previous version

Update to GME 0.6.2 broke playback of MSX .kss files

https://forum.zdoom.org/viewtopic.php?t=63206
This commit is contained in:
alexey.lysiuk 2019-01-19 14:02:04 +02:00 committed by Christoph Oelckers
parent 4c3192fb28
commit 09d1a42c60

View file

@ -1,4 +1,4 @@
// Game_Music_Emu https://bitbucket.org/mpyne/game-music-emu/ // Game_Music_Emu 0.6.0. http://www.slack.net/~ant/
/* /*
Last validated with zexall 2006.11.14 2:19 PM Last validated with zexall 2006.11.14 2:19 PM
@ -162,6 +162,11 @@ static byte const ed_dd_timing [0x100] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,
}; };
// even on x86, using short and unsigned char was slower
typedef int fint16;
typedef unsigned fuint16;
typedef unsigned fuint8;
bool Kss_Cpu::run( cpu_time_t end_time ) bool Kss_Cpu::run( cpu_time_t end_time )
{ {
set_end_time( end_time ); set_end_time( end_time );
@ -178,10 +183,10 @@ bool Kss_Cpu::run( cpu_time_t end_time )
rg = this->r.b; rg = this->r.b;
cpu_time_t s_time = s.time; cpu_time_t s_time = s.time;
uint16_t pc = r.pc; fuint16 pc = r.pc;
uint16_t sp = r.sp; fuint16 sp = r.sp;
uint16_t ix = r.ix; // TODO: keep in memory for direct access? fuint16 ix = r.ix; // TODO: keep in memory for direct access?
uint16_t iy = r.iy; fuint16 iy = r.iy;
int flags = r.b.flags; int flags = r.b.flags;
goto loop; goto loop;
@ -203,7 +208,7 @@ loop:
uint8_t const* instr = s.read [pc >> page_shift]; uint8_t const* instr = s.read [pc >> page_shift];
#define GET_ADDR() GET_LE16( instr ) #define GET_ADDR() GET_LE16( instr )
uint8_t opcode; fuint8 opcode;
// TODO: eliminate this special case // TODO: eliminate this special case
#if BLARGG_NONPORTABLE #if BLARGG_NONPORTABLE
@ -236,7 +241,7 @@ loop:
11,10,10, 4,17,11, 7,11,11, 6,10, 4,17, 8, 7,11, // F 11,10,10, 4,17,11, 7,11,11, 6,10, 4,17, 8, 7,11, // F
}; };
uint16_t data; fuint16 data;
data = base_timing [opcode]; data = base_timing [opcode];
if ( (s_time += data) >= 0 ) if ( (s_time += data) >= 0 )
goto possibly_out_of_time; goto possibly_out_of_time;
@ -292,7 +297,7 @@ possibly_out_of_time:
goto loop; goto loop;
case 0x3A:{// LD A,(addr) case 0x3A:{// LD A,(addr)
uint16_t addr = GET_ADDR(); fuint16 addr = GET_ADDR();
pc += 2; pc += 2;
rg.a = READ( addr ); rg.a = READ( addr );
goto loop; goto loop;
@ -380,7 +385,7 @@ possibly_out_of_time:
case 0xCD:{// CALL addr case 0xCD:{// CALL addr
call_taken: call_taken:
uint16_t addr = pc + 2; fuint16 addr = pc + 2;
pc = GET_ADDR(); pc = GET_ADDR();
sp = uint16_t (sp - 2); sp = uint16_t (sp - 2);
WRITE_WORD( sp, addr ); WRITE_WORD( sp, addr );
@ -388,7 +393,7 @@ possibly_out_of_time:
} }
case 0xFF: // RST case 0xFF: // RST
if ( pc >= idle_addr ) if ( pc > idle_addr )
goto hit_idle_addr; goto hit_idle_addr;
CASE7( C7, CF, D7, DF, E7, EF, F7 ): CASE7( C7, CF, D7, DF, E7, EF, F7 ):
data = pc; data = pc;
@ -496,7 +501,7 @@ possibly_out_of_time:
add_hl_data: { add_hl_data: {
blargg_ulong sum = rp.hl + data; blargg_ulong sum = rp.hl + data;
data ^= rp.hl; data ^= rp.hl;
rp.hl = sum; rp.hl = (uint16_t)sum;
flags = (flags & (S80 | Z40 | V04)) | flags = (flags & (S80 | Z40 | V04)) |
(sum >> 16) | (sum >> 16) |
(sum >> 8 & (F20 | F08)) | (sum >> 8 & (F20 | F08)) |
@ -686,21 +691,21 @@ possibly_out_of_time:
goto loop; goto loop;
case 0x2A:{// LD HL,(addr) case 0x2A:{// LD HL,(addr)
uint16_t addr = GET_ADDR(); fuint16 addr = GET_ADDR();
pc += 2; pc += 2;
rp.hl = READ_WORD( addr ); rp.hl = READ_WORD( addr );
goto loop; goto loop;
} }
case 0x32:{// LD (addr),A case 0x32:{// LD (addr),A
uint16_t addr = GET_ADDR(); fuint16 addr = GET_ADDR();
pc += 2; pc += 2;
WRITE( addr, rg.a ); WRITE( addr, rg.a );
goto loop; goto loop;
} }
case 0x22:{// LD (addr),HL case 0x22:{// LD (addr),HL
uint16_t addr = GET_ADDR(); fuint16 addr = GET_ADDR();
pc += 2; pc += 2;
WRITE_WORD( addr, rp.hl ); WRITE_WORD( addr, rp.hl );
goto loop; goto loop;
@ -723,7 +728,7 @@ possibly_out_of_time:
// Rotate // Rotate
case 0x07:{// RLCA case 0x07:{// RLCA
uint16_t temp = rg.a; fuint16 temp = rg.a;
temp = (temp << 1) | (temp >> 7); temp = (temp << 1) | (temp >> 7);
flags = (flags & (S80 | Z40 | P04)) | flags = (flags & (S80 | Z40 | P04)) |
(temp & (F20 | F08 | C01)); (temp & (F20 | F08 | C01));
@ -732,7 +737,7 @@ possibly_out_of_time:
} }
case 0x0F:{// RRCA case 0x0F:{// RRCA
uint16_t temp = rg.a; fuint16 temp = rg.a;
flags = (flags & (S80 | Z40 | P04)) | flags = (flags & (S80 | Z40 | P04)) |
(temp & C01); (temp & C01);
temp = (temp << 7) | (temp >> 1); temp = (temp << 7) | (temp >> 1);
@ -746,12 +751,12 @@ possibly_out_of_time:
flags = (flags & (S80 | Z40 | P04)) | flags = (flags & (S80 | Z40 | P04)) |
(temp & (F20 | F08)) | (temp & (F20 | F08)) |
(temp >> 8); (temp >> 8);
rg.a = temp; rg.a = (uint8_t)temp;
goto loop; goto loop;
} }
case 0x1F:{// RRA case 0x1F:{// RRA
uint16_t temp = (flags << 7) | (rg.a >> 1); fuint16 temp = (flags << 7) | (rg.a >> 1);
flags = (flags & (S80 | Z40 | P04)) | flags = (flags & (S80 | Z40 | P04)) |
(temp & (F20 | F08)) | (temp & (F20 | F08)) |
(rg.a & C01); (rg.a & C01);
@ -761,7 +766,7 @@ possibly_out_of_time:
// Misc // Misc
case 0x2F:{// CPL case 0x2F:{// CPL
uint16_t temp = ~rg.a; fuint16 temp = ~rg.a;
flags = (flags & (S80 | Z40 | P04 | C01)) | flags = (flags & (S80 | Z40 | P04 | C01)) |
(temp & (F20 | F08)) | (temp & (F20 | F08)) |
(H10 | N02); (H10 | N02);
@ -787,21 +792,21 @@ possibly_out_of_time:
goto loop; goto loop;
case 0xE3:{// EX (SP),HL case 0xE3:{// EX (SP),HL
uint16_t temp = READ_WORD( sp ); fuint16 temp = READ_WORD( sp );
WRITE_WORD( sp, rp.hl ); WRITE_WORD( sp, rp.hl );
rp.hl = temp; rp.hl = temp;
goto loop; goto loop;
} }
case 0xEB:{// EX DE,HL case 0xEB:{// EX DE,HL
uint16_t temp = rp.hl; fuint16 temp = rp.hl;
rp.hl = rp.de; rp.hl = rp.de;
rp.de = temp; rp.de = temp;
goto loop; goto loop;
} }
case 0xD9:{// EXX DE,HL case 0xD9:{// EXX DE,HL
uint16_t temp = r.alt.w.bc; fuint16 temp = r.alt.w.bc;
r.alt.w.bc = rp.bc; r.alt.w.bc = rp.bc;
rp.bc = temp; rp.bc = temp;
@ -842,7 +847,7 @@ possibly_out_of_time:
// Rotate left // Rotate left
#define RLC( read, write ) {\ #define RLC( read, write ) {\
uint8_t result = read;\ fuint8 result = read;\
result = uint8_t (result << 1) | (result >> 7);\ result = uint8_t (result << 1) | (result >> 7);\
flags = SZ28P( result ) | (result & C01);\ flags = SZ28P( result ) | (result & C01);\
write;\ write;\
@ -861,7 +866,7 @@ possibly_out_of_time:
} }
#define RL( read, write ) {\ #define RL( read, write ) {\
uint16_t result = (read << 1) | (flags & C01);\ fuint16 result = (read << 1) | (flags & C01);\
flags = SZ28PC( result );\ flags = SZ28PC( result );\
write;\ write;\
goto loop;\ goto loop;\
@ -879,7 +884,7 @@ possibly_out_of_time:
} }
#define SLA( read, add, write ) {\ #define SLA( read, add, write ) {\
uint16_t result = (read << 1) | add;\ fuint16 result = (read << 1) | add;\
flags = SZ28PC( result );\ flags = SZ28PC( result );\
write;\ write;\
goto loop;\ goto loop;\
@ -910,7 +915,7 @@ possibly_out_of_time:
// Rotate right // Rotate right
#define RRC( read, write ) {\ #define RRC( read, write ) {\
uint8_t result = read;\ fuint8 result = read;\
flags = result & C01;\ flags = result & C01;\
result = uint8_t (result << 7) | (result >> 1);\ result = uint8_t (result << 7) | (result >> 1);\
flags |= SZ28P( result );\ flags |= SZ28P( result );\
@ -930,8 +935,8 @@ possibly_out_of_time:
} }
#define RR( read, write ) {\ #define RR( read, write ) {\
uint8_t result = read;\ fuint8 result = read;\
uint8_t temp = result & C01;\ fuint8 temp = result & C01;\
result = uint8_t (flags << 7) | (result >> 1);\ result = uint8_t (flags << 7) | (result >> 1);\
flags = SZ28P( result ) | temp;\ flags = SZ28P( result ) | temp;\
write;\ write;\
@ -950,7 +955,7 @@ possibly_out_of_time:
} }
#define SRA( read, write ) {\ #define SRA( read, write ) {\
uint8_t result = read;\ fuint8 result = read;\
flags = result & C01;\ flags = result & C01;\
result = (result & 0x80) | (result >> 1);\ result = (result & 0x80) | (result >> 1);\
flags |= SZ28P( result );\ flags |= SZ28P( result );\
@ -970,7 +975,7 @@ possibly_out_of_time:
} }
#define SRL( read, write ) {\ #define SRL( read, write ) {\
uint8_t result = read;\ fuint8 result = read;\
flags = result & C01;\ flags = result & C01;\
result >>= 1;\ result >>= 1;\
flags |= SZ28P( result );\ flags |= SZ28P( result );\
@ -1078,7 +1083,7 @@ possibly_out_of_time:
blargg_ulong sum = temp + (flags & C01); blargg_ulong sum = temp + (flags & C01);
flags = ~data >> 2 & N02; flags = ~data >> 2 & N02;
if ( flags ) if ( flags )
sum = -sum; sum = (blargg_ulong)-(blargg_long)sum;
sum += rp.hl; sum += rp.hl;
temp ^= rp.hl; temp ^= rp.hl;
temp ^= sum; temp ^= sum;
@ -1086,7 +1091,7 @@ possibly_out_of_time:
(temp >> 8 & H10) | (temp >> 8 & H10) |
(sum >> 8 & (S80 | F20 | F08)) | (sum >> 8 & (S80 | F20 | F08)) |
((temp - -0x8000) >> 14 & V04); ((temp - -0x8000) >> 14 & V04);
rp.hl = sum; rp.hl = (uint16_t)sum;
if ( (uint16_t) sum ) if ( (uint16_t) sum )
goto loop; goto loop;
flags |= Z40; flags |= Z40;
@ -1114,7 +1119,7 @@ possibly_out_of_time:
case 0x43: // LD (ADDR),BC case 0x43: // LD (ADDR),BC
case 0x53: // LD (ADDR),DE case 0x53: // LD (ADDR),DE
temp = R16( data, 4, 0x43 ); temp = R16( data, 4, 0x43 );
uint16_t addr = GET_ADDR(); fuint16 addr = GET_ADDR();
pc += 2; pc += 2;
WRITE_WORD( addr, temp ); WRITE_WORD( addr, temp );
goto loop; goto loop;
@ -1122,21 +1127,21 @@ possibly_out_of_time:
case 0x4B: // LD BC,(ADDR) case 0x4B: // LD BC,(ADDR)
case 0x5B:{// LD DE,(ADDR) case 0x5B:{// LD DE,(ADDR)
uint16_t addr = GET_ADDR(); fuint16 addr = GET_ADDR();
pc += 2; pc += 2;
R16( data, 4, 0x4B ) = READ_WORD( addr ); R16( data, 4, 0x4B ) = READ_WORD( addr );
goto loop; goto loop;
} }
case 0x7B:{// LD SP,(ADDR) case 0x7B:{// LD SP,(ADDR)
uint16_t addr = GET_ADDR(); fuint16 addr = GET_ADDR();
pc += 2; pc += 2;
sp = READ_WORD( addr ); sp = READ_WORD( addr );
goto loop; goto loop;
} }
case 0x67:{// RRD case 0x67:{// RRD
uint8_t temp = READ( rp.hl ); fuint8 temp = READ( rp.hl );
WRITE( rp.hl, (rg.a << 4) | (temp >> 4) ); WRITE( rp.hl, (rg.a << 4) | (temp >> 4) );
temp = (rg.a & 0xF0) | (temp & 0x0F); temp = (rg.a & 0xF0) | (temp & 0x0F);
flags = (flags & C01) | SZ28P( temp ); flags = (flags & C01) | SZ28P( temp );
@ -1145,7 +1150,7 @@ possibly_out_of_time:
} }
case 0x6F:{// RLD case 0x6F:{// RLD
uint8_t temp = READ( rp.hl ); fuint8 temp = READ( rp.hl );
WRITE( rp.hl, (temp << 4) | (rg.a & 0x0F) ); WRITE( rp.hl, (temp << 4) | (rg.a & 0x0F) );
temp = (rg.a & 0xF0) | (temp >> 4); temp = (rg.a & 0xF0) | (temp >> 4);
flags = (flags & C01) | SZ28P( temp ); flags = (flags & C01) | SZ28P( temp );
@ -1169,7 +1174,7 @@ possibly_out_of_time:
case 0xA1: // CPI case 0xA1: // CPI
case 0xB1: // CPIR case 0xB1: // CPIR
inc = +1; inc = +1;
uint16_t addr = rp.hl; fuint16 addr = rp.hl;
rp.hl = addr + inc; rp.hl = addr + inc;
int temp = READ( addr ); int temp = READ( addr );
@ -1202,7 +1207,7 @@ possibly_out_of_time:
case 0xA0: // LDI case 0xA0: // LDI
case 0xB0: // LDIR case 0xB0: // LDIR
inc = +1; inc = +1;
uint16_t addr = rp.hl; fuint16 addr = rp.hl;
rp.hl = addr + inc; rp.hl = addr + inc;
int temp = READ( addr ); int temp = READ( addr );
@ -1234,7 +1239,7 @@ possibly_out_of_time:
case 0xA3: // OUTI case 0xA3: // OUTI
case 0xB3: // OTIR case 0xB3: // OTIR
inc = +1; inc = +1;
uint16_t addr = rp.hl; fuint16 addr = rp.hl;
rp.hl = addr + inc; rp.hl = addr + inc;
int temp = READ( addr ); int temp = READ( addr );
@ -1260,7 +1265,7 @@ possibly_out_of_time:
case 0xB2: // INIR case 0xB2: // INIR
inc = +1; inc = +1;
uint16_t addr = rp.hl; fuint16 addr = rp.hl;
rp.hl = addr + inc; rp.hl = addr + inc;
int temp = IN( rp.bc ); int temp = IN( rp.bc );
@ -1325,7 +1330,7 @@ possibly_out_of_time:
//////////////////////////////////////// DD/FD prefix //////////////////////////////////////// DD/FD prefix
{ {
uint16_t ixy; fuint16 ixy;
case 0xDD: case 0xDD:
ixy = ix; ixy = ix;
goto ix_prefix; goto ix_prefix;
@ -1521,7 +1526,7 @@ possibly_out_of_time:
goto loop; goto loop;
case 0x22:{// LD (ADDR),IXY case 0x22:{// LD (ADDR),IXY
uint16_t addr = GET_ADDR(); fuint16 addr = GET_ADDR();
pc += 2; pc += 2;
WRITE_WORD( addr, ixy ); WRITE_WORD( addr, ixy );
goto loop; goto loop;
@ -1533,7 +1538,7 @@ possibly_out_of_time:
goto set_ixy; goto set_ixy;
case 0x2A:{// LD IXY,(addr) case 0x2A:{// LD IXY,(addr)
uint16_t addr = GET_ADDR(); fuint16 addr = GET_ADDR();
ixy = READ_WORD( addr ); ixy = READ_WORD( addr );
pc += 2; pc += 2;
goto set_ixy; goto set_ixy;
@ -1557,7 +1562,7 @@ possibly_out_of_time:
case 0x3E: goto srl_data_addr; // SRL (IXY) case 0x3E: goto srl_data_addr; // SRL (IXY)
CASE8( 46, 4E, 56, 5E, 66, 6E, 76, 7E ):{// BIT b,(IXY+disp) CASE8( 46, 4E, 56, 5E, 66, 6E, 76, 7E ):{// BIT b,(IXY+disp)
uint8_t temp = READ( data ); fuint8 temp = READ( data );
int masked = temp & 1 << (data2 >> 3 & 7); int masked = temp & 1 << (data2 >> 3 & 7);
flags = (flags & C01) | H10 | flags = (flags & C01) | H10 |
(masked & S80) | (masked & S80) |
@ -1659,7 +1664,7 @@ possibly_out_of_time:
goto loop; goto loop;
case 0xE3:{// EX (SP),IXY case 0xE3:{// EX (SP),IXY
uint16_t temp = READ_WORD( sp ); fuint16 temp = READ_WORD( sp );
WRITE_WORD( sp, ixy ); WRITE_WORD( sp, ixy );
ixy = temp; ixy = temp;
goto set_ixy; goto set_ixy;