Skip to content

Commit 3afd990

Browse files
committed
apple3 updates [R. Belmont, robj]
- RAM is always present at FFCx, eliminated previous need for hack - VIAs are clocked by PRE1M (1 MHz), fixes Confidence Test - Fixed joystick reading; works in Sandman and Atomic Defense - Hooked up HBlank input to VIA 1 PB6 - Support raster splits; Atomic Defense is playable (pick joystick B)
1 parent edd1382 commit 3afd990

File tree

4 files changed

+165
-82
lines changed

4 files changed

+165
-82
lines changed

src/mame/drivers/apple3.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ static MACHINE_CONFIG_START( apple3, apple3_state )
6161
MCFG_SCREEN_ADD("screen", RASTER)
6262
MCFG_SCREEN_REFRESH_RATE(60)
6363
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
64-
MCFG_SCREEN_SIZE(280*2, 224)
64+
MCFG_SCREEN_SIZE((280*2)+32, 224)
6565
MCFG_SCREEN_VISIBLE_AREA(0, (280*2)-1,0,192-1)
6666
MCFG_SCREEN_UPDATE_DRIVER(apple3_state, screen_update_apple3)
6767
MCFG_SCREEN_PALETTE("palette")
@@ -130,12 +130,12 @@ static MACHINE_CONFIG_START( apple3, apple3_state )
130130
MCFG_DEVICE_ADD("rtc", MM58167, XTAL_32_768kHz)
131131

132132
/* via */
133-
MCFG_DEVICE_ADD("via6522_0", VIA6522, 2000000)
133+
MCFG_DEVICE_ADD("via6522_0", VIA6522, 1000000)
134134
MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(apple3_state, apple3_via_0_out_a))
135135
MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(apple3_state, apple3_via_0_out_b))
136136
MCFG_VIA6522_IRQ_HANDLER(WRITELINE(apple3_state, apple3_via_0_irq_func))
137137

138-
MCFG_DEVICE_ADD("via6522_1", VIA6522, 2000000)
138+
MCFG_DEVICE_ADD("via6522_1", VIA6522, 1000000)
139139
MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(apple3_state, apple3_via_1_out_a))
140140
MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(apple3_state, apple3_via_1_out_b))
141141
MCFG_VIA6522_IRQ_HANDLER(WRITELINE(apple3_state, apple3_via_1_irq_func))

src/mame/includes/apple3.h

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ class apple3_state : public driver_device
9898
DECLARE_VIDEO_START(apple3);
9999
UINT32 screen_update_apple3(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
100100
TIMER_DEVICE_CALLBACK_MEMBER(apple3_interrupt);
101+
TIMER_CALLBACK_MEMBER(scanstart_cb);
102+
TIMER_CALLBACK_MEMBER(scanend_cb);
101103
DECLARE_WRITE_LINE_MEMBER(apple3_acia_irq_func);
102104
DECLARE_WRITE8_MEMBER(apple3_via_0_out_a);
103105
DECLARE_WRITE8_MEMBER(apple3_via_0_out_b);
@@ -106,12 +108,12 @@ class apple3_state : public driver_device
106108
DECLARE_WRITE_LINE_MEMBER(apple3_via_0_irq_func);
107109
DECLARE_WRITE_LINE_MEMBER(apple3_via_1_irq_func);
108110
void apple3_write_charmem();
109-
void apple3_video_text40(bitmap_ind16 &bitmap);
110-
void apple3_video_text80(bitmap_ind16 &bitmap);
111-
void apple3_video_graphics_hgr(bitmap_ind16 &bitmap);
112-
void apple3_video_graphics_chgr(bitmap_ind16 &bitmap);
113-
void apple3_video_graphics_shgr(bitmap_ind16 &bitmap);
114-
void apple3_video_graphics_chires(bitmap_ind16 &bitmap);
111+
void text40(bitmap_ind16 &bitmap, const rectangle &cliprect);
112+
void text80(bitmap_ind16 &bitmap, const rectangle &cliprect);
113+
void graphics_hgr(bitmap_ind16 &bitmap, const rectangle &cliprect);
114+
void graphics_chgr(bitmap_ind16 &bitmap, const rectangle &cliprect);
115+
void graphics_shgr(bitmap_ind16 &bitmap, const rectangle &cliprect);
116+
void graphics_chires(bitmap_ind16 &bitmap, const rectangle &cliprect);
115117
UINT8 *apple3_bankaddr(UINT16 bank, offs_t offset);
116118
UINT8 *apple3_get_zpa_addr(offs_t offset);
117119
void apple3_update_memory();
@@ -160,6 +162,8 @@ class apple3_state : public driver_device
160162
UINT16 m_lastchar, m_strobe;
161163
UINT8 m_transchar;
162164

165+
emu_timer *m_scanstart, *m_scanend;
166+
163167
int m_analog_sel;
164168
bool m_ramp_active;
165169
int m_pdl_charge;

src/mame/machine/apple3.cpp

Lines changed: 123 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -135,12 +135,16 @@ READ8_MEMBER(apple3_state::apple3_c0xx_r)
135135
case 0x40: case 0x41: case 0x42: case 0x43:
136136
case 0x44: case 0x45: case 0x46: case 0x47:
137137
case 0x48: case 0x49: case 0x4A: case 0x4B:
138-
case 0x4C: case 0x4D: case 0x4E: case 0x4F:
138+
case 0x4C: case 0x4D:
139139
m_c040_time = 200;
140140
break;
141141

142+
case 0x4E: case 0x4F: // character RAM enable/disable
143+
break;
144+
142145
case 0x50: case 0x51: case 0x52: case 0x53:
143146
case 0x54: case 0x55: case 0x56: case 0x57:
147+
machine().first_screen()->update_partial(machine().first_screen()->vpos());
144148
/* graphics softswitches */
145149
if (offset & 1)
146150
m_flags |= 1 << ((offset - 0x50) / 2);
@@ -235,8 +239,8 @@ READ8_MEMBER(apple3_state::apple3_c0xx_r)
235239
}
236240
break;
237241

