mirror of
https://github.com/holub/mame
synced 2025-04-24 09:20:02 +03:00
Sync with MESS (no whatsnew)
This commit is contained in:
parent
2a88e54278
commit
36ea482ace
@ -881,7 +881,7 @@ static void I386OP(jg_rel16)(i386_state *cpustate) // Opcode 0x0f 8f
|
||||
static void I386OP(jge_rel16)(i386_state *cpustate) // Opcode 0x0f 8d
|
||||
{
|
||||
INT16 disp = FETCH16(cpustate);
|
||||
if( (cpustate->SF == cpustate->OF) ) {
|
||||
if(cpustate->SF == cpustate->OF) {
|
||||
if (cpustate->sreg[CS].d)
|
||||
{
|
||||
cpustate->eip += disp;
|
||||
|
@ -820,7 +820,7 @@ static void I386OP(jg_rel32)(i386_state *cpustate) // Opcode 0x0f 8f
|
||||
static void I386OP(jge_rel32)(i386_state *cpustate) // Opcode 0x0f 8d
|
||||
{
|
||||
INT32 disp = FETCH32(cpustate);
|
||||
if( (cpustate->SF == cpustate->OF) ) {
|
||||
if(cpustate->SF == cpustate->OF) {
|
||||
cpustate->eip += disp;
|
||||
CHANGE_PC(cpustate,cpustate->eip);
|
||||
CYCLES(cpustate,CYCLES_JCC_FULL_DISP); /* TODO: Timing = 7 + m */
|
||||
|
@ -449,7 +449,7 @@ static void I386OP(jg_rel8)(i386_state *cpustate) // Opcode 0x7f
|
||||
static void I386OP(jge_rel8)(i386_state *cpustate) // Opcode 0x7d
|
||||
{
|
||||
INT8 disp = FETCH(cpustate);
|
||||
if( (cpustate->SF == cpustate->OF) ) {
|
||||
if(cpustate->SF == cpustate->OF) {
|
||||
NEAR_BRANCH(cpustate,disp);
|
||||
CYCLES(cpustate,CYCLES_JCC_DISP8); /* TODO: Timing = 7 + m */
|
||||
} else {
|
||||
@ -1411,7 +1411,7 @@ static void I386OP(setge_rm8)(i386_state *cpustate) // Opcode 0x0f 9d
|
||||
{
|
||||
UINT8 modrm = FETCH(cpustate);
|
||||
UINT8 value = 0;
|
||||
if( (cpustate->SF == cpustate->OF) ) {
|
||||
if(cpustate->SF == cpustate->OF) {
|
||||
value = 1;
|
||||
}
|
||||
if( modrm >= 0xc0 ) {
|
||||
|
@ -1580,7 +1580,7 @@ INLINE void m68ki_stack_frame_buserr(m68ki_cpu_core *m68k, UINT32 sr)
|
||||
/* Format 8 stack frame (68010).
|
||||
* 68010 only. This is the 29 word bus/address error frame.
|
||||
*/
|
||||
void m68ki_stack_frame_1000(m68ki_cpu_core *m68k, UINT32 pc, UINT32 sr, UINT32 vector)
|
||||
INLINE void m68ki_stack_frame_1000(m68ki_cpu_core *m68k, UINT32 pc, UINT32 sr, UINT32 vector)
|
||||
{
|
||||
/* VERSION
|
||||
* NUMBER
|
||||
@ -1634,7 +1634,7 @@ void m68ki_stack_frame_1000(m68ki_cpu_core *m68k, UINT32 pc, UINT32 sr, UINT32 v
|
||||
* if the error happens at an instruction boundary.
|
||||
* PC stacked is address of next instruction.
|
||||
*/
|
||||
void m68ki_stack_frame_1010(m68ki_cpu_core *m68k, UINT32 sr, UINT32 vector, UINT32 pc, UINT32 fault_address)
|
||||
INLINE void m68ki_stack_frame_1010(m68ki_cpu_core *m68k, UINT32 sr, UINT32 vector, UINT32 pc, UINT32 fault_address)
|
||||
{
|
||||
int orig_rw = m68k->mmu_tmp_buserror_rw; // this gets splatted by the following pushes, so save it now
|
||||
int orig_fc = m68k->mmu_tmp_buserror_fc;
|
||||
@ -1686,7 +1686,7 @@ void m68ki_stack_frame_1010(m68ki_cpu_core *m68k, UINT32 sr, UINT32 vector, UINT
|
||||
* if the error happens during instruction execution.
|
||||
* PC stacked is address of instruction in progress.
|
||||
*/
|
||||
void m68ki_stack_frame_1011(m68ki_cpu_core *m68k, UINT32 sr, UINT32 vector, UINT32 pc, UINT32 fault_address)
|
||||
INLINE void m68ki_stack_frame_1011(m68ki_cpu_core *m68k, UINT32 sr, UINT32 vector, UINT32 pc, UINT32 fault_address)
|
||||
{
|
||||
int orig_rw = m68k->mmu_tmp_buserror_rw; // this gets splatted by the following pushes, so save it now
|
||||
int orig_fc = m68k->mmu_tmp_buserror_fc;
|
||||
@ -1760,7 +1760,7 @@ void m68ki_stack_frame_1011(m68ki_cpu_core *m68k, UINT32 sr, UINT32 vector, UINT
|
||||
* This is used by the 68040 for bus fault and mmu trap
|
||||
* 30 words
|
||||
*/
|
||||
void m68ki_stack_frame_0111(m68ki_cpu_core *m68k, UINT32 sr, UINT32 vector, UINT32 pc, UINT32 fault_address, bool in_mmu)
|
||||
INLINE void m68ki_stack_frame_0111(m68ki_cpu_core *m68k, UINT32 sr, UINT32 vector, UINT32 pc, UINT32 fault_address, bool in_mmu)
|
||||
{
|
||||
int orig_rw = m68k->mmu_tmp_buserror_rw; // this gets splatted by the following pushes, so save it now
|
||||
int orig_fc = m68k->mmu_tmp_buserror_fc;
|
||||
@ -1955,7 +1955,7 @@ INLINE void m68ki_exception_address_error(m68ki_cpu_core *m68k)
|
||||
|
||||
|
||||
/* Service an interrupt request and start exception processing */
|
||||
void m68ki_exception_interrupt(m68ki_cpu_core *m68k, UINT32 int_level)
|
||||
INLINE void m68ki_exception_interrupt(m68ki_cpu_core *m68k, UINT32 int_level)
|
||||
{
|
||||
UINT32 vector;
|
||||
UINT32 sr;
|
||||
|
@ -240,11 +240,12 @@ void eeprom_device::nvram_default()
|
||||
|
||||
/* handle hard-coded data from the driver */
|
||||
if (m_default_data.u8 != NULL)
|
||||
for (offs_t offs = 0; offs < m_default_data_size; offs++)
|
||||
for (offs_t offs = 0; offs < m_default_data_size; offs++) {
|
||||
if (m_data_bits == 8)
|
||||
m_addrspace[0]->write_byte(offs, m_default_data.u8[offs]);
|
||||
else
|
||||
m_addrspace[0]->write_word(offs * 2, m_default_data.u16[offs]);
|
||||
}
|
||||
|
||||
/* populate from a memory region if present */
|
||||
if (m_region != NULL)
|
||||
|
@ -274,7 +274,7 @@ static TIMER_CALLBACK( pokey_pot_trigger );
|
||||
/* is this a filtering channel (3/4) and is the filter active? */ \
|
||||
if( chip->AUDCTL & ((CH1_FILTER|CH2_FILTER) & (0x10 >> ch)) ) \
|
||||
{ \
|
||||
if( chip->output[ch-2] ) \
|
||||
if( ch >= 2 && chip->output[ch-2] ) \
|
||||
{ \
|
||||
chip->output[ch-2] = 0; \
|
||||
if( chip->audible[ch] ) \
|
||||
@ -318,7 +318,7 @@ static TIMER_CALLBACK( pokey_pot_trigger );
|
||||
/* is this a filtering channel (3/4) and is the filter active? */ \
|
||||
if( chip->AUDCTL & ((CH1_FILTER|CH2_FILTER) & (0x10 >> ch)) ) \
|
||||
{ \
|
||||
if( chip->output[ch-2] ) \
|
||||
if( ch >= 2 && chip->output[ch-2] ) \
|
||||
{ \
|
||||
chip->output[ch-2] = 0; \
|
||||
sum -= chip->volume[ch-2]; \
|
||||
|
@ -988,7 +988,7 @@ static void tms5220_process(tms5220_state *tms, INT16 *buffer, unsigned int size
|
||||
#endif
|
||||
|
||||
/* if TS is now 0, ramp the energy down to 0. Is this really correct to hardware? */
|
||||
if ( (tms->talk_status == 0))
|
||||
if (tms->talk_status == 0)
|
||||
{
|
||||
#ifdef DEBUG_GENERATION
|
||||
fprintf(stderr,"Talk status is 0, forcing target energy to 0\n");
|
||||
|
@ -581,6 +581,7 @@ int a2_16sect_format::identify(io_generic *io, UINT32 form_factor)
|
||||
return size == expected_size;
|
||||
}
|
||||
|
||||
// following is placeholder, is completely wrong.
|
||||
const floppy_image_format_t::desc_e a2_16sect_format::mac_gcr[] = {
|
||||
{ SECTOR_LOOP_START, 0, -1 },
|
||||
{ RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 },
|
||||
@ -703,7 +704,7 @@ bool a2_16sect_format::save(io_generic *io, floppy_image *image)
|
||||
int ts;
|
||||
//fprintf(stderr,"DEBUG: a2_16sect_format::save() about to generate bitstream from physical track %d (logical %d)...", track, track/2);
|
||||
//~332 samples per cell, times 3+8+3 (14) for address mark, 24 for sync, 3+343+3 (349) for data mark, 24 for sync is around 743, near 776 expected
|
||||
generate_bitstream_from_track(track, head, 200000000/(3104*nsect*3), buf, ts, image); // 3104 needs tweaking, *3 is 3x multiread from a dfi disk
|
||||
generate_bitstream_from_track(track, head, 200000000/((3004*nsect*6)/2), buf, ts, image); // 3104 needs tweaking
|
||||
//fprintf(stderr,"done.\n");
|
||||
int pos = 0;
|
||||
int wrap = 0;
|
||||
@ -860,6 +861,7 @@ bool a2_16sect_format::save(io_generic *io, floppy_image *image)
|
||||
//printf("\n");
|
||||
}
|
||||
// display a little table of which sectors decoded ok
|
||||
int total_good = 0;
|
||||
for (int j = 0; j < 35; j++) {
|
||||
printf("T%2d: ",j);
|
||||
for (int i = 0; i < 16; i++) {
|
||||
@ -868,14 +870,508 @@ bool a2_16sect_format::save(io_generic *io, floppy_image *image)
|
||||
if (visualgrid[i][j] & ADDRFOUND) printf("a"); else printf(" ");
|
||||
if (visualgrid[i][j] & ADDRGOOD) printf("A"); else printf(" ");
|
||||
if (visualgrid[i][j] & DATAFOUND) printf("d"); else printf(" ");
|
||||
if (visualgrid[i][j] & DATAGOOD) printf("D"); else printf(" ");
|
||||
if (visualgrid[i][j] & DATAGOOD) { printf("D"); total_good++; } else printf(" ");
|
||||
if (visualgrid[i][j] & DATAPOST) printf("."); else printf(" ");
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
printf("Total Good Sectors: %d\n", total_good);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const floppy_format_type FLOPPY_A216S_FORMAT = &floppy_image_format_creator<a2_16sect_format>;
|
||||
/* RWTS18 format
|
||||
* Developed by Roland Gustafsson (http://www.acts.org/roland/index.html)
|
||||
for Br0derbund Software around 1986
|
||||
This format works as follows:
|
||||
* Track 0, in its entirety, is a normal 16-sector track, nothing special.
|
||||
(some disks may lack a normal sector 0 on this track, more info needed)
|
||||
* Tracks 1 thru 34 are in the special "RWTS18" track format:
|
||||
The format consists of six "large" sectors with 768 bytes each.
|
||||
Each of those large sectors has a title-specific sync byte and contains
|
||||
three "virtual" small sectors of 256 bytes, in an order like follows:
|
||||
BigSector Contains
|
||||
0: 0, 6, 12
|
||||
1: 1, 7, 13
|
||||
2: 2, 8, 14
|
||||
3: 3, 9, 15
|
||||
4: 4, 10, 16
|
||||
5: 5, 11, 17
|
||||
The sector format is: (all gcr6)
|
||||
D5 9D <track> <sector> <checksum> AA FF FF <titlespecific sync> <0x400 nybbles which represent 768 bytes> <data checksum> D6
|
||||
Title-specific sync bytes are:
|
||||
Airheart: D4
|
||||
Toy Shop: unknown
|
||||
Carmen USA: unknown (not all released versions used RWTS18)
|
||||
Wings of Fury: 96
|
||||
Prince of Persia: unknown
|
||||
And several others.
|
||||
*/
|
||||
a2_rwts18_format::a2_rwts18_format() : floppy_image_format_t()
|
||||
{
|
||||
}
|
||||
|
||||
const char *a2_rwts18_format::name() const
|
||||
{
|
||||
return "a2_rwts18";
|
||||
}
|
||||
|
||||
const char *a2_rwts18_format::description() const
|
||||
{
|
||||
return "Apple II RWTS18-type Image";
|
||||
}
|
||||
|
||||
const char *a2_rwts18_format::extensions() const
|
||||
{
|
||||
return "rti";
|
||||
}
|
||||
|
||||
bool a2_rwts18_format::supports_save() const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
int a2_rwts18_format::identify(io_generic *io, UINT32 form_factor)
|
||||
{
|
||||
int size = io_generic_size(io);
|
||||
int expected_size = 35 * 16 * 256;
|
||||
return size == expected_size;
|
||||
}
|
||||
|
||||
// following is placeholder, is completely wrong.
|
||||
const floppy_image_format_t::desc_e a2_rwts18_format::mac_gcr[] = {
|
||||
{ SECTOR_LOOP_START, 0, -1 },
|
||||
{ RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 },
|
||||
{ RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 },
|
||||
{ RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 },
|
||||
{ RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 },
|
||||
{ RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 },
|
||||
{ RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 },
|
||||
{ RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 },
|
||||
{ RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 },
|
||||
{ RAWBITS, 0xd5aa96, 24 },
|
||||
{ CRC_MACHEAD_START, 0 },
|
||||
{ TRACK_ID_GCR6 },
|
||||
{ SECTOR_ID_GCR6 },
|
||||
{ TRACK_HEAD_ID_GCR6 },
|
||||
{ SECTOR_INFO_GCR6 },
|
||||
{ CRC_END, 0 },
|
||||
{ CRC, 0 },
|
||||
{ RAWBITS, 0xdeaaff, 24 },
|
||||
{ RAWBITS, 0xff3fcf, 24 }, { RAWBITS, 0xf3fcff, 24 },
|
||||
{ RAWBITS, 0xd5aaad, 24 },
|
||||
{ SECTOR_ID_GCR6 },
|
||||
{ SECTOR_DATA_MAC, -1 },
|
||||
{ RAWBITS, 0xdeaaff, 24 },
|
||||
{ RAWBITS, 0xff, 8 },
|
||||
{ SECTOR_LOOP_END },
|
||||
{ END },
|
||||
};
|
||||
|
||||
|
||||
bool a2_rwts18_format::load(io_generic *io, UINT32 form_factor, floppy_image *image)
|
||||
{
|
||||
/* TODO: rewrite me properly
|
||||
UINT8 sector_data[(256)*16];
|
||||
memset(sector_data, 0, sizeof(sector_data));
|
||||
|
||||
desc_s sectors[16];
|
||||
int format = 0;
|
||||
int pos_data = 0;
|
||||
|
||||
int head_count = 1;
|
||||
|
||||
for(int track=0; track < 35; track++) {
|
||||
for(int head=0; head < head_count; head++) {
|
||||
for(int si=0; si<16; si++) {
|
||||
UINT8 *data = sector_data + (256)*si;
|
||||
sectors[si].data = data;
|
||||
sectors[si].size = 256;
|
||||
sectors[si].sector_id = si;
|
||||
sectors[si].sector_info = format;
|
||||
io_generic_read(io, data, pos_data, 256);
|
||||
pos_data += 256;
|
||||
}
|
||||
generate_track(mac_gcr, track, head, sectors, 16, 3104*16, image);
|
||||
}
|
||||
}
|
||||
return true;*/
|
||||
return false; // I hope that throws an error...
|
||||
}
|
||||
|
||||
UINT8 a2_rwts18_format::gb(const UINT8 *buf, int ts, int &pos, int &wrap)
|
||||
{
|
||||
UINT8 v = 0;
|
||||
int w1 = wrap;
|
||||
while(wrap != w1+2 && !(v & 0x80)) {
|
||||
v = v << 1 | ((buf[pos >> 3] >> (7-(pos & 7))) & 1);
|
||||
pos++;
|
||||
if(pos == ts) {
|
||||
pos = 0;
|
||||
wrap++;
|
||||
}
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
void a2_rwts18_format::update_chk(const UINT8 *data, int size, UINT32 &chk)
|
||||
{
|
||||
}
|
||||
|
||||
bool a2_rwts18_format::save(io_generic *io, floppy_image *image)
|
||||
{
|
||||
int g_tracks, g_heads;
|
||||
int visualgrid[18][35]; // visualizer grid, cleared/initialized below
|
||||
// lenient addr check: if unset, only accept an addr mark if the checksum was good
|
||||
// if set, accept an addr mark if the track and sector values are both sane
|
||||
#undef LENIENT_ADDR_CHECK
|
||||
// if set, use the old, not as robust logic for choosing which copy of a decoded sector to write
|
||||
// to the resulting image if the sector has a bad checksum and/or postamble
|
||||
#undef USE_OLD_BEST_SECTOR_PRIORITY
|
||||
// select a sector order for resulting file: 0 = logical, 1 = dos3.3, 2 = prodos
|
||||
#define SECTOR_ORDER 1
|
||||
// nothing found
|
||||
#define NOTFOUND 0
|
||||
// address mark was found
|
||||
#define ADDRFOUND 1
|
||||
// address checksum is good
|
||||
#define ADDRGOOD 2
|
||||
// data mark was found (requires addrfound and sane values)
|
||||
#define DATAFOUND 4
|
||||
// data checksum is good
|
||||
#define DATAGOOD 8
|
||||
// data postamble is good
|
||||
#define DATAPOST 16
|
||||
for (int i = 0; i < 18; i++) {
|
||||
for (int j = 0; j < 35; j++) {
|
||||
visualgrid[i][j] = 0;
|
||||
}
|
||||
}
|
||||
image->get_actual_geometry(g_tracks, g_heads);
|
||||
|
||||
int head = 0;
|
||||
|
||||
int pos_data = 0;
|
||||
|
||||
// for track 0 ONLY:
|
||||
UINT8 sectdata[(768)*6];
|
||||
memset(sectdata, 0, sizeof(sectdata));
|
||||
int nsect = 18;
|
||||
UINT8 buf[130000]; // originally 13000, multiread dfi disks need larger
|
||||
int ts;
|
||||
//fprintf(stderr,"DEBUG: a2_rwts18_format::save() about to generate bitstream from physical track %d (logical %d)...", track, track/2);
|
||||
//~332 samples per cell, times 3+8+3 (14) for address mark, 24 for sync, 3+343+3 (349) for data mark, 24 for sync is around 743, near 776 expected
|
||||
generate_bitstream_from_track(0, head, 200000000/((3004*nsect*6)/2), buf, ts, image); // 3104 needs tweaking
|
||||
//fprintf(stderr,"done.\n");
|
||||
int pos = 0;
|
||||
int wrap = 0;
|
||||
int hb = 0;
|
||||
int dosver = 0; // apple dos version; 0 = >=3.3, 1 = <3.3
|
||||
for(;;) {
|
||||
UINT8 v = gb(buf, ts, pos, wrap);
|
||||
if(v == 0xff)
|
||||
hb = 1;
|
||||
else if(hb == 1 && v == 0xd5)
|
||||
hb = 2;
|
||||
else if(hb == 2 && v == 0xaa)
|
||||
hb = 3;
|
||||
else if(hb == 3 && ((v == 0x96) || (v == 0xab))) { // 0x96 = dos 3.3/16sec, 0xab = dos 3.21 and below/13sec
|
||||
hb = 4;
|
||||
if (v == 0xab) dosver = 1;
|
||||
}
|
||||
else
|
||||
hb = 0;
|
||||
|
||||
if(hb == 4) {
|
||||
UINT8 h[11];
|
||||
for(int i=0; i<11; i++)
|
||||
h[i] = gb(buf, ts, pos, wrap);
|
||||
//UINT8 v2 = gcr6bw_tb[h[2]];
|
||||
UINT8 vl = gcr4_decode(h[0],h[1]);
|
||||
UINT8 tr = gcr4_decode(h[2],h[3]);
|
||||
UINT8 se = gcr4_decode(h[4],h[5]);
|
||||
UINT8 chk = gcr4_decode(h[6],h[7]);
|
||||
UINT32 post = (h[8]<<16)|(h[9]<<8)|h[10];
|
||||
printf("Address Mark:\tVolume %d, Track %d, Sector %2d, Checksum %02X: %s, Postamble %03X: %s\n", vl, tr, se, chk, (chk ^ vl ^ tr ^ se)==0?"OK":"BAD", post, (post&0xFFFF00)==0xDEAA00?"OK":"BAD");
|
||||
// sanity check
|
||||
if (tr == 0 && se < nsect) {
|
||||
visualgrid[se][0] |= ADDRFOUND;
|
||||
visualgrid[se][0] |= ((chk ^ vl ^ tr ^ se)==0)?ADDRGOOD:0;
|
||||
#ifdef LENIENT_ADDR_CHECK
|
||||
// if ((visualgrid[se][0] & ADDRFOUND) == ADDRFOUND) {
|
||||
#else
|
||||
if ((visualgrid[se][0] & ADDRGOOD) == ADDRGOOD) {
|
||||
#endif
|
||||
int opos = pos;
|
||||
int owrap = wrap;
|
||||
hb = 0;
|
||||
for(int i=0; i<20 && hb != 4; i++) {
|
||||
v = gb(buf, ts, pos, wrap);
|
||||
if(v == 0xff)
|
||||
hb = 1;
|
||||
else if(hb == 1 && v == 0xd5)
|
||||
hb = 2;
|
||||
else if(hb == 2 && v == 0xaa)
|
||||
hb = 3;
|
||||
else if(hb == 3 && v == 0xad)
|
||||
hb = 4;
|
||||
else
|
||||
hb = 0;
|
||||
}
|
||||
if((hb == 4)&&(dosver == 0)) {
|
||||
visualgrid[se][0] |= DATAFOUND;
|
||||
int sector_translate[16] = {
|
||||
#if SECTOR_ORDER == 0
|
||||
// logical order (0-15)
|
||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
|
||||
#elif SECTOR_ORDER == 1
|
||||
// DOS order (*.do)
|
||||
0x00, 0x07, 0x0E, 0x06, 0x0D, 0x05, 0x0C, 0x04,
|
||||
0x0B, 0x03, 0x0A, 0x02, 0x09, 0x01, 0x08, 0x0F
|
||||
#elif SECTOR_ORDER == 2
|
||||
// prodos order (*.po)
|
||||
0x00, 0x08, 0x01, 0x09, 0x02, 0x0A, 0x03, 0x0B,
|
||||
0x04, 0x0C, 0x05, 0x0D, 0x06, 0x0E, 0x07, 0x0F
|
||||
#endif
|
||||
};
|
||||
UINT8 *dest = sectdata+(256)*sector_translate[se];
|
||||
UINT8 data[0x157];
|
||||
UINT32 dpost = 0;
|
||||
UINT8 c = 0;
|
||||
// first read in sector and decode to 6bit form
|
||||
for(int i=0; i<0x156; i++) {
|
||||
data[i] = gcr6bw_tb[gb(buf, ts, pos, wrap)] ^ c;
|
||||
c = data[i];
|
||||
// printf("%02x ", c);
|
||||
// if (((i&0xf)+1)==0x10) printf("\n");
|
||||
}
|
||||
// read the checksum byte
|
||||
data[0x156] = gcr6bw_tb[gb(buf,ts,pos,wrap)];
|
||||
// now read the postamble bytes
|
||||
for(int i=0; i<3; i++) {
|
||||
dpost <<= 8;
|
||||
dpost |= gb(buf, ts, pos, wrap);
|
||||
}
|
||||
// next combine in the upper 2 bits of each byte
|
||||
UINT8 bit_swap[4] = { 0, 2, 1, 3 };
|
||||
for(int i=0; i<0x56; i++)
|
||||
data[i+0x056] = data[i+0x056]<<2 | bit_swap[data[i]&3];
|
||||
for(int i=0; i<0x56; i++)
|
||||
data[i+0x0ac] = data[i+0x0ac]<<2 | bit_swap[(data[i]>>2)&3];
|
||||
for(int i=0; i<0x54; i++)
|
||||
data[i+0x102] = data[i+0x102]<<2 | bit_swap[(data[i]>>4)&3];
|
||||
// now decode it into 256 bytes
|
||||
// but only write it if the bitfield of the track shows datagood is NOT set.
|
||||
// if it is set we don't want to overwrite a guaranteed good read with a bad one
|
||||
// if past read had a bad checksum or bad postamble...
|
||||
#ifndef USE_OLD_BEST_SECTOR_PRIORITY
|
||||
if (((visualgrid[se][0]&DATAGOOD)==0)||((visualgrid[se][0]&DATAPOST)==0)) {
|
||||
// if the current read is good, and postamble is good, write it in, no matter what.
|
||||
// if the current read is good and the current postamble is bad, write it in unless the postamble was good before
|
||||
// if the current read is bad and the current postamble is good and the previous read had neither good, write it in
|
||||
// if the current read isn't good and neither is the postamble but nothing better
|
||||
// has been written before, write it anyway.
|
||||
if ( ((data[0x156] == c) && (dpost&0xFFFF00)==0xDEAA00) ||
|
||||
(((data[0x156] == c) && (dpost&0xFFFF00)!=0xDEAA00) && ((visualgrid[se][0]&DATAPOST)==0)) ||
|
||||
(((data[0x156] != c) && (dpost&0xFFFF00)==0xDEAA00) && (((visualgrid[se][0]&DATAGOOD)==0)&&(visualgrid[se][0]&DATAPOST)==0)) ||
|
||||
(((data[0x156] != c) && (dpost&0xFFFF00)!=0xDEAA00) && (((visualgrid[se][0]&DATAGOOD)==0)&&(visualgrid[se][0]&DATAPOST)==0))
|
||||
) {
|
||||
for(int i=0x56; i<0x156; i++) {
|
||||
UINT8 dv = data[i];
|
||||
*dest++ = dv;
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
if ((visualgrid[se][0]&DATAGOOD)==0) {
|
||||
for(int i=0x56; i<0x156; i++) {
|
||||
UINT8 dv = data[i];
|
||||
*dest++ = dv;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
// do some checking
|
||||
if ((data[0x156] != c) || (dpost&0xFFFF00)!=0xDEAA00)
|
||||
fprintf(stderr,"Data Mark:\tChecksum xpctd %d found %d: %s, Postamble %03X: %s\n", data[0x156], c, (data[0x156]==c)?"OK":"BAD", dpost, (dpost&0xFFFF00)==0xDEAA00?"OK":"BAD");
|
||||
if (data[0x156] == c) visualgrid[se][0] |= DATAGOOD;
|
||||
if ((dpost&0xFFFF00)==0xDEAA00) visualgrid[se][0] |= DATAPOST;
|
||||
} else if ((hb == 4)&&(dosver == 1)) {
|
||||
fprintf(stderr,"ERROR: We don't handle dos sectors below 3.3 yet!\n");
|
||||
} else {
|
||||
pos = opos;
|
||||
wrap = owrap;
|
||||
}
|
||||
}
|
||||
}
|
||||
hb = 0;
|
||||
}
|
||||
if(wrap)
|
||||
break;
|
||||
}
|
||||
for(int i=0; i<nsect; i++) {
|
||||
//if(nsect>0) printf("t%d,", track);
|
||||
UINT8 *data = sectdata + (256)*i;
|
||||
io_generic_write(io, data, pos_data, 256);
|
||||
pos_data += 256;
|
||||
}
|
||||
|
||||
// for the rest of the tracks
|
||||
for(int track=2; track < 70; track+=2) {
|
||||
UINT8 sectdata[(768)*6];
|
||||
memset(sectdata, 0, sizeof(sectdata));
|
||||
int nsect = 18;
|
||||
UINT8 buf[130000]; // originally 13000, multiread dfi disks need larger
|
||||
int ts;
|
||||
//fprintf(stderr,"DEBUG: a2_rwts18_format::save() about to generate bitstream from physical track %d (logical %d)...", track, track/2);
|
||||
//~332 samples per cell, times 3+8+3 (14) for address mark, 24 for sync, 3+343+3 (349) for data mark, 24 for sync is around 743, near 776 expected
|
||||
generate_bitstream_from_track(track, head, 200000000/((3004*nsect*6)/2), buf, ts, image); // 3104 needs tweaking
|
||||
//fprintf(stderr,"done.\n");
|
||||
int pos = 0;
|
||||
int wrap = 0;
|
||||
int hb = 0;
|
||||
for(;;) {
|
||||
UINT8 v = gb(buf, ts, pos, wrap);
|
||||
if(v == 0xff)
|
||||
hb = 1;
|
||||
else if(hb == 1 && v == 0xd5)
|
||||
hb = 2;
|
||||
else if(hb == 2 && v == 0x9d)
|
||||
hb = 3;
|
||||
else
|
||||
hb = 0;
|
||||
|
||||
if(hb == 3) {
|
||||
UINT8 h[11];
|
||||
for(int i=0; i<7; i++)
|
||||
h[i] = gb(buf, ts, pos, wrap);
|
||||
UINT8 tr = gcr6bw_tb[h[0]];
|
||||
UINT8 se = gcr6bw_tb[h[1]];
|
||||
UINT8 chk = gcr6bw_tb[h[2]];
|
||||
UINT32 post = (h[3]<<16)|(h[4]<<8)|h[5];
|
||||
printf("RWTS18 AM:\t Track %d, Sector %2d, Checksum %02X: %s, Postamble %03X: %s\n", tr, se, chk, (chk ^ tr ^ se)==0?"OK":"BAD", post, post==0xAAFFFF?"OK":"BAD");
|
||||
// sanity check
|
||||
if (tr == track/2 && se < nsect) {
|
||||
visualgrid[se][track/2] |= ADDRFOUND;
|
||||
visualgrid[se][track/2] |= ((chk ^ tr ^ se)==0)?ADDRGOOD:0;
|
||||
#ifdef LENIENT_ADDR_CHECK
|
||||
// if ((visualgrid[se][track/2] & ADDRFOUND) == ADDRFOUND) {
|
||||
#else
|
||||
if ((visualgrid[se][track/2] & ADDRGOOD) == ADDRGOOD) {
|
||||
#endif
|
||||
//int opos = pos;
|
||||
//int owrap = wrap;
|
||||
// RWTS18 doesn't have a true data mark, its part of the address header
|
||||
// The next byte however is unique per title
|
||||
v = gb(buf, ts, pos, wrap);
|
||||
printf("Data mark header per-title byte = 0x%2x\n", v);
|
||||
|
||||
visualgrid[se][track/2] |= DATAFOUND;
|
||||
//UINT8 *dest = sectdata+(768)*se;
|
||||
UINT8 data[0x401];
|
||||
UINT32 dpost = 0;
|
||||
UINT8 c = 0;
|
||||
// first read in the ENTIRE sector and decode to 6bit form
|
||||
for(int i=0; i<0x400; i++) {
|
||||
data[i] = gcr6bw_tb[gb(buf, ts, pos, wrap)] ^ c;
|
||||
c = data[i];
|
||||
printf("%02x ", c);
|
||||
if (((i&0xf)+1)==0x10) printf("\n");
|
||||
}
|
||||
// read the checksum byte
|
||||
data[0x400] = gcr6bw_tb[gb(buf,ts,pos,wrap)];
|
||||
// now read the postamble byte
|
||||
for(int i=0; i<1; i++) {
|
||||
dpost <<= 8;
|
||||
dpost |= gb(buf, ts, pos, wrap);
|
||||
}
|
||||
printf("Data Postamble was 0x%02x\n", dpost);
|
||||
/*
|
||||
// next combine in the upper 2 bits of each byte
|
||||
UINT8 bit_swap[4] = { 0, 2, 1, 3 };
|
||||
for(int i=0; i<0x56; i++)
|
||||
data[i+0x056] = data[i+0x056]<<2 | bit_swap[data[i]&3];
|
||||
for(int i=0; i<0x56; i++)
|
||||
data[i+0x0ac] = data[i+0x0ac]<<2 | bit_swap[(data[i]>>2)&3];
|
||||
for(int i=0; i<0x54; i++)
|
||||
data[i+0x102] = data[i+0x102]<<2 | bit_swap[(data[i]>>4)&3];
|
||||
// now decode it into 256 bytes
|
||||
// but only write it if the bitfield of the track shows datagood is NOT set.
|
||||
// if it is set we don't want to overwrite a guaranteed good read with a bad one
|
||||
// if past read had a bad checksum or bad postamble...
|
||||
#ifndef USE_OLD_BEST_SECTOR_PRIORITY
|
||||
if (((visualgrid[se][track/2]&DATAGOOD)==0)||((visualgrid[se][track/2]&DATAPOST)==0)) {
|
||||
// if the current read is good, and postamble is good, write it in, no matter what.
|
||||
// if the current read is good and the current postamble is bad, write it in unless the postamble was good before
|
||||
// if the current read is bad and the current postamble is good and the previous read had neither good, write it in
|
||||
// if the current read isn't good and neither is the postamble but nothing better
|
||||
// has been written before, write it anyway.
|
||||
if ( ((data[0x156] == c) && (dpost&0xFFFF00)==0xDEAA00) ||
|
||||
(((data[0x156] == c) && (dpost&0xFFFF00)!=0xDEAA00) && ((visualgrid[se][track/2]&DATAPOST)==0)) ||
|
||||
(((data[0x156] != c) && (dpost&0xFFFF00)==0xDEAA00) && (((visualgrid[se][track/2]&DATAGOOD)==0)&&(visualgrid[se][track/2]&DATAPOST)==0)) ||
|
||||
(((data[0x156] != c) && (dpost&0xFFFF00)!=0xDEAA00) && (((visualgrid[se][track/2]&DATAGOOD)==0)&&(visualgrid[se][track/2]&DATAPOST)==0))
|
||||
) {
|
||||
for(int i=0x56; i<0x156; i++) {
|
||||
UINT8 dv = data[i];
|
||||
*dest++ = dv;
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
if ((visualgrid[se][track/2]&DATAGOOD)==0) {
|
||||
for(int i=0x56; i<0x156; i++) {
|
||||
UINT8 dv = data[i];
|
||||
*dest++ = dv;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
// do some checking
|
||||
if ((data[0x156] != c) || (dpost&0xFFFF00)!=0xDEAA00)
|
||||
fprintf(stderr,"Data Mark:\tChecksum xpctd %d found %d: %s, Postamble %03X: %s\n", data[0x156], c, (data[0x156]==c)?"OK":"BAD", dpost, (dpost&0xFFFF00)==0xDEAA00?"OK":"BAD");
|
||||
if (data[0x156] == c) visualgrid[se][track/2] |= DATAGOOD;
|
||||
if ((dpost&0xFFFF00)==0xDEAA00) visualgrid[se][track/2] |= DATAPOST;
|
||||
} else if ((hb == 4)&&(dosver == 1)) {
|
||||
fprintf(stderr,"ERROR: We don't handle dos sectors below 3.3 yet!\n");
|
||||
} else {
|
||||
pos = opos;
|
||||
wrap = owrap;
|
||||
}*/
|
||||
}
|
||||
}
|
||||
hb = 0;
|
||||
}
|
||||
if(wrap)
|
||||
break;
|
||||
}
|
||||
for(int i=0; i<nsect; i++) {
|
||||
//if(nsect>0) printf("t%d,", track);
|
||||
UINT8 *data = sectdata + (256)*i;
|
||||
io_generic_write(io, data, pos_data, 256);
|
||||
pos_data += 256;
|
||||
}
|
||||
//printf("\n");
|
||||
}
|
||||
// display a little table of which sectors decoded ok
|
||||
int total_good = 0;
|
||||
for (int j = 0; j < 35; j++) {
|
||||
printf("T%2d: ",j);
|
||||
for (int i = 0; i < 16; i++) {
|
||||
if (visualgrid[i][j] == NOTFOUND) printf("-NF- ");
|
||||
else {
|
||||
if (visualgrid[i][j] & ADDRFOUND) printf("a"); else printf(" ");
|
||||
if (visualgrid[i][j] & ADDRGOOD) printf("A"); else printf(" ");
|
||||
if (visualgrid[i][j] & DATAFOUND) printf("d"); else printf(" ");
|
||||
if (visualgrid[i][j] & DATAGOOD) { printf("D"); total_good++; } else printf(" ");
|
||||
if (visualgrid[i][j] & DATAPOST) printf("."); else printf(" ");
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
printf("Total Good Sectors: %d\n", total_good);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const floppy_format_type FLOPPY_RWTS18_FORMAT = &floppy_image_format_creator<a2_rwts18_format>;
|
@ -55,4 +55,27 @@ private:
|
||||
|
||||
extern const floppy_format_type FLOPPY_A216S_FORMAT;
|
||||
|
||||
class a2_rwts18_format : public floppy_image_format_t
|
||||
{
|
||||
public:
|
||||
a2_rwts18_format();
|
||||
|
||||
virtual int identify(io_generic *io, UINT32 form_factor);
|
||||
virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image);
|
||||
virtual bool save(io_generic *io, floppy_image *image);
|
||||
|
||||
virtual const char *name() const;
|
||||
virtual const char *description() const;
|
||||
virtual const char *extensions() const;
|
||||
virtual bool supports_save() const;
|
||||
|
||||
private:
|
||||
static const desc_e mac_gcr[];
|
||||
|
||||
UINT8 gb(const UINT8 *buf, int ts, int &pos, int &wrap);
|
||||
void update_chk(const UINT8 *data, int size, UINT32 &chk);
|
||||
};
|
||||
|
||||
extern const floppy_format_type FLOPPY_RWTS18_FORMAT;
|
||||
|
||||
#endif /* AP2_DISK_H */
|
||||
|
@ -125,7 +125,7 @@ FLOPPY_IDENTIFY( apridisk_identify )
|
||||
floppy_image_read(floppy, &header, 0, sizeof(header));
|
||||
|
||||
/* look for the magic string */
|
||||
if (memcmp(header, apr_magic, sizeof(apr_magic)) == 0)
|
||||
if (memcmp(header, apr_magic, sizeof(*apr_magic)) == 0)
|
||||
*vote = 100;
|
||||
else
|
||||
*vote = 0;
|
||||
|
@ -914,7 +914,7 @@ static floperr_t coco_dmk_seek_sector_in_track(floppy_image_legacy *floppy, int
|
||||
else
|
||||
{
|
||||
/* check IDAM integrity and check for matching sector */
|
||||
if ((sector == dmk_idam_sector(&track_data[idam_offset]))
|
||||
if (sector == dmk_idam_sector(&track_data[idam_offset])
|
||||
/* && (track == dmk_idam_track(&track_data[idam_offset])) */
|
||||
/* && (head == dmk_idam_side(&track_data[idam_offset])) */
|
||||
)
|
||||
|
@ -48,7 +48,7 @@
|
||||
// threshholds for brickwall windowing
|
||||
//define MIN_CLOCKS 65
|
||||
// number_please apple2 wants 40 min
|
||||
#define MIN_CLOCKS 40
|
||||
#define MIN_CLOCKS 60
|
||||
//define MAX_CLOCKS 260
|
||||
#define MAX_CLOCKS 270
|
||||
#define MIN_THRESH (MIN_CLOCKS*(clock_rate/25000000))
|
||||
@ -233,10 +233,13 @@ bool dfi_format::load(io_generic *io, UINT32 form_factor, floppy_image *image)
|
||||
if (trans_time > MAX_THRESH) {
|
||||
mg = mg == floppy_image::MG_A ? floppy_image::MG_B : floppy_image::MG_A;
|
||||
if (((track%2)==0)&&(head==0)) fprintf(stderr,"missed transition, total time for transition is %d\n",trans_time);
|
||||
//buf[tpos++] = mg | UINT32((200000000ULL*(cur_time-(trans_time/2)))/index_time); // generate imaginary transition at half period
|
||||
#ifndef FAKETRANS_ONE
|
||||
buf[tpos++] = mg | UINT32((200000000ULL*(cur_time-(trans_time/2)))/index_time); // generate imaginary transition at half period
|
||||
#else
|
||||
buf[tpos++] = mg | UINT32((200000000ULL*(cur_time-((trans_time*2)/3)))/index_time);
|
||||
mg = mg == floppy_image::MG_A ? floppy_image::MG_B : floppy_image::MG_A;
|
||||
buf[tpos++] = mg | UINT32((200000000ULL*(cur_time-(trans_time/3)))/index_time);
|
||||
#endif
|
||||
mg = mg == floppy_image::MG_A ? floppy_image::MG_B : floppy_image::MG_A;
|
||||
buf[tpos++] = mg | UINT32(200000000ULL*cur_time/index_time); // generate transition now
|
||||
prev_time = cur_time;
|
||||
|
@ -106,11 +106,6 @@ void io_generic_write(struct io_generic *generic, const void *buffer, UINT64 off
|
||||
size_t bytes_to_write;
|
||||
UINT64 size;
|
||||
|
||||
if (offset > 0x29c50)
|
||||
{
|
||||
offset = offset;
|
||||
}
|
||||
|
||||
size = io_generic_size(generic);
|
||||
|
||||
if (size < offset)
|
||||
|
@ -2087,8 +2087,6 @@ void LzmaEnc_Finish(CLzmaEncHandle pp)
|
||||
CLzmaEnc *p = (CLzmaEnc *)pp;
|
||||
if (p->mtMode)
|
||||
MatchFinderMt_ReleaseStream(&p->matchFinderMt);
|
||||
#else
|
||||
pp = pp;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -263,7 +263,7 @@ void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *ctx)
|
||||
|
||||
byteSwap(ctx->buf, 4);
|
||||
memcpy(digest, ctx->buf, 16);
|
||||
memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */
|
||||
memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */
|
||||
if(0 != ctx->internal_buf) {
|
||||
free(ctx->internal_buf);
|
||||
ctx->internal_buf = 0;
|
||||
|
@ -52,7 +52,6 @@
|
||||
|
||||
void *SZipAlloc(void *p, size_t size)
|
||||
{
|
||||
p = p;
|
||||
if (size == 0)
|
||||
return 0;
|
||||
|
||||
@ -61,7 +60,6 @@ void *SZipAlloc(void *p, size_t size)
|
||||
|
||||
void SZipFree(void *p, void *address)
|
||||
{
|
||||
p = p;
|
||||
free(address);
|
||||
}
|
||||
|
||||
|
@ -827,10 +827,10 @@ void console_create_window(running_machine &machine)
|
||||
{
|
||||
NSInteger tag;
|
||||
for (tag = 1; tag <= 8; tag <<= 1) {
|
||||
NSString *title = [NSString stringWithFormat:@"%d-byte Chunks", tag];
|
||||
NSString *title = [NSString stringWithFormat:@"%ld-byte Chunks", tag];
|
||||
NSMenuItem *chunkItem = [menu insertItemWithTitle:title
|
||||
action:@selector(showChunkSize:)
|
||||
keyEquivalent:[NSString stringWithFormat:@"%d", tag]
|
||||
keyEquivalent:[NSString stringWithFormat:@"%ld", tag]
|
||||
atIndex:index++];
|
||||
[chunkItem setTarget:self];
|
||||
[chunkItem setTag:tag];
|
||||
@ -900,13 +900,13 @@ void console_create_window(running_machine &machine)
|
||||
|
||||
item = [contextMenu addItemWithTitle:@"Toggle Breakpoint"
|
||||
action:@selector(debugToggleBreakpoint:)
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", NSF9FunctionKey]];
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF9FunctionKey]];
|
||||
[item setKeyEquivalentModifierMask:0];
|
||||
[item setTarget:self];
|
||||
|
||||
item = [contextMenu addItemWithTitle:@"Disable Breakpoint"
|
||||
action:@selector(debugToggleBreakpointEnable:)
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", NSF9FunctionKey]];
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF9FunctionKey]];
|
||||
[item setKeyEquivalentModifierMask:NSShiftKeyMask];
|
||||
[item setTarget:self];
|
||||
|
||||
@ -914,7 +914,7 @@ void console_create_window(running_machine &machine)
|
||||
|
||||
item = [contextMenu addItemWithTitle:@"Run to Cursor"
|
||||
action:@selector(debugRunToCursor:)
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", NSF4FunctionKey]];
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF4FunctionKey]];
|
||||
[item setKeyEquivalentModifierMask:0];
|
||||
[item setTarget:self];
|
||||
|
||||
@ -1163,7 +1163,7 @@ void console_create_window(running_machine &machine)
|
||||
{
|
||||
NSMenuItem *breakItem = [menu insertItemWithTitle:@"Toggle Breakpoint at Cursor"
|
||||
action:@selector(debugToggleBreakpoint:)
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", NSF9FunctionKey]
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF9FunctionKey]
|
||||
atIndex:index++];
|
||||
[breakItem setKeyEquivalentModifierMask:0];
|
||||
[breakItem setTarget:self];
|
||||
@ -1171,7 +1171,7 @@ void console_create_window(running_machine &machine)
|
||||
{
|
||||
NSMenuItem *disableItem = [menu insertItemWithTitle:@"Disable Breakpoint at Cursor"
|
||||
action:@selector(debugToggleBreakpointEnable:)
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", NSF9FunctionKey]
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF9FunctionKey]
|
||||
atIndex:index++];
|
||||
[disableItem setKeyEquivalentModifierMask:NSShiftKeyMask];
|
||||
[disableItem setAlternate:YES];
|
||||
@ -1183,11 +1183,11 @@ void console_create_window(running_machine &machine)
|
||||
if (runMenu != nil) {
|
||||
runItem = [runMenu addItemWithTitle:@"to Cursor"
|
||||
action:@selector(debugRunToCursor:)
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", NSF4FunctionKey]];
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF4FunctionKey]];
|
||||
} else {
|
||||
runItem = [menu insertItemWithTitle:@"Run to Cursor"
|
||||
action:@selector(debugRunToCursor:)
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", NSF4FunctionKey]
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF4FunctionKey]
|
||||
atIndex:index++];
|
||||
}
|
||||
[runItem setKeyEquivalentModifierMask:0];
|
||||
@ -1350,26 +1350,26 @@ void console_create_window(running_machine &machine)
|
||||
{
|
||||
NSMenuItem *runParentItem = [menu addItemWithTitle:@"Run"
|
||||
action:@selector(debugRun:)
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", NSF5FunctionKey]];
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF5FunctionKey]];
|
||||
NSMenu *runMenu = [[NSMenu allocWithZone:[NSMenu menuZone]] initWithTitle:@"Run"];
|
||||
[runParentItem setSubmenu:runMenu];
|
||||
[runMenu release];
|
||||
[runParentItem setKeyEquivalentModifierMask:0];
|
||||
[[runMenu addItemWithTitle:@"and Hide Debugger"
|
||||
action:@selector(debugRunAndHide:)
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", NSF12FunctionKey]]
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF12FunctionKey]]
|
||||
setKeyEquivalentModifierMask:0];
|
||||
[[runMenu addItemWithTitle:@"to Next CPU"
|
||||
action:@selector(debugRunToNextCPU:)
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", NSF6FunctionKey]]
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF6FunctionKey]]
|
||||
setKeyEquivalentModifierMask:0];
|
||||
[[runMenu addItemWithTitle:@"until Next Interrupt on Current CPU"
|
||||
action:@selector(debugRunToNextInterrupt:)
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", NSF7FunctionKey]]
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF7FunctionKey]]
|
||||
setKeyEquivalentModifierMask:0];
|
||||
[[runMenu addItemWithTitle:@"until Next VBLANK"
|
||||
action:@selector(debugRunToNextVBLANK:)
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", NSF8FunctionKey]]
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF8FunctionKey]]
|
||||
setKeyEquivalentModifierMask:0];
|
||||
}
|
||||
{
|
||||
@ -1379,15 +1379,15 @@ void console_create_window(running_machine &machine)
|
||||
[stepMenu release];
|
||||
[[stepMenu addItemWithTitle:@"Into"
|
||||
action:@selector(debugStepInto:)
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", NSF11FunctionKey]]
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF11FunctionKey]]
|
||||
setKeyEquivalentModifierMask:0];
|
||||
[[stepMenu addItemWithTitle:@"Over"
|
||||
action:@selector(debugStepOver:)
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", NSF10FunctionKey]]
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF10FunctionKey]]
|
||||
setKeyEquivalentModifierMask:0];
|
||||
[[stepMenu addItemWithTitle:@"Out"
|
||||
action:@selector(debugStepOut:)
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", NSF10FunctionKey]]
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF10FunctionKey]]
|
||||
setKeyEquivalentModifierMask:NSShiftKeyMask];
|
||||
}
|
||||
{
|
||||
@ -1397,11 +1397,11 @@ void console_create_window(running_machine &machine)
|
||||
[resetMenu release];
|
||||
[[resetMenu addItemWithTitle:@"Soft"
|
||||
action:@selector(debugSoftReset:)
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", NSF3FunctionKey]]
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF3FunctionKey]]
|
||||
setKeyEquivalentModifierMask:0];
|
||||
[[resetMenu addItemWithTitle:@"Hard"
|
||||
action:@selector(debugHardReset:)
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", NSF3FunctionKey]]
|
||||
keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF3FunctionKey]]
|
||||
setKeyEquivalentModifierMask:NSShiftKeyMask];
|
||||
}
|
||||
[menu addItem:[NSMenuItem separatorItem]];
|
||||
|
Loading…
Reference in New Issue
Block a user