Previous 15994 Revisions Next

r12367 Thursday 28th July, 2011 at 18:38:32 UTC by Curt Coder
[PC1512] Rewrote the VDU, driver is now fully working. [Curt Coder]
[hash]pc1512.xml
[src/mess]mess.mak
[src/mess/drivers]pc1512.c
[src/mess/includes]pc1512.h
[src/mess/video]pc1512.c*

hash/pc1512.xml
r12366r12367
11<?xml version="1.0"?>
22<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
33<softwarelist name="pc1512" description="Amstrad PC1512 diskettes">
4   <!--
5   Missing software that supports PC1512 special features:
6
7   20,000 Leagues Under the Sea
8   Bob Morane: Science Fiction 1
9   The Carl Lewis Challenge
10   Die Hard 2: Die Harder
11   Dragonfly
12   Feud
13   Flags
14   Gnome Ranger
15   The Great Escape
16   Iznogoud
17   Legend of Djel
18   Lemmings
19   Maupiti Island
20   Metal Mutant
21   Nil Dieu Vivant
22   Oh No! More Lemmings
23   Prohibition
24   Time and Magik: The Trilogy
425   
26   Deluxe Paint II
27   Wordstar 1512
28   -->
529   <software name="amstcoll">
630      <description>The Amstrad PC Collection</description>
731      <year>1986</year>
src/mess/includes/pc1512.h
r12366r12367
2323#include "machine/ram.h"
2424#include "sound/speaker.h"
2525#include "video/mc6845.h"
26#include "video/pc_cga.h"
2726
2827#define I8086_TAG      "ic120"
2928#define I8087_TAG      "ic119"
r12366r12367
8584   required_device<mc146818_device> m_rtc;
8685   required_device<device_t> m_fdc;
8786   required_device<device_t> m_uart;
88   optional_device<ams40041_device> m_vdu;
87   required_device<ams40041_device> m_vdu;
8988   required_device<device_t> m_centronics;
9089   required_device<device_t> m_speaker;
9190   required_device<pc1512_keyboard_device> m_kb;
r12366r12367
9695   virtual void machine_start();
9796   virtual void machine_reset();
9897
98   virtual void video_start();
99   virtual bool screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect);
100
99101   void update_speaker();
100102   void update_fdc_int();
101103   void update_fdc_drq();
102104   void update_fdc_tc();
103105   void update_ack();
104106   void set_fdc_dsr(UINT8 data);
107   int get_display_mode(UINT8 mode);
108   offs_t get_char_rom_offset();
109   int get_color(UINT8 data);
110   void draw_alpha(mc6845_device *device, bitmap_t *bitmap, const rectangle *cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, void *param);
111   void draw_graphics_1(mc6845_device *device, bitmap_t *bitmap, const rectangle *cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, void *param);
112   void draw_graphics_2(mc6845_device *device, bitmap_t *bitmap, const rectangle *cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, void *param);
105113
106//  DECLARE_READ8_MEMBER( videoram_r );
107//  DECLARE_WRITE8_MEMBER( videoram_w );
114   DECLARE_READ8_MEMBER( video_ram_r );
115   DECLARE_WRITE8_MEMBER( video_ram_w );
108116   DECLARE_READ8_MEMBER( system_r );
109117   DECLARE_WRITE8_MEMBER( system_w );
110118   DECLARE_READ8_MEMBER( mouse_r );
r12366r12367
115123   DECLARE_WRITE8_MEMBER( printer_w );
116124   DECLARE_READ8_MEMBER( fdc_r );
117125   DECLARE_WRITE8_MEMBER( fdc_w );
118//  DECLARE_READ8_MEMBER( vdu_r );
119//  DECLARE_WRITE8_MEMBER( vdu_w );
126   DECLARE_READ8_MEMBER( vdu_r );
127   DECLARE_WRITE8_MEMBER( vdu_w );
120128   DECLARE_WRITE_LINE_MEMBER( kbdata_w );
121129   DECLARE_WRITE_LINE_MEMBER( kbclk_w );
122130   DECLARE_WRITE_LINE_MEMBER( pit1_w );
r12366r12367
178186   UINT8 *m_video_ram;
179187   UINT8 *m_char_rom;
180188   int m_toggle;
189   int m_lpen;
190   int m_blink;
191   int m_cursor;
192   int m_blink_ctr;
193   UINT8 m_vdu_mode;
194   UINT8 m_vdu_color;
195   UINT8 m_vdu_plane;
196   UINT8 m_vdu_rdsel;
197   UINT8 m_vdu_border;
181198
182199   // sound state
183200   int m_speaker_drive;
src/mess/video/pc1512.c
r0r12367
1#include "includes/pc1512.h"
2
3
4
5//**************************************************************************
6//  CONSTANTS
7//**************************************************************************
8
9#define LOG 0
10
11
12static const int PALETTE_0[] = { 0, 3, 5, 7 };
13static const int PALETTE_1[] = { 0, 2, 4, 6 };
14static const int PALETTE_2[] = { 0, 3, 4, 7 };
15
16
17enum
18{
19   ALPHA_40 = 0,
20   ALPHA_80,
21   GRAPHICS_1,
22   GRAPHICS_2
23};
24
25
26#define MODE_ALPHA_80      0x01
27#define MODE_GRAPHICS      0x02
28#define MODE_PALETTE_2      0x04
29#define MODE_ENABLE_VIDEO   0x08
30#define MODE_GRAPHICS_2      0x10
31#define MODE_BLINK         0x20
32
33
34#define COLOR_INTENSITY      0x10
35#define COLOR_PALETTE_1      0x20
36
37
38#define VFP_HIRES         22
39#define HFP_HIRES         112
40#define VFP_LORES         22
41#define HFP_LORES         16
42
43
44
45//**************************************************************************
46//  PALETTE
47//**************************************************************************
48
49//-------------------------------------------------
50//  PALETTE_INIT( pc1512 )
51//-------------------------------------------------
52
53static PALETTE_INIT( pc1512 )
54{
55   palette_set_color_rgb(machine,  0, 0x00, 0x00, 0x00);
56   palette_set_color_rgb(machine,  1, 0x00, 0x00, 0xaa);
57   palette_set_color_rgb(machine,  2, 0x00, 0xaa, 0x00);
58   palette_set_color_rgb(machine,  3, 0x00, 0xaa, 0xaa);
59   palette_set_color_rgb(machine,  4, 0xaa, 0x00, 0x00);
60   palette_set_color_rgb(machine,  5, 0xaa, 0x00, 0xaa);
61   palette_set_color_rgb(machine,  6, 0xaa, 0x55, 0x00);
62   palette_set_color_rgb(machine,  7, 0xaa, 0xaa, 0xaa);
63   palette_set_color_rgb(machine,  8, 0x55, 0x55, 0x55);
64   palette_set_color_rgb(machine,  9, 0x55, 0x55, 0xff);
65   palette_set_color_rgb(machine, 10, 0x55, 0xff, 0x55);
66   palette_set_color_rgb(machine, 11, 0x55, 0xff, 0xff);
67   palette_set_color_rgb(machine, 12, 0xff, 0x55, 0x55);
68   palette_set_color_rgb(machine, 13, 0xff, 0x55, 0xff);
69   palette_set_color_rgb(machine, 14, 0xff, 0xff, 0x55);
70   palette_set_color_rgb(machine, 15, 0xff, 0xff, 0xff);
71}
72
73
74
75//**************************************************************************
76//  VIDEO RAM ACCESS
77//**************************************************************************
78
79//-------------------------------------------------
80//  video_ram_r -
81//-------------------------------------------------
82
83READ8_MEMBER( pc1512_state::video_ram_r )
84{
85   UINT8 data = 0;
86   
87   switch (get_display_mode(m_vdu_mode))
88   {
89   case ALPHA_40:
90   case ALPHA_80:
91      data = m_video_ram[offset];
92      break;
93     
94   case GRAPHICS_1:
95      data = m_video_ram[(offset << 2) | 3];
96      break;
97     
98   case GRAPHICS_2:
99      data = m_video_ram[(offset << 2) | (m_vdu_rdsel ^ 0x03)];
100      break;
101   }
102   
103   return data;
104}
105
106
107//-------------------------------------------------
108//  video_ram_w -
109//-------------------------------------------------
110
111WRITE8_MEMBER( pc1512_state::video_ram_w )
112{
113   switch (get_display_mode(m_vdu_mode))
114   {
115   case ALPHA_40:
116   case ALPHA_80:
117      m_video_ram[offset] = data;
118      break;
119     
120   case GRAPHICS_1:
121      m_video_ram[(offset << 2) | 3] = data;
122      m_video_ram[(offset << 2) | 2] = data;
123      m_video_ram[(offset << 2) | 1] = data;
124      m_video_ram[(offset << 2) | 0] = data;
125      break;
126     
127   case GRAPHICS_2:
128      if (BIT(m_vdu_plane, 0)) m_video_ram[(offset << 2) | 3] = data;
129      if (BIT(m_vdu_plane, 1)) m_video_ram[(offset << 2) | 2] = data;
130      if (BIT(m_vdu_plane, 2)) m_video_ram[(offset << 2) | 1] = data;
131      if (BIT(m_vdu_plane, 3)) m_video_ram[(offset << 2) | 0] = data;
132      break;
133   }
134}
135
136
137//-------------------------------------------------
138//  vdu_r -
139//-------------------------------------------------
140
141READ8_MEMBER( pc1512_state::vdu_r )
142{
143   UINT8 data = 0;
144   
145   switch (offset)
146   {
147   case 1: case 3: case 5: case 7:
148      data = m_vdu->register_r(space, 0);
149      break;
150     
151   case 0xa: // VDU Status
152      /*
153
154         bit     description
155
156         0       Toggle Bit
157         1       Light-pen latch select
158         2       Light-pen switch off
159         3       Frame Flyback Time
160         4       
161         5       
162         6       
163         7       
164
165      */
166     
167      // toggle bit
168      data |= m_toggle;
169      m_toggle = !m_toggle;
170     
171      // light pen latch
172      data |= m_lpen << 1;
173     
174      // light pen switch
175      data |= 0x04;
176     
177      // vertical sync
178      data |= m_vdu->vsync_r() << 3;
179      break;
180   }
181   
182   return data;
183}
184
185
186//-------------------------------------------------
187//  vdu_w -
188//-------------------------------------------------
189
190WRITE8_MEMBER( pc1512_state::vdu_w )
191{
192   switch (offset)
193   {
194   case 0: case 2: case 4: case 6:
195      m_vdu->address_w(space, 0, data);
196      break;
197
198   case 1: case 3: case 5: case 7:
199      m_vdu->register_w(space, 0, data);
200      break;
201     
202   case 8: // VDU Mode Control
203      /*
204
205         bit     description
206
207         0       Select Alpha 80 Char mode (de-select 40 Char mode)
208         1       Select Graphics modes (de-select Alpha modes)
209         2       Select Palette 2 (de-select palettes 0,1)
210         3       Enable Video Display
211         4       Select Graphics Mode 2 (de-select graphics mode 1)
212         5       Enable Blinking Chars (disable intensified backgrounds)
213         6       
214         7       
215
216      */
217
218      if (LOG) logerror("VDU Mode Control %02x\n", data);
219     
220      if ((get_display_mode(m_vdu_mode) != GRAPHICS_2) && (get_display_mode(data) == GRAPHICS_2))
221      {
222         m_vdu_plane = 0x0f;
223         m_vdu_border = 0;
224      }
225
226      if (get_display_mode(data) != GRAPHICS_2)
227      {
228         m_vdu_rdsel = 0;
229      }
230     
231      if (get_display_mode(m_vdu_mode) != get_display_mode(data))
232      {
233         switch (get_display_mode(data))
234         {
235         case ALPHA_40:
236         case GRAPHICS_1:
237            m_vdu->set_hpixels_per_column(8);
238            m_vdu->set_clock(XTAL_28_63636MHz/32);
239            break;
240           
241         case ALPHA_80:
242            m_vdu->set_hpixels_per_column(8);
243            m_vdu->set_clock(XTAL_28_63636MHz/16);
244            break;
245           
246         case GRAPHICS_2:
247            m_vdu->set_hpixels_per_column(16);
248            m_vdu->set_clock(XTAL_28_63636MHz/32);
249            break;
250         }
251      }
252     
253      m_vdu_mode = data;
254      break;
255     
256   case 9: // VDU Colour Select
257      /*
258
259         bit     description
260
261         0       
262         1       
263         2       
264         3       
265         4       
266         5       
267         6       
268         7       
269
270      */
271     
272      if (LOG) logerror("VDU Colour Select %02x\n", data);
273     
274      m_vdu_color = data;
275      break;
276     
277   case 0xb: // Clear Light Pen Latch
278      if (LOG) logerror("VDU Clear Light Pen Latch\n");
279     
280      m_lpen = 0;
281      break;
282     
283   case 0xc: // Set Light Pen Latch
284      if (LOG) logerror("VDU Set Light Pen Latch\n");
285     
286      if (!m_lpen)
287      {
288         m_vdu->assert_light_pen_input();
289      }
290     
291      m_lpen = 1;
292      break;
293     
294   case 0xd: // VDU Colour Plane Write
295      /*
296
297         bit     description
298
299         0       Allow CPU write to Blue Plane
300         1       Allow CPU write to Green Plane
301         2       Allow CPU write to Red Plane
302         3       Allow CPU write to Intensity Plane
303         4       
304         5       
305         6       
306         7       
307
308      */
309     
310      if (LOG) logerror("VDU Colour Plane Write %01x\n", data & 0x0f);
311     
312      if (get_display_mode(m_vdu_mode) == GRAPHICS_2)
313      {
314         m_vdu_plane = data;
315      }
316      break;
317     
318   case 0xe: // VDU Colour Plane Read
319      /*
320
321         bit     description
322
323         0       Read Select bit 0 (RDSEL0)
324         1       Read Select bit 1 (RDSEL1)
325         2       
326         3       
327         4       
328         5       
329         6       
330         7       
331
332      */
333     
334      if (LOG) logerror("VDU Colour Plane Read %u\n", data & 0x03);
335     
336      if (get_display_mode(m_vdu_mode) == GRAPHICS_2)
337      {
338         m_vdu_rdsel = data & 0x03;
339      }
340      break;
341     
342   case 0xf: // VDU Graphics Mode 2 Border
343      /*
344
345         bit     description
346
347         0       Border Blue
348         1       Border Green
349         2       Border Red
350         3       Border Intensity
351         4       
352         5       
353         6       
354         7       
355
356      */
357     
358      if (LOG) logerror("VDU Graphics Mode 2 Border %u\n", data & 0x0f);
359     
360      m_vdu_border = data;
361      break;
362   }
363}
364
365
366//-------------------------------------------------
367//  mc6845_interface crtc_intf
368//-------------------------------------------------
369
370int pc1512_state::get_display_mode(UINT8 mode)
371{
372   if (mode & MODE_GRAPHICS)
373   {
374      if (mode & MODE_GRAPHICS_2)
375      {
376         return GRAPHICS_2;
377      }
378      else
379      {
380         return GRAPHICS_1;
381      }
382   }
383   else
384   {
385      if (mode & MODE_ALPHA_80)
386      {
387         return ALPHA_80;
388      }
389      else
390      {
391         return ALPHA_40;
392      }
393   }
394}
395
396offs_t pc1512_state::get_char_rom_offset()
397{
398   return ((input_port_read(machine(), "LK") >> 5) & 0x03) << 11;
399}
400
401void pc1512_state::draw_alpha(mc6845_device *device, bitmap_t *bitmap, const rectangle *cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, void *param)
402{
403   offs_t char_rom_offset = get_char_rom_offset();
404   UINT16 *p = BITMAP_ADDR16(bitmap, y + VFP_HIRES, HFP_HIRES);
405   
406   if (get_display_mode(m_vdu_mode) == ALPHA_40)
407      p = BITMAP_ADDR16(bitmap, y + VFP_LORES, HFP_LORES);
408   
409   if (y > 199) return;
410   
411   for (int column = 0; column < x_count; column++)
412   {
413      UINT8 code = m_video_ram[(ma + column) << 1];
414      UINT8 attr = m_video_ram[((ma + column) << 1) + 1];
415      int fg = attr & 0x0f;
416      int bg = attr >> 4;
417     
418      if (m_vdu_mode & MODE_BLINK)
419      {
420         bg &= 0x07;
421         
422         if (BIT(attr, 7) && !m_blink)
423         {
424            fg = bg;
425         }
426      }
427
428      offs_t addr = char_rom_offset | (code << 3) | (ra & 0x07);
429      UINT8 data = m_char_rom[addr & 0x1fff];
430
431      if ((column == cursor_x) && m_cursor)
432      {
433         data = 0xff;
434      }
435
436      for (int bit = 0; bit < 8; bit++)
437      {
438         int color = BIT(data, 7) ? fg : bg;
439
440         *p = color; p++;
441
442         data <<= 1;
443      }
444   }
445}
446
447int pc1512_state::get_color(UINT8 data)
448{
449   if (data == 0) return m_vdu_color & 0x0f;
450   
451   int color = PALETTE_0[data & 0x03];
452   
453   if (m_vdu_color & COLOR_PALETTE_1)
454   {
455      color = PALETTE_1[data & 0x03];
456   }
457   else if (m_vdu_mode & MODE_PALETTE_2)
458   {
459      color = PALETTE_2[data & 0x03];
460   }
461
462   if (m_vdu_color & COLOR_INTENSITY)
463   {
464      color += 8;
465   }
466   
467   return color;
468};
469
470void pc1512_state::draw_graphics_1(mc6845_device *device, bitmap_t *bitmap, const rectangle *cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, void *param)
471{
472   if (y > 199) return;
473
474   UINT16 *p = BITMAP_ADDR16(bitmap, y + VFP_LORES, HFP_LORES);
475   
476   for (int column = 0; column < x_count; column++)
477   {
478      offs_t offset = ((ra & 0x01) << 15) | ((ma + column) << 3);
479     
480      UINT16 b = (m_video_ram[offset | 3] << 8) | m_video_ram[offset | 7];
481     
482      for (int x = 0; x < 8; x++)
483      {
484         *p = get_color((BIT(b, 15) << 1) | BIT(b, 14)); p++;
485         b <<= 2;
486      }
487   }
488}
489
490void pc1512_state::draw_graphics_2(mc6845_device *device, bitmap_t *bitmap, const rectangle *cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, void *param)
491{
492   if (y > 199) return;
493
494   UINT16 *p = BITMAP_ADDR16(bitmap, y + VFP_HIRES, HFP_HIRES);
495   
496   for (int column = 0; column < x_count; column++)
497   {
498      offs_t offset = ((ra & 0x01) << 15) | ((ma + column) << 3);
499     
500      UINT16 i = BIT(m_vdu_color, 3) ? ((m_video_ram[offset | 0] << 8) | m_video_ram[offset | 4]) : 0;
501      UINT16 r = BIT(m_vdu_color, 2) ? ((m_video_ram[offset | 1] << 8) | m_video_ram[offset | 5]) : 0;
502      UINT16 g = BIT(m_vdu_color, 1) ? ((m_video_ram[offset | 2] << 8) | m_video_ram[offset | 6]) : 0;
503      UINT16 b = BIT(m_vdu_color, 0) ? ((m_video_ram[offset | 3] << 8) | m_video_ram[offset | 7]) : 0;
504     
505      for (int x = 0; x < 16; x++)
506      {
507         *p = (BIT(i, 15) << 3) | (BIT(r, 15) << 2) | (BIT(g, 15) << 1) | BIT(b, 15); p++;
508         i <<= 1; r <<= 1; g <<= 1; b <<= 1;
509      }
510   }
511}
512
513static MC6845_UPDATE_ROW( pc1512_update_row )
514{
515   pc1512_state *state = device->machine().driver_data<pc1512_state>();
516
517   switch (state->get_display_mode(state->m_vdu_mode))
518   {
519   case ALPHA_40:
520   case ALPHA_80:
521      state->draw_alpha(device, bitmap, cliprect, ma, ra, y, x_count, cursor_x, param);
522      break;
523     
524   case GRAPHICS_1:
525      state->draw_graphics_1(device, bitmap, cliprect, ma, ra, y, x_count, cursor_x, param);
526      break;
527     
528   case GRAPHICS_2:
529      state->draw_graphics_2(device, bitmap, cliprect, ma, ra, y, x_count, cursor_x, param);
530      break;
531   }
532}
533
534static const mc6845_interface crtc_intf =
535{
536   SCREEN_TAG,
537   8,
538   NULL,
539   pc1512_update_row,
540   NULL,
541   DEVCB_NULL,
542   DEVCB_NULL,
543   DEVCB_NULL,
544   DEVCB_NULL,
545   NULL
546};
547
548
549//-------------------------------------------------
550//  VIDEO_START( pc1512 )
551//-------------------------------------------------
552
553void pc1512_state::video_start()
554{
555   // find memory regions
556   m_char_rom = machine().region(AMS40041_TAG)->base();
557
558   // allocate memory
559   m_video_ram = auto_alloc_array(machine(), UINT8, 0x10000);
560}
561
562
563//-------------------------------------------------
564//  SCREEN_UPDATE( pc1512 )
565//-------------------------------------------------
566
567bool pc1512_state::screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect)
568{
569   if (m_vdu_mode & MODE_ENABLE_VIDEO)
570   {
571      m_blink_ctr++;
572     
573      if (m_blink_ctr == 0x08)
574      {
575         m_cursor = !m_cursor;
576      }
577      else if (m_blink_ctr == 0x10)
578      {
579         m_cursor = !m_cursor;
580         m_blink = !m_blink;
581         m_blink_ctr = 0;
582      }
583
584      switch (get_display_mode(m_vdu_mode))
585      {
586      case ALPHA_40:
587      case GRAPHICS_1:
588         screen.set_visible_area(0, 359, 0, 245);
589         break;
590         
591      case ALPHA_80:
592      case GRAPHICS_2:
593         screen.set_visible_area(0, 831, 0, 245);
594         break;
595      }
596
597      switch (get_display_mode(m_vdu_mode))
598      {
599      case ALPHA_40:
600      case ALPHA_80:
601      case GRAPHICS_1:
602         bitmap_fill(&bitmap, &cliprect, m_vdu_color & 0x0f);
603         break;
604         
605      case GRAPHICS_2:
606         bitmap_fill(&bitmap, &cliprect, m_vdu_border & 0x0f);
607         break;
608      }
609     
610      m_vdu->update(&bitmap, &cliprect);
611   }
612   else
613   {   
614      bitmap_fill(&bitmap, &cliprect, 0);
615   }
616   
617   return false;
618}
619
620
621//-------------------------------------------------
622//  MACHINE_CONFIG( pc1512 )
623//-------------------------------------------------
624
625MACHINE_CONFIG_FRAGMENT( pc1512_video )
626   MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
627   MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
628   MCFG_SCREEN_SIZE(80*8, 24*8)
629   MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 24*8-1)
630   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
631   MCFG_SCREEN_REFRESH_RATE(50)
632   
633   MCFG_PALETTE_LENGTH(16)
634   MCFG_PALETTE_INIT(pc1512)
635   
636   MCFG_MC6845_ADD(AMS40041_TAG, AMS40041, XTAL_28_63636MHz/32, crtc_intf)
637MACHINE_CONFIG_END
src/mess/drivers/pc1512.c
r12366r12367
22
33    Amstrad PC1512
44
5   http://www.seasip.info/AmstradXT
6   
7*/
8
9/*
10
511    TODO:
612
7    - rewrite VDU
13   - adjust mouse speed
14   - V2 keyboard error
15   - V3 VDU check goes crazy
816
9    http://git.redump.net/cgit.cgi/mess/commit/?id=94fd742c9f51970583806ed37c6b3d9815f73e1a
10    http://www.retroisle.com/amstrad/pcs/OriginalDocs/techmanual.php#1.11.2.2
11    http://www.reenigne.org/blog/crtc-emulation-for-mess/
12    http://www.seasip.info/AmstradXT/pc1512kbd.html
13
1417*/
1518
1619#include "includes/pc1512.h"
r12366r12367
462465
463466static ADDRESS_MAP_START( pc1512_mem, AS_PROGRAM, 16, pc1512_state )
464467   AM_RANGE(0x00000, 0x9ffff) AM_RAM
465//  AM_RANGE(0xb8000, 0xbffff) AM_READWRITE(videoram_r, videoram_w)
468   AM_RANGE(0xb8000, 0xbbfff) AM_READWRITE8(video_ram_r, video_ram_w, 0xffff)
466469   AM_RANGE(0xfc000, 0xfffff) AM_ROM AM_REGION(I8086_TAG, 0)
467470ADDRESS_MAP_END
468471
r12366r12367
482485   AM_RANGE(0x080, 0x083) AM_WRITE8(dma_page_w, 0xffff)
483486   AM_RANGE(0x0a0, 0x0a1) AM_WRITE8(nmi_mask_w, 0xff00)
484487   AM_RANGE(0x378, 0x37b) AM_READWRITE8(printer_r, printer_w, 0xffff)
485//  AM_RANGE(0x3d0, 0x3df) AM_READWRITE8(vdu_r, vdu_w, 0xffff)
488   AM_RANGE(0x3d0, 0x3df) AM_READWRITE8(vdu_r, vdu_w, 0xffff)
486489   AM_RANGE(0x3f0, 0x3f7) AM_READWRITE8(fdc_r, fdc_w, 0xffff)
487490   AM_RANGE(0x3f8, 0x3ff) AM_DEVREADWRITE8_LEGACY(INS8250_TAG, ins8250_r, ins8250_w, 0xffff)
488491ADDRESS_MAP_END
r12366r12367
541544   pc1512_state *state = field.machine().driver_data<pc1512_state>();
542545
543546   if (newval > oldval)
547      state->m_mouse_y--;
548   else
544549      state->m_mouse_y++;
545   else
546      state->m_mouse_y--;
547550}
548551
549552
r12366r12367
578581   PORT_DIPNAME( 0x10, 0x10, "ROM Size")
579582   PORT_DIPSETTING( 0x10, "16 KB" )
580583   PORT_DIPSETTING( 0x00, "32 KB" )
581/*  PORT_DIPNAME( 0x60, 0x60, "Character Set")
584   PORT_DIPNAME( 0x60, 0x60, "Character Set")
582585    PORT_DIPSETTING( 0x60, "Default (Codepage 437)" )
583586    PORT_DIPSETTING( 0x40, "Portugese (Codepage 865)" )
584587    PORT_DIPSETTING( 0x20, "Norwegian (Codepage 860)" )
585    PORT_DIPSETTING( 0x00, "Greek")*/
588    PORT_DIPSETTING( 0x00, "Greek")
586589   PORT_DIPNAME( 0x80, 0x80, "Floppy Ready Line")
587590   PORT_DIPSETTING( 0x80, "Connected" )
588591   PORT_DIPSETTING( 0x00, "Not connected" )
589
590   PORT_INCLUDE( pcvideo_pc1512 )
591592INPUT_PORTS_END
592593
593594
r12366r12367
977978   save_item(NAME(m_printer_data));
978979   save_item(NAME(m_printer_control));
979980   save_item(NAME(m_toggle));
981   save_item(NAME(m_lpen));
982   save_item(NAME(m_blink));
983   save_item(NAME(m_cursor));
984   save_item(NAME(m_blink_ctr));
985   save_item(NAME(m_vdu_mode));
986   save_item(NAME(m_vdu_color));
987   save_item(NAME(m_vdu_plane));
988   save_item(NAME(m_vdu_rdsel));
989   save_item(NAME(m_vdu_border));
980990   save_item(NAME(m_speaker_drive));
981991}
982992
r12366r12367
9921002   m_kb_bits = 0;
9931003
9941004   set_fdc_dsr(0);
1005   
1006   m_lpen = 0;
1007   m_blink = 0;
1008   m_cursor = 0;
1009   m_blink_ctr = 0;
1010   m_vdu_mode = 0;
1011   m_vdu_color = 0;
1012   m_vdu_rdsel = 0;
1013   m_vdu_plane = 0x0f;
1014   m_vdu_border = 0;
9951015}
9961016
9971017
r12366r12367
10101030   MCFG_CPU_IO_MAP(pc1512_io)
10111031
10121032   // video
1013   MCFG_FRAGMENT_ADD( pcvideo_pc1512 )
1033   MCFG_FRAGMENT_ADD(pc1512_video)
10141034
10151035   // sound
10161036   MCFG_SPEAKER_STANDARD_MONO("mono")
r12366r12367
10581078   ROM_LOAD16_BYTE( "40043.ic129", 0x0000, 0x2000, CRC(f72f1582) SHA1(7781d4717917262805d514b331ba113b1e05a247) )
10591079   ROM_LOAD16_BYTE( "40044.ic132", 0x0001, 0x2000, CRC(668fcc94) SHA1(74002f5cc542df442eec9e2e7a18db3598d8c482) )
10601080
1061   ROM_REGION( 0x08100, "gfx1", 0 )
1062   ROM_LOAD( "40045.ic127", 0x00000, 0x02000, CRC(dd5e030f) SHA1(7d858bbb2e8d6143aa67ab712edf5f753c2788a7) )
1081   ROM_REGION( 0x2000, AMS40041_TAG, 0 )
1082   ROM_LOAD( "40045.ic127", 0x0000, 0x2000, CRC(dd5e030f) SHA1(7d858bbb2e8d6143aa67ab712edf5f753c2788a7) )
10631083ROM_END
10641084
10651085
r12366r12367
10721092   ROM_LOAD16_BYTE( "40043v2.ic129", 0x0000, 0x2000, CRC(1aec54fa) SHA1(b12fd73cfc35a240ed6da4dcc4b6c9910be611e0) )
10731093   ROM_LOAD16_BYTE( "40044v2.ic132", 0x0001, 0x2000, CRC(d2d4d2de) SHA1(c376fd1ad23025081ae16c7949e88eea7f56e1bb) )
10741094
1075   ROM_REGION( 0x08100, "gfx1", 0 )
1076   ROM_LOAD( "40078.ic127", 0x00000, 0x02000, CRC(ae9c0d04) SHA1(bc8dc4dcedeea5bc1c04986b1f105ad93cb2ebcd) )
1095   ROM_REGION( 0x2000, AMS40041_TAG, 0 )
1096   ROM_LOAD( "40078.ic127", 0x0000, 0x2000, CRC(ae9c0d04) SHA1(bc8dc4dcedeea5bc1c04986b1f105ad93cb2ebcd) )
10771097ROM_END
10781098
10791099
r12366r12367
10861106   ROM_LOAD16_BYTE( "40043-2.ic129", 0x0000, 0x2000, CRC(ea527e6e) SHA1(b77fa44767a71a0b321a88bb0a394f1125b7c220) )
10871107   ROM_LOAD16_BYTE( "40044-2.ic130", 0x0001, 0x2000, CRC(532c3854) SHA1(18a17b710f9eb079d9d7216d07807030f904ceda) )
10881108
1089   ROM_REGION( 0x08100, "gfx1", 0 )
1090   ROM_LOAD( "40078.ic127", 0x00000, 0x02000, CRC(ae9c0d04) SHA1(bc8dc4dcedeea5bc1c04986b1f105ad93cb2ebcd) )
1109   ROM_REGION( 0x2000, AMS40041_TAG, 0 )
1110   ROM_LOAD( "40078.ic127", 0x0000, 0x2000, CRC(ae9c0d04) SHA1(bc8dc4dcedeea5bc1c04986b1f105ad93cb2ebcd) )
10911111ROM_END
10921112
10931113
r12366r12367
10971117//**************************************************************************
10981118
10991119//    YEAR  NAME        PARENT      COMPAT  MACHINE     INPUT       INIT    COMPANY         FULLNAME        FLAGS
1100COMP( 1986, pc1512,      0,         0,      pc1512,      pc1512,      0,      "Amstrad plc",   "PC1512 (V1)",   GAME_IMPERFECT_GRAPHICS )
1120COMP( 1986, pc1512,      0,         0,      pc1512,      pc1512,      0,      "Amstrad plc",   "PC1512 (V1)",   GAME_SUPPORTS_SAVE )
11011121COMP( 1987, pc1512v2,   pc1512,      0,      pc1512,      pc1512,      0,      "Amstrad plc",   "PC1512 (V2)",   GAME_NOT_WORKING )
11021122COMP( 1989, pc1512v3,   pc1512,      0,      pc1512,      pc1512,      0,      "Amstrad plc",   "PC1512 (V3)",   GAME_NOT_WORKING )
src/mess/mess.mak
r12366r12367
605605   $(MESS_MACHINE)/amstr_pc.o   \
606606   $(MESS_DRIVERS)/pc1512.o   \
607607   $(MESS_MACHINE)/pc1512kb.o   \
608   $(MESS_VIDEO)/pc1512.o      \
608609   $(MESS_VIDEO)/nc.o         \
609610   $(MESS_DRIVERS)/nc.o      \
610611   $(MESS_MACHINE)/nc.o      \

Previous 15994 Revisions Next


© 1998-2018 The MESS Team