238-
case 0xD0: case 0xD1: case 0xD2: case 0xD3:
239-
case 0xD4: case 0xD5: case 0xD6: case 0xD7:
242+
case 0xd0: case 0xd1: case 0xd2: case 0xd3:
243+
case 0xd4: case 0xd5: case 0xd6: case 0xd7:
240244
/* external drive stuff */
241245
m_fdc->read_c0dx(space, offset&0xf);
242246
result = 0x00;
@@ -246,35 +250,56 @@ READ8_MEMBER(apple3_state::apple3_c0xx_r)
246250
m_smoothscr = offset & 1;
247251
break;
248252

249-
case 0xDB:
253+
case 0xda:
254+
// printf("ENCWRT off\n");
255+
break;
256+
257+
case 0xdb:
250258
apple3_write_charmem();
259+
// printf("ENCWRT on (write_charmem (r))\n");
260+
break;
261+
262+
case 0xdc:
263+
// printf("ENCSEL off\n");
264+
break;
265+
266+
case 0xdd:
267+
// printf("ENCSEL on\n");
268+
break;
269+
270+
case 0xde:
271+
// printf("ENSIO off\n");
272+
break;
273+
274+
case 0xdf:
275+
// printf("ENSIO on\n");
251276
break;
252277

253-
case 0xE0: case 0xE1:
278+
case 0xe0: case 0xe1:
254279
result = m_fdc->read(space, offset&0xf);
255280
m_va = offset & 1;
256281
break;
257282

258-
case 0xE2: case 0xE3:
283+
case 0xe2: case 0xe3:
259284
result = m_fdc->read(space, offset&0xf);
260285
m_vb = offset & 1;
261286
break;
262287

263-
case 0xE4: case 0xE5:
288+
case 0xe4: case 0xe5:
264289
result = m_fdc->read(space, offset&0xf);
265290
m_vc = offset & 1;
266291
break;
267292

268-
case 0xE6: case 0xE7: case 0xE8: case 0xE9:
269-
case 0xEA: case 0xEB: case 0xEC: case 0xED:
270-
case 0xEE: case 0xEF:
293+
case 0xe6: case 0xe7: case 0xe8: case 0xe9:
294+
case 0xea: case 0xeb: case 0xec: case 0xed:
295+
case 0xee: case 0xef:
271296
result = m_fdc->read(space, offset&0xf);
272297
break;
273298

274-
case 0xF0:
275-
case 0xF1:
276-
case 0xF2:
277-
case 0xF3:
299+
case 0xf0:
300+
case 0xf1:
301+
case 0xf2:
302+
case 0xf3:
278303
result = m_acia->read(space, offset & 0x03);
279304
break;
280305
}
@@ -314,12 +339,16 @@ WRITE8_MEMBER(apple3_state::apple3_c0xx_w)
314339
case 0x40: case 0x41: case 0x42: case 0x43:
315340
case 0x44: case 0x45: case 0x46: case 0x47:
316341
case 0x48: case 0x49: case 0x4A: case 0x4B:
317-
case 0x4C: case 0x4D: case 0x4E: case 0x4F:
342+
case 0x4C: case 0x4D:
318343
m_c040_time = 200;
319344
break;
320345

