@@ -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+
10401115READ_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