Skip to content

Commit

Permalink
- reverted GME Kss_Cpu.cpp to previous version
Browse files Browse the repository at this point in the history
Update to GME 0.6.2 broke playback of MSX .kss files

https://forum.zdoom.org/viewtopic.php?t=63206
  • Loading branch information
alexey-lysiuk committed Jan 19, 2019
1 parent 2861161 commit df6669b
Showing 1 changed file with 51 additions and 46 deletions.
97 changes: 51 additions & 46 deletions game-music-emu/gme/Kss_Cpu.cpp
@@ -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
Expand Down Expand Up @@ -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,
};

// 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 )
{
set_end_time( end_time );
Expand All @@ -178,10 +183,10 @@ bool Kss_Cpu::run( cpu_time_t end_time )
rg = this->r.b;

cpu_time_t s_time = s.time;
uint16_t pc = r.pc;
uint16_t sp = r.sp;
uint16_t ix = r.ix; // TODO: keep in memory for direct access?
uint16_t iy = r.iy;
fuint16 pc = r.pc;
fuint16 sp = r.sp;
fuint16 ix = r.ix; // TODO: keep in memory for direct access?
fuint16 iy = r.iy;
int flags = r.b.flags;

goto loop;
Expand All @@ -203,7 +208,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
uint8_t const* instr = s.read [pc >> page_shift];
#define GET_ADDR() GET_LE16( instr )

uint8_t opcode;
fuint8 opcode;

// TODO: eliminate this special case
#if BLARGG_NONPORTABLE
Expand Down Expand Up @@ -236,7 +241,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
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];
if ( (s_time += data) >= 0 )
goto possibly_out_of_time;
Expand Down Expand Up @@ -292,7 +297,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
goto loop;