346+
case 0x4E: case 0x4F: // character RAM disable/enable
347+
break;
348+
321349
case 0x50: case 0x51: case 0x52: case 0x53:
322350
case 0x54: case 0x55: case 0x56: case 0x57:
351+
machine().first_screen()->update_partial(machine().first_screen()->vpos());
323352
/* graphics softswitches */
324353
if (offset & 1)
325354
m_flags |= 1 << ((offset - 0x50) / 2);
@@ -390,31 +419,52 @@ WRITE8_MEMBER(apple3_state::apple3_c0xx_w)
390419
}
391420
break;
392421

393-
case 0xD0: case 0xD1: case 0xD2: case 0xD3:
394-
case 0xD4: case 0xD5: case 0xD6: case 0xD7:
422+
case 0xd0: case 0xd1: case 0xd2: case 0xd3:
423+
case 0xd4: case 0xd5: case 0xd6: case 0xd7:
395424
/* external drive stuff */
396425
m_fdc->write_c0dx(space, offset&0xf, data);
397426
break;
398427

399-
case 0xd9:
400-
popmessage("Smooth scroll enabled, contact MESSdev");
428+
case 0xd8: case 0xd9:
429+
m_smoothscr = offset & 1;
430+
break;
431+
432+
case 0xda:
433+
// printf("ENCWRT off\n");
401434
break;
402435

403-
case 0xDB:
436+
case 0xdb:
404437
apple3_write_charmem();
438+
// printf("ENCWRT on (write_charmem (w))\n");
405439
break;
406440

407-
case 0xE0: case 0xE1: case 0xE2: case 0xE3:
408-
case 0xE4: case 0xE5: case 0xE6: case 0xE7:
409-
case 0xE8: case 0xE9: case 0xEA: case 0xEB:
410-
case 0xEC: case 0xED: case 0xEE: case 0xEF:
441+
case 0xdc:
442+
// printf("ENCSEL off\n");
443+
break;
444+
445+
case 0xdd:
446+
// printf("ENCSEL on\n");
447+
break;
448+
449+
case 0xde:
450+
// printf("ENSIO off\n");
451+
break;
452+
453+
case 0xdf:
454+
// printf("ENSIO on\n");
455+
break;
456+
457+
case 0xe0: case 0xe1: case 0xe2: case 0xe3:
458+
case 0xe4: case 0xe5: case 0xe6: case 0xe7:
459+
case 0xe8: case 0xe9: case 0xea: case 0xeb:
460+
case 0xec: case 0xed: case 0xee: case 0xef:
411461
m_fdc->write(space, offset&0xf, data);
412462
break;
413463

414-
case 0xF0:
415-
case 0xF1:
416-
case 0xF2:
417-
case 0xF3:
464+
case 0xf0:
465+
case 0xf1:
466+
case 0xf2:
467+
case 0xf3:
418468
m_acia->write(space, offset & 0x03, data);
419469
break;
420470
}
@@ -530,7 +580,6 @@ void apple3_state::apple3_update_memory()
530580
}
531581
else
532582
{
533-
m_rom_has_been_disabled = true;
534583
m_bank7rd = m_bank7wr;
535584

536585
// if we had an IRQ waiting for RAM to be paged in...
@@ -576,17 +625,6 @@ void apple3_state::apple3_irq_update()
576625
{
577626
if (m_acia_irq || m_via_1_irq || m_via_0_irq)
578627
{
579-
// HACK: SOS floppy driver enables ROM at Fxxx *before* trying to
580-
// suppress IRQs. IRQ hits at inopportune time -> bad vector -> system crash.
581-
// This breaks the Confidence Test, but the Confidence Test
582-
// never disables the ROM so checking for that gets us
583-
// working in all cases.
584-
// Bonus points: for some reason this isn't a problem with -debug.
585-
// m6502 heisenbug maybe?
586-
if ((m_via_0_a & ENV_ROMENABLE) && (m_rom_has_been_disabled))
587-
{
588-
return;
589-
}
590628
// printf(" setting IRQ\n");
591629
m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
592630
m_via_1->write_pa7(0); // this is active low
@@ -630,12 +668,14 @@ MACHINE_RESET_MEMBER(apple3_state,apple3)
630668
m_c040_time = 0;
631669
m_strobe = 0;
632670
m_lastchar = 0x0d;
633-
m_rom_has_been_disabled = false;
634671
m_cnxx_slot = -1;
635672
m_analog_sel = 0;
636673
m_ramp_active = false;
637674

638675
m_fdc->set_floppies_4(floppy0, floppy1, floppy2, floppy3);
676+
677+
m_scanstart->adjust(machine().first_screen()->time_until_pos(0, 0));
678+
m_scanend->adjust(attotime::never);
639679
}
640680

641681

@@ -702,6 +742,9 @@ DRIVER_INIT_MEMBER(apple3_state,apple3)
702742
m_via_1->write_pb6(1);
703743
m_via_1->write_pb7(1);
704744

745+
m_scanstart = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(apple3_state::scanstart_cb),this));
746+
m_scanend = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(apple3_state::scanend_cb),this));
747+
705748
apple3_update_memory();
706749

