Previous 199869 Revisions Next

r23512 Friday 7th June, 2013 at 09:21:05 UTC by Robbbert
(MESS) Altos5: banking done, passes self test
[src/mess/drivers]altos5.c

trunk/src/mess/drivers/altos5.c
r23511r23512
3737   DECLARE_WRITE8_MEMBER(port09_w);
3838   DECLARE_WRITE8_MEMBER(port14_w);
3939   DECLARE_DRIVER_INIT(altos5);
40   DECLARE_WRITE8_MEMBER(kbd_put);
41   DECLARE_READ8_MEMBER(port2e_r);
42   DECLARE_READ8_MEMBER(port2f_r);
4340   TIMER_DEVICE_CALLBACK_MEMBER(ctc_tick);
4441   DECLARE_WRITE_LINE_MEMBER(ctc_z1_w);
4542   UINT8 m_port08;
4643   UINT8 m_port09;
44   UINT8 *m_p_prom;
4745   bool m_ipl;
4846   bool m_wrpt;
47   UINT8 convert(offs_t offset, bool state);
4948   void setup_banks();
5049   virtual void machine_reset();
5150   required_device<cpu_device> m_maincpu;
r23511r23512
9392static INPUT_PORTS_START( altos5 )
9493INPUT_PORTS_END
9594
95UINT8 altos5_state::convert(offs_t offset, bool state)
96{
97   UINT8 data = m_p_prom[offset];
98
99   // if IPL and /A12, point at rom
100   if (!state & m_ipl & !BIT(offset, 0))
101      data = 0x31;
102   else
103   // if WPRT point at nothing
104   if (state & BIT(data, 7))
105      data = 0x30;
106   else
107   // normalise bank number and use it
108   if (BIT(data, 6))
109      data-= 0x20;
110   else
111      data-= 0x10;
112
113   return data & 0x3f;
114}
115   
96116void altos5_state::setup_banks()
97117{
98   UINT8 *prom =  memregion("proms")->base();
99   UINT8 i;
100   offs_t offset = ((~m_port09 & 0x20) << 3) | (m_port09 & 0xc0) | ((m_port09 & 0x18) << 1);
101printf("\n%X:",offset);
102   for (i = 0; i < 16; i++)
103      printf("%X ",prom[offset+i]);
104   membank("bankr0")->set_entry(49);
118   // WPRT | template | cpu bank
119   offs_t offs = ((~m_port09 & 0x20) << 3) | ((m_port09 & 0x06) << 5) | ((m_port09 & 0x18) << 1);
120   offs_t temp = offs;
121
122   membank("bankr0")->set_entry(convert(offs++, 0));
123   membank("bankr1")->set_entry(convert(offs++, 0));
124   membank("bankr2")->set_entry(convert(offs++, 0));
125   membank("bankr3")->set_entry(convert(offs++, 0));
126   membank("bankr4")->set_entry(convert(offs++, 0));
127   membank("bankr5")->set_entry(convert(offs++, 0));
128   membank("bankr6")->set_entry(convert(offs++, 0));
129   membank("bankr7")->set_entry(convert(offs++, 0));
130   membank("bankr8")->set_entry(convert(offs++, 0));
131   membank("bankr9")->set_entry(convert(offs++, 0));
132   membank("bankra")->set_entry(convert(offs++, 0));
133   membank("bankrb")->set_entry(convert(offs++, 0));
134   membank("bankrc")->set_entry(convert(offs++, 0));
135   membank("bankrd")->set_entry(convert(offs++, 0));
136   membank("bankre")->set_entry(convert(offs++, 0));
137   membank("bankrf")->set_entry(convert(offs++, 0));
138
139   membank("bankw0")->set_entry(convert(temp++, 1));
140   membank("bankw1")->set_entry(convert(temp++, 1));
141   membank("bankw2")->set_entry(convert(temp++, 1));
142   membank("bankw3")->set_entry(convert(temp++, 1));
143   membank("bankw4")->set_entry(convert(temp++, 1));
144   membank("bankw5")->set_entry(convert(temp++, 1));
145   membank("bankw6")->set_entry(convert(temp++, 1));
146   membank("bankw7")->set_entry(convert(temp++, 1));
147   membank("bankw8")->set_entry(convert(temp++, 1));
148   membank("bankw9")->set_entry(convert(temp++, 1));
149   membank("bankwa")->set_entry(convert(temp++, 1));
150   membank("bankwb")->set_entry(convert(temp++, 1));
151   membank("bankwc")->set_entry(convert(temp++, 1));
152   membank("bankwd")->set_entry(convert(temp++, 1));
153   membank("bankwe")->set_entry(convert(temp++, 1));
154   membank("bankwf")->set_entry(convert(temp++, 1));
105155}
106156
107157void altos5_state::machine_reset()
r23511r23512
111161   m_wrpt = 0;
112162   m_ipl = 1;
113163   setup_banks();
164   m_maincpu->reset();
114165}
115166
116167static const z80_daisy_config daisy_chain_intf[] =
r23511r23512
120171   { "z80pio_1" },
121172   { "z80ctc" },
122173   { "z80dart" },
123//   { "z80sio" },
174   { "z80sio" },
124175   { NULL }
125176};
126177
127/*
128d0: L = a HD is present
129d1: L = a 2nd hard drive is present
130d2: unused configuration input (must be H to skip HD boot)
131d3: selected floppy is single(L) or double sided(H)
132d7: IRQ from FDC
133*/
134READ8_MEMBER( altos5_state::port08_r )
135{
136   return m_port08 | 0x87;
137}
138178
139/*
140d0: HD IRQ
141*/
142READ8_MEMBER( altos5_state::port09_r )
143{
144   return m_port09 | 0x01;
145}
146
147/*
148d4: DDEN (H = double density
149d5: DS (H = drive 2)
150d6: SS (H = side 2)
151*/
152WRITE8_MEMBER( altos5_state::port08_w )
153{
154   m_port08 = data;
155}
156
157/*
158d1, 2: Memory Map template selection (0 = diag; 1 = oasis; 2 = mp/m)
159d3, 4: CPU bank select
160d5:    H = Write protect of common area
161d6, 7: DMA bank select
162*/
163WRITE8_MEMBER( altos5_state::port09_w )
164{
165   m_port09 = data;
166   setup_banks();
167}
168
169179// turns off IPL mode, removes boot rom from memory map
170180WRITE8_MEMBER( altos5_state::port14_w )
171181{
r23511r23512
217227   m_ctc->trg1(0);
218228   m_ctc->trg2(1);
219229   m_ctc->trg2(0);
230   m_ctc->trg3(1);
231   m_ctc->trg3(0);
220232}
221233
222234WRITE_LINE_MEMBER( altos5_state::ctc_z1_w )
r23511r23512
247259   DEVCB_NULL          /* portB ready active callback */
248260};
249261
262/*
263d0: L = a HD is present
264d1: L = a 2nd hard drive is present
265d2: unused configuration input (must be H to skip HD boot)
266d3: selected floppy is single(L) or double sided(H)
267d7: IRQ from FDC
268*/
269READ8_MEMBER( altos5_state::port08_r )
270{
271   return m_port08 | 0x87;
272}
273
274/*
275d0: HD IRQ
276*/
277READ8_MEMBER( altos5_state::port09_r )
278{
279   return m_port09 | 0x01;
280}
281
282/*
283d4: DDEN (H = double density
284d5: DS (H = drive 2)
285d6: SS (H = side 2)
286*/
287WRITE8_MEMBER( altos5_state::port08_w )
288{
289   m_port08 = data;
290}
291
292/*
293d1, 2: Memory Map template selection (0 = diag; 1 = oasis; 2 = mp/m)
294d3, 4: CPU bank select
295d5:    H = Write protect of common area
296d6, 7: DMA bank select
297*/
298WRITE8_MEMBER( altos5_state::port09_w )
299{
300   m_port09 = data;
301   setup_banks();
302}
303
250304// parallel port
251305static Z80PIO_INTERFACE( pio1_intf )
252306{
r23511r23512
287341   DEVCB_NULL
288342};
289343
344// consoles#1 and 2
290345static Z80SIO_INTERFACE( sio_intf )
291346{
292347   0, 0, 0, 0,
r23511r23512
325380
326381DRIVER_INIT_MEMBER( altos5_state, altos5 )
327382{
383   m_p_prom =  memregion("proms")->base();
384
328385   UINT8 *RAM = memregion("maincpu")->base();
386
329387   membank("bankr0")->configure_entries(0, 50, &RAM[0], 0x1000);
330388   membank("bankr1")->configure_entries(0, 50, &RAM[0], 0x1000);
331389   membank("bankr2")->configure_entries(0, 50, &RAM[0], 0x1000);
r23511r23512
383441ROM_START( altos5 ) // 00000-2FFFF = ram banks; 30000-30FFF wprt space; 31000-31FFF ROM
384442   ROM_REGION( 0x32000, "maincpu", ROMREGION_ERASEFF )
385443   ROM_LOAD("2732.bin",   0x31000, 0x1000, CRC(15fdc7eb) SHA1(e15bdf5d5414ad56f8c4bb84edc6f967a5f01ba9)) // bios
386   ROM_FILL(0x31054, 2, 0) // temp until banking sorted out
387   ROM_FILL(0x31344, 3, 0) // kill self test
388444
389445   ROM_REGION( 0x200, "proms", 0 )
390446   ROM_LOAD("82s141.bin", 0x0000, 0x0200, CRC(35c8078c) SHA1(dce24374bfcc5d23959e2c03485d82a119c0c3c9)) // banking control
r23511r23512
393449/* Driver */
394450
395451/*   YEAR  NAME    PARENT  COMPAT   MACHINE  INPUT   CLASS           INIT    COMPANY    FULLNAME       FLAGS */
396COMP(1982, altos5, 0,      0,       altos5,  altos5, altos5_state,  altos5, "Altos", "Altos 5-15", GAME_NOT_WORKING | GAME_NO_SOUND)
452COMP(1982, altos5, 0,      0,       altos5,  altos5, altos5_state,  altos5, "Altos", "Altos 5-15", GAME_NOT_WORKING | GAME_NO_SOUND_HW )

Previous 199869 Revisions Next


© 1997-2024 The MAME Team