case 0x3A:{// LD A,(addr)
uint16_t addr = GET_ADDR();
fuint16 addr = GET_ADDR();
pc += 2;
rg.a = READ( addr );
goto loop;
Expand Down Expand Up @@ -380,15 +385,15 @@ bool Kss_Cpu::run( cpu_time_t end_time )

case 0xCD:{// CALL addr
call_taken:
uint16_t addr = pc + 2;
fuint16 addr = pc + 2;
pc = GET_ADDR();
sp = uint16_t (sp - 2);
WRITE_WORD( sp, addr );
goto loop;
}

case 0xFF: // RST
if ( pc >= idle_addr )
if ( pc > idle_addr )
goto hit_idle_addr;
CASE7( C7, CF, D7, DF, E7, EF, F7 ):
data = pc;
Expand Down Expand Up @@ -496,7 +501,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
add_hl_data: {
blargg_ulong sum = rp.hl + data;
data ^= rp.hl;
rp.hl = sum;
rp.hl = (uint16_t)sum;
flags = (flags & (S80 | Z40 | V04)) |
(sum >> 16) |
(sum >> 8 & (F20 | F08)) |
Expand Down Expand Up @@ -686,21 +691,21 @@ bool Kss_Cpu::run( cpu_time_t end_time )
goto loop;

case 0x2A:{// LD HL,(addr)
uint16_t addr = GET_ADDR();
fuint16 addr = GET_ADDR();
pc += 2;
rp.hl = READ_WORD( addr );
goto loop;
}

case 0x32:{// LD (addr),A
uint16_t addr = GET_ADDR();
fuint16 addr = GET_ADDR();
pc += 2;
WRITE( addr, rg.a );
goto loop;
}

case 0x22:{// LD (addr),HL
uint16_t addr = GET_ADDR();
fuint16 addr = GET_ADDR();
pc += 2;
WRITE_WORD( addr, rp.hl );
goto loop;
Expand All @@ -723,7 +728,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
// Rotate

case 0x07:{// RLCA
uint16_t temp = rg.a;
fuint16 temp = rg.a;
temp = (temp << 1) | (temp >> 7);
flags = (flags & (S80 | Z40 | P04)) |
(temp & (F20 | F08 | C01));
Expand All @@ -732,7 +737,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
}

case 0x0F:{// RRCA
uint16_t temp = rg.a;
fuint16 temp = rg.a;
flags = (flags & (S80 | Z40 | P04)) |
(temp & C01);
temp = (temp << 7) | (temp >> 1);
Expand All @@ -746,12 +751,12 @@ bool Kss_Cpu::run( cpu_time_t end_time )
flags = (flags & (S80 | Z40 | P04)) |
(temp & (F20 | F08)) |
(temp >> 8);
rg.a = temp;
rg.a = (uint8_t)temp;
goto loop;
}

case 0x1F:{// RRA
uint16_t temp = (flags << 7) | (rg.a >> 1);
fuint16 temp = (flags << 7) | (rg.a >> 1);
flags = (flags & (S80 | Z40 | P04)) |
(temp & (F20 | F08)) |
(rg.a & C01);
Expand All @@ -761,7 +766,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )

// Misc
case 0x2F:{// CPL
uint16_t temp = ~rg.a;
fuint16 temp = ~rg.a;
flags = (flags & (S80 | Z40 | P04 | C01)) |
(temp & (F20 | F08)) |
(H10 | N02);
Expand All @@ -787,21 +792,21 @@ bool Kss_Cpu::run( cpu_time_t end_time )
goto loop;

case 0xE3:{// EX (SP),HL
uint16_t temp = READ_WORD( sp );
fuint16 temp = READ_WORD( sp );
WRITE_WORD( sp, rp.hl );
rp.hl = temp;
goto loop;
}

case 0xEB:{// EX DE,HL
uint16_t temp = rp.hl;
fuint16 temp = rp.hl;
rp.hl = rp.de;
rp.de = temp;
goto loop;
}

case 0xD9:{// EXX DE,HL
uint16_t temp = r.alt.w.bc;
fuint16 temp = r.alt.w.bc;
r.alt.w.bc = rp.bc;
rp.bc = temp;

Expand Down Expand Up @@ -842,7 +847,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
// Rotate left

#define RLC( read, write ) {\
uint8_t result = read;\
fuint8 result = read;\
result = uint8_t (result << 1) | (result >> 7);\
flags = SZ28P( result ) | (result & C01);\
write;\
Expand All @@ -861,7 +866,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
}

#define RL( read, write ) {\
uint16_t result = (read << 1) | (flags & C01);\
fuint16 result = (read << 1) | (flags & C01);\
flags = SZ28PC( result );\
write;\
goto loop;\
Expand All @@ -879,7 +884,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
}

#define SLA( read, add, write ) {\
uint16_t result = (read << 1) | add;\
fuint16 result = (read << 1) | add;\
flags = SZ28PC( result );\
write;\
goto loop;\
Expand Down Expand Up @@ -910,7 +915,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
// Rotate right

#define RRC( read, write ) {\
uint8_t result = read;\
fuint8 result = read;\
flags = result & C01;\
result = uint8_t (result << 7) | (result >> 1);\
flags |= SZ28P( result );\
Expand All @@ -930,8 +935,8 @@ bool Kss_Cpu::run( cpu_time_t end_time )
}

#define RR( read, write ) {\
uint8_t result = read;\
uint8_t temp = result & C01;\
fuint8 result = read;\
fuint8 temp = result & C01;\
result = uint8_t (flags << 7) | (result >> 1);\
flags = SZ28P( result ) | temp;\
write;\
Expand All @@ -950,7 +955,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
}

#define SRA( read, write ) {\
uint8_t result = read;\
fuint8 result = read;\
flags = result & C01;\
result = (result & 0x80) | (result >> 1);\
flags |= SZ28P( result );\
Expand All @@ -970,7 +975,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
}

#define SRL( read, write ) {\
uint8_t result = read;\
fuint8 result = read;\
flags = result & C01;\
result >>= 1;\
flags |= SZ28P( result );\
Expand Down Expand Up @@ -1078,15 +1083,15 @@ bool Kss_Cpu::run( cpu_time_t end_time )
blargg_ulong sum = temp + (flags & C01);
flags = ~data >> 2 & N02;
if ( flags )
sum = -sum;
sum = (blargg_ulong)-(blargg_long)sum;
sum += rp.hl;
temp ^= rp.hl;
temp ^= sum;
flags |=(sum >> 16 & C01) |
(temp >> 8 & H10) |
(sum >> 8 & (S80 | F20 | F08)) |
((temp - -0x8000) >> 14 & V04);
rp.hl = sum;
rp.hl = (uint16_t)sum;
if ( (uint16_t) sum )
goto loop;
flags |= Z40;
Expand Down Expand Up @@ -1114,29 +1119,29 @@ bool Kss_Cpu::run( cpu_time_t end_time )
case 0x43: // LD (ADDR),BC
case 0x53: // LD (ADDR),DE
temp = R16( data, 4, 0x43 );
uint16_t addr = GET_ADDR();
fuint16 addr = GET_ADDR();
pc += 2;
WRITE_WORD( addr, temp );
goto loop;
}