707750
save_item(NAME(m_acia_irq));
@@ -714,7 +757,6 @@ DRIVER_INIT_MEMBER(apple3_state,apple3)
714757
save_item(NAME(m_zpa));
715758
save_item(NAME(m_last_n));
716759
save_item(NAME(m_sync));
717-
save_item(NAME(m_rom_has_been_disabled));
718760
save_item(NAME(m_indir_bank));
719761
save_item(NAME(m_cnxx_slot));
720762
save_item(NAME(m_speaker_state));
@@ -855,7 +897,11 @@ READ8_MEMBER(apple3_state::apple3_memory_r)
855897
}
856898
else
857899
{
858-
if (offset >= 0xffd0 && offset <= 0xffdf)
900+
if (offset >= 0xffc0 && offset <= 0xffcf)
901+
{
902+
rv = m_bank7wr[offset - 0xf000];
903+
}
904+
else if (offset >= 0xffd0 && offset <= 0xffdf)
859905
{
860906
rv = m_via_0->read(space, offset);
861907
}
@@ -992,7 +1038,15 @@ WRITE8_MEMBER(apple3_state::apple3_memory_w)
9921038
}
9931039
else
9941040
{
995-
if (offset >= 0xffd0 && offset <= 0xffdf)
1041+
if (offset >= 0xffc0 && offset <= 0xffcf)
1042+
{
1043+
// does writeprot really apply to ffcx?
1044+
if (!(m_via_0_a & ENV_WRITEPROT))
1045+
{
1046+
m_bank7wr[offset - 0xf000] = data;
1047+
}
1048+
}
1049+
else if (offset >= 0xffd0 && offset <= 0xffdf)
9961050
{
9971051
if (!space.debugger_access())
9981052
{
@@ -1037,6 +1091,27 @@ TIMER_DEVICE_CALLBACK_MEMBER(apple3_state::apple3_c040_tick)
10371091
}
10381092
}
10391093

1094+
TIMER_CALLBACK_MEMBER(apple3_state::scanstart_cb)
1095+
{
1096+
int scanline;
1097+
1098+
scanline = machine().first_screen()->vpos();
1099+
//machine().first_screen()->update_partial(machine().first_screen()->vpos());
1100+
1101+
m_via_1->write_pb6(0);
1102+
1103+
m_scanend->adjust(machine().first_screen()->time_until_pos(scanline, 559));
1104+
}
1105+
1106+
TIMER_CALLBACK_MEMBER(apple3_state::scanend_cb)
1107+
{
1108+
int scanline = machine().first_screen()->vpos();
1109+
1110+
m_via_1->write_pb6(1);
1111+
1112+
m_scanstart->adjust(machine().first_screen()->time_until_pos((scanline+1) % 224, 0));
1113+
}
1114+
10401115
READ_LINE_MEMBER(apple3_state::ay3600_shift_r)
10411116
{
10421117
// either shift key
@@ -1205,15 +1280,15 @@ void apple3_state::pdl_handler(int offset)
12051280
break;
12061281

12071282
case 2:
1208-
pdlread = m_joy1y->read();
1283+
pdlread = 255 - m_joy1y->read();
12091284
break;
12101285

12111286
case 4:
12121287
pdlread = m_joy2x->read();
12131288
break;
12141289

12151290
case 5:
1216-
pdlread = m_joy2y->read();
1291+
pdlread = 255 - m_joy2y->read();
12171292
break;
12181293

12191294
default:
@@ -1224,8 +1299,8 @@ void apple3_state::pdl_handler(int offset)
12241299
// help the ROM self-test
12251300
if (m_pdl_charge > 82)
12261301
{
1227-
m_pdl_charge += (pdlread*4);
1228-
m_pdl_charge -= 93;
1302+
m_pdl_charge += (pdlread*7);
1303+
m_pdl_charge -= 100;
12291304
}
12301305
m_pdltimer->adjust(attotime::from_hz(1000000.0));
12311306
m_ramp_active = true;

0 commit comments

Comments
 (0)