Previous 199869 Revisions Next

r31217 Monday 7th July, 2014 at 15:01:52 UTC by Carl
(mess) rmnimbus: fix and simplify more drawing code (nw)
[src/emu/bus/isa]dectalk.c
[src/emu/cpu/i86]i186.c i186.h
[src/mess/drivers]rmnimbus.c
[src/mess/includes]rmnimbus.h
[src/mess/machine]rmnimbus.c
[src/mess/video]rmnimbus.c

trunk/src/emu/cpu/i86/i186.h
r31216r31217
8888
8989   struct dma_state
9090   {
91      bool        drq_delay;
9291      bool        drq_state;
9392      UINT32      source;
9493      UINT32      dest;
r31216r31217
117116   static const device_timer_id TIMER_TIME0 = 3;
118117   static const device_timer_id TIMER_TIME1 = 4;
119118   static const device_timer_id TIMER_TIME2 = 5;
120   static const device_timer_id TIMER_DMA0 = 6;
121   static const device_timer_id TIMER_DMA1 = 7;
122119
123120   struct timer_state  m_timer[3];
124121   struct dma_state    m_dma[2];
trunk/src/emu/cpu/i86/i186.c
r31216r31217
1010#define LOG_INTERRUPTS      0
1111#define LOG_INTERRUPTS_EXT  0
1212#define LOG_TIMER           0
13#define LOG_OPTIMIZATION    0
1413#define LOG_DMA             0
15#define CPU_RESUME_TRIGGER  7123
1614
1715/* external int priority masks */
1816
r31216r31217
608606   m_timer[0].time_timer = timer_alloc(TIMER_TIME0);
609607   m_timer[1].time_timer = timer_alloc(TIMER_TIME1);
610608   m_timer[2].time_timer = timer_alloc(TIMER_TIME2);
611   m_dma[0].finish_timer = timer_alloc(TIMER_DMA0);
612   m_dma[1].finish_timer = timer_alloc(TIMER_DMA1);
613609
614610   m_out_tmrout0_func.resolve_safe();
615611   m_out_tmrout1_func.resolve_safe();
r31216r31217
637633   m_intr.status            = 0x0000;
638634   m_intr.poll_status       = 0x0000;
639635   m_reloc = 0x20ff;
640   m_dma[0].drq_delay = false;
641   m_dma[1].drq_delay = false;
642636   m_dma[0].drq_state = false;
643637   m_dma[1].drq_state = false;
644638   for(int i = 0; i < ARRAY_LENGTH(m_timer); ++i)
r31216r31217
647641      m_timer[i].time_timer_active = 0;
648642      m_timer[i].maxA = 0;
649643      m_timer[i].maxB = 0;
644      m_timer[i].count = 0;
650645   }
651646}
652647
r31216r31217
826821
827822      /* check external interrupts */
828823      for (IntNo = 0; IntNo < 4; IntNo++)
824      {
829825         if ((m_intr.ext[IntNo] & 0x0F) == Priority)
830826         {
831827            if (LOG_INTERRUPTS)
r31216r31217
838834            /* if there's something pending, generate an interrupt */
839835            if (m_intr.request & (0x10 << IntNo))
840836            {
837               if((IntNo >= 2) && (m_intr.ext[IntNo - 2] & EXTINT_CTRL_CASCADE))
838               {
839                  logerror("i186: %06x: irq %d use when set for cascade mode\n", pc(), IntNo);
840                  m_intr.request &= ~(0x10 << IntNo);
841                  continue;
842               }
841843               /* otherwise, generate an interrupt for this request */
842844               new_vector = 0x0c + IntNo;
843845
r31216r31217
845847               m_intr.ack_mask = 0x0010 << IntNo;
846848               goto generate_int;
847849            }
850            else if ((m_intr.in_service & (0x10 << IntNo)) && (m_intr.ext[IntNo] & EXTINT_CTRL_SFNM))
851               return; // if an irq is in service and sfnm is enabled, stop here
848852         }
853      }
849854   }
850855   return;
851856
r31216r31217
855860   if (!m_intr.pending)
856861      set_input_line(0, ASSERT_LINE);
857862   m_intr.pending = 1;
858   machine().scheduler().trigger(CPU_RESUME_TRIGGER);
859   if (LOG_OPTIMIZATION) logerror("  - trigger due to interrupt pending\n");
860863   if (LOG_INTERRUPTS) logerror("(%f) **** Requesting interrupt vector %02X\n", machine().time().as_double(), new_vector);
861864}
862865
r31216r31217
920923            }
921924      }
922925   }
926   update_interrupt_state();
923927}
924928
925929/* Trigger an external interrupt, optionally supplying the vector to take */
r31216r31217
928932   if (LOG_INTERRUPTS_EXT) logerror("generating external int %02X, vector %02X\n",intno,vector);
929933
930934   if(!state)
931      return;
935   {
936      m_intr.request &= ~(0x010 << intno);
937      m_intr.ack_mask &= ~(0x0010 << intno);
938   }
939   else // Turn on the requested request bit and handle interrupt
940      m_intr.request |= (0x010 << intno);
932941
933   // Turn on the requested request bit and handle interrupt
934   m_intr.request |= (0x010 << intno);
935942   update_interrupt_state();
936943}
937944
r31216r31217
10151022            t->int_timer->adjust(attotime::never, which);
10161023         break;
10171024      }
1018      case TIMER_DMA0:
1019      case TIMER_DMA1:
1020      {
1021         int which = param;
1022         struct dma_state *d = &m_dma[which];
1023
1024         d->drq_delay = false;
1025         if(d->drq_state)
1026            drq_callback(which);
1027         break;
1028      }
10291025      case TIMER_TIME0:
10301026      case TIMER_TIME1:
10311027      case TIMER_TIME2:
r31216r31217
12271223   UINT8   dma_byte;
12281224   UINT8   incdec_size;
12291225
1230   if(dma->drq_delay)
1231      return;
1232
12331226   if (LOG_DMA>1)
12341227      logerror("Control=%04X, src=%05X, dest=%05X, count=%04X\n",dma->control,dma->source,dma->dest,dma->count);
12351228
r31216r31217
12821275   dma->count -= 1;
12831276
12841277   // Terminate if count is zero, and terminate flag set
1285   if((dma->control & TERMINATE_ON_ZERO) && (dma->count==0))
1278   if(((dma->control & TERMINATE_ON_ZERO) || !(dma->control & SYNC_MASK)) && (dma->count==0))
12861279   {
12871280      dma->control &= ~ST_STOP;
12881281      if (LOG_DMA) logerror("DMA terminated\n");
r31216r31217
12951288      m_intr.request |= 0x04 << which;
12961289      update_interrupt_state();
12971290   }
1298
1299//  dma->finish_timer->adjust(attotime::from_hz(clock()/8), 0);
1300//  dma->drq_delay = true;
13011291}
13021292
13031293READ16_MEMBER(i80186_cpu_device::internal_port_r)
trunk/src/emu/bus/isa/dectalk.c
r31216r31217
3939
4040READ8_MEMBER(dectalk_isa_device::dma_r)
4141{
42   m_cpu->drq1_w(0);
4243   return m_dma;
4344}
4445
4546WRITE8_MEMBER(dectalk_isa_device::dma_w)
4647{
48   m_cpu->drq1_w(0);
4749   m_dma = data;
4850}
4951
r31216r31217
7173READ16_MEMBER(dectalk_isa_device::dsp_dma_r)
7274{
7375   m_bio = ASSERT_LINE;
76   m_cpu->drq1_w(0);
7477   return m_dsp_dma;
7578}
7679
trunk/src/mess/includes/rmnimbus.h
r31216r31217
2020#define MAINCPU_TAG "maincpu"
2121#define IOCPU_TAG   "iocpu"
2222
23#define SCREEN_WIDTH_PIXELS     640
24#define SCREEN_HEIGHT_LINES     250
25#define SCREEN_NO_COLOURS       16
26
27#define NO_VIDREGS              (0x30/2)
28
29
3023/* Nimbus specific */
3124
3225/* External int vectors for chained interupts */
r31216r31217
191184   UINT8 m_last_playmode;
192185   UINT8 m_ay8910_a;
193186   UINT8 m_sio_int_state;
194   UINT16 m_vidregs[NO_VIDREGS];
195   UINT8 m_bpp;
196   UINT16 m_pixel_mask;
197   UINT8 m_hs_count;
187   UINT16 m_vidregs[24];
188   UINT16 m_x, m_y;
198189   UINT32 m_debug_video;
199190   UINT8 m_vector;
200191   UINT8 m_eeprom_bits;
r31216r31217
202193
203194   DECLARE_READ8_MEMBER(nimbus_mcu_r);
204195   DECLARE_WRITE8_MEMBER(nimbus_mcu_w);
205   DECLARE_READ16_MEMBER(nimbus_io_r);
206   DECLARE_WRITE16_MEMBER(nimbus_io_w);
207196   DECLARE_READ8_MEMBER(scsi_r);
208197   DECLARE_WRITE8_MEMBER(scsi_w);
209198   DECLARE_WRITE8_MEMBER(fdc_ctl_w);
r31216r31217
225214   virtual void machine_reset();
226215   virtual void video_start();
227216   virtual void video_reset();
228   DECLARE_PALETTE_INIT(rmnimbus);
229217   UINT32 screen_update_nimbus(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
230218   DECLARE_WRITE_LINE_MEMBER(sio_interrupt);
231219   DECLARE_WRITE_LINE_MEMBER(nimbus_fdc_intrq_w);
r31216r31217
241229   DECLARE_WRITE_LINE_MEMBER(write_scsi_iena);
242230
243231   UINT8 get_pixel(UINT16 x, UINT16 y);
244   UINT16 read_pixel_line(UINT16 x, UINT16 y, UINT8 width);
232   UINT16 read_pixel_line(UINT16 x, UINT16 y, UINT8 pixels, UINT8 bpp);
245233   UINT16 read_pixel_data(UINT16 x, UINT16 y);
246234   void set_pixel(UINT16 x, UINT16 y, UINT8 colour);
247235   void set_pixel40(UINT16 x, UINT16 y, UINT8 colour);
248   void write_pixel_line(UINT16 x, UINT16 y, UINT16    data, UINT8 width);
249   void move_pixel_line(UINT16 x, UINT16 y, UINT16    data, UINT8 width);
236   void write_pixel_line(UINT16 x, UINT16 y, UINT16, UINT8 pixels, UINT8 bpp);
237   void move_pixel_line(UINT16 x, UINT16 y, UINT8 width);
250238   void write_pixel_data(UINT16 x, UINT16 y, UINT16    data);
251239   void write_reg_004();
252240   void write_reg_006();
241   void write_reg_00A();
242   void write_reg_00E();
253243   void write_reg_010();
254244   void write_reg_012();
255245   void write_reg_014();
r31216r31217
258248   void write_reg_01C();
259249   void write_reg_01E();
260250   void write_reg_026();
261   void change_palette(UINT8 bank, UINT16 colours, UINT8 regno);
251   void change_palette(UINT8 bank, UINT16 colours);
262252   void external_int(UINT16 intno, UINT8 vector);
263253   DECLARE_READ8_MEMBER(cascade_callback);
264254   void *get_dssi_ptr(address_space &space, UINT16   ds, UINT16 si);
r31216r31217
271261   void hdc_post_rw();
272262   void hdc_drq();
273263   void pc8031_reset();
274   void ipc_dumpregs();
264   //void ipc_dumpregs();
275265   void iou_reset();
276266   void rmni_sound_reset();
277267   void mouse_js_reset();
trunk/src/mess/video/rmnimbus.c
r31216r31217
2828
2929
3030#define WIDTH_MASK      0x07
31#define XOR_MASK        0x08
32#define MASK_4080       0x10
3331
3432// Offsets of nimbus video registers within register array
3533
r31216r31217
6058
6159#define FG_COLOUR       (m_vidregs[reg024]&0x0F)
6260#define BG_COLOUR       ((m_vidregs[reg024]&0xF0)>>4)
61#define SELECT_COL(x,c)   (IS_80COL ? ((((x) & 1) ? ((c) << 2) : (c)) & 0xC) : (c))
62#define FILL_WORD(c)   (((c) << 12) | ((c) << 8) | ((c) << 4) | (c))
6363
64#define IS_80COL        (m_vidregs[reg026]&MASK_4080)
65#define IS_XOR          (m_vidregs[reg022]&XOR_MASK)
64#define IS_80COL        (m_vidregs[reg026]&0x10)
65#define IS_XOR          (m_vidregs[reg022]&8)
6666
6767#define DEBUG_TEXT  0x01
6868#define DEBUG_DB    0x02
r31216r31217
7171#define DEBUG_SET(flags)    ((m_debug_video & (flags))==(flags))
7272
7373static void video_debug(running_machine &machine, int ref, int params, const char *param[]);
74static void video_regdump(running_machine &machine, int ref, int params, const char *param[]);
7574
7675/*
7776    I'm not sure which of thes return values on a real machine, so for the time being I'm going
r31216r31217
8584
8685   switch (offset)
8786   {
88      case    reg000  : result=m_vidregs[reg000]; break;
87      case    reg000  : result=read_pixel_data(m_vidregs[reg002],m_vidregs[reg00C]); break;
8988      case    reg002  : result=m_vidregs[reg002]; break;
9089      case    reg004  : result=read_pixel_data(m_vidregs[reg002],++m_vidregs[reg00C]); break;
9190      case    reg006  : result=m_vidregs[reg006]; break;
r31216r31217
9493      case    reg00C  : result=m_vidregs[reg00C]; break;
9594      case    reg00E  : result=m_vidregs[reg00E]; break;
9695
97      case    reg010  : result=m_vidregs[reg010]; break;
96      case    reg010  : result=read_pixel_data(m_vidregs[reg002],m_vidregs[reg00C]); break;
9897      case    reg012  : result=m_vidregs[reg012]; break;
9998      case    reg014  : result=m_vidregs[reg014]; break;
10099      case    reg016  : result=m_vidregs[reg016]; break;
101100      case    reg018  : result=m_vidregs[reg018]; break;
102      case    reg01A  : result=m_vidregs[reg01A]; break;
101      case    reg01A  : result=read_pixel_data(++m_vidregs[reg002],m_vidregs[reg00C]); break;
103102      case    reg01C  : result=m_vidregs[reg01C]; break;
104103      case    reg01E  : result=m_vidregs[reg01E]; break;
105104
r31216r31217
108107      case    reg024  : result=m_vidregs[reg024]; break;
109108      case    reg026  : result=m_vidregs[reg026]; break;
110109      case    reg028  : result=m_screen->vpos() % 0xb; break; //result=m_vidregs[reg028]; break;
111      case    reg02A  : result=m_vidregs[reg02A]; break;
112      case    reg02C  : result=m_vidregs[reg02C]; break;
110      case    reg02A  : result=m_vidregs[reg002]; break;
111      case    reg02C  : result=m_vidregs[reg00C]; break;
113112      case    reg02E  : result=m_vidregs[reg02E]; break;
114113      default         : result=0; break;
115114   }
r31216r31217
124123{
125124   UINT8   result = 0;
126125
127   if((x<SCREEN_WIDTH_PIXELS) && (y<SCREEN_HEIGHT_LINES))
126   if((x<640) && (y<250))
128127   {
129128      if(IS_80COL)
130         result=m_video_mem.pix16(y, x);
129         result=m_video_mem.pix16(y, x) >> 2;
131130      else
132131         result=m_video_mem.pix16(y, x*2);
133132   }
r31216r31217
135134   return result;
136135}
137136
138UINT16 rmnimbus_state::read_pixel_line(UINT16 x, UINT16 y, UINT8 width)
137UINT16 rmnimbus_state::read_pixel_line(UINT16 x, UINT16 y, UINT8 pixels, UINT8 bpp)
139138{
140   UINT16  result = 0;
141   UINT16  mask;
142   UINT16  pixel_x;
143   UINT16  colour;
144   UINT8   shifts;
139   UINT16 colour = 0;
140   int i;
141   x *= pixels;
145142
146143   if(DEBUG_SET(DEBUG_TEXT | DEBUG_PIXEL))
147      logerror("read_pixel_line(x=%04X, y=%04X, width=%02X, bpp=%02X, pixel_mask=%02X)\n",x,y,width,m_bpp,m_pixel_mask);
144      logerror("read_pixel_line(x=%d, y=%d, width=%d, bpp=%d)\n",x,y,pixels,bpp);
148145
149   shifts=width-m_bpp;
150
151   for(mask=m_pixel_mask, pixel_x=(x*(width/m_bpp)); mask>0; mask=(mask>>m_bpp), pixel_x++)
146   for(i = 0; i < pixels - 1; i++)
152147   {
153      colour=get_pixel(pixel_x,y);
148      colour |= get_pixel(i + x, y);
154149
155      if(m_bpp==1)
156         colour=((colour==FG_COLOUR) ? 1 : 0) << shifts;
150      if(bpp==1)
151         colour=((colour==SELECT_COL(x + i, FG_COLOUR)) ? 1 : 0) << 1;
157152      else
158         colour=colour << shifts;
159
160      result=(result & ~mask)  | colour;
161
162      shifts-=m_bpp;
153         colour <<= bpp;
163154   }
164
165   return result;
155   return colour | get_pixel(x + i, y);
166156}
167157
168158UINT16 rmnimbus_state::read_pixel_data(UINT16 x, UINT16 y)
r31216r31217
170160   UINT16  result=0;
171161
172162   if(DEBUG_SET(DEBUG_TEXT | DEBUG_PIXEL))
173      logerror("read_pixel_data(x=%04X, y=%04X), reg022=%04X\n",x,y,m_vidregs[reg022]);
163      logerror("read_pixel_data(x=%d, y=%d), reg022=%04X\n",x,y,m_vidregs[reg022]);
174164
175165   if(IS_80COL)
176166   {
r31216r31217
184174
185175         case 0x03   : break;
186176
187         case 0x04   : m_bpp=2; m_pixel_mask=0xC0;
188                     result=read_pixel_line(x,y,8);
189                     break;
177         case 0x04   :
178               result=read_pixel_line(x,y,4,2);
179               break;
190180
191181         case 0x05   : break;
192182
193         case 0x06   : m_bpp=2; m_pixel_mask=0xC000;
194                     result=read_pixel_line(x,y,16);
195                     break;
183         case 0x06   :
184               result=read_pixel_line(x,y,8,2);
185               break;
196186
197187         case 0x07   : break;
198188      }
r31216r31217
213203
214204         case 0x05   : break;
215205
216         case 0x06   : m_bpp=4; m_pixel_mask=0xF000;
217                     result=read_pixel_line(x,y,16);
218                     break;
206         case 0x06   :
207               result=read_pixel_line(x,y,4,4);
208               break;
219209
220210         case 0x07   : break;
221211      }
r31216r31217
254244      case    reg004  : m_vidregs[reg004]=data; write_reg_004(); break;
255245      case    reg006  : m_vidregs[reg006]=data; write_reg_006(); break;
256246      case    reg008  : m_vidregs[reg008]=data; break;
257      case    reg00A  : m_vidregs[reg00A]=data; break;
247      case    reg00A  : m_vidregs[reg00A]=data; write_reg_00A(); break;
258248      case    reg00C  : m_vidregs[reg00C]=data; break;
259      case    reg00E  : m_vidregs[reg00E]=data; break;
249      case    reg00E  : m_vidregs[reg00E]=data; write_reg_00E(); break;
260250
261251      case    reg010  : m_vidregs[reg010]=data; write_reg_010(); break;
262252      case    reg012  : m_vidregs[reg012]=data; write_reg_012(); break;
r31216r31217
271261      case    reg022  : m_vidregs[reg022]=data; break;
272262      case    reg024  : m_vidregs[reg024]=data; break;
273263      case    reg026  : m_vidregs[reg026]=data; write_reg_026(); break;
274      case    reg028  : change_palette(0,data,reg028); break;
275      case    reg02A  : change_palette(1,data,reg02A); break;
276      case    reg02C  : change_palette(2,data,reg02C); break;
277      case    reg02E  : change_palette(3,data,reg02E); break;
264      case    reg028  : change_palette(0,data); break;
265      case    reg02A  : change_palette(1,data); break;
266      case    reg02C  : change_palette(2,data); break;
267      case    reg02E  : change_palette(3,data); break;
278268
279269      default         : break;
280270   }
r31216r31217
283273void rmnimbus_state::set_pixel(UINT16 x, UINT16 y, UINT8 colour)
284274{
285275   if(DEBUG_SET(DEBUG_TEXT | DEBUG_PIXEL))
286      logerror("set_pixel(x=%04X, y=%04X, colour=%04X), IS_XOR=%02X\n",x,y,colour,IS_XOR);
276      logerror("set_pixel(x=%d, y=%d, colour=%04X), IS_XOR=%02X\n",x,y,colour,IS_XOR);
287277
288   if(IS_80COL)
289      colour&=0x03;
290
291   if((x<SCREEN_WIDTH_PIXELS) && (y<SCREEN_HEIGHT_LINES))
278   if((x<640) && (y<250))
292279   {
293280      if(IS_XOR)
294281         m_video_mem.pix16(y, x)^=colour;
r31216r31217
303290   set_pixel((x*2)+1,y,colour);
304291}
305292
306void rmnimbus_state::write_pixel_line(UINT16 x, UINT16 y, UINT16    data, UINT8 width)
293void rmnimbus_state::write_pixel_line(UINT16 x, UINT16 y, UINT16 data, UINT8 pixels, UINT8 bpp)
307294{
308   UINT16  mask;
309   UINT16  pixel_x;
310   UINT16  colour;
311   UINT8   shifts;
295   UINT8 colour;
296   UINT8 mask = (1 << bpp) - 1;
297   x *= pixels;
312298
313299   if(DEBUG_SET(DEBUG_TEXT | DEBUG_PIXEL))
314      logerror("write_pixel_line(x=%04X, y=%04X, data=%04X, width=%02X, bpp=%02X, pixel_mask=%02X)\n",x,y,data,width,m_bpp,m_pixel_mask);
300      logerror("write_pixel_line(x=%d, y=%d, data=%04X, width=%d, bpp=%d)\n",x,y,data,pixels,bpp);
315301
316   shifts=width-m_bpp;
317
318   for(mask=m_pixel_mask, pixel_x=(x*(width/m_bpp)); mask>0; mask=(mask>>m_bpp), pixel_x++)
302   for(int i = (pixels - 1); i >= 0; i--)
319303   {
320      if(m_bpp==1)
321         colour=(data & mask) ? FG_COLOUR : BG_COLOUR;
304      if(bpp==1)
305         colour = SELECT_COL(x + i, (data & 1) ? FG_COLOUR : BG_COLOUR);
306      else if(IS_80COL)
307         colour = (data & mask) << 2;
322308      else
323         colour=(data & mask) >> shifts;
309         colour = (data & mask);
324310
325      //logerror("write_pixel_line: data=%04X, mask=%04X, shifts=%02X, bpp=%02X colour=%02X\n",data,mask,shifts,m_bpp,colour);
326
327311      if(IS_80COL)
328         set_pixel(pixel_x,y,colour);
312         set_pixel(x + i,y,colour);
329313      else
330         set_pixel40(pixel_x,y,colour);
314         set_pixel40(x + i,y,colour);
331315
332      shifts-=m_bpp;
316      data >>= bpp;
333317   }
334318}
335319
336void rmnimbus_state::move_pixel_line(UINT16 x, UINT16 y, UINT16    data, UINT8 width)
320void rmnimbus_state::move_pixel_line(UINT16 x, UINT16 y, UINT8 pixels)
337321{
338   UINT16  pixelno;
339   UINT16  pixelx;
340
322   x *= pixels;
341323   if(DEBUG_SET(DEBUG_TEXT | DEBUG_PIXEL))
342      logerror("move_pixel_line(x=%04X, y=%04X, data=%04X, width=%02X)\n",x,y,data,width);
324      logerror("move_pixel_line(x=%d, y=%d, width=%d)\n",x,y,pixels);
343325
344   for(pixelno=0;pixelno<width;pixelno++)
326   for(int i = 0; i < pixels; i++)
345327   {
346      pixelx=(x*width)+pixelno;
347328      if(DEBUG_SET(DEBUG_TEXT | DEBUG_PIXEL))
348         logerror("pixelx=%04X\n",pixelx);
349      m_video_mem.pix16(m_vidregs[reg020], pixelx)=m_video_mem.pix16(y, pixelx);
329         logerror("x=%d\n",x + i);
330      m_video_mem.pix16(m_vidregs[reg020], x + i) = m_video_mem.pix16(y, x + i);
350331   }
351332}
352333
r31216r31217
380361void rmnimbus_state::write_pixel_data(UINT16 x, UINT16 y, UINT16    data)
381362{
382363   if(DEBUG_SET(DEBUG_TEXT | DEBUG_PIXEL))
383      logerror("write_pixel_data(x=%04X, y=%04X, data=%04X), reg022=%04X\n",x,y,data,m_vidregs[reg022]);
364      logerror("write_pixel_data(x=%d, y=%d, data=%04X), reg022=%04X\n",x,y,data,m_vidregs[reg022]);
384365
385366   if(IS_80COL)
386367   {
387368      switch (m_vidregs[reg022] & WIDTH_MASK)
388369      {
389         case 0x00   : m_bpp=1; m_pixel_mask=0x8000;
390                     write_pixel_line(x,y,data,16);
391                     break;
370         case 0x00:
371            write_pixel_line(x,y,data,16,1);
372            break;
392373
393         case 0x01   : m_bpp=1; m_pixel_mask=0x80;
394                     write_pixel_line(x,y,data,8);
395                     break;
374         case 0x01:
375            write_pixel_line(x,y,data,8,1);
376            break;
396377
397         case 0x02   : m_bpp=1; m_pixel_mask=0x0080;
398                     write_pixel_line(x,y,data,8);
399                     break;
378         case 0x02:
379            write_pixel_line(x,y,data,8,1);
380            break;
400381
401         case 0x03   : m_bpp=1;
402                     set_pixel(x,y,FG_COLOUR);
403                     break;
382         case 0x03:
383            set_pixel(x,y,SELECT_COL(x, FG_COLOUR));
384            break;
404385
405         case 0x04   : m_bpp=2; m_pixel_mask=0xC0;
406                     write_pixel_line(x,y,(((data & 0xFF00)>>8) & (data & 0xFF)) | (~((data & 0xFF00)>>8) & read_pixel_line(x,y,8)),8);
407                     break;
386         case 0x04:
387            write_pixel_line(x,y,(((data & 0xFF00)>>8) & (data & 0xFF)) | (~((data & 0xFF00)>>8) & read_pixel_line(x,y,4,2)),4,2);
388            break;
408389
409         case 0x05   : move_pixel_line(x,y,data,16);
410                     break;
390         case 0x05:
391            move_pixel_line(x,y,16);
392            break;
411393
412         case 0x06   : m_bpp=2; m_pixel_mask=0xC000;
413                     write_pixel_line(x,y,data,16);
414                     break;
394         case 0x06:
395            write_pixel_line(x,y,data,8,2);
396            break;
415397
416         case 0x07   : m_bpp=1;
417                     set_pixel(x,y,FG_COLOUR);
418                     break;
398         case 0x07:
399            set_pixel(x,y,SELECT_COL(x, FG_COLOUR));
400            break;
419401      }
420402   }
421403   else /* 40 Col */
422404   {
423405      switch (m_vidregs[reg022] & WIDTH_MASK)
424406      {
425         case 0x00   : m_bpp=1; m_pixel_mask=0x0080;
426                     write_pixel_line(x,y,data,8);
427                     break;
407         case 0x00:
408            write_pixel_line(x,y,data,8,1);
409            break;
428410
429         case 0x01   : m_bpp=2; m_pixel_mask=0xC0;
430                     write_pixel_line(x,y,data,8);
431                     break;
411         case 0x01:
412            write_pixel_line(x,y,data,4,2);
413            break;
432414
433         case 0x02   : m_bpp=1; m_pixel_mask=0x0080;
434                     set_pixel40(x,y,FG_COLOUR);
435                     break;
415         case 0x02:
416            set_pixel40(x,y,FG_COLOUR);
417            break;
436418
437         case 0x03   : m_bpp=1;
438                     set_pixel(x,y,FG_COLOUR);
439                     break;
419         case 0x03:
420            set_pixel(x,y,FG_COLOUR);
421            break;
440422
441         case 0x04   : m_bpp=4; m_pixel_mask=0xF0;
442                     write_pixel_line(x,y,(((data & 0xFF00)>>8) & (data & 0xFF)) | (~((data & 0xFF00)>>8) & read_pixel_line(x,y,8)),8);
443                     break;
423         case 0x04:
424            write_pixel_line(x,y,(((data & 0xFF00)>>8) & (data & 0xFF)) | (~((data & 0xFF00)>>8) & read_pixel_line(x,y,2,4)),2,4);
425            break;
444426
445         case 0x05   : move_pixel_line(x,y,data,16);
446                     break;
427         case 0x05:
428            move_pixel_line(x,y,16);
429            break;
447430
448         case 0x06   : m_bpp=4; m_pixel_mask=0xF000;
449                     write_pixel_line(x,y,data,16);
450                     break;
431         case 0x06:
432            write_pixel_line(x,y,data,4,4);
433            break;
451434
452         case 0x07   : m_bpp=1;
453                     set_pixel(x,y,FG_COLOUR);
454                     break;
435         case 0x07:
436            set_pixel(x,y,FG_COLOUR);
437            break;
455438      }
456439   }
457440}
458441
459442void rmnimbus_state::write_reg_004()
460443{
461   m_vidregs[reg002]=0;
444   //m_vidregs[reg002]=0;
462445   m_vidregs[reg00C]++;
463446}
464447
r31216r31217
468451   m_vidregs[reg002]=m_vidregs[reg006];
469452}
470453
454void rmnimbus_state::write_reg_00A()
455{
456   m_vidregs[reg002]++;
457}
458
459void rmnimbus_state::write_reg_00E()
460{
461   m_vidregs[reg002]++;
462   m_vidregs[reg00C]=m_vidregs[reg00E];
463}
464
471465void rmnimbus_state::write_reg_010()
472466{
473467   write_pixel_data(m_vidregs[reg002],m_vidregs[reg00C],m_vidregs[reg010]);
r31216r31217
480474   // work correctly.
481475   m_vidregs[reg002]=m_vidregs[reg012];
482476
483   write_pixel_data(m_vidregs[reg012],m_vidregs[reg00C],FG_COLOUR);
477   write_pixel_data(m_vidregs[reg012],m_vidregs[reg00C],FILL_WORD(FG_COLOUR));
484478}
485479
486480void rmnimbus_state::write_reg_014()
r31216r31217
492486{
493487   m_vidregs[reg002]=m_vidregs[reg016];
494488
495   write_pixel_data(m_vidregs[reg002],++m_vidregs[reg00C],FG_COLOUR);
489   write_pixel_data(m_vidregs[reg002],++m_vidregs[reg00C],FILL_WORD(FG_COLOUR));
496490}
497491
498492
r31216r31217
508502   // and others using the standard RM box menus) work correctly.
509503   m_vidregs[reg00C]=m_vidregs[reg01C];
510504
511   write_pixel_data(m_vidregs[reg002],m_vidregs[reg01C],FG_COLOUR);
505   write_pixel_data(m_vidregs[reg002],m_vidregs[reg01C],FILL_WORD(FG_COLOUR));
512506}
513507
514508void rmnimbus_state::write_reg_01E()
515509{
516510   m_vidregs[reg00C]=m_vidregs[reg01E];
517511
518   write_pixel_data(++m_vidregs[reg002],m_vidregs[reg00C],FG_COLOUR);
512   write_pixel_data(++m_vidregs[reg002],m_vidregs[reg00C],FILL_WORD(FG_COLOUR));
519513}
520514
521515/*
r31216r31217
529523      logerror("reg 026 write, border_colour=%02X\n",m_vidregs[reg026] & 0x0F);
530524}
531525
532void rmnimbus_state::change_palette(UINT8 bank, UINT16 colours, UINT8 regno)
526void rmnimbus_state::change_palette(UINT8 bank, UINT16 colours)
533527{
534   UINT8   colourno;
535   UINT16  mask;
536   UINT8   shifts;
537   UINT8   colourmax;
538   UINT8   first;
539
540   // for the register's data has changed update it, and then update the pallette, else do nothing.
541   if(m_vidregs[regno]!=colours)
542      m_vidregs[regno]=colours;
543   else
544      return;
545
546   // Setup parameters for pallette change
547   colourmax=IS_80COL ? 1 : 4;
548   first=IS_80COL ? bank : bank*4;
549
550   shifts=0;
551   mask=0x000F;
552
553528   // loop over changing colours
554   for(colourno=first; colourno<(first+colourmax); colourno++)
529   for(int colourno = (bank * 4); colourno < ((bank + 1) * 4); colourno++)
555530   {
556      int paletteidx=(colours & mask) >> shifts;
557      int i = (paletteidx & 8) >> 3;
558      m_palette->set_pen_color(colourno, pal2bit((paletteidx & 2) | i), pal2bit(((paletteidx & 4) >> 1) | i), pal2bit(((paletteidx & 1) << 1) | i));
531      int i = (colours & 8) >> 3;
532      m_palette->set_pen_color(colourno, pal2bit((colours & 2) | i), pal2bit(((colours & 4) >> 1) | i), pal2bit(((colours & 1) << 1) | i));
559533
560534      if(DEBUG_SET(DEBUG_TEXT))
561         logerror("set colourno[%02X], paletteidx=%02X\n",colourno, paletteidx);
562      mask=mask<<4;
563      shifts+=4;
535         logerror("set colourno[%02X], colour=%02X\n",colourno, colours);
536      colours >>= 4;
564537   }
565538}
566539
r31216r31217
578551   }
579552}
580553
581static void video_regdump(running_machine &machine, int ref, int params, const char *param[])
582{
583   rmnimbus_state *state = machine.driver_data<rmnimbus_state>();
584   int regno;
585
586   for(regno=0;regno<0x08;regno++)
587   {
588      debug_console_printf(machine,"reg%03X=%04X reg%03X=%04X reg%03X=%04X\n",
589            regno*2,state->m_vidregs[regno],
590            (regno+0x08)*2,state->m_vidregs[regno+0x08],
591            (regno+0x10)*2,state->m_vidregs[regno+0x10]);
592
593      logerror("reg%03X=%04X reg%03X=%04X reg%03X=%04X\n",
594            regno*2,state->m_vidregs[regno],
595            (regno+0x08)*2,state->m_vidregs[regno+0x08],
596            (regno+0x10)*2,state->m_vidregs[regno+0x10]);
597   }
598}
599
600554void rmnimbus_state::video_start()
601555{
602556   m_debug_video=0;
603557
604   logerror("video_start\n");
605
606558   m_screen->register_screen_bitmap(m_video_mem);
607559
608560   save_item(NAME(m_vidregs));
r31216r31217
610562   if (machine().debug_flags & DEBUG_FLAG_ENABLED)
611563   {
612564      debug_console_register_command(machine(), "nimbus_vid_debug", CMDFLAG_NONE, 0, 0, 1, video_debug);
613      debug_console_register_command(machine(), "nimbus_vid_regdump", CMDFLAG_NONE, 0, 0, 1, video_regdump);
614565   }
615566}
616567
617PALETTE_INIT_MEMBER(rmnimbus_state, rmnimbus)
618{
619   int colourno;
620
621   for ( colourno = 0; colourno < SCREEN_NO_COLOURS; colourno++ )
622   {
623      int i = (colourno & 8) >> 3;
624      palette.set_pen_color(colourno, pal2bit((colourno & 2) | i), pal2bit(((colourno & 4) >> 1) | i), pal2bit(((colourno & 1) << 1) | i));
625   }
626}
627
628568void rmnimbus_state::video_reset()
629569{
630570   // When we reset clear the video registers and video memory.
631571   memset(&m_vidregs,0x00,sizeof(m_vidregs));
632
633   m_bpp=4;          // bits per pixel
634   logerror("Video reset\n");
635572}
636573
637574UINT32 rmnimbus_state::screen_update_nimbus(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
trunk/src/mess/drivers/rmnimbus.c
r31216r31217
120120   //MCFG_SCREEN_VIDEO_ATTRIBUTES(VIDEO_UPDATE_SCANLINE)
121121   MCFG_SCREEN_PALETTE("palette")
122122
123   MCFG_PALETTE_ADD("palette", SCREEN_NO_COLOURS)
124   MCFG_PALETTE_INIT_OWNER(rmnimbus_state, rmnimbus)
123   MCFG_PALETTE_ADD("palette", 16)
125124
126125   /* Backing storage */
127126   MCFG_WD2793x_ADD(FDC_TAG, 1000000)
trunk/src/mess/machine/rmnimbus.c
r31216r31217
10261026   if(LOG_DISK)
10271027      logerror("nimbus_drives_drq_w(%d)\n", state);
10281028
1029   if(state && FDC_DRQ_ENABLED())
1030      m_maincpu->drq1_w(state);
1029   m_maincpu->drq1_w(state && FDC_DRQ_ENABLED());
10311030}
10321031
10331032UINT8 rmnimbus_state::fdc_driveno(UINT8 drivesel)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team