Previous 15994 Revisions Next

r4672 Tuesday 12th May, 2009 at 07:09:05 UTC by Curt Coder
[HD44102] Implemented display start page setting, reset, and hopefully fixed cast from pointer to integer warning.
[src/mess/drivers]kyocera.c
[src/mess/video]hd44102.c hd44102.h kyocera.c

src/mess/video/hd44102.c
r4671r4672
1212   TODO:
1313
1414   - 4 bit mode
15   - what if write Y > 49?
15   - busy flag
16   - reset flag
1617
1718*/
1819
r4671r4672
2526
2627#define LOG 0
2728
28#define HD44102_CONTROL_DISPLAY_OFF      0x38
29#define HD44102_CONTROL_DISPLAY_ON      0x39
30#define HD44102_CONTROL_COUNT_DOWN_MODE   0x3a
31#define HD44102_CONTROL_COUNT_UP_MODE   0x3b
32#define HD44102_CONTROL_Y_ADDRESS_MASK   0x3f
33#define HD44102_CONTROL_X_ADDRESS_MASK   0xc0
29#define HD44102_CONTROL_DISPLAY_OFF         0x38
30#define HD44102_CONTROL_DISPLAY_ON         0x39
31#define HD44102_CONTROL_COUNT_DOWN_MODE      0x3a
32#define HD44102_CONTROL_COUNT_UP_MODE      0x3b
33#define HD44102_CONTROL_Y_ADDRESS_MASK      0x3f
34#define HD44102_CONTROL_X_ADDRESS_MASK      0xc0
35#define HD44102_CONTROL_DISPLAY_START_PAGE   0x3e
3436
35#define HD44102_STATUS_BUSY            0x80
36#define HD44102_STATUS_COUNT_UP         0x40
37#define HD44102_STATUS_DISPLAY_OFF      0x20
38#define HD44102_STATUS_RESET         0x10
37#define HD44102_STATUS_BUSY               0x80   /* not supported */
38#define HD44102_STATUS_COUNT_UP            0x40
39#define HD44102_STATUS_DISPLAY_OFF         0x20
40#define HD44102_STATUS_RESET            0x10   /* not supported */
3941
4042/***************************************************************************
4143    TYPE DEFINITIONS
r4671r4672
5153   UINT8 status;               /* status register */
5254   UINT8 output;               /* output register */
5355
56   int page;                  /* display start page */
5457   int x;                     /* X address */
5558   int y;                     /* Y address */
5659};
r4671r4672
102105   {
103106   case HD44102_CONTROL_DISPLAY_OFF:
104107      if (LOG) logerror("HD44102 '%s' Display Off\n", device->tag);
108
105109      hd44102->status |= HD44102_STATUS_DISPLAY_OFF;
106110      break;
107111
108112   case HD44102_CONTROL_DISPLAY_ON:
109113      if (LOG) logerror("HD44102 '%s' Display On\n", device->tag);
114
110115      hd44102->status &= ~HD44102_STATUS_DISPLAY_OFF;
111116      break;
112117
113118   case HD44102_CONTROL_COUNT_DOWN_MODE:
114119      if (LOG) logerror("HD44102 '%s' Count Down Mode\n", device->tag);
120
115121      hd44102->status &= ~HD44102_STATUS_COUNT_UP;
116122      break;
117123
118124   case HD44102_CONTROL_COUNT_UP_MODE:
119125      if (LOG) logerror("HD44102 '%s' Count Up Mode\n", device->tag);
126
120127      hd44102->status |= HD44102_STATUS_COUNT_UP;
121128      break;
122129
123130   default:
124      hd44102->x = (data & HD44102_CONTROL_X_ADDRESS_MASK) >> 6;
125      hd44102->y = data & HD44102_CONTROL_Y_ADDRESS_MASK;
126      if (LOG) logerror("HD44102 '%s' Address %02x -> X %u Y %u\n", device->tag, data, hd44102->x, hd44102->y);
127      break;
131      {
132      int x = (data & HD44102_CONTROL_X_ADDRESS_MASK) >> 6;
133      int y = data & HD44102_CONTROL_Y_ADDRESS_MASK;
134
135      if ((data & HD44102_CONTROL_Y_ADDRESS_MASK) == HD44102_CONTROL_DISPLAY_START_PAGE)
136      {
137         if (LOG) logerror("HD44102 '%s' Display Start Page %u\n", device->tag, x);
138
139         hd44102->page = x;
140      }
141      else if (y > 49)
142      {
143         logerror("HD44102 '%s' Invalid Address X %u Y %u (%02x)!\n", device->tag, data, x, y);
144      }
145      else
146      {
147         if (LOG) logerror("HD44102 '%s' Address X %u Y %u (%02x)\n", device->tag, data, x, y);
148
149         hd44102->x = x;
150         hd44102->y = y;
151      }
152      }
128153   }
129154}
130155
131156/*-------------------------------------------------
132    hd44102_data_r - data read
157    count_up_or_down - counts Y up or down
133158-------------------------------------------------*/
134159
135READ8_DEVICE_HANDLER( hd44102_data_r )
160static void count_up_or_down(hd44102_t *hd44102)
136161{
137   hd44102_t *hd44102 = get_safe_token(device);
138
139   UINT8 data = hd44102->output;
140
141   hd44102->output = hd44102->ram[hd44102->x][hd44102->y];
142
143162   if (hd44102->status & HD44102_STATUS_COUNT_UP)
144163   {
145164      if (++hd44102->y > 49) hd44102->y = 0;
r4671r4672
148167   {
149168      if (--hd44102->y < 0) hd44102->y = 49;
150169   }
170}
151171
172/*-------------------------------------------------
173    hd44102_data_r - data read
174-------------------------------------------------*/
175
176READ8_DEVICE_HANDLER( hd44102_data_r )
177{
178   hd44102_t *hd44102 = get_safe_token(device);
179
180   UINT8 data = hd44102->output;
181
182   hd44102->output = hd44102->ram[hd44102->x][hd44102->y];
183
184   count_up_or_down(hd44102);
185
152186   return data;
153187}
154188
r4671r4672
162196
163197   hd44102->ram[hd44102->x][hd44102->y] = data;
164198
165   if (hd44102->status & HD44102_STATUS_COUNT_UP)
166   {
167      if (++hd44102->y > 49) hd44102->y = 0;
168   }
169   else
170   {
171      if (--hd44102->y < 0) hd44102->y = 49;
172   }
199   count_up_or_down(hd44102);
173200}
174201
175202/*-------------------------------------------------
r4671r4672
181208   hd44102_t *hd44102 = get_safe_token(device);
182209   const hd44102_config *config = get_safe_config(device);
183210
184   if (hd44102->status & HD44102_STATUS_DISPLAY_OFF)
211   int x, y, z;
212
213   for (y = 0; y < 50; y++)
185214   {
186   }
187   else
188   {
189      int y, z;
215      z = hd44102->page << 3;
190216
191      for (y = 0; y < 50; y++)
217      for (x = 0; x < 32; x++)
192218      {
193         for (z = 0; z < 32; z++)
194         {
195            UINT8 data = hd44102->ram[z / 8][y];
219         UINT8 data = hd44102->ram[z / 8][y];
196220
197            int sy = config->sy + z;
198            int sx = config->sx + y;
221         int sy = config->sy + z;
222         int sx = config->sx + y;
199223
200            if ((sy >= cliprect->min_y) && (sy <= cliprect->max_y) && (sx >= cliprect->min_x) && (sx <= cliprect->max_x))
201            {
202               *BITMAP_ADDR16(bitmap, sy, sx) = BIT(data, z % 8);
203            }
224         if ((sy >= cliprect->min_y) && (sy <= cliprect->max_y) && (sx >= cliprect->min_x) && (sx <= cliprect->max_x))
225         {
226            int color = (hd44102->status & HD44102_STATUS_DISPLAY_OFF) ? 0 : BIT(data, z % 8);
227           
228            *BITMAP_ADDR16(bitmap, sy, sx) = color;
204229         }
230
231         z++;
232         z %= 32;
205233      }
206234   }
207235}
r4671r4672
222250   /* register for state saving */
223251   state_save_register_device_item(device, 0, hd44102->status);
224252   state_save_register_device_item(device, 0, hd44102->output);
253   state_save_register_device_item(device, 0, hd44102->page);
225254   state_save_register_device_item(device, 0, hd44102->x);
226255   state_save_register_device_item(device, 0, hd44102->y);
227256}
r4671r4672
232261
233262static DEVICE_RESET( hd44102 )
234263{
235//   hd44102_t *hd44102 = get_safe_token(device);
264   hd44102_t *hd44102 = get_safe_token(device);
236265
266   hd44102->status = HD44102_STATUS_DISPLAY_OFF | HD44102_STATUS_COUNT_UP;
237267}
238268
239269/*-------------------------------------------------
src/mess/video/hd44102.h
r4671r4672
1919
2020#define HD44102 DEVICE_GET_INFO_NAME( hd44102 )
2121
22#define MDRV_HD44102_ADD(_tag, _clock, _screen, _sx, _sy) \
23   MDRV_DEVICE_ADD((_tag), HD44102, _clock) \
24   MDRV_DEVICE_CONFIG_DATA32(hd44102_config, screen_tag, _screen) \
22#define MDRV_HD44102_ADD(_tag, _screen, _sx, _sy) \
23   MDRV_DEVICE_ADD((_tag), HD44102, 0) \
24   MDRV_DEVICE_CONFIG_DATAPTR(hd44102_config, screen_tag, _screen) \
2525   MDRV_DEVICE_CONFIG_DATA32(hd44102_config, sx, _sx) \
2626   MDRV_DEVICE_CONFIG_DATA32(hd44102_config, sy, _sy)
2727
src/mess/video/kyocera.c
r4671r4672
126126   MDRV_VIDEO_START(kyo85)
127127   MDRV_VIDEO_UPDATE(kyo85)
128128
129   MDRV_HD44102_ADD( "m1", 0, SCREEN_TAG,   0,  0)
130   MDRV_HD44102_ADD( "m2", 0, SCREEN_TAG,  50,  0)
131   MDRV_HD44102_ADD( "m3", 0, SCREEN_TAG, 100,  0)
132   MDRV_HD44102_ADD( "m4", 0, SCREEN_TAG, 150,  0)
133   MDRV_HD44102_ADD( "m5", 0, SCREEN_TAG, 200,  0)
134   MDRV_HD44102_ADD( "m6", 0, SCREEN_TAG,   0, 32)
135   MDRV_HD44102_ADD( "m7", 0, SCREEN_TAG,  50, 32)
136   MDRV_HD44102_ADD( "m8", 0, SCREEN_TAG, 100, 32)
137   MDRV_HD44102_ADD( "m9", 0, SCREEN_TAG, 150, 32)
138   MDRV_HD44102_ADD("m10", 0, SCREEN_TAG, 200, 32)
129   MDRV_HD44102_ADD( "m1", SCREEN_TAG,   0,  0)
130   MDRV_HD44102_ADD( "m2", SCREEN_TAG,  50,  0)
131   MDRV_HD44102_ADD( "m3", SCREEN_TAG, 100,  0)
132   MDRV_HD44102_ADD( "m4", SCREEN_TAG, 150,  0)
133   MDRV_HD44102_ADD( "m5", SCREEN_TAG, 200,  0)
134   MDRV_HD44102_ADD( "m6", SCREEN_TAG,   0, 32)
135   MDRV_HD44102_ADD( "m7", SCREEN_TAG,  50, 32)
136   MDRV_HD44102_ADD( "m8", SCREEN_TAG, 100, 32)
137   MDRV_HD44102_ADD( "m9", SCREEN_TAG, 150, 32)
138   MDRV_HD44102_ADD("m10", SCREEN_TAG, 200, 32)
139
140//   MDRV_HD44103_MASTER_ADD("m11", SCREEN_TAG, CAP_P(18), RES_K(100), HD44103_FS_HIGH, HD44103_DUTY_1_32)
141//   MDRV_HD44103_SLAVE_ADD( "m12", "m11", SCREEN_TAG, HD44103_FS_HIGH, HD44103_DUTY_1_32)
139142MACHINE_DRIVER_END
src/mess/drivers/kyocera.c
r4671r4672
99
1010   Supported systems:
1111     - Kyocera Kyotronic 85
12     - Olivetti M10 (slightly diff hw, the whole bios is shifted by 1 word)
12     - Olivetti M10 (slightly diff hw)
1313     - NEC PC-8201A (slightly diff hw)
1414     - Tandy Model 100
1515     - Tandy Model 102 (slightly diff hw)
r4671r4672
766766
767767ROM_START(olivm10)
768768   ROM_REGION( 0x8010, I8085_TAG, 0 )
769   ROM_LOAD( "m10rom.bin", 0x0000, 0x8010, CRC(0be02b58) SHA1(56f2087a658efd0323663d15afcd4f5f27c68664) )
769   ROM_LOAD( "m10rom.bin", 0x0000, 0x8000, CRC(0be02b58) SHA1(56f2087a658efd0323663d15afcd4f5f27c68664) )
770770ROM_END
771771
772772ROM_START(kyo85)

Previous 15994 Revisions Next


© 1998-2018 The MESS Team