case 0x4B: // LD BC,(ADDR)
case 0x5B:{// LD DE,(ADDR)
uint16_t addr = GET_ADDR();
fuint16 addr = GET_ADDR();
pc += 2;
R16( data, 4, 0x4B ) = READ_WORD( addr );
goto loop;
}

case 0x7B:{// LD SP,(ADDR)
uint16_t addr = GET_ADDR();
fuint16 addr = GET_ADDR();
pc += 2;
sp = READ_WORD( addr );
goto loop;
}

case 0x67:{// RRD
uint8_t temp = READ( rp.hl );
fuint8 temp = READ( rp.hl );
WRITE( rp.hl, (rg.a << 4) | (temp >> 4) );
temp = (rg.a & 0xF0) | (temp & 0x0F);
flags = (flags & C01) | SZ28P( temp );
Expand All @@ -1145,7 +1150,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
}

case 0x6F:{// RLD
uint8_t temp = READ( rp.hl );
fuint8 temp = READ( rp.hl );
WRITE( rp.hl, (temp << 4) | (rg.a & 0x0F) );
temp = (rg.a & 0xF0) | (temp >> 4);
flags = (flags & C01) | SZ28P( temp );
Expand All @@ -1169,7 +1174,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
case 0xA1: // CPI
case 0xB1: // CPIR
inc = +1;
uint16_t addr = rp.hl;
fuint16 addr = rp.hl;
rp.hl = addr + inc;
int temp = READ( addr );

Expand Down Expand Up @@ -1202,7 +1207,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
case 0xA0: // LDI
case 0xB0: // LDIR
inc = +1;
uint16_t addr = rp.hl;
fuint16 addr = rp.hl;
rp.hl = addr + inc;
int temp = READ( addr );

Expand Down Expand Up @@ -1234,7 +1239,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
case 0xA3: // OUTI
case 0xB3: // OTIR
inc = +1;
uint16_t addr = rp.hl;
fuint16 addr = rp.hl;
rp.hl = addr + inc;
int temp = READ( addr );

Expand All @@ -1260,7 +1265,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
case 0xB2: // INIR
inc = +1;

uint16_t addr = rp.hl;
fuint16 addr = rp.hl;
rp.hl = addr + inc;

int temp = IN( rp.bc );
Expand Down Expand Up @@ -1325,7 +1330,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )

//////////////////////////////////////// DD/FD prefix
{
uint16_t ixy;
fuint16 ixy;
case 0xDD:
ixy = ix;
goto ix_prefix;
Expand Down Expand Up @@ -1521,7 +1526,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
goto loop;

case 0x22:{// LD (ADDR),IXY
uint16_t addr = GET_ADDR();
fuint16 addr = GET_ADDR();
pc += 2;
WRITE_WORD( addr, ixy );
goto loop;
Expand All @@ -1533,7 +1538,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
goto set_ixy;

case 0x2A:{// LD IXY,(addr)
uint16_t addr = GET_ADDR();
fuint16 addr = GET_ADDR();
ixy = READ_WORD( addr );
pc += 2;
goto set_ixy;
Expand All @@ -1557,7 +1562,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
case 0x3E: goto srl_data_addr; // SRL (IXY)

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);
flags = (flags & C01) | H10 |
(masked & S80) |
Expand Down Expand Up @@ -1659,7 +1664,7 @@ bool Kss_Cpu::run( cpu_time_t end_time )
goto loop;

case 0xE3:{// EX (SP),IXY
uint16_t temp = READ_WORD( sp );
fuint16 temp = READ_WORD( sp );
WRITE_WORD( sp, ixy );
ixy = temp;
goto set_ixy;
Expand Down

0 comments on commit df6669b

Please sign in to comment.