Previous 199869 Revisions Next

r44642 Wednesday 3rd February, 2016 at 04:15:36 UTC by Vasantha Crabb
Merge pull request #601 from bmunger/r9751

r9751: Added more dma registers for serial and floppy
[/trunk]makefile
[scripts/src]3rdparty.lua
[scripts/target/mame]mess.lua
[src/devices/bus/a2bus]a2pic.cpp
[src/devices/bus/centronics]epson_lx810l.cpp
[src/devices/machine]i8271.cpp i8271.h k033906.cpp k033906.h
[src/devices/video]vooddefs.h voodoo.cpp voodoo.h voodoo_pci.cpp
[src/emu]emuopts.cpp
[src/mame]arcade.lst mess.lst
[src/mame/drivers]arkanoid.cpp esd16.cpp fidelz80.cpp funkball.cpp gticlub.cpp hornet.cpp kaneko16.cpp ladyfrog.cpp magictg.cpp nibble.cpp nwk-tr.cpp overdriv.cpp pc9801.cpp savquest.cpp seattle.cpp stv.cpp tispeak.cpp vc4000.cpp vegas.cpp viper.cpp
[src/mame/includes]arkanoid.h chihiro.h overdriv.h
[src/mame/machine]315-5838_317-0229_comp.cpp 315-5838_317-0229_comp.h arkanoid.cpp pc9801_cd.cpp* pc9801_cd.h* pc9801_kbd.cpp pc9801_kbd.h
[src/mame/video]chihiro.cpp

trunk/makefile
r253153r253154
12671267   $(SILENT)$(PYTHON) scripts/build/file2str.py $< $@ layout_$(basename $(notdir $<))
12681268
12691269$(SRC)/devices/cpu/m68000/m68kops.cpp: $(SRC)/devices/cpu/m68000/m68k_in.cpp $(SRC)/devices/cpu/m68000/m68kmake.cpp
1270ifeq ($(TARGETOS),asmjs)
1271   $(SILENT) $(MAKE) -C $(SRC)/devices/cpu/m68000
1272else
12701273   $(SILENT) $(MAKE) -C $(SRC)/devices/cpu/m68000 CC=$(CC) CXX=$(CXX)
1274endif
12711275
12721276#-------------------------------------------------
12731277# Regression tests
trunk/scripts/src/3rdparty.lua
r253153r253154
967967         "/wd4210", -- warning C4210: nonstandard extension used : function given file scope
968968         "/wd4701", -- warning C4701: potentially uninitialized local variable 'xxx' used
969969         "/wd4703", -- warning C4703: potentially uninitialized local pointer variable 'xxx' used
970         "/wd4477", -- warning C4477: '<function>' : format string '<format-string>' requires an argument of type '<type>', but variadic argument <position> has type '<type>'
970971      }
971972
972973   configuration { }
trunk/scripts/target/mame/mess.lua
r253153r253154
20902090   MAME_DIR .. "src/mame/machine/pc9801_cbus.h",
20912091   MAME_DIR .. "src/mame/machine/pc9801_kbd.cpp",
20922092   MAME_DIR .. "src/mame/machine/pc9801_kbd.h",
2093   MAME_DIR .. "src/mame/machine/pc9801_cd.cpp",
2094   MAME_DIR .. "src/mame/machine/pc9801_cd.h",
20932095   MAME_DIR .. "src/mame/drivers/tk80bs.cpp",
20942096   MAME_DIR .. "src/mame/drivers/hh_ucom4.cpp",
20952097   MAME_DIR .. "src/mame/includes/hh_ucom4.h",
trunk/src/devices/bus/a2bus/a2pic.cpp
r253153r253154
4949   PORT_DIPSETTING(    0x06, "13 microseconds" )
5050   PORT_DIPSETTING(    0x07, "15 microseconds" )
5151
52   PORT_DIPNAME( 0x08, 0x00, "Strobe polarity (SW4)" )
52   PORT_DIPNAME( 0x08, 0x08, "Strobe polarity (SW4)" )
5353   PORT_DIPSETTING(    0x00, "Positive" )
5454   PORT_DIPSETTING(    0x08, "Negative" )
5555
56   PORT_DIPNAME( 0x10, 0x00, "Acknowledge polarity (SW5)" )
56   PORT_DIPNAME( 0x10, 0x10, "Acknowledge polarity (SW5)" )
5757   PORT_DIPSETTING(    0x00, "Positive" )
5858   PORT_DIPSETTING(    0x10, "Negative" )
5959
r253153r253154
181181
182182UINT8 a2bus_pic_device::read_c0nx(address_space &space, UINT8 offset)
183183{
184   UINT8 rv = 0;
185
184186   switch (offset)
185187   {
186188      case 3:
187189         return m_ctx_data_in->read();
188190
189191      case 4:
190         return m_ack;
192         rv = m_ack;
191193
194         // clear flip-flop
195         if (m_dsw1->read() & 0x10)    // negative polarity
196         {
197            m_ack |= 0x80;
198         }
199         else
200         {
201            m_ack &= ~0x80;
202         }
203
204         return rv;
205
192206      case 6: // does reading this really work?
193207         m_irqenable = true;
194208         break;
trunk/src/devices/bus/centronics/epson_lx810l.cpp
r253153r253154
2626 */
2727
2828#include "epson_lx810l.h"
29extern const char layout_lx800[]; /* use layout from lx800 */
29//extern const char layout_lx800[]; /* use layout from lx800 */
3030
3131//#define LX810LDEBUG
3232#ifdef LX810LDEBUG
r253153r253154
132132   MCFG_UPD7810_CO0(WRITELINE(epson_lx810l_t, co0_w))
133133   MCFG_UPD7810_CO1(WRITELINE(epson_lx810l_t, co1_w))
134134
135   MCFG_DEFAULT_LAYOUT(layout_lx800)
135//   MCFG_DEFAULT_LAYOUT(layout_lx800)
136136
137137   /* video hardware (simulates paper) */
138138   MCFG_SCREEN_ADD("screen", RASTER)
trunk/src/devices/machine/i8271.cpp
r253153r253154
8888      flopi[i].live = false;
8989      flopi[i].ready = get_ready(i);
9090   }
91   hdl_cb(false);
9192   set_irq(false);
9293   set_drq(false);
9394   command_pos = 0;
r253153r253154
887888{
888889   logerror("%s: command done (%s) - %02x\n", tag(), data_completion ? "data" : "seek", rr);
889890   fi.main_state = fi.sub_state = IDLE;
891   idle_icnt = 0;
890892   main_phase = PHASE_RESULT;
891893   set_irq(true);
892894}
r253153r253154
981983void i8271_device::read_data_start(floppy_info &fi)
982984{
983985   fi.main_state = READ_DATA;
986   hdl_cb(true);
984987   fi.sub_state = HEAD_LOAD_DONE;
985988
986989   logerror("%s: command read%s data%s cmd=%02x crn=(%d, %d, %d) len=%02x rate=%d\n",
r253153r253154
10101013void i8271_device::scan_start(floppy_info &fi)
10111014{
10121015   fi.main_state = SCAN_DATA;
1016   hdl_cb(true);
10131017   fi.sub_state = HEAD_LOAD_DONE;
10141018
10151019   logerror("%s: command scan%s data%s cmd=%02x crn=(%d, %d, %d) len=%02x rate=%d\n",
r253153r253154
10411045void i8271_device::verify_data_start(floppy_info &fi)
10421046{
10431047   fi.main_state = VERIFY_DATA;
1048   hdl_cb(true);
10441049   fi.sub_state = HEAD_LOAD_DONE;
10451050
10461051   logerror("%s: command verify%s data%s cmd=%02x crn=(%d, %d, %d) len=%02x rate=%d\n",
r253153r253154
10981103         return;
10991104
11001105      case SEEK_WAIT_STEP_TIME_DONE:
1106         hdl_cb(true);
11011107         do {
11021108            if(fi.pcn > command[1])
11031109               fi.pcn--;
r253153r253154
11811187void i8271_device::write_data_start(floppy_info &fi)
11821188{
11831189   fi.main_state = WRITE_DATA;
1190   hdl_cb(true);
11841191   fi.sub_state = HEAD_LOAD_DONE;
1192
11851193   logerror("%s: command write%s data%s cmd=%02x crn=(%d, %d, %d) len=%02x rate=%d\n",
11861194            tag(),
11871195            command[0] & 0x04 ? " deleted" : "",
r253153r253154
12381246         return;
12391247
12401248      case SEEK_WAIT_STEP_TIME_DONE:
1249         hdl_cb(true);
12411250         do {
12421251            if(fi.pcn > command[1])
12431252               fi.pcn--;
r253153r253154
13111320void i8271_device::format_track_start(floppy_info &fi)
13121321{
13131322   fi.main_state = FORMAT_TRACK;
1323   hdl_cb(true);
13141324   fi.sub_state = HEAD_LOAD_DONE;
13151325
13161326   logerror("%s: command format track c=%02x n=%02x sc=%02x gap3=%02x gap5=%02x gap1=%02x\n",
r253153r253154
13641374         return;
13651375
13661376      case SEEK_WAIT_STEP_TIME_DONE:
1377         hdl_cb(true);
13671378         do {
13681379            if(fi.pcn > command[1])
13691380               fi.pcn--;
r253153r253154
14021413void i8271_device::read_id_start(floppy_info &fi)
14031414{
14041415   fi.main_state = READ_ID;
1416   hdl_cb(true);
14051417   fi.sub_state = HEAD_LOAD_DONE;
14061418
14071419   logerror("%s: command read id, rate=%d\n",
r253153r253154
14571469         return;
14581470
14591471      case SEEK_WAIT_STEP_TIME_DONE:
1472         hdl_cb(true);
14601473         do {
14611474            if(fi.pcn > command[1])
14621475               fi.pcn--;
r253153r253154
15531566         continue;
15541567      }
15551568
1569      if (fi.main_state == IDLE) {
1570         idle_icnt++;
1571         if (icnt != 0x0f && idle_icnt >= icnt) {
1572            hdl_cb(false);
1573         }
1574      }
1575
15561576      switch(fi.sub_state) {
15571577      case IDLE:
15581578      case SEEK_MOVE:
trunk/src/devices/machine/i8271.h
r253153r253154
215215   UINT8 srate, hset, icnt, hload;
216216   int sector_size;
217217   int cur_rate;
218   int idle_icnt;
218219
219220   static std::string tts(attotime t);
220221   std::string ttsn();
trunk/src/devices/machine/k033906.cpp
r253153r253154
3333
3434void k033906_device::device_start()
3535{
36   m_voodoo = machine().device(m_voodoo_tag);
36   m_voodoo = (voodoo_device*)machine().device(m_voodoo_tag);
3737
3838   m_reg_set = 0;
3939
r253153r253154
9595
9696      case 0x10:      // initEnable
9797      {
98         voodoo_set_init_enable(m_voodoo, data);
98         m_voodoo->voodoo_set_init_enable(data);
9999         break;
100100      }
101101
trunk/src/devices/machine/k033906.h
r253153r253154
1212#define __K033906_H__
1313
1414#include "emu.h"
15#include "video/voodoo.h"
1516
1617
17
1818/***************************************************************************
1919    DEVICE CONFIGURATION MACROS
2020***************************************************************************/
r253153r253154
5858   int          m_reg_set; // 1 = access reg / 0 = access ram
5959
6060   const char   *m_voodoo_tag;
61   device_t     *m_voodoo;
61   voodoo_device     *m_voodoo;
6262
6363   UINT32       m_reg[256];
6464   UINT32       m_ram[32768];
trunk/src/devices/video/vooddefs.h
r253153r253154
99***************************************************************************/
1010
1111
12/*************************************
13 *
14 *  Misc. constants
15 *
16 *************************************/
1712
18/* enumeration describing reasons we might be stalled */
19enum
20{
21   NOT_STALLED = 0,
22   STALLED_UNTIL_FIFO_LWM,
23   STALLED_UNTIL_FIFO_EMPTY
24};
2513
26
27
28// Use old table lookup versus straight double divide
29#define USE_FAST_RECIP  0
30
31/* maximum number of TMUs */
32#define MAX_TMU                 2
33
34/* accumulate operations less than this number of clocks */
35#define ACCUMULATE_THRESHOLD    0
36
37/* number of clocks to set up a triangle (just a guess) */
38#define TRIANGLE_SETUP_CLOCKS   100
39
40/* maximum number of rasterizers */
41#define MAX_RASTERIZERS         1024
42
43/* size of the rasterizer hash table */
44#define RASTER_HASH_SIZE        97
45
46/* flags for LFB writes */
47#define LFB_RGB_PRESENT         1
48#define LFB_ALPHA_PRESENT       2
49#define LFB_DEPTH_PRESENT       4
50#define LFB_DEPTH_PRESENT_MSW   8
51
52/* flags for the register access array */
53#define REGISTER_READ           0x01        /* reads are allowed */
54#define REGISTER_WRITE          0x02        /* writes are allowed */
55#define REGISTER_PIPELINED      0x04        /* writes are pipelined */
56#define REGISTER_FIFO           0x08        /* writes go to FIFO */
57#define REGISTER_WRITETHRU      0x10        /* writes are valid even for CMDFIFO */
58
59/* shorter combinations to make the table smaller */
60#define REG_R                   (REGISTER_READ)
61#define REG_W                   (REGISTER_WRITE)
62#define REG_WT                  (REGISTER_WRITE | REGISTER_WRITETHRU)
63#define REG_RW                  (REGISTER_READ | REGISTER_WRITE)
64#define REG_RWT                 (REGISTER_READ | REGISTER_WRITE | REGISTER_WRITETHRU)
65#define REG_RP                  (REGISTER_READ | REGISTER_PIPELINED)
66#define REG_WP                  (REGISTER_WRITE | REGISTER_PIPELINED)
67#define REG_RWP                 (REGISTER_READ | REGISTER_WRITE | REGISTER_PIPELINED)
68#define REG_RWPT                (REGISTER_READ | REGISTER_WRITE | REGISTER_PIPELINED | REGISTER_WRITETHRU)
69#define REG_RF                  (REGISTER_READ | REGISTER_FIFO)
70#define REG_WF                  (REGISTER_WRITE | REGISTER_FIFO)
71#define REG_RWF                 (REGISTER_READ | REGISTER_WRITE | REGISTER_FIFO)
72#define REG_RPF                 (REGISTER_READ | REGISTER_PIPELINED | REGISTER_FIFO)
73#define REG_WPF                 (REGISTER_WRITE | REGISTER_PIPELINED | REGISTER_FIFO)
74#define REG_RWPF                (REGISTER_READ | REGISTER_WRITE | REGISTER_PIPELINED | REGISTER_FIFO)
75
76/* lookup bits is the log2 of the size of the reciprocal/log table */
77#define RECIPLOG_LOOKUP_BITS    9
78
79/* input precision is how many fraction bits the input value has; this is a 64-bit number */
80#define RECIPLOG_INPUT_PREC     32
81
82/* lookup precision is how many fraction bits each table entry contains */
83#define RECIPLOG_LOOKUP_PREC    22
84
85/* output precision is how many fraction bits the result should have */
86#define RECIP_OUTPUT_PREC       15
87#define LOG_OUTPUT_PREC         8
88
89
90
9114/*************************************
9215 *
93 *  Register constants
94 *
95 *************************************/
96
97/* Codes to the right:
98    R = readable
99    W = writeable
100    P = pipelined
101    F = goes to FIFO
102*/
103
104/* 0x000 */
105#define status          (0x000/4)   /* R  P  */
106#define intrCtrl        (0x004/4)   /* RW P   -- Voodoo2/Banshee only */
107#define vertexAx        (0x008/4)   /*  W PF */
108#define vertexAy        (0x00c/4)   /*  W PF */
109#define vertexBx        (0x010/4)   /*  W PF */
110#define vertexBy        (0x014/4)   /*  W PF */
111#define vertexCx        (0x018/4)   /*  W PF */
112#define vertexCy        (0x01c/4)   /*  W PF */
113#define startR          (0x020/4)   /*  W PF */
114#define startG          (0x024/4)   /*  W PF */
115#define startB          (0x028/4)   /*  W PF */
116#define startZ          (0x02c/4)   /*  W PF */
117#define startA          (0x030/4)   /*  W PF */
118#define startS          (0x034/4)   /*  W PF */
119#define startT          (0x038/4)   /*  W PF */
120#define startW          (0x03c/4)   /*  W PF */
121
122/* 0x040 */
123#define dRdX            (0x040/4)   /*  W PF */
124#define dGdX            (0x044/4)   /*  W PF */
125#define dBdX            (0x048/4)   /*  W PF */
126#define dZdX            (0x04c/4)   /*  W PF */
127#define dAdX            (0x050/4)   /*  W PF */
128#define dSdX            (0x054/4)   /*  W PF */
129#define dTdX            (0x058/4)   /*  W PF */
130#define dWdX            (0x05c/4)   /*  W PF */
131#define dRdY            (0x060/4)   /*  W PF */
132#define dGdY            (0x064/4)   /*  W PF */
133#define dBdY            (0x068/4)   /*  W PF */
134#define dZdY            (0x06c/4)   /*  W PF */
135#define dAdY            (0x070/4)   /*  W PF */
136#define dSdY            (0x074/4)   /*  W PF */
137#define dTdY            (0x078/4)   /*  W PF */
138#define dWdY            (0x07c/4)   /*  W PF */
139
140/* 0x080 */
141#define triangleCMD     (0x080/4)   /*  W PF */
142#define fvertexAx       (0x088/4)   /*  W PF */
143#define fvertexAy       (0x08c/4)   /*  W PF */
144#define fvertexBx       (0x090/4)   /*  W PF */
145#define fvertexBy       (0x094/4)   /*  W PF */
146#define fvertexCx       (0x098/4)   /*  W PF */
147#define fvertexCy       (0x09c/4)   /*  W PF */
148#define fstartR         (0x0a0/4)   /*  W PF */
149#define fstartG         (0x0a4/4)   /*  W PF */
150#define fstartB         (0x0a8/4)   /*  W PF */
151#define fstartZ         (0x0ac/4)   /*  W PF */
152#define fstartA         (0x0b0/4)   /*  W PF */
153#define fstartS         (0x0b4/4)   /*  W PF */
154#define fstartT         (0x0b8/4)   /*  W PF */
155#define fstartW         (0x0bc/4)   /*  W PF */
156
157/* 0x0c0 */
158#define fdRdX           (0x0c0/4)   /*  W PF */
159#define fdGdX           (0x0c4/4)   /*  W PF */
160#define fdBdX           (0x0c8/4)   /*  W PF */
161#define fdZdX           (0x0cc/4)   /*  W PF */
162#define fdAdX           (0x0d0/4)   /*  W PF */
163#define fdSdX           (0x0d4/4)   /*  W PF */
164#define fdTdX           (0x0d8/4)   /*  W PF */
165#define fdWdX           (0x0dc/4)   /*  W PF */
166#define fdRdY           (0x0e0/4)   /*  W PF */
167#define fdGdY           (0x0e4/4)   /*  W PF */
168#define fdBdY           (0x0e8/4)   /*  W PF */
169#define fdZdY           (0x0ec/4)   /*  W PF */
170#define fdAdY           (0x0f0/4)   /*  W PF */
171#define fdSdY           (0x0f4/4)   /*  W PF */
172#define fdTdY           (0x0f8/4)   /*  W PF */
173#define fdWdY           (0x0fc/4)   /*  W PF */
174
175/* 0x100 */
176#define ftriangleCMD    (0x100/4)   /*  W PF */
177#define fbzColorPath    (0x104/4)   /* RW PF */
178#define fogMode         (0x108/4)   /* RW PF */
179#define alphaMode       (0x10c/4)   /* RW PF */
180#define fbzMode         (0x110/4)   /* RW  F */
181#define lfbMode         (0x114/4)   /* RW  F */
182#define clipLeftRight   (0x118/4)   /* RW  F */
183#define clipLowYHighY   (0x11c/4)   /* RW  F */
184#define nopCMD          (0x120/4)   /*  W  F */
185#define fastfillCMD     (0x124/4)   /*  W  F */
186#define swapbufferCMD   (0x128/4)   /*  W  F */
187#define fogColor        (0x12c/4)   /*  W  F */
188#define zaColor         (0x130/4)   /*  W  F */
189#define chromaKey       (0x134/4)   /*  W  F */
190#define chromaRange     (0x138/4)   /*  W  F  -- Voodoo2/Banshee only */
191#define userIntrCMD     (0x13c/4)   /*  W  F  -- Voodoo2/Banshee only */
192
193/* 0x140 */
194#define stipple         (0x140/4)   /* RW  F */
195#define color0          (0x144/4)   /* RW  F */
196#define color1          (0x148/4)   /* RW  F */
197#define fbiPixelsIn     (0x14c/4)   /* R     */
198#define fbiChromaFail   (0x150/4)   /* R     */
199#define fbiZfuncFail    (0x154/4)   /* R     */
200#define fbiAfuncFail    (0x158/4)   /* R     */
201#define fbiPixelsOut    (0x15c/4)   /* R     */
202#define fogTable        (0x160/4)   /*  W  F */
203
204/* 0x1c0 */
205#define cmdFifoBaseAddr (0x1e0/4)   /* RW     -- Voodoo2 only */
206#define cmdFifoBump     (0x1e4/4)   /* RW     -- Voodoo2 only */
207#define cmdFifoRdPtr    (0x1e8/4)   /* RW     -- Voodoo2 only */
208#define cmdFifoAMin     (0x1ec/4)   /* RW     -- Voodoo2 only */
209#define colBufferAddr   (0x1ec/4)   /* RW     -- Banshee only */
210#define cmdFifoAMax     (0x1f0/4)   /* RW     -- Voodoo2 only */
211#define colBufferStride (0x1f0/4)   /* RW     -- Banshee only */
212#define cmdFifoDepth    (0x1f4/4)   /* RW     -- Voodoo2 only */
213#define auxBufferAddr   (0x1f4/4)   /* RW     -- Banshee only */
214#define cmdFifoHoles    (0x1f8/4)   /* RW     -- Voodoo2 only */
215#define auxBufferStride (0x1f8/4)   /* RW     -- Banshee only */
216
217/* 0x200 */
218#define fbiInit4        (0x200/4)   /* RW     -- Voodoo/Voodoo2 only */
219#define clipLeftRight1  (0x200/4)   /* RW     -- Banshee only */
220#define vRetrace        (0x204/4)   /* R      -- Voodoo/Voodoo2 only */
221#define clipTopBottom1  (0x204/4)   /* RW     -- Banshee only */
222#define backPorch       (0x208/4)   /* RW     -- Voodoo/Voodoo2 only */
223#define videoDimensions (0x20c/4)   /* RW     -- Voodoo/Voodoo2 only */
224#define fbiInit0        (0x210/4)   /* RW     -- Voodoo/Voodoo2 only */
225#define fbiInit1        (0x214/4)   /* RW     -- Voodoo/Voodoo2 only */
226#define fbiInit2        (0x218/4)   /* RW     -- Voodoo/Voodoo2 only */
227#define fbiInit3        (0x21c/4)   /* RW     -- Voodoo/Voodoo2 only */
228#define hSync           (0x220/4)   /*  W     -- Voodoo/Voodoo2 only */
229#define vSync           (0x224/4)   /*  W     -- Voodoo/Voodoo2 only */
230#define clutData        (0x228/4)   /*  W  F  -- Voodoo/Voodoo2 only */
231#define dacData         (0x22c/4)   /*  W     -- Voodoo/Voodoo2 only */
232#define maxRgbDelta     (0x230/4)   /*  W     -- Voodoo/Voodoo2 only */
233#define hBorder         (0x234/4)   /*  W     -- Voodoo2 only */
234#define vBorder         (0x238/4)   /*  W     -- Voodoo2 only */
235#define borderColor     (0x23c/4)   /*  W     -- Voodoo2 only */
236
237/* 0x240 */
238#define hvRetrace       (0x240/4)   /* R      -- Voodoo2 only */
239#define fbiInit5        (0x244/4)   /* RW     -- Voodoo2 only */
240#define fbiInit6        (0x248/4)   /* RW     -- Voodoo2 only */
241#define fbiInit7        (0x24c/4)   /* RW     -- Voodoo2 only */
242#define swapPending     (0x24c/4)   /*  W     -- Banshee only */
243#define leftOverlayBuf  (0x250/4)   /*  W     -- Banshee only */
244#define rightOverlayBuf (0x254/4)   /*  W     -- Banshee only */
245#define fbiSwapHistory  (0x258/4)   /* R      -- Voodoo2/Banshee only */
246#define fbiTrianglesOut (0x25c/4)   /* R      -- Voodoo2/Banshee only */
247#define sSetupMode      (0x260/4)   /*  W PF  -- Voodoo2/Banshee only */
248#define sVx             (0x264/4)   /*  W PF  -- Voodoo2/Banshee only */
249#define sVy             (0x268/4)   /*  W PF  -- Voodoo2/Banshee only */
250#define sARGB           (0x26c/4)   /*  W PF  -- Voodoo2/Banshee only */
251#define sRed            (0x270/4)   /*  W PF  -- Voodoo2/Banshee only */
252#define sGreen          (0x274/4)   /*  W PF  -- Voodoo2/Banshee only */
253#define sBlue           (0x278/4)   /*  W PF  -- Voodoo2/Banshee only */
254#define sAlpha          (0x27c/4)   /*  W PF  -- Voodoo2/Banshee only */
255
256/* 0x280 */
257#define sVz             (0x280/4)   /*  W PF  -- Voodoo2/Banshee only */
258#define sWb             (0x284/4)   /*  W PF  -- Voodoo2/Banshee only */
259#define sWtmu0          (0x288/4)   /*  W PF  -- Voodoo2/Banshee only */
260#define sS_W0           (0x28c/4)   /*  W PF  -- Voodoo2/Banshee only */
261#define sT_W0           (0x290/4)   /*  W PF  -- Voodoo2/Banshee only */
262#define sWtmu1          (0x294/4)   /*  W PF  -- Voodoo2/Banshee only */
263#define sS_Wtmu1        (0x298/4)   /*  W PF  -- Voodoo2/Banshee only */
264#define sT_Wtmu1        (0x29c/4)   /*  W PF  -- Voodoo2/Banshee only */
265#define sDrawTriCMD     (0x2a0/4)   /*  W PF  -- Voodoo2/Banshee only */
266#define sBeginTriCMD    (0x2a4/4)   /*  W PF  -- Voodoo2/Banshee only */
267
268/* 0x2c0 */
269#define bltSrcBaseAddr  (0x2c0/4)   /* RW PF  -- Voodoo2 only */
270#define bltDstBaseAddr  (0x2c4/4)   /* RW PF  -- Voodoo2 only */
271#define bltXYStrides    (0x2c8/4)   /* RW PF  -- Voodoo2 only */
272#define bltSrcChromaRange (0x2cc/4) /* RW PF  -- Voodoo2 only */
273#define bltDstChromaRange (0x2d0/4) /* RW PF  -- Voodoo2 only */
274#define bltClipX        (0x2d4/4)   /* RW PF  -- Voodoo2 only */
275#define bltClipY        (0x2d8/4)   /* RW PF  -- Voodoo2 only */
276#define bltSrcXY        (0x2e0/4)   /* RW PF  -- Voodoo2 only */
277#define bltDstXY        (0x2e4/4)   /* RW PF  -- Voodoo2 only */
278#define bltSize         (0x2e8/4)   /* RW PF  -- Voodoo2 only */
279#define bltRop          (0x2ec/4)   /* RW PF  -- Voodoo2 only */
280#define bltColor        (0x2f0/4)   /* RW PF  -- Voodoo2 only */
281#define bltCommand      (0x2f8/4)   /* RW PF  -- Voodoo2 only */
282#define bltData         (0x2fc/4)   /*  W PF  -- Voodoo2 only */
283
284/* 0x300 */
285#define textureMode     (0x300/4)   /*  W PF */
286#define tLOD            (0x304/4)   /*  W PF */
287#define tDetail         (0x308/4)   /*  W PF */
288#define texBaseAddr     (0x30c/4)   /*  W PF */
289#define texBaseAddr_1   (0x310/4)   /*  W PF */
290#define texBaseAddr_2   (0x314/4)   /*  W PF */
291#define texBaseAddr_3_8 (0x318/4)   /*  W PF */
292#define trexInit0       (0x31c/4)   /*  W  F  -- Voodoo/Voodoo2 only */
293#define trexInit1       (0x320/4)   /*  W  F */
294#define nccTable        (0x324/4)   /*  W  F */
295
296
297
298// 2D registers
299#define banshee2D_clip0Min          (0x008/4)
300#define banshee2D_clip0Max          (0x00c/4)
301#define banshee2D_dstBaseAddr       (0x010/4)
302#define banshee2D_dstFormat         (0x014/4)
303#define banshee2D_srcColorkeyMin    (0x018/4)
304#define banshee2D_srcColorkeyMax    (0x01c/4)
305#define banshee2D_dstColorkeyMin    (0x020/4)
306#define banshee2D_dstColorkeyMax    (0x024/4)
307#define banshee2D_bresError0        (0x028/4)
308#define banshee2D_bresError1        (0x02c/4)
309#define banshee2D_rop               (0x030/4)
310#define banshee2D_srcBaseAddr       (0x034/4)
311#define banshee2D_commandExtra      (0x038/4)
312#define banshee2D_lineStipple       (0x03c/4)
313#define banshee2D_lineStyle         (0x040/4)
314#define banshee2D_pattern0Alias     (0x044/4)
315#define banshee2D_pattern1Alias     (0x048/4)
316#define banshee2D_clip1Min          (0x04c/4)
317#define banshee2D_clip1Max          (0x050/4)
318#define banshee2D_srcFormat         (0x054/4)
319#define banshee2D_srcSize           (0x058/4)
320#define banshee2D_srcXY             (0x05c/4)
321#define banshee2D_colorBack         (0x060/4)
322#define banshee2D_colorFore         (0x064/4)
323#define banshee2D_dstSize           (0x068/4)
324#define banshee2D_dstXY             (0x06c/4)
325#define banshee2D_command           (0x070/4)
326
327
328/*************************************
329 *
330 *  Alias map of the first 64
331 *  registers when remapped
332 *
333 *************************************/
334
335static const UINT8 register_alias_map[0x40] =
336{
337   status,     0x004/4,    vertexAx,   vertexAy,
338   vertexBx,   vertexBy,   vertexCx,   vertexCy,
339   startR,     dRdX,       dRdY,       startG,
340   dGdX,       dGdY,       startB,     dBdX,
341   dBdY,       startZ,     dZdX,       dZdY,
342   startA,     dAdX,       dAdY,       startS,
343   dSdX,       dSdY,       startT,     dTdX,
344   dTdY,       startW,     dWdX,       dWdY,
345
346   triangleCMD,0x084/4,    fvertexAx,  fvertexAy,
347   fvertexBx,  fvertexBy,  fvertexCx,  fvertexCy,
348   fstartR,    fdRdX,      fdRdY,      fstartG,
349   fdGdX,      fdGdY,      fstartB,    fdBdX,
350   fdBdY,      fstartZ,    fdZdX,      fdZdY,
351   fstartA,    fdAdX,      fdAdY,      fstartS,
352   fdSdX,      fdSdY,      fstartT,    fdTdX,
353   fdTdY,      fstartW,    fdWdX,      fdWdY
354};
355
356
357
358/*************************************
359 *
360 *  Table of per-register access rights
361 *
362 *************************************/
363
364static const UINT8 voodoo_register_access[0x100] =
365{
366   /* 0x000 */
367   REG_RP,     0,          REG_WPF,    REG_WPF,
368   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
369   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
370   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
371
372   /* 0x040 */
373   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
374   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
375   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
376   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
377
378   /* 0x080 */
379   REG_WPF,    0,          REG_WPF,    REG_WPF,
380   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
381   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
382   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
383
384   /* 0x0c0 */
385   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
386   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
387   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
388   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
389
390   /* 0x100 */
391   REG_WPF,    REG_RWPF,   REG_RWPF,   REG_RWPF,
392   REG_RWF,    REG_RWF,    REG_RWF,    REG_RWF,
393   REG_WF,     REG_WF,     REG_WF,     REG_WF,
394   REG_WF,     REG_WF,     0,          0,
395
396   /* 0x140 */
397   REG_RWF,    REG_RWF,    REG_RWF,    REG_R,
398   REG_R,      REG_R,      REG_R,      REG_R,
399   REG_WF,     REG_WF,     REG_WF,     REG_WF,
400   REG_WF,     REG_WF,     REG_WF,     REG_WF,
401
402   /* 0x180 */
403   REG_WF,     REG_WF,     REG_WF,     REG_WF,
404   REG_WF,     REG_WF,     REG_WF,     REG_WF,
405   REG_WF,     REG_WF,     REG_WF,     REG_WF,
406   REG_WF,     REG_WF,     REG_WF,     REG_WF,
407
408   /* 0x1c0 */
409   REG_WF,     REG_WF,     REG_WF,     REG_WF,
410   REG_WF,     REG_WF,     REG_WF,     REG_WF,
411   0,          0,          0,          0,
412   0,          0,          0,          0,
413
414   /* 0x200 */
415   REG_RW,     REG_R,      REG_RW,     REG_RW,
416   REG_RW,     REG_RW,     REG_RW,     REG_RW,
417   REG_W,      REG_W,      REG_W,      REG_W,
418   REG_W,      0,          0,          0,
419
420   /* 0x240 */
421   0,          0,          0,          0,
422   0,          0,          0,          0,
423   0,          0,          0,          0,
424   0,          0,          0,          0,
425
426   /* 0x280 */
427   0,          0,          0,          0,
428   0,          0,          0,          0,
429   0,          0,          0,          0,
430   0,          0,          0,          0,
431
432   /* 0x2c0 */
433   0,          0,          0,          0,
434   0,          0,          0,          0,
435   0,          0,          0,          0,
436   0,          0,          0,          0,
437
438   /* 0x300 */
439   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
440   REG_WPF,    REG_WPF,    REG_WPF,    REG_WF,
441   REG_WF,     REG_WF,     REG_WF,     REG_WF,
442   REG_WF,     REG_WF,     REG_WF,     REG_WF,
443
444   /* 0x340 */
445   REG_WF,     REG_WF,     REG_WF,     REG_WF,
446   REG_WF,     REG_WF,     REG_WF,     REG_WF,
447   REG_WF,     REG_WF,     REG_WF,     REG_WF,
448   REG_WF,     REG_WF,     REG_WF,     REG_WF,
449
450   /* 0x380 */
451   REG_WF
452};
453
454
455static const UINT8 voodoo2_register_access[0x100] =
456{
457   /* 0x000 */
458   REG_RP,     REG_RWPT,   REG_WPF,    REG_WPF,
459   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
460   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
461   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
462
463   /* 0x040 */
464   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
465   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
466   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
467   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
468
469   /* 0x080 */
470   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
471   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
472   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
473   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
474
475   /* 0x0c0 */
476   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
477   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
478   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
479   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
480
481   /* 0x100 */
482   REG_WPF,    REG_RWPF,   REG_RWPF,   REG_RWPF,
483   REG_RWF,    REG_RWF,    REG_RWF,    REG_RWF,
484   REG_WF,     REG_WF,     REG_WF,     REG_WF,
485   REG_WF,     REG_WF,     REG_WF,     REG_WF,
486
487   /* 0x140 */
488   REG_RWF,    REG_RWF,    REG_RWF,    REG_R,
489   REG_R,      REG_R,      REG_R,      REG_R,
490   REG_WF,     REG_WF,     REG_WF,     REG_WF,
491   REG_WF,     REG_WF,     REG_WF,     REG_WF,
492
493   /* 0x180 */
494   REG_WF,     REG_WF,     REG_WF,     REG_WF,
495   REG_WF,     REG_WF,     REG_WF,     REG_WF,
496   REG_WF,     REG_WF,     REG_WF,     REG_WF,
497   REG_WF,     REG_WF,     REG_WF,     REG_WF,
498
499   /* 0x1c0 */
500   REG_WF,     REG_WF,     REG_WF,     REG_WF,
501   REG_WF,     REG_WF,     REG_WF,     REG_WF,
502   REG_RWT,    REG_RWT,    REG_RWT,    REG_RWT,
503   REG_RWT,    REG_RWT,    REG_RWT,    REG_RW,
504
505   /* 0x200 */
506   REG_RWT,    REG_R,      REG_RWT,    REG_RWT,
507   REG_RWT,    REG_RWT,    REG_RWT,    REG_RWT,
508   REG_WT,     REG_WT,     REG_WF,     REG_WT,
509   REG_WT,     REG_WT,     REG_WT,     REG_WT,
510
511   /* 0x240 */
512   REG_R,      REG_RWT,    REG_RWT,    REG_RWT,
513   0,          0,          REG_R,      REG_R,
514   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
515   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
516
517   /* 0x280 */
518   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
519   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
520   REG_WPF,    REG_WPF,    0,          0,
521   0,          0,          0,          0,
522
523   /* 0x2c0 */
524   REG_RWPF,   REG_RWPF,   REG_RWPF,   REG_RWPF,
525   REG_RWPF,   REG_RWPF,   REG_RWPF,   REG_RWPF,
526   REG_RWPF,   REG_RWPF,   REG_RWPF,   REG_RWPF,
527   REG_RWPF,   REG_RWPF,   REG_RWPF,   REG_WPF,
528
529   /* 0x300 */
530   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
531   REG_WPF,    REG_WPF,    REG_WPF,    REG_WF,
532   REG_WF,     REG_WF,     REG_WF,     REG_WF,
533   REG_WF,     REG_WF,     REG_WF,     REG_WF,
534
535   /* 0x340 */
536   REG_WF,     REG_WF,     REG_WF,     REG_WF,
537   REG_WF,     REG_WF,     REG_WF,     REG_WF,
538   REG_WF,     REG_WF,     REG_WF,     REG_WF,
539   REG_WF,     REG_WF,     REG_WF,     REG_WF,
540
541   /* 0x380 */
542   REG_WF
543};
544
545
546static const UINT8 banshee_register_access[0x100] =
547{
548   /* 0x000 */
549   REG_RP,     REG_RWPT,   REG_WPF,    REG_WPF,
550   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
551   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
552   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
553
554   /* 0x040 */
555   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
556   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
557   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
558   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
559
560   /* 0x080 */
561   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
562   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
563   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
564   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
565
566   /* 0x0c0 */
567   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
568   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
569   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
570   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
571
572   /* 0x100 */
573   REG_WPF,    REG_RWPF,   REG_RWPF,   REG_RWPF,
574   REG_RWF,    REG_RWF,    REG_RWF,    REG_RWF,
575   REG_WF,     REG_WF,     REG_WF,     REG_WF,
576   REG_WF,     REG_WF,     REG_WF,     REG_WF,
577
578   /* 0x140 */
579   REG_RWF,    REG_RWF,    REG_RWF,    REG_R,
580   REG_R,      REG_R,      REG_R,      REG_R,
581   REG_WF,     REG_WF,     REG_WF,     REG_WF,
582   REG_WF,     REG_WF,     REG_WF,     REG_WF,
583
584   /* 0x180 */
585   REG_WF,     REG_WF,     REG_WF,     REG_WF,
586   REG_WF,     REG_WF,     REG_WF,     REG_WF,
587   REG_WF,     REG_WF,     REG_WF,     REG_WF,
588   REG_WF,     REG_WF,     REG_WF,     REG_WF,
589
590   /* 0x1c0 */
591   REG_WF,     REG_WF,     REG_WF,     REG_WF,
592   REG_WF,     REG_WF,     REG_WF,     REG_WF,
593   0,          0,          0,          REG_RWF,
594   REG_RWF,    REG_RWF,    REG_RWF,    0,
595
596   /* 0x200 */
597   REG_RWF,    REG_RWF,    0,          0,
598   0,          0,          0,          0,
599   0,          0,          0,          0,
600   0,          0,          0,          0,
601
602   /* 0x240 */
603   0,          0,          0,          REG_WT,
604   REG_RWF,    REG_RWF,    REG_WPF,    REG_WPF,
605   REG_WPF,    REG_WPF,    REG_R,      REG_R,
606   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
607
608   /* 0x280 */
609   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
610   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
611   REG_WPF,    REG_WPF,    0,          0,
612   0,          0,          0,          0,
613
614   /* 0x2c0 */
615   0,          0,          0,          0,
616   0,          0,          0,          0,
617   0,          0,          0,          0,
618   0,          0,          0,          0,
619
620   /* 0x300 */
621   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
622   REG_WPF,    REG_WPF,    REG_WPF,    0,
623   REG_WF,     REG_WF,     REG_WF,     REG_WF,
624   REG_WF,     REG_WF,     REG_WF,     REG_WF,
625
626   /* 0x340 */
627   REG_WF,     REG_WF,     REG_WF,     REG_WF,
628   REG_WF,     REG_WF,     REG_WF,     REG_WF,
629   REG_WF,     REG_WF,     REG_WF,     REG_WF,
630   REG_WF,     REG_WF,     REG_WF,     REG_WF,
631
632   /* 0x380 */
633   REG_WF
634};
635
636
637
638/*************************************
639 *
640 *  Register string table for debug
641 *
642 *************************************/
643
644static const char *const voodoo_reg_name[] =
645{
646   /* 0x000 */
647   "status",       "{intrCtrl}",   "vertexAx",     "vertexAy",
648   "vertexBx",     "vertexBy",     "vertexCx",     "vertexCy",
649   "startR",       "startG",       "startB",       "startZ",
650   "startA",       "startS",       "startT",       "startW",
651   /* 0x040 */
652   "dRdX",         "dGdX",         "dBdX",         "dZdX",
653   "dAdX",         "dSdX",         "dTdX",         "dWdX",
654   "dRdY",         "dGdY",         "dBdY",         "dZdY",
655   "dAdY",         "dSdY",         "dTdY",         "dWdY",
656   /* 0x080 */
657   "triangleCMD",  "reserved084",  "fvertexAx",    "fvertexAy",
658   "fvertexBx",    "fvertexBy",    "fvertexCx",    "fvertexCy",
659   "fstartR",      "fstartG",      "fstartB",      "fstartZ",
660   "fstartA",      "fstartS",      "fstartT",      "fstartW",
661   /* 0x0c0 */
662   "fdRdX",        "fdGdX",        "fdBdX",        "fdZdX",
663   "fdAdX",        "fdSdX",        "fdTdX",        "fdWdX",
664   "fdRdY",        "fdGdY",        "fdBdY",        "fdZdY",
665   "fdAdY",        "fdSdY",        "fdTdY",        "fdWdY",
666   /* 0x100 */
667   "ftriangleCMD", "fbzColorPath", "fogMode",      "alphaMode",
668   "fbzMode",      "lfbMode",      "clipLeftRight","clipLowYHighY",
669   "nopCMD",       "fastfillCMD",  "swapbufferCMD","fogColor",
670   "zaColor",      "chromaKey",    "{chromaRange}","{userIntrCMD}",
671   /* 0x140 */
672   "stipple",      "color0",       "color1",       "fbiPixelsIn",
673   "fbiChromaFail","fbiZfuncFail", "fbiAfuncFail", "fbiPixelsOut",
674   "fogTable160",  "fogTable164",  "fogTable168",  "fogTable16c",
675   "fogTable170",  "fogTable174",  "fogTable178",  "fogTable17c",
676   /* 0x180 */
677   "fogTable180",  "fogTable184",  "fogTable188",  "fogTable18c",
678   "fogTable190",  "fogTable194",  "fogTable198",  "fogTable19c",
679   "fogTable1a0",  "fogTable1a4",  "fogTable1a8",  "fogTable1ac",
680   "fogTable1b0",  "fogTable1b4",  "fogTable1b8",  "fogTable1bc",
681   /* 0x1c0 */
682   "fogTable1c0",  "fogTable1c4",  "fogTable1c8",  "fogTable1cc",
683   "fogTable1d0",  "fogTable1d4",  "fogTable1d8",  "fogTable1dc",
684   "{cmdFifoBaseAddr}","{cmdFifoBump}","{cmdFifoRdPtr}","{cmdFifoAMin}",
685   "{cmdFifoAMax}","{cmdFifoDepth}","{cmdFifoHoles}","reserved1fc",
686   /* 0x200 */
687   "fbiInit4",     "vRetrace",     "backPorch",    "videoDimensions",
688   "fbiInit0",     "fbiInit1",     "fbiInit2",     "fbiInit3",
689   "hSync",        "vSync",        "clutData",     "dacData",
690   "maxRgbDelta",  "{hBorder}",    "{vBorder}",    "{borderColor}",
691   /* 0x240 */
692   "{hvRetrace}",  "{fbiInit5}",   "{fbiInit6}",   "{fbiInit7}",
693   "reserved250",  "reserved254",  "{fbiSwapHistory}","{fbiTrianglesOut}",
694   "{sSetupMode}", "{sVx}",        "{sVy}",        "{sARGB}",
695   "{sRed}",       "{sGreen}",     "{sBlue}",      "{sAlpha}",
696   /* 0x280 */
697   "{sVz}",        "{sWb}",        "{sWtmu0}",     "{sS/Wtmu0}",
698   "{sT/Wtmu0}",   "{sWtmu1}",     "{sS/Wtmu1}",   "{sT/Wtmu1}",
699   "{sDrawTriCMD}","{sBeginTriCMD}","reserved2a8", "reserved2ac",
700   "reserved2b0",  "reserved2b4",  "reserved2b8",  "reserved2bc",
701   /* 0x2c0 */
702   "{bltSrcBaseAddr}","{bltDstBaseAddr}","{bltXYStrides}","{bltSrcChromaRange}",
703   "{bltDstChromaRange}","{bltClipX}","{bltClipY}","reserved2dc",
704   "{bltSrcXY}",   "{bltDstXY}",   "{bltSize}",    "{bltRop}",
705   "{bltColor}",   "reserved2f4",  "{bltCommand}", "{bltData}",
706   /* 0x300 */
707   "textureMode",  "tLOD",         "tDetail",      "texBaseAddr",
708   "texBaseAddr_1","texBaseAddr_2","texBaseAddr_3_8","trexInit0",
709   "trexInit1",    "nccTable0.0",  "nccTable0.1",  "nccTable0.2",
710   "nccTable0.3",  "nccTable0.4",  "nccTable0.5",  "nccTable0.6",
711   /* 0x340 */
712   "nccTable0.7",  "nccTable0.8",  "nccTable0.9",  "nccTable0.A",
713   "nccTable0.B",  "nccTable1.0",  "nccTable1.1",  "nccTable1.2",
714   "nccTable1.3",  "nccTable1.4",  "nccTable1.5",  "nccTable1.6",
715   "nccTable1.7",  "nccTable1.8",  "nccTable1.9",  "nccTable1.A",
716   /* 0x380 */
717   "nccTable1.B"
718};
719
720
721static const char *const banshee_reg_name[] =
722{
723   /* 0x000 */
724   "status",       "intrCtrl",     "vertexAx",     "vertexAy",
725   "vertexBx",     "vertexBy",     "vertexCx",     "vertexCy",
726   "startR",       "startG",       "startB",       "startZ",
727   "startA",       "startS",       "startT",       "startW",
728   /* 0x040 */
729   "dRdX",         "dGdX",         "dBdX",         "dZdX",
730   "dAdX",         "dSdX",         "dTdX",         "dWdX",
731   "dRdY",         "dGdY",         "dBdY",         "dZdY",
732   "dAdY",         "dSdY",         "dTdY",         "dWdY",
733   /* 0x080 */
734   "triangleCMD",  "reserved084",  "fvertexAx",    "fvertexAy",
735   "fvertexBx",    "fvertexBy",    "fvertexCx",    "fvertexCy",
736   "fstartR",      "fstartG",      "fstartB",      "fstartZ",
737   "fstartA",      "fstartS",      "fstartT",      "fstartW",
738   /* 0x0c0 */
739   "fdRdX",        "fdGdX",        "fdBdX",        "fdZdX",
740   "fdAdX",        "fdSdX",        "fdTdX",        "fdWdX",
741   "fdRdY",        "fdGdY",        "fdBdY",        "fdZdY",
742   "fdAdY",        "fdSdY",        "fdTdY",        "fdWdY",
743   /* 0x100 */
744   "ftriangleCMD", "fbzColorPath", "fogMode",      "alphaMode",
745   "fbzMode",      "lfbMode",      "clipLeftRight","clipLowYHighY",
746   "nopCMD",       "fastfillCMD",  "swapbufferCMD","fogColor",
747   "zaColor",      "chromaKey",    "chromaRange",  "userIntrCMD",
748   /* 0x140 */
749   "stipple",      "color0",       "color1",       "fbiPixelsIn",
750   "fbiChromaFail","fbiZfuncFail", "fbiAfuncFail", "fbiPixelsOut",
751   "fogTable160",  "fogTable164",  "fogTable168",  "fogTable16c",
752   "fogTable170",  "fogTable174",  "fogTable178",  "fogTable17c",
753   /* 0x180 */
754   "fogTable180",  "fogTable184",  "fogTable188",  "fogTable18c",
755   "fogTable190",  "fogTable194",  "fogTable198",  "fogTable19c",
756   "fogTable1a0",  "fogTable1a4",  "fogTable1a8",  "fogTable1ac",
757   "fogTable1b0",  "fogTable1b4",  "fogTable1b8",  "fogTable1bc",
758   /* 0x1c0 */
759   "fogTable1c0",  "fogTable1c4",  "fogTable1c8",  "fogTable1cc",
760   "fogTable1d0",  "fogTable1d4",  "fogTable1d8",  "fogTable1dc",
761   "reserved1e0",  "reserved1e4",  "reserved1e8",  "colBufferAddr",
762   "colBufferStride","auxBufferAddr","auxBufferStride","reserved1fc",
763   /* 0x200 */
764   "clipLeftRight1","clipTopBottom1","reserved208","reserved20c",
765   "reserved210",  "reserved214",  "reserved218",  "reserved21c",
766   "reserved220",  "reserved224",  "reserved228",  "reserved22c",
767   "reserved230",  "reserved234",  "reserved238",  "reserved23c",
768   /* 0x240 */
769   "reserved240",  "reserved244",  "reserved248",  "swapPending",
770   "leftOverlayBuf","rightOverlayBuf","fbiSwapHistory","fbiTrianglesOut",
771   "sSetupMode",   "sVx",          "sVy",          "sARGB",
772   "sRed",         "sGreen",       "sBlue",        "sAlpha",
773   /* 0x280 */
774   "sVz",          "sWb",          "sWtmu0",       "sS/Wtmu0",
775   "sT/Wtmu0",     "sWtmu1",       "sS/Wtmu1",     "sT/Wtmu1",
776   "sDrawTriCMD",  "sBeginTriCMD", "reserved2a8",  "reserved2ac",
777   "reserved2b0",  "reserved2b4",  "reserved2b8",  "reserved2bc",
778   /* 0x2c0 */
779   "reserved2c0",  "reserved2c4",  "reserved2c8",  "reserved2cc",
780   "reserved2d0",  "reserved2d4",  "reserved2d8",  "reserved2dc",
781   "reserved2e0",  "reserved2e4",  "reserved2e8",  "reserved2ec",
782   "reserved2f0",  "reserved2f4",  "reserved2f8",  "reserved2fc",
783   /* 0x300 */
784   "textureMode",  "tLOD",         "tDetail",      "texBaseAddr",
785   "texBaseAddr_1","texBaseAddr_2","texBaseAddr_3_8","reserved31c",
786   "trexInit1",    "nccTable0.0",  "nccTable0.1",  "nccTable0.2",
787   "nccTable0.3",  "nccTable0.4",  "nccTable0.5",  "nccTable0.6",
788   /* 0x340 */
789   "nccTable0.7",  "nccTable0.8",  "nccTable0.9",  "nccTable0.A",
790   "nccTable0.B",  "nccTable1.0",  "nccTable1.1",  "nccTable1.2",
791   "nccTable1.3",  "nccTable1.4",  "nccTable1.5",  "nccTable1.6",
792   "nccTable1.7",  "nccTable1.8",  "nccTable1.9",  "nccTable1.A",
793   /* 0x380 */
794   "nccTable1.B"
795};
796
797
798
799/*************************************
800 *
801 *  Voodoo Banshee I/O space registers
802 *
803 *************************************/
804
805/* 0x000 */
806#define io_status                       (0x000/4)   /*  */
807#define io_pciInit0                     (0x004/4)   /*  */
808#define io_sipMonitor                   (0x008/4)   /*  */
809#define io_lfbMemoryConfig              (0x00c/4)   /*  */
810#define io_miscInit0                    (0x010/4)   /*  */
811#define io_miscInit1                    (0x014/4)   /*  */
812#define io_dramInit0                    (0x018/4)   /*  */
813#define io_dramInit1                    (0x01c/4)   /*  */
814#define io_agpInit                      (0x020/4)   /*  */
815#define io_tmuGbeInit                   (0x024/4)   /*  */
816#define io_vgaInit0                     (0x028/4)   /*  */
817#define io_vgaInit1                     (0x02c/4)   /*  */
818#define io_dramCommand                  (0x030/4)   /*  */
819#define io_dramData                     (0x034/4)   /*  */
820
821/* 0x040 */
822#define io_pllCtrl0                     (0x040/4)   /*  */
823#define io_pllCtrl1                     (0x044/4)   /*  */
824#define io_pllCtrl2                     (0x048/4)   /*  */
825#define io_dacMode                      (0x04c/4)   /*  */
826#define io_dacAddr                      (0x050/4)   /*  */
827#define io_dacData                      (0x054/4)   /*  */
828#define io_rgbMaxDelta                  (0x058/4)   /*  */
829#define io_vidProcCfg                   (0x05c/4)   /*  */
830#define io_hwCurPatAddr                 (0x060/4)   /*  */
831#define io_hwCurLoc                     (0x064/4)   /*  */
832#define io_hwCurC0                      (0x068/4)   /*  */
833#define io_hwCurC1                      (0x06c/4)   /*  */
834#define io_vidInFormat                  (0x070/4)   /*  */
835#define io_vidInStatus                  (0x074/4)   /*  */
836#define io_vidSerialParallelPort        (0x078/4)   /*  */
837#define io_vidInXDecimDeltas            (0x07c/4)   /*  */
838
839/* 0x080 */
840#define io_vidInDecimInitErrs           (0x080/4)   /*  */
841#define io_vidInYDecimDeltas            (0x084/4)   /*  */
842#define io_vidPixelBufThold             (0x088/4)   /*  */
843#define io_vidChromaMin                 (0x08c/4)   /*  */
844#define io_vidChromaMax                 (0x090/4)   /*  */
845#define io_vidCurrentLine               (0x094/4)   /*  */
846#define io_vidScreenSize                (0x098/4)   /*  */
847#define io_vidOverlayStartCoords        (0x09c/4)   /*  */
848#define io_vidOverlayEndScreenCoord     (0x0a0/4)   /*  */
849#define io_vidOverlayDudx               (0x0a4/4)   /*  */
850#define io_vidOverlayDudxOffsetSrcWidth (0x0a8/4)   /*  */
851#define io_vidOverlayDvdy               (0x0ac/4)   /*  */
852#define io_vgab0                        (0x0b0/4)   /*  */
853#define io_vgab4                        (0x0b4/4)   /*  */
854#define io_vgab8                        (0x0b8/4)   /*  */
855#define io_vgabc                        (0x0bc/4)   /*  */
856
857/* 0x0c0 */
858#define io_vgac0                        (0x0c0/4)   /*  */
859#define io_vgac4                        (0x0c4/4)   /*  */
860#define io_vgac8                        (0x0c8/4)   /*  */
861#define io_vgacc                        (0x0cc/4)   /*  */
862#define io_vgad0                        (0x0d0/4)   /*  */
863#define io_vgad4                        (0x0d4/4)   /*  */
864#define io_vgad8                        (0x0d8/4)   /*  */
865#define io_vgadc                        (0x0dc/4)   /*  */
866#define io_vidOverlayDvdyOffset         (0x0e0/4)   /*  */
867#define io_vidDesktopStartAddr          (0x0e4/4)   /*  */
868#define io_vidDesktopOverlayStride      (0x0e8/4)   /*  */
869#define io_vidInAddr0                   (0x0ec/4)   /*  */
870#define io_vidInAddr1                   (0x0f0/4)   /*  */
871#define io_vidInAddr2                   (0x0f4/4)   /*  */
872#define io_vidInStride                  (0x0f8/4)   /*  */
873#define io_vidCurrOverlayStartAddr      (0x0fc/4)   /*  */
874
875
876
877/*************************************
878 *
879 *  Register string table for debug
880 *
881 *************************************/
882
883static const char *const banshee_io_reg_name[] =
884{
885   /* 0x000 */
886   "status",       "pciInit0",     "sipMonitor",   "lfbMemoryConfig",
887   "miscInit0",    "miscInit1",    "dramInit0",    "dramInit1",
888   "agpInit",      "tmuGbeInit",   "vgaInit0",     "vgaInit1",
889   "dramCommand",  "dramData",     "reserved38",   "reserved3c",
890
891   /* 0x040 */
892   "pllCtrl0",     "pllCtrl1",     "pllCtrl2",     "dacMode",
893   "dacAddr",      "dacData",      "rgbMaxDelta",  "vidProcCfg",
894   "hwCurPatAddr", "hwCurLoc",     "hwCurC0",      "hwCurC1",
895   "vidInFormat",  "vidInStatus",  "vidSerialParallelPort","vidInXDecimDeltas",
896
897   /* 0x080 */
898   "vidInDecimInitErrs","vidInYDecimDeltas","vidPixelBufThold","vidChromaMin",
899   "vidChromaMax", "vidCurrentLine","vidScreenSize","vidOverlayStartCoords",
900   "vidOverlayEndScreenCoord","vidOverlayDudx","vidOverlayDudxOffsetSrcWidth","vidOverlayDvdy",
901   "vga[b0]",      "vga[b4]",      "vga[b8]",      "vga[bc]",
902
903   /* 0x0c0 */
904   "vga[c0]",      "vga[c4]",      "vga[c8]",      "vga[cc]",
905   "vga[d0]",      "vga[d4]",      "vga[d8]",      "vga[dc]",
906   "vidOverlayDvdyOffset","vidDesktopStartAddr","vidDesktopOverlayStride","vidInAddr0",
907   "vidInAddr1",   "vidInAddr2",   "vidInStride",  "vidCurrOverlayStartAddr"
908};
909
910
911
912/*************************************
913 *
914 *  Voodoo Banshee AGP space registers
915 *
916 *************************************/
917
918/* 0x000 */
919#define agpReqSize              (0x000/4)   /*  */
920#define agpHostAddressLow       (0x004/4)   /*  */
921#define agpHostAddressHigh      (0x008/4)   /*  */
922#define agpGraphicsAddress      (0x00c/4)   /*  */
923#define agpGraphicsStride       (0x010/4)   /*  */
924#define agpMoveCMD              (0x014/4)   /*  */
925#define cmdBaseAddr0            (0x020/4)   /*  */
926#define cmdBaseSize0            (0x024/4)   /*  */
927#define cmdBump0                (0x028/4)   /*  */
928#define cmdRdPtrL0              (0x02c/4)   /*  */
929#define cmdRdPtrH0              (0x030/4)   /*  */
930#define cmdAMin0                (0x034/4)   /*  */
931#define cmdAMax0                (0x03c/4)   /*  */
932
933/* 0x040 */
934#define cmdFifoDepth0           (0x044/4)   /*  */
935#define cmdHoleCnt0             (0x048/4)   /*  */
936#define cmdBaseAddr1            (0x050/4)   /*  */
937#define cmdBaseSize1            (0x054/4)   /*  */
938#define cmdBump1                (0x058/4)   /*  */
939#define cmdRdPtrL1              (0x05c/4)   /*  */
940#define cmdRdPtrH1              (0x060/4)   /*  */
941#define cmdAMin1                (0x064/4)   /*  */
942#define cmdAMax1                (0x06c/4)   /*  */
943#define cmdFifoDepth1           (0x074/4)   /*  */
944#define cmdHoleCnt1             (0x078/4)   /*  */
945
946/* 0x080 */
947#define cmdFifoThresh           (0x080/4)   /*  */
948#define cmdHoleInt              (0x084/4)   /*  */
949
950/* 0x100 */
951#define yuvBaseAddress          (0x100/4)   /*  */
952#define yuvStride               (0x104/4)   /*  */
953#define crc1                    (0x120/4)   /*  */
954#define crc2                    (0x130/4)   /*  */
955
956
957
958/*************************************
959 *
960 *  Register string table for debug
961 *
962 *************************************/
963
964static const char *const banshee_agp_reg_name[] =
965{
966   /* 0x000 */
967   "agpReqSize",   "agpHostAddressLow","agpHostAddressHigh","agpGraphicsAddress",
968   "agpGraphicsStride","agpMoveCMD","reserved18",  "reserved1c",
969   "cmdBaseAddr0", "cmdBaseSize0", "cmdBump0",     "cmdRdPtrL0",
970   "cmdRdPtrH0",   "cmdAMin0",     "reserved38",   "cmdAMax0",
971
972   /* 0x040 */
973   "reserved40",   "cmdFifoDepth0","cmdHoleCnt0",  "reserved4c",
974   "cmdBaseAddr1", "cmdBaseSize1", "cmdBump1",     "cmdRdPtrL1",
975   "cmdRdPtrH1",   "cmdAMin1",     "reserved68",   "cmdAMax1",
976   "reserved70",   "cmdFifoDepth1","cmdHoleCnt1",  "reserved7c",
977
978   /* 0x080 */
979   "cmdFifoThresh","cmdHoleInt",   "reserved88",   "reserved8c",
980   "reserved90",   "reserved94",   "reserved98",   "reserved9c",
981   "reserveda0",   "reserveda4",   "reserveda8",   "reservedac",
982   "reservedb0",   "reservedb4",   "reservedb8",   "reservedbc",
983
984   /* 0x0c0 */
985   "reservedc0",   "reservedc4",   "reservedc8",   "reservedcc",
986   "reservedd0",   "reservedd4",   "reservedd8",   "reserveddc",
987   "reservede0",   "reservede4",   "reservede8",   "reservedec",
988   "reservedf0",   "reservedf4",   "reservedf8",   "reservedfc",
989
990   /* 0x100 */
991   "yuvBaseAddress","yuvStride",   "reserved108",  "reserved10c",
992   "reserved110",  "reserved114",  "reserved118",  "reserved11c",
993   "crc1",         "reserved124",  "reserved128",  "reserved12c",
994   "crc2",         "reserved134",  "reserved138",  "reserved13c"
995};
996
997
998
999/*************************************
1000 *
1001 *  Dithering tables
1002 *
1003 *************************************/
1004
1005static const UINT8 dither_matrix_4x4[16] =
1006{
1007      0,  8,  2, 10,
1008   12,  4, 14,  6,
1009      3, 11,  1,  9,
1010   15,  7, 13,  5
1011};
1012
1013static const UINT8 dither_matrix_2x2[16] =
1014{
1015      2, 10,  2, 10,
1016   14,  6, 14,  6,
1017      2, 10,  2, 10,
1018   14,  6, 14,  6
1019};
1020
1021
1022
1023/*************************************
1024 *
1025 *  Macros for extracting pixels
1026 *
1027 *************************************/
1028
1029#define EXTRACT_565_TO_888(val, a, b, c)                    \
1030   (a) = (((val) >> 8) & 0xf8) | (((val) >> 13) & 0x07);   \
1031   (b) = (((val) >> 3) & 0xfc) | (((val) >> 9) & 0x03);    \
1032   (c) = (((val) << 3) & 0xf8) | (((val) >> 2) & 0x07);
1033#define EXTRACT_x555_TO_888(val, a, b, c)                   \
1034   (a) = (((val) >> 7) & 0xf8) | (((val) >> 12) & 0x07);   \
1035   (b) = (((val) >> 2) & 0xf8) | (((val) >> 7) & 0x07);    \
1036   (c) = (((val) << 3) & 0xf8) | (((val) >> 2) & 0x07);
1037#define EXTRACT_555x_TO_888(val, a, b, c)                   \
1038   (a) = (((val) >> 8) & 0xf8) | (((val) >> 13) & 0x07);   \
1039   (b) = (((val) >> 3) & 0xf8) | (((val) >> 8) & 0x07);    \
1040   (c) = (((val) << 2) & 0xf8) | (((val) >> 3) & 0x07);
1041#define EXTRACT_1555_TO_8888(val, a, b, c, d)               \
1042   (a) = ((INT16)(val) >> 15) & 0xff;                      \
1043   EXTRACT_x555_TO_888(val, b, c, d)
1044#define EXTRACT_5551_TO_8888(val, a, b, c, d)               \
1045   EXTRACT_555x_TO_888(val, a, b, c)                       \
1046   (d) = ((val) & 0x0001) ? 0xff : 0x00;
1047#define EXTRACT_x888_TO_888(val, a, b, c)                   \
1048   (a) = ((val) >> 16) & 0xff;                             \
1049   (b) = ((val) >> 8) & 0xff;                              \
1050   (c) = ((val) >> 0) & 0xff;
1051#define EXTRACT_888x_TO_888(val, a, b, c)                   \
1052   (a) = ((val) >> 24) & 0xff;                             \
1053   (b) = ((val) >> 16) & 0xff;                             \
1054   (c) = ((val) >> 8) & 0xff;
1055#define EXTRACT_8888_TO_8888(val, a, b, c, d)               \
1056   (a) = ((val) >> 24) & 0xff;                             \
1057   (b) = ((val) >> 16) & 0xff;                             \
1058   (c) = ((val) >> 8) & 0xff;                              \
1059   (d) = ((val) >> 0) & 0xff;
1060#define EXTRACT_4444_TO_8888(val, a, b, c, d)               \
1061   (a) = (((val) >> 8) & 0xf0) | (((val) >> 12) & 0x0f);   \
1062   (b) = (((val) >> 4) & 0xf0) | (((val) >> 8) & 0x0f);    \
1063   (c) = (((val) >> 0) & 0xf0) | (((val) >> 4) & 0x0f);    \
1064   (d) = (((val) << 4) & 0xf0) | (((val) >> 0) & 0x0f);
1065#define EXTRACT_332_TO_888(val, a, b, c)                    \
1066   (a) = (((val) >> 0) & 0xe0) | (((val) >> 3) & 0x1c) | (((val) >> 6) & 0x03); \
1067   (b) = (((val) << 3) & 0xe0) | (((val) >> 0) & 0x1c) | (((val) >> 3) & 0x03); \
1068   (c) = (((val) << 6) & 0xc0) | (((val) << 4) & 0x30) | (((val) << 2) & 0x0c) | (((val) << 0) & 0x03);
1069
1070
1071/*************************************
1072 *
1073 *  Misc. macros
1074 *
1075 *************************************/
1076
1077/* macro for clamping a value between minimum and maximum values */
1078#define CLAMP(val,min,max)      do { if ((val) < (min)) { (val) = (min); } else if ((val) > (max)) { (val) = (max); } } while (0)
1079
1080/* macro to compute the base 2 log for LOD calculations */
1081#define LOGB2(x)                (log((double)(x)) / log(2.0))
1082
1083
1084
1085/*************************************
1086 *
1087 *  Macros for extracting bitfields
1088 *
1089 *************************************/
1090
1091#define INITEN_ENABLE_HW_INIT(val)          (((val) >> 0) & 1)
1092#define INITEN_ENABLE_PCI_FIFO(val)         (((val) >> 1) & 1)
1093#define INITEN_REMAP_INIT_TO_DAC(val)       (((val) >> 2) & 1)
1094#define INITEN_ENABLE_SNOOP0(val)           (((val) >> 4) & 1)
1095#define INITEN_SNOOP0_MEMORY_MATCH(val)     (((val) >> 5) & 1)
1096#define INITEN_SNOOP0_READWRITE_MATCH(val)  (((val) >> 6) & 1)
1097#define INITEN_ENABLE_SNOOP1(val)           (((val) >> 7) & 1)
1098#define INITEN_SNOOP1_MEMORY_MATCH(val)     (((val) >> 8) & 1)
1099#define INITEN_SNOOP1_READWRITE_MATCH(val)  (((val) >> 9) & 1)
1100#define INITEN_SLI_BUS_OWNER(val)           (((val) >> 10) & 1)
1101#define INITEN_SLI_ODD_EVEN(val)            (((val) >> 11) & 1)
1102#define INITEN_SECONDARY_REV_ID(val)        (((val) >> 12) & 0xf)   /* voodoo 2 only */
1103#define INITEN_MFCTR_FAB_ID(val)            (((val) >> 16) & 0xf)   /* voodoo 2 only */
1104#define INITEN_ENABLE_PCI_INTERRUPT(val)    (((val) >> 20) & 1)     /* voodoo 2 only */
1105#define INITEN_PCI_INTERRUPT_TIMEOUT(val)   (((val) >> 21) & 1)     /* voodoo 2 only */
1106#define INITEN_ENABLE_NAND_TREE_TEST(val)   (((val) >> 22) & 1)     /* voodoo 2 only */
1107#define INITEN_ENABLE_SLI_ADDRESS_SNOOP(val) (((val) >> 23) & 1)    /* voodoo 2 only */
1108#define INITEN_SLI_SNOOP_ADDRESS(val)       (((val) >> 24) & 0xff)  /* voodoo 2 only */
1109
1110#define FBZCP_CC_RGBSELECT(val)             (((val) >> 0) & 3)
1111#define FBZCP_CC_ASELECT(val)               (((val) >> 2) & 3)
1112#define FBZCP_CC_LOCALSELECT(val)           (((val) >> 4) & 1)
1113#define FBZCP_CCA_LOCALSELECT(val)          (((val) >> 5) & 3)
1114#define FBZCP_CC_LOCALSELECT_OVERRIDE(val)  (((val) >> 7) & 1)
1115#define FBZCP_CC_ZERO_OTHER(val)            (((val) >> 8) & 1)
1116#define FBZCP_CC_SUB_CLOCAL(val)            (((val) >> 9) & 1)
1117#define FBZCP_CC_MSELECT(val)               (((val) >> 10) & 7)
1118#define FBZCP_CC_REVERSE_BLEND(val)         (((val) >> 13) & 1)
1119#define FBZCP_CC_ADD_ACLOCAL(val)           (((val) >> 14) & 3)
1120#define FBZCP_CC_INVERT_OUTPUT(val)         (((val) >> 16) & 1)
1121#define FBZCP_CCA_ZERO_OTHER(val)           (((val) >> 17) & 1)
1122#define FBZCP_CCA_SUB_CLOCAL(val)           (((val) >> 18) & 1)
1123#define FBZCP_CCA_MSELECT(val)              (((val) >> 19) & 7)
1124#define FBZCP_CCA_REVERSE_BLEND(val)        (((val) >> 22) & 1)
1125#define FBZCP_CCA_ADD_ACLOCAL(val)          (((val) >> 23) & 3)
1126#define FBZCP_CCA_INVERT_OUTPUT(val)        (((val) >> 25) & 1)
1127#define FBZCP_CCA_SUBPIXEL_ADJUST(val)      (((val) >> 26) & 1)
1128#define FBZCP_TEXTURE_ENABLE(val)           (((val) >> 27) & 1)
1129#define FBZCP_RGBZW_CLAMP(val)              (((val) >> 28) & 1)     /* voodoo 2 only */
1130#define FBZCP_ANTI_ALIAS(val)               (((val) >> 29) & 1)     /* voodoo 2 only */
1131
1132#define ALPHAMODE_ALPHATEST(val)            (((val) >> 0) & 1)
1133#define ALPHAMODE_ALPHAFUNCTION(val)        (((val) >> 1) & 7)
1134#define ALPHAMODE_ALPHABLEND(val)           (((val) >> 4) & 1)
1135#define ALPHAMODE_ANTIALIAS(val)            (((val) >> 5) & 1)
1136#define ALPHAMODE_SRCRGBBLEND(val)          (((val) >> 8) & 15)
1137#define ALPHAMODE_DSTRGBBLEND(val)          (((val) >> 12) & 15)
1138#define ALPHAMODE_SRCALPHABLEND(val)        (((val) >> 16) & 15)
1139#define ALPHAMODE_DSTALPHABLEND(val)        (((val) >> 20) & 15)
1140#define ALPHAMODE_ALPHAREF(val)             (((val) >> 24) & 0xff)
1141
1142#define FOGMODE_ENABLE_FOG(val)             (((val) >> 0) & 1)
1143#define FOGMODE_FOG_ADD(val)                (((val) >> 1) & 1)
1144#define FOGMODE_FOG_MULT(val)               (((val) >> 2) & 1)
1145#define FOGMODE_FOG_ZALPHA(val)             (((val) >> 3) & 3)
1146#define FOGMODE_FOG_CONSTANT(val)           (((val) >> 5) & 1)
1147#define FOGMODE_FOG_DITHER(val)             (((val) >> 6) & 1)      /* voodoo 2 only */
1148#define FOGMODE_FOG_ZONES(val)              (((val) >> 7) & 1)      /* voodoo 2 only */
1149
1150#define FBZMODE_ENABLE_CLIPPING(val)        (((val) >> 0) & 1)
1151#define FBZMODE_ENABLE_CHROMAKEY(val)       (((val) >> 1) & 1)
1152#define FBZMODE_ENABLE_STIPPLE(val)         (((val) >> 2) & 1)
1153#define FBZMODE_WBUFFER_SELECT(val)         (((val) >> 3) & 1)
1154#define FBZMODE_ENABLE_DEPTHBUF(val)        (((val) >> 4) & 1)
1155#define FBZMODE_DEPTH_FUNCTION(val)         (((val) >> 5) & 7)
1156#define FBZMODE_ENABLE_DITHERING(val)       (((val) >> 8) & 1)
1157#define FBZMODE_RGB_BUFFER_MASK(val)        (((val) >> 9) & 1)
1158#define FBZMODE_AUX_BUFFER_MASK(val)        (((val) >> 10) & 1)
1159#define FBZMODE_DITHER_TYPE(val)            (((val) >> 11) & 1)
1160#define FBZMODE_STIPPLE_PATTERN(val)        (((val) >> 12) & 1)
1161#define FBZMODE_ENABLE_ALPHA_MASK(val)      (((val) >> 13) & 1)
1162#define FBZMODE_DRAW_BUFFER(val)            (((val) >> 14) & 3)
1163#define FBZMODE_ENABLE_DEPTH_BIAS(val)      (((val) >> 16) & 1)
1164#define FBZMODE_Y_ORIGIN(val)               (((val) >> 17) & 1)
1165#define FBZMODE_ENABLE_ALPHA_PLANES(val)    (((val) >> 18) & 1)
1166#define FBZMODE_ALPHA_DITHER_SUBTRACT(val)  (((val) >> 19) & 1)
1167#define FBZMODE_DEPTH_SOURCE_COMPARE(val)   (((val) >> 20) & 1)
1168#define FBZMODE_DEPTH_FLOAT_SELECT(val)     (((val) >> 21) & 1)     /* voodoo 2 only */
1169
1170#define LFBMODE_WRITE_FORMAT(val)           (((val) >> 0) & 0xf)
1171#define LFBMODE_WRITE_BUFFER_SELECT(val)    (((val) >> 4) & 3)
1172#define LFBMODE_READ_BUFFER_SELECT(val)     (((val) >> 6) & 3)
1173#define LFBMODE_ENABLE_PIXEL_PIPELINE(val)  (((val) >> 8) & 1)
1174#define LFBMODE_RGBA_LANES(val)             (((val) >> 9) & 3)
1175#define LFBMODE_WORD_SWAP_WRITES(val)       (((val) >> 11) & 1)
1176#define LFBMODE_BYTE_SWIZZLE_WRITES(val)    (((val) >> 12) & 1)
1177#define LFBMODE_Y_ORIGIN(val)               (((val) >> 13) & 1)
1178#define LFBMODE_WRITE_W_SELECT(val)         (((val) >> 14) & 1)
1179#define LFBMODE_WORD_SWAP_READS(val)        (((val) >> 15) & 1)
1180#define LFBMODE_BYTE_SWIZZLE_READS(val)     (((val) >> 16) & 1)
1181
1182#define CHROMARANGE_BLUE_EXCLUSIVE(val)     (((val) >> 24) & 1)
1183#define CHROMARANGE_GREEN_EXCLUSIVE(val)    (((val) >> 25) & 1)
1184#define CHROMARANGE_RED_EXCLUSIVE(val)      (((val) >> 26) & 1)
1185#define CHROMARANGE_UNION_MODE(val)         (((val) >> 27) & 1)
1186#define CHROMARANGE_ENABLE(val)             (((val) >> 28) & 1)
1187
1188#define FBIINIT0_VGA_PASSTHRU(val)          (((val) >> 0) & 1)
1189#define FBIINIT0_GRAPHICS_RESET(val)        (((val) >> 1) & 1)
1190#define FBIINIT0_FIFO_RESET(val)            (((val) >> 2) & 1)
1191#define FBIINIT0_SWIZZLE_REG_WRITES(val)    (((val) >> 3) & 1)
1192#define FBIINIT0_STALL_PCIE_FOR_HWM(val)    (((val) >> 4) & 1)
1193#define FBIINIT0_PCI_FIFO_LWM(val)          (((val) >> 6) & 0x1f)
1194#define FBIINIT0_LFB_TO_MEMORY_FIFO(val)    (((val) >> 11) & 1)
1195#define FBIINIT0_TEXMEM_TO_MEMORY_FIFO(val) (((val) >> 12) & 1)
1196#define FBIINIT0_ENABLE_MEMORY_FIFO(val)    (((val) >> 13) & 1)
1197#define FBIINIT0_MEMORY_FIFO_HWM(val)       (((val) >> 14) & 0x7ff)
1198#define FBIINIT0_MEMORY_FIFO_BURST(val)     (((val) >> 25) & 0x3f)
1199
1200#define FBIINIT1_PCI_DEV_FUNCTION(val)      (((val) >> 0) & 1)
1201#define FBIINIT1_PCI_WRITE_WAIT_STATES(val) (((val) >> 1) & 1)
1202#define FBIINIT1_MULTI_SST1(val)            (((val) >> 2) & 1)      /* not on voodoo 2 */
1203#define FBIINIT1_ENABLE_LFB(val)            (((val) >> 3) & 1)
1204#define FBIINIT1_X_VIDEO_TILES(val)         (((val) >> 4) & 0xf)
1205#define FBIINIT1_VIDEO_TIMING_RESET(val)    (((val) >> 8) & 1)
1206#define FBIINIT1_SOFTWARE_OVERRIDE(val)     (((val) >> 9) & 1)
1207#define FBIINIT1_SOFTWARE_HSYNC(val)        (((val) >> 10) & 1)
1208#define FBIINIT1_SOFTWARE_VSYNC(val)        (((val) >> 11) & 1)
1209#define FBIINIT1_SOFTWARE_BLANK(val)        (((val) >> 12) & 1)
1210#define FBIINIT1_DRIVE_VIDEO_TIMING(val)    (((val) >> 13) & 1)
1211#define FBIINIT1_DRIVE_VIDEO_BLANK(val)     (((val) >> 14) & 1)
1212#define FBIINIT1_DRIVE_VIDEO_SYNC(val)      (((val) >> 15) & 1)
1213#define FBIINIT1_DRIVE_VIDEO_DCLK(val)      (((val) >> 16) & 1)
1214#define FBIINIT1_VIDEO_TIMING_VCLK(val)     (((val) >> 17) & 1)
1215#define FBIINIT1_VIDEO_CLK_2X_DELAY(val)    (((val) >> 18) & 3)
1216#define FBIINIT1_VIDEO_TIMING_SOURCE(val)   (((val) >> 20) & 3)
1217#define FBIINIT1_ENABLE_24BPP_OUTPUT(val)   (((val) >> 22) & 1)
1218#define FBIINIT1_ENABLE_SLI(val)            (((val) >> 23) & 1)
1219#define FBIINIT1_X_VIDEO_TILES_BIT5(val)    (((val) >> 24) & 1)     /* voodoo 2 only */
1220#define FBIINIT1_ENABLE_EDGE_FILTER(val)    (((val) >> 25) & 1)
1221#define FBIINIT1_INVERT_VID_CLK_2X(val)     (((val) >> 26) & 1)
1222#define FBIINIT1_VID_CLK_2X_SEL_DELAY(val)  (((val) >> 27) & 3)
1223#define FBIINIT1_VID_CLK_DELAY(val)         (((val) >> 29) & 3)
1224#define FBIINIT1_DISABLE_FAST_READAHEAD(val) (((val) >> 31) & 1)
1225
1226#define FBIINIT2_DISABLE_DITHER_SUB(val)    (((val) >> 0) & 1)
1227#define FBIINIT2_DRAM_BANKING(val)          (((val) >> 1) & 1)
1228#define FBIINIT2_ENABLE_TRIPLE_BUF(val)     (((val) >> 4) & 1)
1229#define FBIINIT2_ENABLE_FAST_RAS_READ(val)  (((val) >> 5) & 1)
1230#define FBIINIT2_ENABLE_GEN_DRAM_OE(val)    (((val) >> 6) & 1)
1231#define FBIINIT2_ENABLE_FAST_READWRITE(val) (((val) >> 7) & 1)
1232#define FBIINIT2_ENABLE_PASSTHRU_DITHER(val) (((val) >> 8) & 1)
1233#define FBIINIT2_SWAP_BUFFER_ALGORITHM(val) (((val) >> 9) & 3)
1234#define FBIINIT2_VIDEO_BUFFER_OFFSET(val)   (((val) >> 11) & 0x1ff)
1235#define FBIINIT2_ENABLE_DRAM_BANKING(val)   (((val) >> 20) & 1)
1236#define FBIINIT2_ENABLE_DRAM_READ_FIFO(val) (((val) >> 21) & 1)
1237#define FBIINIT2_ENABLE_DRAM_REFRESH(val)   (((val) >> 22) & 1)
1238#define FBIINIT2_REFRESH_LOAD_VALUE(val)    (((val) >> 23) & 0x1ff)
1239
1240#define FBIINIT3_TRI_REGISTER_REMAP(val)    (((val) >> 0) & 1)
1241#define FBIINIT3_VIDEO_FIFO_THRESH(val)     (((val) >> 1) & 0x1f)
1242#define FBIINIT3_DISABLE_TMUS(val)          (((val) >> 6) & 1)
1243#define FBIINIT3_FBI_MEMORY_TYPE(val)       (((val) >> 8) & 7)
1244#define FBIINIT3_VGA_PASS_RESET_VAL(val)    (((val) >> 11) & 1)
1245#define FBIINIT3_HARDCODE_PCI_BASE(val)     (((val) >> 12) & 1)
1246#define FBIINIT3_FBI2TREX_DELAY(val)        (((val) >> 13) & 0xf)
1247#define FBIINIT3_TREX2FBI_DELAY(val)        (((val) >> 17) & 0x1f)
1248#define FBIINIT3_YORIGIN_SUBTRACT(val)      (((val) >> 22) & 0x3ff)
1249
1250#define FBIINIT4_PCI_READ_WAITS(val)        (((val) >> 0) & 1)
1251#define FBIINIT4_ENABLE_LFB_READAHEAD(val)  (((val) >> 1) & 1)
1252#define FBIINIT4_MEMORY_FIFO_LWM(val)       (((val) >> 2) & 0x3f)
1253#define FBIINIT4_MEMORY_FIFO_START_ROW(val) (((val) >> 8) & 0x3ff)
1254#define FBIINIT4_MEMORY_FIFO_STOP_ROW(val)  (((val) >> 18) & 0x3ff)
1255#define FBIINIT4_VIDEO_CLOCKING_DELAY(val)  (((val) >> 29) & 7)     /* voodoo 2 only */
1256
1257#define FBIINIT5_DISABLE_PCI_STOP(val)      (((val) >> 0) & 1)      /* voodoo 2 only */
1258#define FBIINIT5_PCI_SLAVE_SPEED(val)       (((val) >> 1) & 1)      /* voodoo 2 only */
1259#define FBIINIT5_DAC_DATA_OUTPUT_WIDTH(val) (((val) >> 2) & 1)      /* voodoo 2 only */
1260#define FBIINIT5_DAC_DATA_17_OUTPUT(val)    (((val) >> 3) & 1)      /* voodoo 2 only */
1261#define FBIINIT5_DAC_DATA_18_OUTPUT(val)    (((val) >> 4) & 1)      /* voodoo 2 only */
1262#define FBIINIT5_GENERIC_STRAPPING(val)     (((val) >> 5) & 0xf)    /* voodoo 2 only */
1263#define FBIINIT5_BUFFER_ALLOCATION(val)     (((val) >> 9) & 3)      /* voodoo 2 only */
1264#define FBIINIT5_DRIVE_VID_CLK_SLAVE(val)   (((val) >> 11) & 1)     /* voodoo 2 only */
1265#define FBIINIT5_DRIVE_DAC_DATA_16(val)     (((val) >> 12) & 1)     /* voodoo 2 only */
1266#define FBIINIT5_VCLK_INPUT_SELECT(val)     (((val) >> 13) & 1)     /* voodoo 2 only */
1267#define FBIINIT5_MULTI_CVG_DETECT(val)      (((val) >> 14) & 1)     /* voodoo 2 only */
1268#define FBIINIT5_SYNC_RETRACE_READS(val)    (((val) >> 15) & 1)     /* voodoo 2 only */
1269#define FBIINIT5_ENABLE_RHBORDER_COLOR(val) (((val) >> 16) & 1)     /* voodoo 2 only */
1270#define FBIINIT5_ENABLE_LHBORDER_COLOR(val) (((val) >> 17) & 1)     /* voodoo 2 only */
1271#define FBIINIT5_ENABLE_BVBORDER_COLOR(val) (((val) >> 18) & 1)     /* voodoo 2 only */
1272#define FBIINIT5_ENABLE_TVBORDER_COLOR(val) (((val) >> 19) & 1)     /* voodoo 2 only */
1273#define FBIINIT5_DOUBLE_HORIZ(val)          (((val) >> 20) & 1)     /* voodoo 2 only */
1274#define FBIINIT5_DOUBLE_VERT(val)           (((val) >> 21) & 1)     /* voodoo 2 only */
1275#define FBIINIT5_ENABLE_16BIT_GAMMA(val)    (((val) >> 22) & 1)     /* voodoo 2 only */
1276#define FBIINIT5_INVERT_DAC_HSYNC(val)      (((val) >> 23) & 1)     /* voodoo 2 only */
1277#define FBIINIT5_INVERT_DAC_VSYNC(val)      (((val) >> 24) & 1)     /* voodoo 2 only */
1278#define FBIINIT5_ENABLE_24BIT_DACDATA(val)  (((val) >> 25) & 1)     /* voodoo 2 only */
1279#define FBIINIT5_ENABLE_INTERLACING(val)    (((val) >> 26) & 1)     /* voodoo 2 only */
1280#define FBIINIT5_DAC_DATA_18_CONTROL(val)   (((val) >> 27) & 1)     /* voodoo 2 only */
1281#define FBIINIT5_RASTERIZER_UNIT_MODE(val)  (((val) >> 30) & 3)     /* voodoo 2 only */
1282
1283#define FBIINIT6_WINDOW_ACTIVE_COUNTER(val) (((val) >> 0) & 7)      /* voodoo 2 only */
1284#define FBIINIT6_WINDOW_DRAG_COUNTER(val)   (((val) >> 3) & 0x1f)   /* voodoo 2 only */
1285#define FBIINIT6_SLI_SYNC_MASTER(val)       (((val) >> 8) & 1)      /* voodoo 2 only */
1286#define FBIINIT6_DAC_DATA_22_OUTPUT(val)    (((val) >> 9) & 3)      /* voodoo 2 only */
1287#define FBIINIT6_DAC_DATA_23_OUTPUT(val)    (((val) >> 11) & 3)     /* voodoo 2 only */
1288#define FBIINIT6_SLI_SYNCIN_OUTPUT(val)     (((val) >> 13) & 3)     /* voodoo 2 only */
1289#define FBIINIT6_SLI_SYNCOUT_OUTPUT(val)    (((val) >> 15) & 3)     /* voodoo 2 only */
1290#define FBIINIT6_DAC_RD_OUTPUT(val)         (((val) >> 17) & 3)     /* voodoo 2 only */
1291#define FBIINIT6_DAC_WR_OUTPUT(val)         (((val) >> 19) & 3)     /* voodoo 2 only */
1292#define FBIINIT6_PCI_FIFO_LWM_RDY(val)      (((val) >> 21) & 0x7f)  /* voodoo 2 only */
1293#define FBIINIT6_VGA_PASS_N_OUTPUT(val)     (((val) >> 28) & 3)     /* voodoo 2 only */
1294#define FBIINIT6_X_VIDEO_TILES_BIT0(val)    (((val) >> 30) & 1)     /* voodoo 2 only */
1295
1296#define FBIINIT7_GENERIC_STRAPPING(val)     (((val) >> 0) & 0xff)   /* voodoo 2 only */
1297#define FBIINIT7_CMDFIFO_ENABLE(val)        (((val) >> 8) & 1)      /* voodoo 2 only */
1298#define FBIINIT7_CMDFIFO_MEMORY_STORE(val)  (((val) >> 9) & 1)      /* voodoo 2 only */
1299#define FBIINIT7_DISABLE_CMDFIFO_HOLES(val) (((val) >> 10) & 1)     /* voodoo 2 only */
1300#define FBIINIT7_CMDFIFO_READ_THRESH(val)   (((val) >> 11) & 0x1f)  /* voodoo 2 only */
1301#define FBIINIT7_SYNC_CMDFIFO_WRITES(val)   (((val) >> 16) & 1)     /* voodoo 2 only */
1302#define FBIINIT7_SYNC_CMDFIFO_READS(val)    (((val) >> 17) & 1)     /* voodoo 2 only */
1303#define FBIINIT7_RESET_PCI_PACKER(val)      (((val) >> 18) & 1)     /* voodoo 2 only */
1304#define FBIINIT7_ENABLE_CHROMA_STUFF(val)   (((val) >> 19) & 1)     /* voodoo 2 only */
1305#define FBIINIT7_CMDFIFO_PCI_TIMEOUT(val)   (((val) >> 20) & 0x7f)  /* voodoo 2 only */
1306#define FBIINIT7_ENABLE_TEXTURE_BURST(val)  (((val) >> 27) & 1)     /* voodoo 2 only */
1307
1308#define TEXMODE_ENABLE_PERSPECTIVE(val)     (((val) >> 0) & 1)
1309#define TEXMODE_MINIFICATION_FILTER(val)    (((val) >> 1) & 1)
1310#define TEXMODE_MAGNIFICATION_FILTER(val)   (((val) >> 2) & 1)
1311#define TEXMODE_CLAMP_NEG_W(val)            (((val) >> 3) & 1)
1312#define TEXMODE_ENABLE_LOD_DITHER(val)      (((val) >> 4) & 1)
1313#define TEXMODE_NCC_TABLE_SELECT(val)       (((val) >> 5) & 1)
1314#define TEXMODE_CLAMP_S(val)                (((val) >> 6) & 1)
1315#define TEXMODE_CLAMP_T(val)                (((val) >> 7) & 1)
1316#define TEXMODE_FORMAT(val)                 (((val) >> 8) & 0xf)
1317#define TEXMODE_TC_ZERO_OTHER(val)          (((val) >> 12) & 1)
1318#define TEXMODE_TC_SUB_CLOCAL(val)          (((val) >> 13) & 1)
1319#define TEXMODE_TC_MSELECT(val)             (((val) >> 14) & 7)
1320#define TEXMODE_TC_REVERSE_BLEND(val)       (((val) >> 17) & 1)
1321#define TEXMODE_TC_ADD_ACLOCAL(val)         (((val) >> 18) & 3)
1322#define TEXMODE_TC_INVERT_OUTPUT(val)       (((val) >> 20) & 1)
1323#define TEXMODE_TCA_ZERO_OTHER(val)         (((val) >> 21) & 1)
1324#define TEXMODE_TCA_SUB_CLOCAL(val)         (((val) >> 22) & 1)
1325#define TEXMODE_TCA_MSELECT(val)            (((val) >> 23) & 7)
1326#define TEXMODE_TCA_REVERSE_BLEND(val)      (((val) >> 26) & 1)
1327#define TEXMODE_TCA_ADD_ACLOCAL(val)        (((val) >> 27) & 3)
1328#define TEXMODE_TCA_INVERT_OUTPUT(val)      (((val) >> 29) & 1)
1329#define TEXMODE_TRILINEAR(val)              (((val) >> 30) & 1)
1330#define TEXMODE_SEQ_8_DOWNLD(val)           (((val) >> 31) & 1)
1331
1332#define TEXLOD_LODMIN(val)                  (((val) >> 0) & 0x3f)
1333#define TEXLOD_LODMAX(val)                  (((val) >> 6) & 0x3f)
1334#define TEXLOD_LODBIAS(val)                 (((val) >> 12) & 0x3f)
1335#define TEXLOD_LOD_ODD(val)                 (((val) >> 18) & 1)
1336#define TEXLOD_LOD_TSPLIT(val)              (((val) >> 19) & 1)
1337#define TEXLOD_LOD_S_IS_WIDER(val)          (((val) >> 20) & 1)
1338#define TEXLOD_LOD_ASPECT(val)              (((val) >> 21) & 3)
1339#define TEXLOD_LOD_ZEROFRAC(val)            (((val) >> 23) & 1)
1340#define TEXLOD_TMULTIBASEADDR(val)          (((val) >> 24) & 1)
1341#define TEXLOD_TDATA_SWIZZLE(val)           (((val) >> 25) & 1)
1342#define TEXLOD_TDATA_SWAP(val)              (((val) >> 26) & 1)
1343#define TEXLOD_TDIRECT_WRITE(val)           (((val) >> 27) & 1)     /* Voodoo 2 only */
1344
1345#define TEXDETAIL_DETAIL_MAX(val)           (((val) >> 0) & 0xff)
1346#define TEXDETAIL_DETAIL_BIAS(val)          (((val) >> 8) & 0x3f)
1347#define TEXDETAIL_DETAIL_SCALE(val)         (((val) >> 14) & 7)
1348#define TEXDETAIL_RGB_MIN_FILTER(val)       (((val) >> 17) & 1)     /* Voodoo 2 only */
1349#define TEXDETAIL_RGB_MAG_FILTER(val)       (((val) >> 18) & 1)     /* Voodoo 2 only */
1350#define TEXDETAIL_ALPHA_MIN_FILTER(val)     (((val) >> 19) & 1)     /* Voodoo 2 only */
1351#define TEXDETAIL_ALPHA_MAG_FILTER(val)     (((val) >> 20) & 1)     /* Voodoo 2 only */
1352#define TEXDETAIL_SEPARATE_RGBA_FILTER(val) (((val) >> 21) & 1)     /* Voodoo 2 only */
1353
1354#define TREXINIT_SEND_TMU_CONFIG(val)       (((val) >> 18) & 1)
1355
1356
1357/*************************************
1358 *
135916 *  Core types
136017 *
136118 *************************************/
r253153r253154
136421struct poly_extra_data;
136522
136623
1367struct rgba
1368{
1369#ifdef LSB_FIRST
1370   UINT8               b, g, r, a;
1371#else
1372   UINT8               a, r, g, b;
1373#endif
1374};
137524
137625
1377union voodoo_reg
1378{
1379   INT32               i;
1380   UINT32              u;
1381   float               f;
1382   rgba                rgb;
1383};
138426
1385
1386typedef voodoo_reg rgb_union;
1387
1388
1389struct voodoo_stats
1390{
1391   UINT8               lastkey;                /* last key state */
1392   UINT8               display;                /* display stats? */
1393   INT32               swaps;                  /* total swaps */
1394   INT32               stalls;                 /* total stalls */
1395   INT32               total_triangles;        /* total triangles */
1396   INT32               total_pixels_in;        /* total pixels in */
1397   INT32               total_pixels_out;       /* total pixels out */
1398   INT32               total_chroma_fail;      /* total chroma fail */
1399   INT32               total_zfunc_fail;       /* total z func fail */
1400   INT32               total_afunc_fail;       /* total a func fail */
1401   INT32               total_clipped;          /* total clipped */
1402   INT32               total_stippled;         /* total stippled */
1403   INT32               lfb_writes;             /* LFB writes */
1404   INT32               lfb_reads;              /* LFB reads */
1405   INT32               reg_writes;             /* register writes */
1406   INT32               reg_reads;              /* register reads */
1407   INT32               tex_writes;             /* texture writes */
1408   INT32               texture_mode[16];       /* 16 different texture modes */
1409   UINT8               render_override;        /* render override */
1410   char                buffer[1024];           /* string */
1411};
1412
1413
1414/* note that this structure is an even 64 bytes long */
1415struct stats_block
1416{
1417   INT32               pixels_in;              /* pixels in statistic */
1418   INT32               pixels_out;             /* pixels out statistic */
1419   INT32               chroma_fail;            /* chroma test fail statistic */
1420   INT32               zfunc_fail;             /* z function test fail statistic */
1421   INT32               afunc_fail;             /* alpha function test fail statistic */
1422   INT32               clip_fail;              /* clipping fail statistic */
1423   INT32               stipple_count;          /* stipple statistic */
1424   INT32               filler[64/4 - 7];       /* pad this structure to 64 bytes */
1425};
1426
1427
1428struct fifo_state
1429{
1430   UINT32 *            base;                   /* base of the FIFO */
1431   INT32               size;                   /* size of the FIFO */
1432   INT32               in;                     /* input pointer */
1433   INT32               out;                    /* output pointer */
1434};
1435
1436
1437struct cmdfifo_info
1438{
1439   UINT8               enable;                 /* enabled? */
1440   UINT8               count_holes;            /* count holes? */
1441   UINT32              base;                   /* base address in framebuffer RAM */
1442   UINT32              end;                    /* end address in framebuffer RAM */
1443   UINT32              rdptr;                  /* current read pointer */
1444   UINT32              amin;                   /* minimum address */
1445   UINT32              amax;                   /* maximum address */
1446   UINT32              depth;                  /* current depth */
1447   UINT32              holes;                  /* number of holes */
1448};
1449
1450
1451struct pci_state
1452{
1453   fifo_state          fifo;                   /* PCI FIFO */
1454   UINT32              init_enable;            /* initEnable value */
1455   UINT8               stall_state;            /* state of the system if we're stalled */
1456   UINT8               op_pending;             /* true if an operation is pending */
1457   attotime            op_end_time;            /* time when the pending operation ends */
1458   emu_timer *         continue_timer;         /* timer to use to continue processing */
1459   UINT32              fifo_mem[64*2];         /* memory backing the PCI FIFO */
1460};
1461
1462
1463struct ncc_table
1464{
1465   UINT8               dirty;                  /* is the texel lookup dirty? */
1466   voodoo_reg *        reg;                    /* pointer to our registers */
1467   INT32               ir[4], ig[4], ib[4];    /* I values for R,G,B */
1468   INT32               qr[4], qg[4], qb[4];    /* Q values for R,G,B */
1469   INT32               y[16];                  /* Y values */
1470   rgb_t *             palette;                /* pointer to associated RGB palette */
1471   rgb_t *             palettea;               /* pointer to associated ARGB palette */
1472   rgb_t               texel[256];             /* texel lookup */
1473};
1474
1475
1476struct tmu_state
1477{
1478   UINT8 *             ram;                    /* pointer to our RAM */
1479   UINT32              mask;                   /* mask to apply to pointers */
1480   voodoo_reg *        reg;                    /* pointer to our register base */
1481   UINT32              regdirty;               /* true if the LOD/mode/base registers have changed */
1482
1483   UINT32              texaddr_mask;           /* mask for texture address */
1484   UINT8               texaddr_shift;          /* shift for texture address */
1485
1486   INT64               starts, startt;         /* starting S,T (14.18) */
1487   INT64               startw;                 /* starting W (2.30) */
1488   INT64               dsdx, dtdx;             /* delta S,T per X */
1489   INT64               dwdx;                   /* delta W per X */
1490   INT64               dsdy, dtdy;             /* delta S,T per Y */
1491   INT64               dwdy;                   /* delta W per Y */
1492
1493   INT32               lodmin, lodmax;         /* min, max LOD values */
1494   INT32               lodbias;                /* LOD bias */
1495   UINT32              lodmask;                /* mask of available LODs */
1496   UINT32              lodoffset[9];           /* offset of texture base for each LOD */
1497   INT32               detailmax;              /* detail clamp */
1498   INT32               detailbias;             /* detail bias */
1499   UINT8               detailscale;            /* detail scale */
1500
1501   UINT32              wmask;                  /* mask for the current texture width */
1502   UINT32              hmask;                  /* mask for the current texture height */
1503
1504   UINT32              bilinear_mask;          /* mask for bilinear resolution (0xf0 for V1, 0xff for V2) */
1505
1506   ncc_table           ncc[2];                 /* two NCC tables */
1507
1508   rgb_t *             lookup;                 /* currently selected lookup */
1509   rgb_t *             texel[16];              /* texel lookups for each format */
1510
1511   rgb_t               palette[256];           /* palette lookup table */
1512   rgb_t               palettea[256];          /* palette+alpha lookup table */
1513};
1514
1515
1516struct tmu_shared_state
1517{
1518   rgb_t               rgb332[256];            /* RGB 3-3-2 lookup table */
1519   rgb_t               alpha8[256];            /* alpha 8-bit lookup table */
1520   rgb_t               int8[256];              /* intensity 8-bit lookup table */
1521   rgb_t               ai44[256];              /* alpha, intensity 4-4 lookup table */
1522
1523   rgb_t               rgb565[65536];          /* RGB 5-6-5 lookup table */
1524   rgb_t               argb1555[65536];        /* ARGB 1-5-5-5 lookup table */
1525   rgb_t               argb4444[65536];        /* ARGB 4-4-4-4 lookup table */
1526};
1527
1528
1529struct setup_vertex
1530{
1531   float               x, y;                   /* X, Y coordinates */
1532   float               a, r, g, b;             /* A, R, G, B values */
1533   float               z, wb;                  /* Z and broadcast W values */
1534   float               w0, s0, t0;             /* W, S, T for TMU 0 */
1535   float               w1, s1, t1;             /* W, S, T for TMU 1 */
1536};
1537
1538
1539struct fbi_state
1540{
1541   UINT8 *             ram;                    /* pointer to frame buffer RAM */
1542   UINT32              mask;                   /* mask to apply to pointers */
1543   UINT32              rgboffs[3];             /* word offset to 3 RGB buffers */
1544   UINT32              auxoffs;                /* word offset to 1 aux buffer */
1545
1546   UINT8               frontbuf;               /* front buffer index */
1547   UINT8               backbuf;                /* back buffer index */
1548   UINT8               swaps_pending;          /* number of pending swaps */
1549   UINT8               video_changed;          /* did the frontbuffer video change? */
1550
1551   UINT32              yorigin;                /* Y origin subtract value */
1552   UINT32              lfb_base;               /* base of LFB in memory */
1553   UINT8               lfb_stride;             /* stride of LFB accesses in bits */
1554
1555   UINT32              width;                  /* width of current frame buffer */
1556   UINT32              height;                 /* height of current frame buffer */
1557   UINT32              xoffs;                  /* horizontal offset (back porch) */
1558   UINT32              yoffs;                  /* vertical offset (back porch) */
1559   UINT32              vsyncscan;              /* vertical sync scanline */
1560   UINT32              rowpixels;              /* pixels per row */
1561   UINT32              tile_width;             /* width of video tiles */
1562   UINT32              tile_height;            /* height of video tiles */
1563   UINT32              x_tiles;                /* number of tiles in the X direction */
1564
1565   emu_timer *         vblank_timer;           /* VBLANK timer */
1566   UINT8               vblank;                 /* VBLANK state */
1567   UINT8               vblank_count;           /* number of VBLANKs since last swap */
1568   UINT8               vblank_swap_pending;    /* a swap is pending, waiting for a vblank */
1569   UINT8               vblank_swap;            /* swap when we hit this count */
1570   UINT8               vblank_dont_swap;       /* don't actually swap when we hit this point */
1571
1572   /* triangle setup info */
1573   UINT8               cheating_allowed;       /* allow cheating? */
1574   INT32               sign;                   /* triangle sign */
1575   INT16               ax, ay;                 /* vertex A x,y (12.4) */
1576   INT16               bx, by;                 /* vertex B x,y (12.4) */
1577   INT16               cx, cy;                 /* vertex C x,y (12.4) */
1578   INT32               startr, startg, startb, starta; /* starting R,G,B,A (12.12) */
1579   INT32               startz;                 /* starting Z (20.12) */
1580   INT64               startw;                 /* starting W (16.32) */
1581   INT32               drdx, dgdx, dbdx, dadx; /* delta R,G,B,A per X */
1582   INT32               dzdx;                   /* delta Z per X */
1583   INT64               dwdx;                   /* delta W per X */
1584   INT32               drdy, dgdy, dbdy, dady; /* delta R,G,B,A per Y */
1585   INT32               dzdy;                   /* delta Z per Y */
1586   INT64               dwdy;                   /* delta W per Y */
1587
1588   stats_block         lfb_stats;              /* LFB-access statistics */
1589
1590   UINT8               sverts;                 /* number of vertices ready */
1591   setup_vertex        svert[3];               /* 3 setup vertices */
1592
1593   fifo_state          fifo;                   /* framebuffer memory fifo */
1594   cmdfifo_info        cmdfifo[2];             /* command FIFOs */
1595
1596   UINT8               fogblend[64];           /* 64-entry fog table */
1597   UINT8               fogdelta[64];           /* 64-entry fog table */
1598   UINT8               fogdelta_mask;          /* mask for for delta (0xff for V1, 0xfc for V2) */
1599
1600   rgb_t               pen[65536];             /* mapping from pixels to pens */
1601   rgb_t               clut[512];              /* clut gamma data */
1602   UINT8               clut_dirty;             /* do we need to recompute? */
1603};
1604
1605
1606struct dac_state
1607{
1608   UINT8               reg[8];                 /* 8 registers */
1609   UINT8               read_result;            /* pending read result */
1610};
1611
1612
1613struct raster_info
1614{
1615   raster_info *       next;                   /* pointer to next entry with the same hash */
1616   poly_draw_scanline_func callback;           /* callback pointer */
1617   UINT8               is_generic;             /* TRUE if this is one of the generic rasterizers */
1618   UINT8               display;                /* display index */
1619   UINT32              hits;                   /* how many hits (pixels) we've used this for */
1620   UINT32              polys;                  /* how many polys we've used this for */
1621   UINT32              eff_color_path;         /* effective fbzColorPath value */
1622   UINT32              eff_alpha_mode;         /* effective alphaMode value */
1623   UINT32              eff_fog_mode;           /* effective fogMode value */
1624   UINT32              eff_fbz_mode;           /* effective fbzMode value */
1625   UINT32              eff_tex_mode_0;         /* effective textureMode value for TMU #0 */
1626   UINT32              eff_tex_mode_1;         /* effective textureMode value for TMU #1 */
1627   UINT32              hash;
1628};
1629
1630
1631struct poly_extra_data
1632{
1633   voodoo_state *      state;                  /* pointer back to the voodoo state */
1634   raster_info *       info;                   /* pointer to rasterizer information */
1635
1636   INT16               ax, ay;                 /* vertex A x,y (12.4) */
1637   INT32               startr, startg, startb, starta; /* starting R,G,B,A (12.12) */
1638   INT32               startz;                 /* starting Z (20.12) */
1639   INT64               startw;                 /* starting W (16.32) */
1640   INT32               drdx, dgdx, dbdx, dadx; /* delta R,G,B,A per X */
1641   INT32               dzdx;                   /* delta Z per X */
1642   INT64               dwdx;                   /* delta W per X */
1643   INT32               drdy, dgdy, dbdy, dady; /* delta R,G,B,A per Y */
1644   INT32               dzdy;                   /* delta Z per Y */
1645   INT64               dwdy;                   /* delta W per Y */
1646
1647   INT64               starts0, startt0;       /* starting S,T (14.18) */
1648   INT64               startw0;                /* starting W (2.30) */
1649   INT64               ds0dx, dt0dx;           /* delta S,T per X */
1650   INT64               dw0dx;                  /* delta W per X */
1651   INT64               ds0dy, dt0dy;           /* delta S,T per Y */
1652   INT64               dw0dy;                  /* delta W per Y */
1653   INT32               lodbase0;               /* used during rasterization */
1654
1655   INT64               starts1, startt1;       /* starting S,T (14.18) */
1656   INT64               startw1;                /* starting W (2.30) */
1657   INT64               ds1dx, dt1dx;           /* delta S,T per X */
1658   INT64               dw1dx;                  /* delta W per X */
1659   INT64               ds1dy, dt1dy;           /* delta S,T per Y */
1660   INT64               dw1dy;                  /* delta W per Y */
1661   INT32               lodbase1;               /* used during rasterization */
1662
1663   UINT16              dither[16];             /* dither matrix, for fastfill */
1664};
1665
1666
1667struct banshee_info
1668{
1669   UINT32              io[0x40];               /* I/O registers */
1670   UINT32              agp[0x80];              /* AGP registers */
1671   UINT8               vga[0x20];              /* VGA registers */
1672   UINT8               crtc[0x27];             /* VGA CRTC registers */
1673   UINT8               seq[0x05];              /* VGA sequencer registers */
1674   UINT8               gc[0x05];               /* VGA graphics controller registers */
1675   UINT8               att[0x15];              /* VGA attribute registers */
1676   UINT8               attff;                  /* VGA attribute flip-flop */
1677
1678   UINT32              blt_regs[0x20];         /* 2D Blitter registers */
1679   UINT32              blt_dst_base;
1680   UINT32              blt_dst_x;
1681   UINT32              blt_dst_y;
1682   UINT32              blt_dst_width;
1683   UINT32              blt_dst_height;
1684   UINT32              blt_dst_stride;
1685   UINT32              blt_dst_bpp;
1686   UINT32              blt_cmd;
1687   UINT32              blt_src_base;
1688   UINT32              blt_src_x;
1689   UINT32              blt_src_y;
1690   UINT32              blt_src_width;
1691   UINT32              blt_src_height;
1692   UINT32              blt_src_stride;
1693   UINT32              blt_src_bpp;
1694};
1695
1696
1697struct voodoo_state
1698{
1699   UINT8               index;                  /* index of board */
1700   voodoo_device *device;               /* pointer to our containing device */
1701   screen_device *screen;              /* the screen we are acting on */
1702   device_t *cpu;                  /* the CPU we interact with */
1703   UINT8               type;                   /* type of system */
1704   UINT8               chipmask;               /* mask for which chips are available */
1705   UINT32              freq;                   /* operating frequency */
1706   attoseconds_t       attoseconds_per_cycle;  /* attoseconds per cycle */
1707   UINT32              extra_cycles;           /* extra cycles not yet accounted for */
1708   int                 trigger;                /* trigger used for stalling */
1709
1710   voodoo_reg          reg[0x400];             /* raw registers */
1711   const UINT8 *       regaccess;              /* register access array */
1712   const char *const * regnames;               /* register names array */
1713   UINT8               alt_regmap;             /* enable alternate register map? */
1714
1715   pci_state           pci;                    /* PCI state */
1716   dac_state           dac;                    /* DAC state */
1717
1718   fbi_state           fbi;                    /* FBI states */
1719   tmu_state           tmu[MAX_TMU];           /* TMU states */
1720   tmu_shared_state    tmushare;               /* TMU shared state */
1721   banshee_info        banshee;                /* Banshee state */
1722
1723   legacy_poly_manager * poly;                 /* polygon manager */
1724   stats_block *       thread_stats;           /* per-thread statistics */
1725
1726   voodoo_stats        stats;                  /* internal statistics */
1727
1728   offs_t              last_status_pc;         /* PC of last status description (for logging) */
1729   UINT32              last_status_value;      /* value of last status read (for logging) */
1730
1731   int                 next_rasterizer;        /* next rasterizer index */
1732   raster_info         rasterizer[MAX_RASTERIZERS]; /* array of rasterizers */
1733   raster_info *       raster_hash[RASTER_HASH_SIZE]; /* hash table of rasterizers */
1734
1735   bool                send_config;
1736   UINT32              tmu_config;
1737};
1738
1739
1740
174127/*************************************
174228 *
174329 *  Inline FIFO management
r253153r253154
2345631}                                                                               \
2346632while (0)
2347633
2348static inline bool ATTR_FORCE_INLINE chromaKeyTest(voodoo_state *v, stats_block *stats, UINT32 fbzModeReg, rgbaint_t rgbaIntColor)
634static inline bool ATTR_FORCE_INLINE chromaKeyTest(voodoo_device *vd, stats_block *stats, UINT32 fbzModeReg, rgbaint_t rgbaIntColor)
2349635{
2350636   if (FBZMODE_ENABLE_CHROMAKEY(fbzModeReg))
2351637   {
2352638      rgb_union color;
2353639      color.u = (rgbaIntColor.get_a()<<24) | (rgbaIntColor.get_r()<<16) | (rgbaIntColor.get_g()<<8) | rgbaIntColor.get_b();
2354640      /* non-range version */
2355      if (!CHROMARANGE_ENABLE(v->reg[chromaRange].u))
641      if (!CHROMARANGE_ENABLE(vd->reg[chromaRange].u))
2356642      {
2357         if (((color.u ^ v->reg[chromaKey].u) & 0xffffff) == 0)
643         if (((color.u ^ vd->reg[chromaKey].u) & 0xffffff) == 0)
2358644         {
2359645            stats->chroma_fail++;
2360646            return false;
r253153r253154
2368654         int results;
2369655
2370656         /* check blue */
2371         low = v->reg[chromaKey].rgb.b;
2372         high = v->reg[chromaRange].rgb.b;
657         low = vd->reg[chromaKey].rgb.b;
658         high = vd->reg[chromaRange].rgb.b;
2373659         test = color.rgb.b;
2374660         results = (test >= low && test <= high);
2375         results ^= CHROMARANGE_BLUE_EXCLUSIVE(v->reg[chromaRange].u);
661         results ^= CHROMARANGE_BLUE_EXCLUSIVE(vd->reg[chromaRange].u);
2376662         results <<= 1;
2377663
2378664         /* check green */
2379         low = v->reg[chromaKey].rgb.g;
2380         high = v->reg[chromaRange].rgb.g;
665         low = vd->reg[chromaKey].rgb.g;
666         high = vd->reg[chromaRange].rgb.g;
2381667         test = color.rgb.g;
2382668         results |= (test >= low && test <= high);
2383         results ^= CHROMARANGE_GREEN_EXCLUSIVE(v->reg[chromaRange].u);
669         results ^= CHROMARANGE_GREEN_EXCLUSIVE(vd->reg[chromaRange].u);
2384670         results <<= 1;
2385671
2386672         /* check red */
2387         low = v->reg[chromaKey].rgb.r;
2388         high = v->reg[chromaRange].rgb.r;
673         low = vd->reg[chromaKey].rgb.r;
674         high = vd->reg[chromaRange].rgb.r;
2389675         test = color.rgb.r;
2390676         results |= (test >= low && test <= high);
2391         results ^= CHROMARANGE_RED_EXCLUSIVE(v->reg[chromaRange].u);
677         results ^= CHROMARANGE_RED_EXCLUSIVE(vd->reg[chromaRange].u);
2392678
2393679         /* final result */
2394         if (CHROMARANGE_UNION_MODE(v->reg[chromaRange].u))
680         if (CHROMARANGE_UNION_MODE(vd->reg[chromaRange].u))
2395681         {
2396682            if (results != 0)
2397683            {
r253153r253154
2520806}                                                                               \
2521807while (0)
2522808
2523static inline bool ATTR_FORCE_INLINE alphaTest(voodoo_state *v, stats_block *stats, UINT32 alphaModeReg, UINT8 alpha)
809static inline bool ATTR_FORCE_INLINE alphaTest(voodoo_device *vd, stats_block *stats, UINT32 alphaModeReg, UINT8 alpha)
2524810{
2525811   if (ALPHAMODE_ALPHATEST(alphaModeReg))
2526812   {
2527      UINT8 alpharef = v->reg[alphaMode].rgb.a;
813      UINT8 alpharef = vd->reg[alphaMode].rgb.a;
2528814      switch (ALPHAMODE_ALPHAFUNCTION(alphaModeReg))
2529815      {
2530816         case 0:     /* alphaOP = never */
r253153r253154
30671353}                                                                               \
30681354while (0)
30691355
3070static inline void ATTR_FORCE_INLINE applyFogging(voodoo_state *v, UINT32 fogModeReg, UINT32 fbzCpReg,  INT32 x, const UINT8 *dither4, INT32 fogDepth,
1356static inline void ATTR_FORCE_INLINE applyFogging(voodoo_device *vd, UINT32 fogModeReg, UINT32 fbzCpReg,  INT32 x, const UINT8 *dither4, INT32 fogDepth,
30711357   rgbaint_t &color, INT32 iterz, INT64 iterw, UINT8 itera)
30721358{
30731359   if (FOGMODE_ENABLE_FOG(fogModeReg))
r253153r253154
30751361      UINT32 color_alpha = color.get_a();
30761362
30771363      /* constant fog bypasses everything else */
3078      rgbaint_t fogColorLocal(v->reg[fogColor].u);
1364      rgbaint_t fogColorLocal(vd->reg[fogColor].u);
30791365
30801366      if (FOGMODE_FOG_CONSTANT(fogModeReg))
30811367      {
r253153r253154
31191405         {
31201406            case 0:     /* fog table */
31211407            {
3122               INT32 delta = v->fbi.fogdelta[fogDepth >> 10];
1408               INT32 delta = vd->fbi.fogdelta[fogDepth >> 10];
31231409               INT32 deltaval;
31241410
31251411               /* perform the multiply against lower 8 bits of wfloat */
3126               deltaval = (delta & v->fbi.fogdelta_mask) *
1412               deltaval = (delta & vd->fbi.fogdelta_mask) *
31271413                        ((fogDepth >> 2) & 0xff);
31281414
31291415               /* fog zones allow for negating this value */
r253153r253154
31371423               deltaval >>= 4;
31381424
31391425               /* add to the blending factor */
3140               fogblend = v->fbi.fogblend[fogDepth >> 10] + deltaval;
1426               fogblend = vd->fbi.fogblend[fogDepth >> 10] + deltaval;
31411427               break;
31421428            }
31431429
r253153r253154
35421828 *
35431829 *************************************/
35441830
3545#define PIXEL_PIPELINE_BEGIN(VV, STATS, XX, YY, FBZCOLORPATH, FBZMODE, ITERZ, ITERW)    \
1831#define PIXEL_PIPELINE_BEGIN(vd, STATS, XX, YY, FBZCOLORPATH, FBZMODE, ITERZ, ITERW)    \
35461832do                                                                              \
35471833{                                                                               \
35481834   INT32 depthval, wfloat, fogdepth, biasdepth;                                  \
r253153r253154
35591845      /* rotate mode */                                                       \
35601846      if (FBZMODE_STIPPLE_PATTERN(FBZMODE) == 0)                              \
35611847      {                                                                       \
3562         (VV)->reg[stipple].u = ((VV)->reg[stipple].u << 1) | ((VV)->reg[stipple].u >> 31);\
3563         if (((VV)->reg[stipple].u & 0x80000000) == 0)                       \
1848         vd->reg[stipple].u = (vd->reg[stipple].u << 1) | (vd->reg[stipple].u >> 31);\
1849         if ((vd->reg[stipple].u & 0x80000000) == 0)                       \
35641850         {                                                                   \
3565            (VV)->stats.total_stippled++;                                   \
1851            vd->stats.total_stippled++;                                   \
35661852            goto skipdrawdepth;                                             \
35671853         }                                                                   \
35681854      }                                                                       \
r253153r253154
35711857      else                                                                    \
35721858      {                                                                       \
35731859         int stipple_index = (((YY) & 3) << 3) | (~(XX) & 7);                \
3574         if ((((VV)->reg[stipple].u >> stipple_index) & 1) == 0)             \
1860         if (((vd->reg[stipple].u >> stipple_index) & 1) == 0)             \
35751861         {                                                                   \
3576            (VV)->stats.total_stippled++;                                   \
1862            vd->stats.total_stippled++;                                   \
35771863            goto skipdrawdepth;                                             \
35781864         }                                                                   \
35791865      }                                                                       \
r253153r253154
35971883   /* add the bias for fog selection*/                                         \
35981884   if (FBZMODE_ENABLE_DEPTH_BIAS(FBZMODE))                                     \
35991885   {                                                                           \
3600      fogdepth += (INT16)(VV)->reg[zaColor].u;                                \
1886      fogdepth += (INT16)vd->reg[zaColor].u;                                \
36011887      CLAMP(fogdepth, 0, 0xffff);                                             \
36021888   }                                                                           \
36031889                                                            \
r253153r253154
36281914   biasdepth = depthval;                                                     \
36291915   if (FBZMODE_ENABLE_DEPTH_BIAS(FBZMODE))                                     \
36301916   {                                                                           \
3631      biasdepth += (INT16)(VV)->reg[zaColor].u;                                \
1917      biasdepth += (INT16)vd->reg[zaColor].u;                                \
36321918      CLAMP(biasdepth, 0, 0xffff);                                             \
36331919   }
36341920
36351921
3636#define DEPTH_TEST(VV, STATS, XX, FBZMODE)    \
1922#define DEPTH_TEST(vd, STATS, XX, FBZMODE)    \
36371923do                                                                              \
36381924{                                                                               \
36391925   /* handle depth buffer testing */                                           \
r253153r253154
36461932      if (FBZMODE_DEPTH_SOURCE_COMPARE(FBZMODE) == 0)                         \
36471933         depthsource = biasdepth;                                             \
36481934      else                                                                    \
3649         depthsource = (UINT16)(VV)->reg[zaColor].u;                         \
1935         depthsource = (UINT16)vd->reg[zaColor].u;                         \
36501936                                                            \
36511937      /* test against the depth buffer */                                     \
36521938      switch (FBZMODE_DEPTH_FUNCTION(FBZMODE))                                \
r253153r253154
37862072   return true;
37872073}
37882074
3789#define PIXEL_PIPELINE_END(VV, STATS, DITHER, DITHER4, DITHER_LOOKUP, XX, dest, depth, FBZMODE, FBZCOLORPATH, ALPHAMODE, FOGMODE, ITERZ, ITERW, ITERAXXX) \
2075#define PIXEL_PIPELINE_END(vd, STATS, DITHER, DITHER4, DITHER_LOOKUP, XX, dest, depth, FBZMODE, FBZCOLORPATH, ALPHAMODE, FOGMODE, ITERZ, ITERW, ITERAXXX) \
37902076                                                            \
37912077   /* perform fogging */                                                       \
37922078   preFog.set(color); \
3793   applyFogging(VV, FOGMODE, FBZCOLORPATH, XX, DITHER4, fogdepth, color, ITERZ, ITERW, ITERAXXX.get_a()); \
2079   applyFogging(vd, FOGMODE, FBZCOLORPATH, XX, DITHER4, fogdepth, color, ITERZ, ITERW, ITERAXXX.get_a()); \
37942080   /* perform alpha blending */                                                \
37952081   alphaBlend(FBZMODE, ALPHAMODE, XX, DITHER, dest[XX], depth, preFog, color); \
37962082   a = color.get_a(); r = color.get_r(); g = color.get_g(); b = color.get_b();                     \
r253153r253154
41212407}                                                                               \
41222408while (0)
41232409
4124static inline bool ATTR_FORCE_INLINE combineColor(voodoo_state *VV, stats_block *STATS, UINT32 FBZCOLORPATH, UINT32 FBZMODE, UINT32 ALPHAMODE,
2410static inline bool ATTR_FORCE_INLINE combineColor(voodoo_device *vd, stats_block *STATS, UINT32 FBZCOLORPATH, UINT32 FBZMODE, UINT32 ALPHAMODE,
41252411                                       rgbaint_t TEXELARGB, INT32 ITERZ, INT64 ITERW, rgbaint_t &srcColor)
41262412{
41272413   rgbaint_t c_other;
r253153r253154
41392425         break;
41402426
41412427      case 2:     /* color1 RGB */
4142         c_other.set((VV)->reg[color1].u);
2428         c_other.set(vd->reg[color1].u);
41432429         break;
41442430
41452431      default:    /* reserved - voodoo3 framebufferRGB */
r253153r253154
41482434   }
41492435
41502436   /* handle chroma key */
4151   if (!chromaKeyTest(VV, STATS, FBZMODE, c_other))
2437   if (!chromaKeyTest(vd, STATS, FBZMODE, c_other))
41522438      return false;
4153   //APPLY_CHROMAKEY(VV, STATS, FBZMODE, c_other);
2439   //APPLY_CHROMAKEY(vd->m_vds, STATS, FBZMODE, c_other);
41542440
41552441   /* compute a_other */
41562442   switch (FBZCP_CC_ASELECT(FBZCOLORPATH))
r253153r253154
41642450         break;
41652451
41662452      case 2:     /* color1 alpha */
4167         c_other.set_a((VV)->reg[color1].rgb.a);
2453         c_other.set_a(vd->reg[color1].rgb.a);
41682454         break;
41692455
41702456      default:    /* reserved */
r253153r253154
41752461   /* handle alpha mask */
41762462   if (!alphaMaskTest(STATS, FBZMODE, c_other.get_a()))
41772463      return false;
4178   //APPLY_ALPHAMASK(VV, STATS, FBZMODE, c_other.rgb.a);
2464   //APPLY_ALPHAMASK(vd->m_vds, STATS, FBZMODE, c_other.rgb.a);
41792465
41802466
41812467   /* compute c_local */
r253153r253154
41842470      if (FBZCP_CC_LOCALSELECT(FBZCOLORPATH) == 0)    /* iterated RGB */
41852471         c_local.set(srcColor);
41862472      else                                            /* color0 RGB */
4187         c_local.set((VV)->reg[color0].u);
2473         c_local.set(vd->reg[color0].u);
41882474   }
41892475   else
41902476   {
41912477      if (!(TEXELARGB.get_a() & 0x80))                  /* iterated RGB */
41922478         c_local.set(srcColor);
41932479      else                                            /* color0 RGB */
4194         c_local.set((VV)->reg[color0].u);
2480         c_local.set(vd->reg[color0].u);
41952481   }
41962482
41972483   /* compute a_local */
r253153r253154
42032489         break;
42042490
42052491      case 1:     /* color0 alpha */
4206         c_local.set_a((VV)->reg[color0].rgb.a);
2492         c_local.set_a(vd->reg[color0].rgb.a);
42072493         break;
42082494
42092495      case 2:     /* clamped iterated Z[27:20] */
r253153r253154
43552641
43562642
43572643   /* handle alpha test */
4358   if (!alphaTest(VV, STATS, ALPHAMODE, srcColor.get_a()))
2644   if (!alphaTest(vd, STATS, ALPHAMODE, srcColor.get_a()))
43592645      return false;
4360   //APPLY_ALPHATEST(VV, STATS, ALPHAMODE, color.rgb.a);
2646   //APPLY_ALPHATEST(vd->m_vds, STATS, ALPHAMODE, color.rgb.a);
43612647
43622648   return true;
43632649}
r253153r253154
43722658
43732659#define RASTERIZER(name, TMUS, FBZCOLORPATH, FBZMODE, ALPHAMODE, FOGMODE, TEXMODE0, TEXMODE1) \
43742660                                                            \
4375static void raster_##name(void *destbase, INT32 y, const poly_extent *extent, const void *extradata, int threadid) \
2661void voodoo_device::raster_##name(void *destbase, INT32 y, const poly_extent *extent, const void *extradata, int threadid) \
43762662{                                                                               \
43772663   const poly_extra_data *extra = (const poly_extra_data *)extradata;          \
4378   voodoo_state *v = extra->state;                                             \
4379   stats_block *stats = &v->thread_stats[threadid];                            \
2664   voodoo_device *vd = extra->device; \
2665   stats_block *stats = &vd->thread_stats[threadid];                            \
43802666   DECLARE_DITHER_POINTERS;                                                    \
43812667   INT32 startx = extent->startx;                                              \
43822668   INT32 stopx = extent->stopx;                                                \
r253153r253154
43942680   /* determine the screen Y */                                                \
43952681   scry = y;                                                                   \
43962682   if (FBZMODE_Y_ORIGIN(FBZMODE))                                              \
4397      scry = (v->fbi.yorigin - y) & 0x3ff;                                    \
2683      scry = (vd->fbi.yorigin - y) & 0x3ff;                                    \
43982684                                                            \
43992685   /* compute dithering */                                                     \
44002686   COMPUTE_DITHER_POINTERS(FBZMODE, y);                                        \
r253153r253154
44052691      INT32 tempclip;                                                         \
44062692                                                            \
44072693      /* Y clipping buys us the whole scanline */                             \
4408      if (scry < ((v->reg[clipLowYHighY].u >> 16) & 0x3ff) ||                 \
4409         scry >= (v->reg[clipLowYHighY].u & 0x3ff))                          \
2694      if (scry < ((vd->reg[clipLowYHighY].u >> 16) & 0x3ff) ||                 \
2695         scry >= (vd->reg[clipLowYHighY].u & 0x3ff))                          \
44102696      {                                                                       \
44112697         stats->pixels_in += stopx - startx;                                 \
44122698         stats->clip_fail += stopx - startx;                                 \
r253153r253154
44142700      }                                                                       \
44152701                                                            \
44162702      /* X clipping */                                                        \
4417      tempclip = (v->reg[clipLeftRight].u >> 16) & 0x3ff;                     \
2703      tempclip = (vd->reg[clipLeftRight].u >> 16) & 0x3ff;                     \
44182704      if (startx < tempclip)                                                  \
44192705      {                                                                       \
44202706         stats->pixels_in += tempclip - startx;                              \
4421         v->stats.total_clipped += tempclip - startx;                        \
2707         vd->stats.total_clipped += tempclip - startx;                        \
44222708         startx = tempclip;                                                  \
44232709      }                                                                       \
4424      tempclip = v->reg[clipLeftRight].u & 0x3ff;                             \
2710      tempclip = vd->reg[clipLeftRight].u & 0x3ff;                             \
44252711      if (stopx >= tempclip)                                                  \
44262712      {                                                                       \
44272713         stats->pixels_in += stopx - tempclip;                               \
4428         v->stats.total_clipped += stopx - tempclip;                         \
2714         vd->stats.total_clipped += stopx - tempclip;                         \
44292715         stopx = tempclip - 1;                                               \
44302716      }                                                                       \
44312717   }                                                                           \
44322718                                                            \
44332719   /* get pointers to the target buffer and depth buffer */                    \
4434   dest = (UINT16 *)destbase + scry * v->fbi.rowpixels;                        \
4435   depth = (v->fbi.auxoffs != ~0) ? ((UINT16 *)(v->fbi.ram + v->fbi.auxoffs) + scry * v->fbi.rowpixels) : NULL; \
2720   dest = (UINT16 *)destbase + scry * vd->fbi.rowpixels;                        \
2721   depth = (vd->fbi.auxoffs != ~0) ? ((UINT16 *)(vd->fbi.ram + vd->fbi.auxoffs) + scry * vd->fbi.rowpixels) : NULL; \
44362722                                                            \
44372723   /* compute the starting parameters */                                       \
44382724   dx = startx - (extra->ax >> 4);                                             \
r253153r253154
44652751      rgbaint_t color, preFog;                                                \
44662752                                                            \
44672753      /* pixel pipeline part 1 handles depth setup and stippling */         \
4468      PIXEL_PIPELINE_BEGIN(v, stats, x, y, FBZCOLORPATH, FBZMODE, iterz, iterw); \
2754      PIXEL_PIPELINE_BEGIN(vd, stats, x, y, FBZCOLORPATH, FBZMODE, iterz, iterw); \
44692755      /* depth testing */         \
4470      if (!depthTest((UINT16) v->reg[zaColor].u, stats, depth[x], FBZMODE, biasdepth)) \
2756      if (!depthTest((UINT16) vd->reg[zaColor].u, stats, depth[x], FBZMODE, biasdepth)) \
44712757         goto skipdrawdepth; \
44722758                                                            \
44732759      /* run the texture pipeline on TMU1 to produce a value in texel */      \
44742760      /* note that they set LOD min to 8 to "disable" a TMU */                \
4475      if (TMUS >= 2 && v->tmu[1].lodmin < (8 << 8))                    {       \
2761      if (TMUS >= 2 && vd->tmu[1].lodmin < (8 << 8))                    {       \
44762762         INT32 tmp; \
44772763         const rgbaint_t texelZero(0);  \
4478         texel = genTexture(&v->tmu[1], x, dither4, TEXMODE1, v->tmu[1].lookup, extra->lodbase1, \
2764         texel = genTexture(&vd->tmu[1], x, dither4, TEXMODE1, vd->tmu[1].lookup, extra->lodbase1, \
44792765                                          iters1, itert1, iterw1, tmp); \
4480         texel = combineTexture(&v->tmu[1], TEXMODE1, texel, texelZero, tmp); \
2766         texel = combineTexture(&vd->tmu[1], TEXMODE1, texel, texelZero, tmp); \
44812767      } \
44822768      /* run the texture pipeline on TMU0 to produce a final */               \
44832769      /* result in texel */                                                   \
44842770      /* note that they set LOD min to 8 to "disable" a TMU */                \
4485      if (TMUS >= 1 && v->tmu[0].lodmin < (8 << 8))                           \
2771      if (TMUS >= 1 && vd->tmu[0].lodmin < (8 << 8))                           \
44862772      {                                                                   \
4487         if (!v->send_config)                                                \
2773         if (!vd->send_config)                                                \
44882774         {                                                                   \
44892775            INT32 lod0; \
44902776            rgbaint_t texelT0;                                                \
4491            texelT0 = genTexture(&v->tmu[0], x, dither4, TEXMODE0, v->tmu[0].lookup, extra->lodbase0, \
2777            texelT0 = genTexture(&vd->tmu[0], x, dither4, TEXMODE0, vd->tmu[0].lookup, extra->lodbase0, \
44922778                                                iters0, itert0, iterw0, lod0); \
4493            texel = combineTexture(&v->tmu[0], TEXMODE0, texelT0, texel, lod0); \
2779            texel = combineTexture(&vd->tmu[0], TEXMODE0, texelT0, texel, lod0); \
44942780         }                                                                   \
44952781         else                                                                \
44962782         {                                                                   \
4497            texel.set(v->tmu_config);                                              \
2783            texel.set(vd->tmu_config);                                              \
44982784         }                                                                   \
44992785      }                                                                   \
45002786                                                            \
45012787      /* colorpath pipeline selects source colors and does blending */        \
45022788      color = clampARGB(iterargb, FBZCOLORPATH);           \
4503      if (!combineColor(v, stats, FBZCOLORPATH, FBZMODE, ALPHAMODE, texel, iterz, iterw, color)) \
2789      if (!combineColor(vd, stats, FBZCOLORPATH, FBZMODE, ALPHAMODE, texel, iterz, iterw, color)) \
45042790         goto skipdrawdepth; \
45052791                                                            \
45062792      /* pixel pipeline part 2 handles fog, alpha, and final output */        \
4507      PIXEL_PIPELINE_END(v, stats, dither, dither4, dither_lookup, x, dest, depth, \
2793      PIXEL_PIPELINE_END(vd, stats, dither, dither4, dither_lookup, x, dest, depth, \
45082794                     FBZMODE, FBZCOLORPATH, ALPHAMODE, FOGMODE,          \
45092795                     iterz, iterw, iterargb);                            \
45102796                                                            \
trunk/src/devices/video/voodoo.cpp
r253153r253154
143143
144144
145145#include "emu.h"
146#include "video/polylgcy.h"
146
147147#include "video/rgbutil.h"
148148#include "voodoo.h"
149149#include "vooddefs.h"
r253153r253154
194194
195195
196196
197/*************************************
198 *
199 *  Prototypes
200 *
201 *************************************/
202197
203static void init_fbi(voodoo_state *v, fbi_state *f, void *memory, int fbmem);
204static void init_tmu_shared(tmu_shared_state *s);
205static void init_tmu(voodoo_state *v, tmu_state *t, voodoo_reg *reg, void *memory, int tmem);
206static void soft_reset(voodoo_state *v);
207static void recompute_video_memory(voodoo_state *v);
208static void check_stalled_cpu(voodoo_state *v, attotime current_time);
209static void flush_fifos(voodoo_state *v, attotime current_time);
210static TIMER_CALLBACK( stall_cpu_callback );
211static void stall_cpu(voodoo_state *v, int state, attotime current_time);
212static TIMER_CALLBACK( vblank_callback );
213static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data);
214static INT32 lfb_direct_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask);
215static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask);
216static INT32 texture_w(voodoo_state *v, offs_t offset, UINT32 data);
217static INT32 banshee_2d_w(voodoo_state *v, offs_t offset, UINT32 data);
218198
219/* command handlers */
220static INT32 fastfill(voodoo_state *v);
221static INT32 swapbuffer(voodoo_state *v, UINT32 data);
222static INT32 triangle(voodoo_state *v);
223static INT32 begin_triangle(voodoo_state *v);
224static INT32 draw_triangle(voodoo_state *v);
225
226/* triangle helpers */
227static INT32 setup_and_draw_triangle(voodoo_state *v);
228static INT32 triangle_create_work_item(voodoo_state *v, UINT16 *drawbuf, int texcount);
229
230/* rasterizer management */
231static raster_info *add_rasterizer(voodoo_state *v, const raster_info *cinfo);
232static raster_info *find_rasterizer(voodoo_state *v, int texcount);
233static void dump_rasterizer_stats(voodoo_state *v);
234
235/* generic rasterizers */
236static void raster_fastfill(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid);
237static void raster_generic_0tmu(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid);
238static void raster_generic_1tmu(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid);
239static void raster_generic_2tmu(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid);
240
241
242
243199/*************************************
244200 *
245201 *  Specific rasterizers
r253153r253154
262218 *************************************/
263219
264220#define RASTERIZER_ENTRY(fbzcp, alpha, fog, fbz, tex0, tex1) \
265   { NULL, raster_##fbzcp##_##alpha##_##fog##_##fbz##_##tex0##_##tex1, FALSE, 0, 0, 0, fbzcp, alpha, fog, fbz, tex0, tex1 },
221   { NULL, voodoo_device::raster_##fbzcp##_##alpha##_##fog##_##fbz##_##tex0##_##tex1, FALSE, 0, 0, 0, fbzcp, alpha, fog, fbz, tex0, tex1 },
266222
267223static const raster_info predef_raster_table[] =
268224{
r253153r253154
278234    INLINE FUNCTIONS
279235***************************************************************************/
280236
281/*-------------------------------------------------
282    get_safe_token - makes sure that the passed
283    in device is, in fact, a voodoo device
284-------------------------------------------------*/
285
286static inline voodoo_state *get_safe_token(device_t *device)
287{
288   assert(device != nullptr);
289   assert((device->type() == VOODOO_1) || (device->type() == VOODOO_2) || (device->type() == VOODOO_BANSHEE) ||  (device->type() == VOODOO_3));
290
291   return (voodoo_state *)downcast<voodoo_device *>(device)->token();
292}
293
294
295
296237/*************************************
297238 *
298239 *  Video update
299240 *
300241 *************************************/
301242
302int voodoo_update(device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect)
243int voodoo_device::voodoo_update(bitmap_rgb32 &bitmap, const rectangle &cliprect)
303244{
304   voodoo_state *v = get_safe_token(device);
305   int changed = v->fbi.video_changed;
306   int drawbuf = v->fbi.frontbuf;
245   int changed = fbi.video_changed;
246   int drawbuf = fbi.frontbuf;
307247   int statskey;
308248   int x, y;
309249
310250   /* reset the video changed flag */
311   v->fbi.video_changed = FALSE;
251   fbi.video_changed = FALSE;
312252
313253   /* if we are blank, just fill with black */
314   if (v->type <= TYPE_VOODOO_2 && FBIINIT1_SOFTWARE_BLANK(v->reg[fbiInit1].u))
254   if (vd_type <= TYPE_VOODOO_2 && FBIINIT1_SOFTWARE_BLANK(reg[fbiInit1].u))
315255   {
316256      bitmap.fill(0, cliprect);
317257      return changed;
318258   }
319259
320260   /* if the CLUT is dirty, recompute the pens array */
321   if (v->fbi.clut_dirty)
261   if (fbi.clut_dirty)
322262   {
323263      UINT8 rtable[32], gtable[64], btable[32];
324264
325265      /* Voodoo/Voodoo-2 have an internal 33-entry CLUT */
326      if (v->type <= TYPE_VOODOO_2)
266      if (vd_type <= TYPE_VOODOO_2)
327267      {
328268         /* kludge: some of the Midway games write 0 to the last entry when they obviously mean FF */
329         if ((v->fbi.clut[32] & 0xffffff) == 0 && (v->fbi.clut[31] & 0xffffff) != 0)
330            v->fbi.clut[32] = 0x20ffffff;
269         if ((fbi.clut[32] & 0xffffff) == 0 && (fbi.clut[31] & 0xffffff) != 0)
270            fbi.clut[32] = 0x20ffffff;
331271
332272         /* compute the R/G/B pens first */
333273         for (x = 0; x < 32; x++)
334274         {
335275            /* treat X as a 5-bit value, scale up to 8 bits, and linear interpolate for red/blue */
336276            y = (x << 3) | (x >> 2);
337            rtable[x] = (v->fbi.clut[y >> 3].r() * (8 - (y & 7)) + v->fbi.clut[(y >> 3) + 1].r() * (y & 7)) >> 3;
338            btable[x] = (v->fbi.clut[y >> 3].b() * (8 - (y & 7)) + v->fbi.clut[(y >> 3) + 1].b() * (y & 7)) >> 3;
277            rtable[x] = (fbi.clut[y >> 3].r() * (8 - (y & 7)) + fbi.clut[(y >> 3) + 1].r() * (y & 7)) >> 3;
278            btable[x] = (fbi.clut[y >> 3].b() * (8 - (y & 7)) + fbi.clut[(y >> 3) + 1].b() * (y & 7)) >> 3;
339279
340280            /* treat X as a 6-bit value with LSB=0, scale up to 8 bits, and linear interpolate */
341281            y = (x * 2) + 0;
342282            y = (y << 2) | (y >> 4);
343            gtable[x*2+0] = (v->fbi.clut[y >> 3].g() * (8 - (y & 7)) + v->fbi.clut[(y >> 3) + 1].g() * (y & 7)) >> 3;
283            gtable[x*2+0] = (fbi.clut[y >> 3].g() * (8 - (y & 7)) + fbi.clut[(y >> 3) + 1].g() * (y & 7)) >> 3;
344284
345285            /* treat X as a 6-bit value with LSB=1, scale up to 8 bits, and linear interpolate */
346286            y = (x * 2) + 1;
347287            y = (y << 2) | (y >> 4);
348            gtable[x*2+1] = (v->fbi.clut[y >> 3].g() * (8 - (y & 7)) + v->fbi.clut[(y >> 3) + 1].g() * (y & 7)) >> 3;
288            gtable[x*2+1] = (fbi.clut[y >> 3].g() * (8 - (y & 7)) + fbi.clut[(y >> 3) + 1].g() * (y & 7)) >> 3;
349289         }
350290      }
351291
352292      /* Banshee and later have a 512-entry CLUT that can be bypassed */
353293      else
354294      {
355         int which = (v->banshee.io[io_vidProcCfg] >> 13) & 1;
356         int bypass = (v->banshee.io[io_vidProcCfg] >> 11) & 1;
295         int which = (banshee.io[io_vidProcCfg] >> 13) & 1;
296         int bypass = (banshee.io[io_vidProcCfg] >> 11) & 1;
357297
358298         /* compute R/G/B pens first */
359299         for (x = 0; x < 32; x++)
360300         {
361301            /* treat X as a 5-bit value, scale up to 8 bits */
362302            y = (x << 3) | (x >> 2);
363            rtable[x] = bypass ? y : v->fbi.clut[which * 256 + y].r();
364            btable[x] = bypass ? y : v->fbi.clut[which * 256 + y].b();
303            rtable[x] = bypass ? y : fbi.clut[which * 256 + y].r();
304            btable[x] = bypass ? y : fbi.clut[which * 256 + y].b();
365305
366306            /* treat X as a 6-bit value with LSB=0, scale up to 8 bits */
367307            y = (x * 2) + 0;
368308            y = (y << 2) | (y >> 4);
369            gtable[x*2+0] = bypass ? y : v->fbi.clut[which * 256 + y].g();
309            gtable[x*2+0] = bypass ? y : fbi.clut[which * 256 + y].g();
370310
371311            /* treat X as a 6-bit value with LSB=1, scale up to 8 bits, and linear interpolate */
372312            y = (x * 2) + 1;
373313            y = (y << 2) | (y >> 4);
374            gtable[x*2+1] = bypass ? y : v->fbi.clut[which * 256 + y].g();
314            gtable[x*2+1] = bypass ? y : fbi.clut[which * 256 + y].g();
375315         }
376316      }
377317
r253153r253154
381321         int r = rtable[(x >> 11) & 0x1f];
382322         int g = gtable[(x >> 5) & 0x3f];
383323         int b = btable[x & 0x1f];
384         v->fbi.pen[x] = rgb_t(r, g, b);
324         fbi.pen[x] = rgb_t(r, g, b);
385325      }
386326
387327      /* no longer dirty */
388      v->fbi.clut_dirty = FALSE;
328      fbi.clut_dirty = FALSE;
389329      changed = TRUE;
390330   }
391331
392332   /* debugging! */
393   if (device->machine().input().code_pressed(KEYCODE_L))
394      drawbuf = v->fbi.backbuf;
333   if (machine().input().code_pressed(KEYCODE_L))
334      drawbuf = fbi.backbuf;
395335
396336   /* copy from the current front buffer */
397337   for (y = cliprect.min_y; y <= cliprect.max_y; y++)
398      if (y >= v->fbi.yoffs)
338      if (y >= fbi.yoffs)
399339      {
400         UINT16 *src = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[drawbuf]) + (y - v->fbi.yoffs) * v->fbi.rowpixels - v->fbi.xoffs;
340         UINT16 *src = (UINT16 *)(fbi.ram + fbi.rgboffs[drawbuf]) + (y - fbi.yoffs) * fbi.rowpixels - fbi.xoffs;
401341         UINT32 *dst = &bitmap.pix32(y);
402342         for (x = cliprect.min_x; x <= cliprect.max_x; x++)
403            dst[x] = v->fbi.pen[src[x]];
343            dst[x] = fbi.pen[src[x]];
404344      }
405345
406346   /* update stats display */
407   statskey = (device->machine().input().code_pressed(KEYCODE_BACKSLASH) != 0);
408   if (statskey && statskey != v->stats.lastkey)
409      v->stats.display = !v->stats.display;
410   v->stats.lastkey = statskey;
347   statskey = (machine().input().code_pressed(KEYCODE_BACKSLASH) != 0);
348   if (statskey && statskey != stats.lastkey)
349      stats.display = !stats.display;
350   stats.lastkey = statskey;
411351
412352   /* display stats */
413   if (v->stats.display)
414      device->popmessage(v->stats.buffer, 0, 0);
353   if (stats.display)
354      popmessage(stats.buffer, 0, 0);
415355
416356   /* update render override */
417   v->stats.render_override = device->machine().input().code_pressed(KEYCODE_ENTER);
418   if (DEBUG_DEPTH && v->stats.render_override)
357   stats.render_override = machine().input().code_pressed(KEYCODE_ENTER);
358   if (DEBUG_DEPTH && stats.render_override)
419359   {
420360      for (y = cliprect.min_y; y <= cliprect.max_y; y++)
421361      {
422         UINT16 *src = (UINT16 *)(v->fbi.ram + v->fbi.auxoffs) + (y - v->fbi.yoffs) * v->fbi.rowpixels - v->fbi.xoffs;
362         UINT16 *src = (UINT16 *)(fbi.ram + fbi.auxoffs) + (y - fbi.yoffs) * fbi.rowpixels - fbi.xoffs;
423363         UINT32 *dst = &bitmap.pix32(y);
424364         for (x = cliprect.min_x; x <= cliprect.max_x; x++)
425365            dst[x] = ((src[x] << 8) & 0xff0000) | ((src[x] >> 0) & 0xff00) | ((src[x] >> 8) & 0xff);
r253153r253154
436376 *
437377 *************************************/
438378
439int voodoo_get_type(device_t *device)
379
380int voodoo_device::voodoo_get_type()
440381{
441   voodoo_state *v = get_safe_token(device);
442   return v->type;
382   voodoo_device *vd = this;
383   return vd->vd_type;
443384}
444385
445386
446int voodoo_is_stalled(device_t *device)
387int voodoo_device::voodoo_is_stalled()
447388{
448   voodoo_state *v = get_safe_token(device);
449   return (v->pci.stall_state != NOT_STALLED);
389   voodoo_device *vd = this;
390   return (vd->pci.stall_state != NOT_STALLED);
450391}
451392
452393
453void voodoo_set_init_enable(device_t *device, UINT32 newval)
394void voodoo_device::voodoo_set_init_enable(UINT32 newval)
454395{
455   voodoo_state *v = get_safe_token(device);
456   v->pci.init_enable = newval;
396   voodoo_device *vd = this;
397   vd->pci.init_enable = newval;
457398   if (LOG_REGISTERS)
458      device->logerror("VOODOO.%d.REG:initEnable write = %08X\n", v->index, newval);
399      logerror("VOODOO.%d.REG:initEnable write = %08X\n", vd->index, newval);
459400}
460401
461402
r253153r253154
466407 *
467408 *************************************/
468409
469static void init_fbi(voodoo_state *v, fbi_state *f, void *memory, int fbmem)
410void voodoo_device::init_fbi(voodoo_device* vd,fbi_state *f, void *memory, int fbmem)
470411{
471412   int pen;
472413
r253153r253154
484425
485426   /* init the pens */
486427   f->clut_dirty = TRUE;
487   if (v->type <= TYPE_VOODOO_2)
428   if (vd->vd_type <= TYPE_VOODOO_2)
488429   {
489430      for (pen = 0; pen < 32; pen++)
490         v->fbi.clut[pen] = rgb_t(pen, pal5bit(pen), pal5bit(pen), pal5bit(pen));
491      v->fbi.clut[32] = rgb_t(32,0xff,0xff,0xff);
431         vd->fbi.clut[pen] = rgb_t(pen, pal5bit(pen), pal5bit(pen), pal5bit(pen));
432      vd->fbi.clut[32] = rgb_t(32,0xff,0xff,0xff);
492433   }
493434   else
494435   {
495436      for (pen = 0; pen < 512; pen++)
496         v->fbi.clut[pen] = rgb_t(pen,pen,pen);
437         vd->fbi.clut[pen] = rgb_t(pen,pen,pen);
497438   }
498439
499440   /* allocate a VBLANK timer */
500   f->vblank_timer = v->device->machine().scheduler().timer_alloc(FUNC(vblank_callback), v);
441   f->vblank_timer = vd->device->machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(voodoo_device::vblank_callback),vd), vd);
501442   f->vblank = FALSE;
502443
503444   /* initialize the memory FIFO */
r253153r253154
505446   f->fifo.size = f->fifo.in = f->fifo.out = 0;
506447
507448   /* set the fog delta mask */
508   f->fogdelta_mask = (v->type < TYPE_VOODOO_2) ? 0xff : 0xfc;
449   f->fogdelta_mask = (vd->vd_type < TYPE_VOODOO_2) ? 0xff : 0xfc;
509450}
510451
511452
512static void init_tmu_shared(tmu_shared_state *s)
453void voodoo_device::init_tmu_shared(tmu_shared_state *s)
513454{
514455   int val;
515456
r253153r253154
554495}
555496
556497
557static void init_tmu(voodoo_state *v, tmu_state *t, voodoo_reg *reg, void *memory, int tmem)
498void voodoo_device::init_tmu(voodoo_device* vd, tmu_state *t, voodoo_reg *reg, void *memory, int tmem)
558499{
559500   /* allocate texture RAM */
560501   t->ram = (UINT8 *)memory;
561502   t->mask = tmem - 1;
562503   t->reg = reg;
563504   t->regdirty = TRUE;
564   t->bilinear_mask = (v->type >= TYPE_VOODOO_2) ? 0xff : 0xf0;
505   t->bilinear_mask = (vd->vd_type >= TYPE_VOODOO_2) ? 0xff : 0xf0;
565506
566507   /* mark the NCC tables dirty and configure their registers */
567508   t->ncc[0].dirty = t->ncc[1].dirty = TRUE;
r253153r253154
569510   t->ncc[1].reg = &t->reg[nccTable+12];
570511
571512   /* create pointers to all the tables */
572   t->texel[0] = v->tmushare.rgb332;
513   t->texel[0] = vd->tmushare.rgb332;
573514   t->texel[1] = t->ncc[0].texel;
574   t->texel[2] = v->tmushare.alpha8;
575   t->texel[3] = v->tmushare.int8;
576   t->texel[4] = v->tmushare.ai44;
515   t->texel[2] = vd->tmushare.alpha8;
516   t->texel[3] = vd->tmushare.int8;
517   t->texel[4] = vd->tmushare.ai44;
577518   t->texel[5] = t->palette;
578   t->texel[6] = (v->type >= TYPE_VOODOO_2) ? t->palettea : nullptr;
519   t->texel[6] = (vd->vd_type >= TYPE_VOODOO_2) ? t->palettea : nullptr;
579520   t->texel[7] = nullptr;
580   t->texel[8] = v->tmushare.rgb332;
521   t->texel[8] = vd->tmushare.rgb332;
581522   t->texel[9] = t->ncc[0].texel;
582   t->texel[10] = v->tmushare.rgb565;
583   t->texel[11] = v->tmushare.argb1555;
584   t->texel[12] = v->tmushare.argb4444;
585   t->texel[13] = v->tmushare.int8;
523   t->texel[10] = vd->tmushare.rgb565;
524   t->texel[11] = vd->tmushare.argb1555;
525   t->texel[12] = vd->tmushare.argb4444;
526   t->texel[13] = vd->tmushare.int8;
586527   t->texel[14] = t->palette;
587528   t->texel[15] = nullptr;
588529   t->lookup = t->texel[0];
589530
590531   /* attach the palette to NCC table 0 */
591532   t->ncc[0].palette = t->palette;
592   if (v->type >= TYPE_VOODOO_2)
533   if (vd->vd_type >= TYPE_VOODOO_2)
593534      t->ncc[0].palettea = t->palettea;
594535
595536   /* set up texture address calculations */
596   if (v->type <= TYPE_VOODOO_2)
537   if (vd->vd_type <= TYPE_VOODOO_2)
597538   {
598539      t->texaddr_mask = 0x0fffff;
599540      t->texaddr_shift = 3;
r253153r253154
606547}
607548
608549
609static void voodoo_postload(voodoo_state *v)
550void voodoo_device::voodoo_postload(voodoo_device *vd)
610551{
611552   int index, subindex;
612553
613   v->fbi.clut_dirty = TRUE;
614   for (index = 0; index < ARRAY_LENGTH(v->tmu); index++)
554   vd->fbi.clut_dirty = TRUE;
555   for (index = 0; index < ARRAY_LENGTH(vd->tmu); index++)
615556   {
616      v->tmu[index].regdirty = TRUE;
617      for (subindex = 0; subindex < ARRAY_LENGTH(v->tmu[index].ncc); subindex++)
618         v->tmu[index].ncc[subindex].dirty = TRUE;
557      vd->tmu[index].regdirty = TRUE;
558      for (subindex = 0; subindex < ARRAY_LENGTH(vd->tmu[index].ncc); subindex++)
559         vd->tmu[index].ncc[subindex].dirty = TRUE;
619560   }
620561
621562   /* recompute video memory to get the FBI FIFO base recomputed */
622   if (v->type <= TYPE_VOODOO_2)
623      recompute_video_memory(v);
563   if (vd->vd_type <= TYPE_VOODOO_2)
564      recompute_video_memory(vd);
624565}
625566
626567
627static void init_save_state(device_t *device)
568static void init_save_state(voodoo_device *vd)
628569{
629   voodoo_state *v = get_safe_token(device);
630570   int index, subindex;
631571
632   device->machine().save().register_postload(save_prepost_delegate(FUNC(voodoo_postload), v));
572   vd->machine().save().register_postload(save_prepost_delegate(FUNC(voodoo_device::voodoo_postload), vd));
633573
634574   /* register states: core */
635   device->save_item(NAME(v->extra_cycles));
636   device->save_pointer(NAME(&v->reg[0].u), ARRAY_LENGTH(v->reg));
637   device->save_item(NAME(v->alt_regmap));
575   vd->save_item(NAME(vd->extra_cycles));
576   vd->save_pointer(NAME(&vd->reg[0].u), ARRAY_LENGTH(vd->reg));
577   vd->save_item(NAME(vd->alt_regmap));
638578
639579   /* register states: pci */
640   device->save_item(NAME(v->pci.fifo.in));
641   device->save_item(NAME(v->pci.fifo.out));
642   device->save_item(NAME(v->pci.init_enable));
643   device->save_item(NAME(v->pci.stall_state));
644   device->save_item(NAME(v->pci.op_pending));
645   device->save_item(NAME(v->pci.op_end_time));
646   device->save_item(NAME(v->pci.fifo_mem));
580   vd->save_item(NAME(vd->pci.fifo.in));
581   vd->save_item(NAME(vd->pci.fifo.out));
582   vd->save_item(NAME(vd->pci.init_enable));
583   vd->save_item(NAME(vd->pci.stall_state));
584   vd->save_item(NAME(vd->pci.op_pending));
585   vd->save_item(NAME(vd->pci.op_end_time));
586   vd->save_item(NAME(vd->pci.fifo_mem));
647587
648588   /* register states: dac */
649   device->save_item(NAME(v->dac.reg));
650   device->save_item(NAME(v->dac.read_result));
589   vd->save_item(NAME(vd->dac.reg));
590   vd->save_item(NAME(vd->dac.read_result));
651591
652592   /* register states: fbi */
653   device->save_pointer(NAME(v->fbi.ram), v->fbi.mask + 1);
654   device->save_item(NAME(v->fbi.rgboffs));
655   device->save_item(NAME(v->fbi.auxoffs));
656   device->save_item(NAME(v->fbi.frontbuf));
657   device->save_item(NAME(v->fbi.backbuf));
658   device->save_item(NAME(v->fbi.swaps_pending));
659   device->save_item(NAME(v->fbi.video_changed));
660   device->save_item(NAME(v->fbi.yorigin));
661   device->save_item(NAME(v->fbi.lfb_base));
662   device->save_item(NAME(v->fbi.lfb_stride));
663   device->save_item(NAME(v->fbi.width));
664   device->save_item(NAME(v->fbi.height));
665   device->save_item(NAME(v->fbi.xoffs));
666   device->save_item(NAME(v->fbi.yoffs));
667   device->save_item(NAME(v->fbi.vsyncscan));
668   device->save_item(NAME(v->fbi.rowpixels));
669   device->save_item(NAME(v->fbi.vblank));
670   device->save_item(NAME(v->fbi.vblank_count));
671   device->save_item(NAME(v->fbi.vblank_swap_pending));
672   device->save_item(NAME(v->fbi.vblank_swap));
673   device->save_item(NAME(v->fbi.vblank_dont_swap));
674   device->save_item(NAME(v->fbi.cheating_allowed));
675   device->save_item(NAME(v->fbi.sign));
676   device->save_item(NAME(v->fbi.ax));
677   device->save_item(NAME(v->fbi.ay));
678   device->save_item(NAME(v->fbi.bx));
679   device->save_item(NAME(v->fbi.by));
680   device->save_item(NAME(v->fbi.cx));
681   device->save_item(NAME(v->fbi.cy));
682   device->save_item(NAME(v->fbi.startr));
683   device->save_item(NAME(v->fbi.startg));
684   device->save_item(NAME(v->fbi.startb));
685   device->save_item(NAME(v->fbi.starta));
686   device->save_item(NAME(v->fbi.startz));
687   device->save_item(NAME(v->fbi.startw));
688   device->save_item(NAME(v->fbi.drdx));
689   device->save_item(NAME(v->fbi.dgdx));
690   device->save_item(NAME(v->fbi.dbdx));
691   device->save_item(NAME(v->fbi.dadx));
692   device->save_item(NAME(v->fbi.dzdx));
693   device->save_item(NAME(v->fbi.dwdx));
694   device->save_item(NAME(v->fbi.drdy));
695   device->save_item(NAME(v->fbi.dgdy));
696   device->save_item(NAME(v->fbi.dbdy));
697   device->save_item(NAME(v->fbi.dady));
698   device->save_item(NAME(v->fbi.dzdy));
699   device->save_item(NAME(v->fbi.dwdy));
700   device->save_item(NAME(v->fbi.lfb_stats.pixels_in));
701   device->save_item(NAME(v->fbi.lfb_stats.pixels_out));
702   device->save_item(NAME(v->fbi.lfb_stats.chroma_fail));
703   device->save_item(NAME(v->fbi.lfb_stats.zfunc_fail));
704   device->save_item(NAME(v->fbi.lfb_stats.afunc_fail));
705   device->save_item(NAME(v->fbi.lfb_stats.clip_fail));
706   device->save_item(NAME(v->fbi.lfb_stats.stipple_count));
707   device->save_item(NAME(v->fbi.sverts));
708   for (index = 0; index < ARRAY_LENGTH(v->fbi.svert); index++)
593   vd->save_pointer(NAME(vd->fbi.ram), vd->fbi.mask + 1);
594   vd->save_item(NAME(vd->fbi.rgboffs));
595   vd->save_item(NAME(vd->fbi.auxoffs));
596   vd->save_item(NAME(vd->fbi.frontbuf));
597   vd->save_item(NAME(vd->fbi.backbuf));
598   vd->save_item(NAME(vd->fbi.swaps_pending));
599   vd->save_item(NAME(vd->fbi.video_changed));
600   vd->save_item(NAME(vd->fbi.yorigin));
601   vd->save_item(NAME(vd->fbi.lfb_base));
602   vd->save_item(NAME(vd->fbi.lfb_stride));
603   vd->save_item(NAME(vd->fbi.width));
604   vd->save_item(NAME(vd->fbi.height));
605   vd->save_item(NAME(vd->fbi.xoffs));
606   vd->save_item(NAME(vd->fbi.yoffs));
607   vd->save_item(NAME(vd->fbi.vsyncscan));
608   vd->save_item(NAME(vd->fbi.rowpixels));
609   vd->save_item(NAME(vd->fbi.vblank));
610   vd->save_item(NAME(vd->fbi.vblank_count));
611   vd->save_item(NAME(vd->fbi.vblank_swap_pending));
612   vd->save_item(NAME(vd->fbi.vblank_swap));
613   vd->save_item(NAME(vd->fbi.vblank_dont_swap));
614   vd->save_item(NAME(vd->fbi.cheating_allowed));
615   vd->save_item(NAME(vd->fbi.sign));
616   vd->save_item(NAME(vd->fbi.ax));
617   vd->save_item(NAME(vd->fbi.ay));
618   vd->save_item(NAME(vd->fbi.bx));
619   vd->save_item(NAME(vd->fbi.by));
620   vd->save_item(NAME(vd->fbi.cx));
621   vd->save_item(NAME(vd->fbi.cy));
622   vd->save_item(NAME(vd->fbi.startr));
623   vd->save_item(NAME(vd->fbi.startg));
624   vd->save_item(NAME(vd->fbi.startb));
625   vd->save_item(NAME(vd->fbi.starta));
626   vd->save_item(NAME(vd->fbi.startz));
627   vd->save_item(NAME(vd->fbi.startw));
628   vd->save_item(NAME(vd->fbi.drdx));
629   vd->save_item(NAME(vd->fbi.dgdx));
630   vd->save_item(NAME(vd->fbi.dbdx));
631   vd->save_item(NAME(vd->fbi.dadx));
632   vd->save_item(NAME(vd->fbi.dzdx));
633   vd->save_item(NAME(vd->fbi.dwdx));
634   vd->save_item(NAME(vd->fbi.drdy));
635   vd->save_item(NAME(vd->fbi.dgdy));
636   vd->save_item(NAME(vd->fbi.dbdy));
637   vd->save_item(NAME(vd->fbi.dady));
638   vd->save_item(NAME(vd->fbi.dzdy));
639   vd->save_item(NAME(vd->fbi.dwdy));
640   vd->save_item(NAME(vd->fbi.lfb_stats.pixels_in));
641   vd->save_item(NAME(vd->fbi.lfb_stats.pixels_out));
642   vd->save_item(NAME(vd->fbi.lfb_stats.chroma_fail));
643   vd->save_item(NAME(vd->fbi.lfb_stats.zfunc_fail));
644   vd->save_item(NAME(vd->fbi.lfb_stats.afunc_fail));
645   vd->save_item(NAME(vd->fbi.lfb_stats.clip_fail));
646   vd->save_item(NAME(vd->fbi.lfb_stats.stipple_count));
647   vd->save_item(NAME(vd->fbi.sverts));
648   for (index = 0; index < ARRAY_LENGTH(vd->fbi.svert); index++)
709649   {
710      device->save_item(NAME(v->fbi.svert[index].x), index);
711      device->save_item(NAME(v->fbi.svert[index].y), index);
712      device->save_item(NAME(v->fbi.svert[index].a), index);
713      device->save_item(NAME(v->fbi.svert[index].r), index);
714      device->save_item(NAME(v->fbi.svert[index].g), index);
715      device->save_item(NAME(v->fbi.svert[index].b), index);
716      device->save_item(NAME(v->fbi.svert[index].z), index);
717      device->save_item(NAME(v->fbi.svert[index].wb), index);
718      device->save_item(NAME(v->fbi.svert[index].w0), index);
719      device->save_item(NAME(v->fbi.svert[index].s0), index);
720      device->save_item(NAME(v->fbi.svert[index].t0), index);
721      device->save_item(NAME(v->fbi.svert[index].w1), index);
722      device->save_item(NAME(v->fbi.svert[index].s1), index);
723      device->save_item(NAME(v->fbi.svert[index].t1), index);
650      vd->save_item(NAME(vd->fbi.svert[index].x), index);
651      vd->save_item(NAME(vd->fbi.svert[index].y), index);
652      vd->save_item(NAME(vd->fbi.svert[index].a), index);
653      vd->save_item(NAME(vd->fbi.svert[index].r), index);
654      vd->save_item(NAME(vd->fbi.svert[index].g), index);
655      vd->save_item(NAME(vd->fbi.svert[index].b), index);
656      vd->save_item(NAME(vd->fbi.svert[index].z), index);
657      vd->save_item(NAME(vd->fbi.svert[index].wb), index);
658      vd->save_item(NAME(vd->fbi.svert[index].w0), index);
659      vd->save_item(NAME(vd->fbi.svert[index].s0), index);
660      vd->save_item(NAME(vd->fbi.svert[index].t0), index);
661      vd->save_item(NAME(vd->fbi.svert[index].w1), index);
662      vd->save_item(NAME(vd->fbi.svert[index].s1), index);
663      vd->save_item(NAME(vd->fbi.svert[index].t1), index);
724664   }
725   device->save_item(NAME(v->fbi.fifo.size));
726   device->save_item(NAME(v->fbi.fifo.in));
727   device->save_item(NAME(v->fbi.fifo.out));
728   for (index = 0; index < ARRAY_LENGTH(v->fbi.cmdfifo); index++)
665   vd->save_item(NAME(vd->fbi.fifo.size));
666   vd->save_item(NAME(vd->fbi.fifo.in));
667   vd->save_item(NAME(vd->fbi.fifo.out));
668   for (index = 0; index < ARRAY_LENGTH(vd->fbi.cmdfifo); index++)
729669   {
730      device->save_item(NAME(v->fbi.cmdfifo[index].enable), index);
731      device->save_item(NAME(v->fbi.cmdfifo[index].count_holes), index);
732      device->save_item(NAME(v->fbi.cmdfifo[index].base), index);
733      device->save_item(NAME(v->fbi.cmdfifo[index].end), index);
734      device->save_item(NAME(v->fbi.cmdfifo[index].rdptr), index);
735      device->save_item(NAME(v->fbi.cmdfifo[index].amin), index);
736      device->save_item(NAME(v->fbi.cmdfifo[index].amax), index);
737      device->save_item(NAME(v->fbi.cmdfifo[index].depth), index);
738      device->save_item(NAME(v->fbi.cmdfifo[index].holes), index);
670      vd->save_item(NAME(vd->fbi.cmdfifo[index].enable), index);
671      vd->save_item(NAME(vd->fbi.cmdfifo[index].count_holes), index);
672      vd->save_item(NAME(vd->fbi.cmdfifo[index].base), index);
673      vd->save_item(NAME(vd->fbi.cmdfifo[index].end), index);
674      vd->save_item(NAME(vd->fbi.cmdfifo[index].rdptr), index);
675      vd->save_item(NAME(vd->fbi.cmdfifo[index].amin), index);
676      vd->save_item(NAME(vd->fbi.cmdfifo[index].amax), index);
677      vd->save_item(NAME(vd->fbi.cmdfifo[index].depth), index);
678      vd->save_item(NAME(vd->fbi.cmdfifo[index].holes), index);
739679   }
740   device->save_item(NAME(v->fbi.fogblend));
741   device->save_item(NAME(v->fbi.fogdelta));
742   device->save_item(NAME(v->fbi.clut));
680   vd->save_item(NAME(vd->fbi.fogblend));
681   vd->save_item(NAME(vd->fbi.fogdelta));
682   vd->save_item(NAME(vd->fbi.clut));
743683
744684   /* register states: tmu */
745   for (index = 0; index < ARRAY_LENGTH(v->tmu); index++)
685   for (index = 0; index < ARRAY_LENGTH(vd->tmu); index++)
746686   {
747      tmu_state *tmu = &v->tmu[index];
687      tmu_state *tmu = &vd->tmu[index];
748688      if (tmu->ram == nullptr)
749689         continue;
750      if (tmu->ram != v->fbi.ram)
751         device->save_pointer(NAME(tmu->ram), tmu->mask + 1, index);
752      device->save_item(NAME(tmu->starts), index);
753      device->save_item(NAME(tmu->startt), index);
754      device->save_item(NAME(tmu->startw), index);
755      device->save_item(NAME(tmu->dsdx), index);
756      device->save_item(NAME(tmu->dtdx), index);
757      device->save_item(NAME(tmu->dwdx), index);
758      device->save_item(NAME(tmu->dsdy), index);
759      device->save_item(NAME(tmu->dtdy), index);
760      device->save_item(NAME(tmu->dwdy), index);
690      if (tmu->ram != vd->fbi.ram)
691         vd->save_pointer(NAME(tmu->ram), tmu->mask + 1, index);
692      vd->save_item(NAME(tmu->starts), index);
693      vd->save_item(NAME(tmu->startt), index);
694      vd->save_item(NAME(tmu->startw), index);
695      vd->save_item(NAME(tmu->dsdx), index);
696      vd->save_item(NAME(tmu->dtdx), index);
697      vd->save_item(NAME(tmu->dwdx), index);
698      vd->save_item(NAME(tmu->dsdy), index);
699      vd->save_item(NAME(tmu->dtdy), index);
700      vd->save_item(NAME(tmu->dwdy), index);
761701      for (subindex = 0; subindex < ARRAY_LENGTH(tmu->ncc); subindex++)
762702      {
763         device->save_item(NAME(tmu->ncc[subindex].ir), index * ARRAY_LENGTH(tmu->ncc) + subindex);
764         device->save_item(NAME(tmu->ncc[subindex].ig), index * ARRAY_LENGTH(tmu->ncc) + subindex);
765         device->save_item(NAME(tmu->ncc[subindex].ib), index * ARRAY_LENGTH(tmu->ncc) + subindex);
766         device->save_item(NAME(tmu->ncc[subindex].qr), index * ARRAY_LENGTH(tmu->ncc) + subindex);
767         device->save_item(NAME(tmu->ncc[subindex].qg), index * ARRAY_LENGTH(tmu->ncc) + subindex);
768         device->save_item(NAME(tmu->ncc[subindex].qb), index * ARRAY_LENGTH(tmu->ncc) + subindex);
769         device->save_item(NAME(tmu->ncc[subindex].y), index * ARRAY_LENGTH(tmu->ncc) + subindex);
703         vd->save_item(NAME(tmu->ncc[subindex].ir), index * ARRAY_LENGTH(tmu->ncc) + subindex);
704         vd->save_item(NAME(tmu->ncc[subindex].ig), index * ARRAY_LENGTH(tmu->ncc) + subindex);
705         vd->save_item(NAME(tmu->ncc[subindex].ib), index * ARRAY_LENGTH(tmu->ncc) + subindex);
706         vd->save_item(NAME(tmu->ncc[subindex].qr), index * ARRAY_LENGTH(tmu->ncc) + subindex);
707         vd->save_item(NAME(tmu->ncc[subindex].qg), index * ARRAY_LENGTH(tmu->ncc) + subindex);
708         vd->save_item(NAME(tmu->ncc[subindex].qb), index * ARRAY_LENGTH(tmu->ncc) + subindex);
709         vd->save_item(NAME(tmu->ncc[subindex].y), index * ARRAY_LENGTH(tmu->ncc) + subindex);
770710      }
771711   }
772712
773713   /* register states: banshee */
774   if (v->type >= TYPE_VOODOO_BANSHEE)
714   if (vd->vd_type >= TYPE_VOODOO_BANSHEE)
775715   {
776      device->save_item(NAME(v->banshee.io));
777      device->save_item(NAME(v->banshee.agp));
778      device->save_item(NAME(v->banshee.vga));
779      device->save_item(NAME(v->banshee.crtc));
780      device->save_item(NAME(v->banshee.seq));
781      device->save_item(NAME(v->banshee.gc));
782      device->save_item(NAME(v->banshee.att));
783      device->save_item(NAME(v->banshee.attff));
716      vd->save_item(NAME(vd->banshee.io));
717      vd->save_item(NAME(vd->banshee.agp));
718      vd->save_item(NAME(vd->banshee.vga));
719      vd->save_item(NAME(vd->banshee.crtc));
720      vd->save_item(NAME(vd->banshee.seq));
721      vd->save_item(NAME(vd->banshee.gc));
722      vd->save_item(NAME(vd->banshee.att));
723      vd->save_item(NAME(vd->banshee.attff));
784724   }
785725}
786726
r253153r253154
792732 *
793733 *************************************/
794734
795static void accumulate_statistics(voodoo_state *v, const stats_block *stats)
735static void accumulate_statistics(voodoo_device *vd, const stats_block *stats)
796736{
797737   /* apply internal voodoo statistics */
798   v->reg[fbiPixelsIn].u += stats->pixels_in;
799   v->reg[fbiPixelsOut].u += stats->pixels_out;
800   v->reg[fbiChromaFail].u += stats->chroma_fail;
801   v->reg[fbiZfuncFail].u += stats->zfunc_fail;
802   v->reg[fbiAfuncFail].u += stats->afunc_fail;
738   vd->reg[fbiPixelsIn].u += stats->pixels_in;
739   vd->reg[fbiPixelsOut].u += stats->pixels_out;
740   vd->reg[fbiChromaFail].u += stats->chroma_fail;
741   vd->reg[fbiZfuncFail].u += stats->zfunc_fail;
742   vd->reg[fbiAfuncFail].u += stats->afunc_fail;
803743
804744   /* apply emulation statistics */
805   v->stats.total_pixels_in += stats->pixels_in;
806   v->stats.total_pixels_out += stats->pixels_out;
807   v->stats.total_chroma_fail += stats->chroma_fail;
808   v->stats.total_zfunc_fail += stats->zfunc_fail;
809   v->stats.total_afunc_fail += stats->afunc_fail;
810   v->stats.total_clipped += stats->clip_fail;
811   v->stats.total_stippled += stats->stipple_count;
745   vd->stats.total_pixels_in += stats->pixels_in;
746   vd->stats.total_pixels_out += stats->pixels_out;
747   vd->stats.total_chroma_fail += stats->chroma_fail;
748   vd->stats.total_zfunc_fail += stats->zfunc_fail;
749   vd->stats.total_afunc_fail += stats->afunc_fail;
750   vd->stats.total_clipped += stats->clip_fail;
751   vd->stats.total_stippled += stats->stipple_count;
812752}
813753
814754
815static void update_statistics(voodoo_state *v, int accumulate)
755static void update_statistics(voodoo_device *vd, int accumulate)
816756{
817757   int threadnum;
818758
r253153r253154
820760   for (threadnum = 0; threadnum < WORK_MAX_THREADS; threadnum++)
821761   {
822762      if (accumulate)
823         accumulate_statistics(v, &v->thread_stats[threadnum]);
824      memset(&v->thread_stats[threadnum], 0, sizeof(v->thread_stats[threadnum]));
763         accumulate_statistics(vd, &vd->thread_stats[threadnum]);
764      memset(&vd->thread_stats[threadnum], 0, sizeof(vd->thread_stats[threadnum]));
825765   }
826766
827767   /* accumulate/reset statistics from the LFB */
828768   if (accumulate)
829      accumulate_statistics(v, &v->fbi.lfb_stats);
830   memset(&v->fbi.lfb_stats, 0, sizeof(v->fbi.lfb_stats));
769      accumulate_statistics(vd, &vd->fbi.lfb_stats);
770   memset(&vd->fbi.lfb_stats, 0, sizeof(vd->fbi.lfb_stats));
831771}
832772
833773
r253153r253154
838778 *
839779 *************************************/
840780
841static void swap_buffers(voodoo_state *v)
781void voodoo_device::swap_buffers(voodoo_device *vd)
842782{
843783   int count;
844784
845   if (LOG_VBLANK_SWAP) v->device->logerror("--- swap_buffers @ %d\n", v->screen->vpos());
785   if (LOG_VBLANK_SWAP) vd->device->logerror("--- swap_buffers @ %d\n", vd->screen->vpos());
846786
847787   /* force a partial update */
848   v->screen->update_partial(v->screen->vpos());
849   v->fbi.video_changed = TRUE;
788   vd->screen->update_partial(vd->screen->vpos());
789   vd->fbi.video_changed = TRUE;
850790
851791   /* keep a history of swap intervals */
852   count = v->fbi.vblank_count;
792   count = vd->fbi.vblank_count;
853793   if (count > 15)
854794      count = 15;
855   v->reg[fbiSwapHistory].u = (v->reg[fbiSwapHistory].u << 4) | count;
795   vd->reg[fbiSwapHistory].u = (vd->reg[fbiSwapHistory].u << 4) | count;
856796
857797   /* rotate the buffers */
858   if (v->type <= TYPE_VOODOO_2)
798   if (vd->vd_type <= TYPE_VOODOO_2)
859799   {
860      if (v->type < TYPE_VOODOO_2 || !v->fbi.vblank_dont_swap)
800      if (vd->vd_type < TYPE_VOODOO_2 || !vd->fbi.vblank_dont_swap)
861801      {
862         if (v->fbi.rgboffs[2] == ~0)
802         if (vd->fbi.rgboffs[2] == ~0)
863803         {
864            v->fbi.frontbuf = 1 - v->fbi.frontbuf;
865            v->fbi.backbuf = 1 - v->fbi.frontbuf;
804            vd->fbi.frontbuf = 1 - vd->fbi.frontbuf;
805            vd->fbi.backbuf = 1 - vd->fbi.frontbuf;
866806         }
867807         else
868808         {
869            v->fbi.frontbuf = (v->fbi.frontbuf + 1) % 3;
870            v->fbi.backbuf = (v->fbi.frontbuf + 1) % 3;
809            vd->fbi.frontbuf = (vd->fbi.frontbuf + 1) % 3;
810            vd->fbi.backbuf = (vd->fbi.frontbuf + 1) % 3;
871811         }
872812      }
873813   }
874814   else
875      v->fbi.rgboffs[0] = v->reg[leftOverlayBuf].u & v->fbi.mask & ~0x0f;
815      vd->fbi.rgboffs[0] = vd->reg[leftOverlayBuf].u & vd->fbi.mask & ~0x0f;
876816
877817   /* decrement the pending count and reset our state */
878   if (v->fbi.swaps_pending)
879      v->fbi.swaps_pending--;
880   v->fbi.vblank_count = 0;
881   v->fbi.vblank_swap_pending = FALSE;
818   if (vd->fbi.swaps_pending)
819      vd->fbi.swaps_pending--;
820   vd->fbi.vblank_count = 0;
821   vd->fbi.vblank_swap_pending = FALSE;
882822
883823   /* reset the last_op_time to now and start processing the next command */
884   if (v->pci.op_pending)
824   if (vd->pci.op_pending)
885825   {
886      v->pci.op_end_time = v->device->machine().time();
887      flush_fifos(v, v->pci.op_end_time);
826      vd->pci.op_end_time = vd->device->machine().time();
827      flush_fifos(vd, vd->pci.op_end_time);
888828   }
889829
890830   /* we may be able to unstall now */
891   if (v->pci.stall_state != NOT_STALLED)
892      check_stalled_cpu(v, v->device->machine().time());
831   if (vd->pci.stall_state != NOT_STALLED)
832      check_stalled_cpu(vd, vd->device->machine().time());
893833
894834   /* periodically log rasterizer info */
895   v->stats.swaps++;
896   if (LOG_RASTERIZERS && v->stats.swaps % 1000 == 0)
897      dump_rasterizer_stats(v);
835   vd->stats.swaps++;
836   if (LOG_RASTERIZERS && vd->stats.swaps % 1000 == 0)
837      dump_rasterizer_stats(vd);
898838
899839   /* update the statistics (debug) */
900   if (v->stats.display)
840   if (vd->stats.display)
901841   {
902      const rectangle &visible_area = v->screen->visible_area();
842      const rectangle &visible_area = vd->screen->visible_area();
903843      int screen_area = visible_area.width() * visible_area.height();
904      char *statsptr = v->stats.buffer;
844      char *statsptr = vd->stats.buffer;
905845      int pixelcount;
906846      int i;
907847
908      update_statistics(v, TRUE);
909      pixelcount = v->stats.total_pixels_out;
848      update_statistics(vd, TRUE);
849      pixelcount = vd->stats.total_pixels_out;
910850
911      statsptr += sprintf(statsptr, "Swap:%6d\n", v->stats.swaps);
912      statsptr += sprintf(statsptr, "Hist:%08X\n", v->reg[fbiSwapHistory].u);
913      statsptr += sprintf(statsptr, "Stal:%6d\n", v->stats.stalls);
851      statsptr += sprintf(statsptr, "Swap:%6d\n", vd->stats.swaps);
852      statsptr += sprintf(statsptr, "Hist:%08X\n", vd->reg[fbiSwapHistory].u);
853      statsptr += sprintf(statsptr, "Stal:%6d\n", vd->stats.stalls);
914854      statsptr += sprintf(statsptr, "Rend:%6d%%\n", pixelcount * 100 / screen_area);
915      statsptr += sprintf(statsptr, "Poly:%6d\n", v->stats.total_triangles);
916      statsptr += sprintf(statsptr, "PxIn:%6d\n", v->stats.total_pixels_in);
917      statsptr += sprintf(statsptr, "POut:%6d\n", v->stats.total_pixels_out);
918      statsptr += sprintf(statsptr, "Clip:%6d\n", v->stats.total_clipped);
919      statsptr += sprintf(statsptr, "Stip:%6d\n", v->stats.total_stippled);
920      statsptr += sprintf(statsptr, "Chro:%6d\n", v->stats.total_chroma_fail);
921      statsptr += sprintf(statsptr, "ZFun:%6d\n", v->stats.total_zfunc_fail);
922      statsptr += sprintf(statsptr, "AFun:%6d\n", v->stats.total_afunc_fail);
923      statsptr += sprintf(statsptr, "RegW:%6d\n", v->stats.reg_writes);
924      statsptr += sprintf(statsptr, "RegR:%6d\n", v->stats.reg_reads);
925      statsptr += sprintf(statsptr, "LFBW:%6d\n", v->stats.lfb_writes);
926      statsptr += sprintf(statsptr, "LFBR:%6d\n", v->stats.lfb_reads);
927      statsptr += sprintf(statsptr, "TexW:%6d\n", v->stats.tex_writes);
855      statsptr += sprintf(statsptr, "Poly:%6d\n", vd->stats.total_triangles);
856      statsptr += sprintf(statsptr, "PxIn:%6d\n", vd->stats.total_pixels_in);
857      statsptr += sprintf(statsptr, "POut:%6d\n", vd->stats.total_pixels_out);
858      statsptr += sprintf(statsptr, "Clip:%6d\n", vd->stats.total_clipped);
859      statsptr += sprintf(statsptr, "Stip:%6d\n", vd->stats.total_stippled);
860      statsptr += sprintf(statsptr, "Chro:%6d\n", vd->stats.total_chroma_fail);
861      statsptr += sprintf(statsptr, "ZFun:%6d\n", vd->stats.total_zfunc_fail);
862      statsptr += sprintf(statsptr, "AFun:%6d\n", vd->stats.total_afunc_fail);
863      statsptr += sprintf(statsptr, "RegW:%6d\n", vd->stats.reg_writes);
864      statsptr += sprintf(statsptr, "RegR:%6d\n", vd->stats.reg_reads);
865      statsptr += sprintf(statsptr, "LFBW:%6d\n", vd->stats.lfb_writes);
866      statsptr += sprintf(statsptr, "LFBR:%6d\n", vd->stats.lfb_reads);
867      statsptr += sprintf(statsptr, "TexW:%6d\n", vd->stats.tex_writes);
928868      statsptr += sprintf(statsptr, "TexM:");
929869      for (i = 0; i < 16; i++)
930         if (v->stats.texture_mode[i])
870         if (vd->stats.texture_mode[i])
931871            *statsptr++ = "0123456789ABCDEF"[i];
932872      *statsptr = 0;
933873   }
934874
935875   /* update statistics */
936   v->stats.stalls = 0;
937   v->stats.total_triangles = 0;
938   v->stats.total_pixels_in = 0;
939   v->stats.total_pixels_out = 0;
940   v->stats.total_chroma_fail = 0;
941   v->stats.total_zfunc_fail = 0;
942   v->stats.total_afunc_fail = 0;
943   v->stats.total_clipped = 0;
944   v->stats.total_stippled = 0;
945   v->stats.reg_writes = 0;
946   v->stats.reg_reads = 0;
947   v->stats.lfb_writes = 0;
948   v->stats.lfb_reads = 0;
949   v->stats.tex_writes = 0;
950   memset(v->stats.texture_mode, 0, sizeof(v->stats.texture_mode));
876   vd->stats.stalls = 0;
877   vd->stats.total_triangles = 0;
878   vd->stats.total_pixels_in = 0;
879   vd->stats.total_pixels_out = 0;
880   vd->stats.total_chroma_fail = 0;
881   vd->stats.total_zfunc_fail = 0;
882   vd->stats.total_afunc_fail = 0;
883   vd->stats.total_clipped = 0;
884   vd->stats.total_stippled = 0;
885   vd->stats.reg_writes = 0;
886   vd->stats.reg_reads = 0;
887   vd->stats.lfb_writes = 0;
888   vd->stats.lfb_reads = 0;
889   vd->stats.tex_writes = 0;
890   memset(vd->stats.texture_mode, 0, sizeof(vd->stats.texture_mode));
951891}
952892
953893
954static void adjust_vblank_timer(voodoo_state *v)
894static void adjust_vblank_timer(voodoo_device *vd)
955895{
956   attotime vblank_period = v->screen->time_until_pos(v->fbi.vsyncscan);
896   attotime vblank_period = vd->screen->time_until_pos(vd->fbi.vsyncscan);
957897
958898   /* if zero, adjust to next frame, otherwise we may get stuck in an infinite loop */
959899   if (vblank_period == attotime::zero)
960      vblank_period = v->screen->frame_period();
961   v->fbi.vblank_timer->adjust(vblank_period);
900      vblank_period = vd->screen->frame_period();
901   vd->fbi.vblank_timer->adjust(vblank_period);
962902}
963903
964904
965static TIMER_CALLBACK( vblank_off_callback )
905TIMER_CALLBACK_MEMBER( voodoo_device::vblank_off_callback )
966906{
967   voodoo_state *v = (voodoo_state *)ptr;
907   if (LOG_VBLANK_SWAP) device->logerror("--- vblank end\n");
968908
969   if (LOG_VBLANK_SWAP) v->device->logerror("--- vblank end\n");
970
971909   /* set internal state and call the client */
972   v->fbi.vblank = FALSE;
910   fbi.vblank = FALSE;
973911
974912   // TODO: Vblank IRQ enable is VOODOO3 only?
975   if (v->type >= TYPE_VOODOO_3)
913   if (vd_type >= TYPE_VOODOO_3)
976914   {
977      if (v->reg[intrCtrl].u & 0x8)       // call IRQ handler if VSYNC interrupt (falling) is enabled
915      if (reg[intrCtrl].u & 0x8)       // call IRQ handler if VSYNC interrupt (falling) is enabled
978916      {
979         v->reg[intrCtrl].u |= 0x200;        // VSYNC int (falling) active
917         reg[intrCtrl].u |= 0x200;        // VSYNC int (falling) active
980918
981         if (!v->device->m_vblank.isnull())
982            v->device->m_vblank(FALSE);
919         if (!device->m_vblank.isnull())
920            device->m_vblank(FALSE);
983921
984922      }
985923   }
986924   else
987925   {
988      if (!v->device->m_vblank.isnull())
989         v->device->m_vblank(FALSE);
926      if (!device->m_vblank.isnull())
927         device->m_vblank(FALSE);
990928   }
991929
992930   /* go to the end of the next frame */
993   adjust_vblank_timer(v);
931   adjust_vblank_timer(this);
994932}
995933
996934
997static TIMER_CALLBACK( vblank_callback )
935TIMER_CALLBACK_MEMBER( voodoo_device::vblank_callback )
998936{
999   voodoo_state *v = (voodoo_state *)ptr;
937   if (LOG_VBLANK_SWAP) device->logerror("--- vblank start\n");
1000938
1001   if (LOG_VBLANK_SWAP) v->device->logerror("--- vblank start\n");
1002
1003939   /* flush the pipes */
1004   if (v->pci.op_pending)
940   if (pci.op_pending)
1005941   {
1006      if (LOG_VBLANK_SWAP) v->device->logerror("---- vblank flush begin\n");
1007      flush_fifos(v, machine.time());
1008      if (LOG_VBLANK_SWAP) v->device->logerror("---- vblank flush end\n");
942      if (LOG_VBLANK_SWAP) device->logerror("---- vblank flush begin\n");
943      flush_fifos(this, machine().time());
944      if (LOG_VBLANK_SWAP) device->logerror("---- vblank flush end\n");
1009945   }
1010946
1011947   /* increment the count */
1012   v->fbi.vblank_count++;
1013   if (v->fbi.vblank_count > 250)
1014      v->fbi.vblank_count = 250;
1015   if (LOG_VBLANK_SWAP) v->device->logerror("---- vblank count = %d", v->fbi.vblank_count);
1016   if (v->fbi.vblank_swap_pending)
1017      if (LOG_VBLANK_SWAP) v->device->logerror(" (target=%d)", v->fbi.vblank_swap);
1018   if (LOG_VBLANK_SWAP) v->device->logerror("\n");
948   fbi.vblank_count++;
949   if (fbi.vblank_count > 250)
950      fbi.vblank_count = 250;
951   if (LOG_VBLANK_SWAP) device->logerror("---- vblank count = %d", fbi.vblank_count);
952   if (fbi.vblank_swap_pending)
953      if (LOG_VBLANK_SWAP) device->logerror(" (target=%d)", fbi.vblank_swap);
954   if (LOG_VBLANK_SWAP) device->logerror("\n");
1019955
1020956   /* if we're past the swap count, do the swap */
1021   if (v->fbi.vblank_swap_pending && v->fbi.vblank_count >= v->fbi.vblank_swap)
1022      swap_buffers(v);
957   if (fbi.vblank_swap_pending && fbi.vblank_count >= fbi.vblank_swap)
958      swap_buffers(this);
1023959
1024960   /* set a timer for the next off state */
1025   machine.scheduler().timer_set(v->screen->time_until_pos(0), FUNC(vblank_off_callback), 0, v);
961   machine().scheduler().timer_set(screen->time_until_pos(0), timer_expired_delegate(FUNC(voodoo_device::vblank_off_callback),this), 0, this);
1026962
963   
964
1027965   /* set internal state and call the client */
1028   v->fbi.vblank = TRUE;
966   fbi.vblank = TRUE;
1029967
1030968   // TODO: Vblank IRQ enable is VOODOO3 only?
1031   if (v->type >= TYPE_VOODOO_3)
969   if (vd_type >= TYPE_VOODOO_3)
1032970   {
1033      if (v->reg[intrCtrl].u & 0x4)       // call IRQ handler if VSYNC interrupt (rising) is enabled
971      if (reg[intrCtrl].u & 0x4)       // call IRQ handler if VSYNC interrupt (rising) is enabled
1034972      {
1035         v->reg[intrCtrl].u |= 0x100;        // VSYNC int (rising) active
973         reg[intrCtrl].u |= 0x100;        // VSYNC int (rising) active
1036974
1037         if (!v->device->m_vblank.isnull())
1038            v->device->m_vblank(TRUE);
975         if (!device->m_vblank.isnull())
976            device->m_vblank(TRUE);
1039977      }
1040978   }
1041979   else
1042980   {
1043      if (!v->device->m_vblank.isnull())
1044         v->device->m_vblank(TRUE);
981      if (!device->m_vblank.isnull())
982         device->m_vblank(TRUE);
1045983   }
1046984}
1047985
r253153r253154
1053991 *
1054992 *************************************/
1055993
1056static void reset_counters(voodoo_state *v)
994static void reset_counters(voodoo_device *vd)
1057995{
1058   update_statistics(v, FALSE);
1059   v->reg[fbiPixelsIn].u = 0;
1060   v->reg[fbiChromaFail].u = 0;
1061   v->reg[fbiZfuncFail].u = 0;
1062   v->reg[fbiAfuncFail].u = 0;
1063   v->reg[fbiPixelsOut].u = 0;
996   update_statistics(vd, FALSE);
997   vd->reg[fbiPixelsIn].u = 0;
998   vd->reg[fbiChromaFail].u = 0;
999   vd->reg[fbiZfuncFail].u = 0;
1000   vd->reg[fbiAfuncFail].u = 0;
1001   vd->reg[fbiPixelsOut].u = 0;
10641002}
10651003
10661004
1067static void soft_reset(voodoo_state *v)
1005void voodoo_device::soft_reset(voodoo_device *vd)
10681006{
1069   reset_counters(v);
1070   v->reg[fbiTrianglesOut].u = 0;
1071   fifo_reset(&v->fbi.fifo);
1072   fifo_reset(&v->pci.fifo);
1007   reset_counters(vd);
1008   vd->reg[fbiTrianglesOut].u = 0;
1009   fifo_reset(&vd->fbi.fifo);
1010   fifo_reset(&vd->pci.fifo);
10731011}
10741012
10751013
r253153r253154
10801018 *
10811019 *************************************/
10821020
1083static void recompute_video_memory(voodoo_state *v)
1021void voodoo_device::recompute_video_memory(voodoo_device *vd)
10841022{
1085   UINT32 buffer_pages = FBIINIT2_VIDEO_BUFFER_OFFSET(v->reg[fbiInit2].u);
1086   UINT32 fifo_start_page = FBIINIT4_MEMORY_FIFO_START_ROW(v->reg[fbiInit4].u);
1087   UINT32 fifo_last_page = FBIINIT4_MEMORY_FIFO_STOP_ROW(v->reg[fbiInit4].u);
1023   UINT32 buffer_pages = FBIINIT2_VIDEO_BUFFER_OFFSET(vd->reg[fbiInit2].u);
1024   UINT32 fifo_start_page = FBIINIT4_MEMORY_FIFO_START_ROW(vd->reg[fbiInit4].u);
1025   UINT32 fifo_last_page = FBIINIT4_MEMORY_FIFO_STOP_ROW(vd->reg[fbiInit4].u);
10881026   UINT32 memory_config;
10891027   int buf;
10901028
10911029   /* memory config is determined differently between V1 and V2 */
1092   memory_config = FBIINIT2_ENABLE_TRIPLE_BUF(v->reg[fbiInit2].u);
1093   if (v->type == TYPE_VOODOO_2 && memory_config == 0)
1094      memory_config = FBIINIT5_BUFFER_ALLOCATION(v->reg[fbiInit5].u);
1030   memory_config = FBIINIT2_ENABLE_TRIPLE_BUF(vd->reg[fbiInit2].u);
1031   if (vd->vd_type == TYPE_VOODOO_2 && memory_config == 0)
1032      memory_config = FBIINIT5_BUFFER_ALLOCATION(vd->reg[fbiInit5].u);
10951033
10961034   /* tiles are 64x16/32; x_tiles specifies how many half-tiles */
1097   v->fbi.tile_width = (v->type == TYPE_VOODOO_1) ? 64 : 32;
1098   v->fbi.tile_height = (v->type == TYPE_VOODOO_1) ? 16 : 32;
1099   v->fbi.x_tiles = FBIINIT1_X_VIDEO_TILES(v->reg[fbiInit1].u);
1100   if (v->type == TYPE_VOODOO_2)
1035   vd->fbi.tile_width = (vd->vd_type == TYPE_VOODOO_1) ? 64 : 32;
1036   vd->fbi.tile_height = (vd->vd_type == TYPE_VOODOO_1) ? 16 : 32;
1037   vd->fbi.x_tiles = FBIINIT1_X_VIDEO_TILES(vd->reg[fbiInit1].u);
1038   if (vd->vd_type == TYPE_VOODOO_2)
11011039   {
1102      v->fbi.x_tiles = (v->fbi.x_tiles << 1) |
1103                  (FBIINIT1_X_VIDEO_TILES_BIT5(v->reg[fbiInit1].u) << 5) |
1104                  (FBIINIT6_X_VIDEO_TILES_BIT0(v->reg[fbiInit6].u));
1040      vd->fbi.x_tiles = (vd->fbi.x_tiles << 1) |
1041                  (FBIINIT1_X_VIDEO_TILES_BIT5(vd->reg[fbiInit1].u) << 5) |
1042                  (FBIINIT6_X_VIDEO_TILES_BIT0(vd->reg[fbiInit6].u));
11051043   }
1106   v->fbi.rowpixels = v->fbi.tile_width * v->fbi.x_tiles;
1044   vd->fbi.rowpixels = vd->fbi.tile_width * vd->fbi.x_tiles;
11071045
1108//  logerror("VOODOO.%d.VIDMEM: buffer_pages=%X  fifo=%X-%X  tiles=%X  rowpix=%d\n", v->index, buffer_pages, fifo_start_page, fifo_last_page, v->fbi.x_tiles, v->fbi.rowpixels);
1046//  logerror("VOODOO.%d.VIDMEM: buffer_pages=%X  fifo=%X-%X  tiles=%X  rowpix=%d\n", vd->index, buffer_pages, fifo_start_page, fifo_last_page, vd->fbi.x_tiles, vd->fbi.rowpixels);
11091047
11101048   /* first RGB buffer always starts at 0 */
1111   v->fbi.rgboffs[0] = 0;
1049   vd->fbi.rgboffs[0] = 0;
11121050
11131051   /* second RGB buffer starts immediately afterwards */
1114   v->fbi.rgboffs[1] = buffer_pages * 0x1000;
1052   vd->fbi.rgboffs[1] = buffer_pages * 0x1000;
11151053
11161054   /* remaining buffers are based on the config */
11171055   switch (memory_config)
11181056   {
11191057      case 3: /* reserved */
1120         v->device->logerror("VOODOO.%d.ERROR:Unexpected memory configuration in recompute_video_memory!\n", v->index);
1058         vd->device->logerror("VOODOO.%d.ERROR:Unexpected memory configuration in recompute_video_memory!\n", vd->index);
11211059
11221060      case 0: /* 2 color buffers, 1 aux buffer */
1123         v->fbi.rgboffs[2] = ~0;
1124         v->fbi.auxoffs = 2 * buffer_pages * 0x1000;
1061         vd->fbi.rgboffs[2] = ~0;
1062         vd->fbi.auxoffs = 2 * buffer_pages * 0x1000;
11251063         break;
11261064
11271065      case 1: /* 3 color buffers, 0 aux buffers */
1128         v->fbi.rgboffs[2] = 2 * buffer_pages * 0x1000;
1129         v->fbi.auxoffs = ~0;
1066         vd->fbi.rgboffs[2] = 2 * buffer_pages * 0x1000;
1067         vd->fbi.auxoffs = ~0;
11301068         break;
11311069
11321070      case 2: /* 3 color buffers, 1 aux buffers */
1133         v->fbi.rgboffs[2] = 2 * buffer_pages * 0x1000;
1134         v->fbi.auxoffs = 3 * buffer_pages * 0x1000;
1071         vd->fbi.rgboffs[2] = 2 * buffer_pages * 0x1000;
1072         vd->fbi.auxoffs = 3 * buffer_pages * 0x1000;
11351073         break;
11361074   }
11371075
11381076   /* clamp the RGB buffers to video memory */
11391077   for (buf = 0; buf < 3; buf++)
1140      if (v->fbi.rgboffs[buf] != ~0 && v->fbi.rgboffs[buf] > v->fbi.mask)
1141         v->fbi.rgboffs[buf] = v->fbi.mask;
1078      if (vd->fbi.rgboffs[buf] != ~0 && vd->fbi.rgboffs[buf] > vd->fbi.mask)
1079         vd->fbi.rgboffs[buf] = vd->fbi.mask;
11421080
11431081   /* clamp the aux buffer to video memory */
1144   if (v->fbi.auxoffs != ~0 && v->fbi.auxoffs > v->fbi.mask)
1145      v->fbi.auxoffs = v->fbi.mask;
1082   if (vd->fbi.auxoffs != ~0 && vd->fbi.auxoffs > vd->fbi.mask)
1083      vd->fbi.auxoffs = vd->fbi.mask;
11461084
11471085/*  osd_printf_debug("rgb[0] = %08X   rgb[1] = %08X   rgb[2] = %08X   aux = %08X\n",
1148            v->fbi.rgboffs[0], v->fbi.rgboffs[1], v->fbi.rgboffs[2], v->fbi.auxoffs);*/
1086            vd->fbi.rgboffs[0], vd->fbi.rgboffs[1], vd->fbi.rgboffs[2], vd->fbi.auxoffs);*/
11491087
11501088   /* compute the memory FIFO location and size */
1151   if (fifo_last_page > v->fbi.mask / 0x1000)
1152      fifo_last_page = v->fbi.mask / 0x1000;
1089   if (fifo_last_page > vd->fbi.mask / 0x1000)
1090      fifo_last_page = vd->fbi.mask / 0x1000;
11531091
11541092   /* is it valid and enabled? */
1155   if (fifo_start_page <= fifo_last_page && FBIINIT0_ENABLE_MEMORY_FIFO(v->reg[fbiInit0].u))
1093   if (fifo_start_page <= fifo_last_page && FBIINIT0_ENABLE_MEMORY_FIFO(vd->reg[fbiInit0].u))
11561094   {
1157      v->fbi.fifo.base = (UINT32 *)(v->fbi.ram + fifo_start_page * 0x1000);
1158      v->fbi.fifo.size = (fifo_last_page + 1 - fifo_start_page) * 0x1000 / 4;
1159      if (v->fbi.fifo.size > 65536*2)
1160         v->fbi.fifo.size = 65536*2;
1095      vd->fbi.fifo.base = (UINT32 *)(vd->fbi.ram + fifo_start_page * 0x1000);
1096      vd->fbi.fifo.size = (fifo_last_page + 1 - fifo_start_page) * 0x1000 / 4;
1097      if (vd->fbi.fifo.size > 65536*2)
1098         vd->fbi.fifo.size = 65536*2;
11611099   }
11621100
11631101   /* if not, disable the FIFO */
11641102   else
11651103   {
1166      v->fbi.fifo.base = nullptr;
1167      v->fbi.fifo.size = 0;
1104      vd->fbi.fifo.base = nullptr;
1105      vd->fbi.fifo.size = 0;
11681106   }
11691107
11701108   /* reset the FIFO */
1171   fifo_reset(&v->fbi.fifo);
1109   fifo_reset(&vd->fbi.fifo);
11721110
11731111   /* reset our front/back buffers if they are out of range */
1174   if (v->fbi.rgboffs[2] == ~0)
1112   if (vd->fbi.rgboffs[2] == ~0)
11751113   {
1176      if (v->fbi.frontbuf == 2)
1177         v->fbi.frontbuf = 0;
1178      if (v->fbi.backbuf == 2)
1179         v->fbi.backbuf = 0;
1114      if (vd->fbi.frontbuf == 2)
1115         vd->fbi.frontbuf = 0;
1116      if (vd->fbi.backbuf == 2)
1117         vd->fbi.backbuf = 0;
11801118   }
11811119}
11821120
r253153r253154
14761414 *
14771415 *************************************/
14781416
1479static int cmdfifo_compute_expected_depth(voodoo_state *v, cmdfifo_info *f)
1417static int cmdfifo_compute_expected_depth(voodoo_device *vd, cmdfifo_info *f)
14801418{
1481   UINT32 *fifobase = (UINT32 *)v->fbi.ram;
1419   UINT32 *fifobase = (UINT32 *)vd->fbi.ram;
14821420   UINT32 readptr = f->rdptr;
14831421   UINT32 command = fifobase[readptr / 4];
14841422   int i, count = 0;
r253153r253154
16161554 *
16171555 *************************************/
16181556
1619static UINT32 cmdfifo_execute(voodoo_state *v, cmdfifo_info *f)
1557UINT32 voodoo_device::cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f)
16201558{
1621   UINT32 *fifobase = (UINT32 *)v->fbi.ram;
1559   UINT32 *fifobase = (UINT32 *)vd->fbi.ram;
16221560   UINT32 readptr = f->rdptr;
16231561   UINT32 *src = &fifobase[readptr / 4];
16241562   UINT32 command = *src++;
r253153r253154
16491587         switch ((command >> 3) & 7)
16501588         {
16511589            case 0:     /* NOP */
1652               if (LOG_CMDFIFO) v->device->logerror("  NOP\n");
1590               if (LOG_CMDFIFO) vd->device->logerror("  NOP\n");
16531591               break;
16541592
16551593            case 1:     /* JSR */
1656               if (LOG_CMDFIFO) v->device->logerror("  JSR $%06X\n", target);
1594               if (LOG_CMDFIFO) vd->device->logerror("  JSR $%06X\n", target);
16571595               osd_printf_debug("JSR in CMDFIFO!\n");
16581596               src = &fifobase[target / 4];
16591597               break;
16601598
16611599            case 2:     /* RET */
1662               if (LOG_CMDFIFO) v->device->logerror("  RET $%06X\n", target);
1600               if (LOG_CMDFIFO) vd->device->logerror("  RET $%06X\n", target);
16631601               fatalerror("RET in CMDFIFO!\n");
16641602
16651603            case 3:     /* JMP LOCAL FRAME BUFFER */
1666               if (LOG_CMDFIFO) v->device->logerror("  JMP LOCAL FRAMEBUF $%06X\n", target);
1604               if (LOG_CMDFIFO) vd->device->logerror("  JMP LOCAL FRAMEBUF $%06X\n", target);
16671605               src = &fifobase[target / 4];
16681606               break;
16691607
16701608            case 4:     /* JMP AGP */
1671               if (LOG_CMDFIFO) v->device->logerror("  JMP AGP $%06X\n", target);
1609               if (LOG_CMDFIFO) vd->device->logerror("  JMP AGP $%06X\n", target);
16721610               fatalerror("JMP AGP in CMDFIFO!\n");
16731611               src = &fifobase[target / 4];
16741612               break;
r253153r253154
16961634         inc = (command >> 15) & 1;
16971635         target = (command >> 3) & 0xfff;
16981636
1699         if (LOG_CMDFIFO) v->device->logerror("  PACKET TYPE 1: count=%d inc=%d reg=%04X\n", count, inc, target);
1637         if (LOG_CMDFIFO) vd->device->logerror("  PACKET TYPE 1: count=%d inc=%d reg=%04X\n", count, inc, target);
17001638
1701         if (v->type >= TYPE_VOODOO_BANSHEE && (target & 0x800))
1639         if (vd->vd_type >= TYPE_VOODOO_BANSHEE && (target & 0x800))
17021640         {
17031641            //  Banshee/Voodoo3 2D register writes
17041642
17051643            /* loop over all registers and write them one at a time */
17061644            for (i = 0; i < count; i++, target += inc)
17071645            {
1708               cycles += banshee_2d_w(v, target & 0xff, *src);
1646               cycles += banshee_2d_w(vd, target & 0xff, *src);
17091647               //logerror("    2d reg: %03x = %08X\n", target & 0x7ff, *src);
17101648               src++;
17111649            }
r253153r253154
17141652         {
17151653            /* loop over all registers and write them one at a time */
17161654            for (i = 0; i < count; i++, target += inc)
1717               cycles += register_w(v, target, *src++);
1655               cycles += register_w(vd, target, *src++);
17181656         }
17191657         break;
17201658
r253153r253154
17271665              1  31:0  = Data word
17281666      */
17291667      case 2:
1730         if (LOG_CMDFIFO) v->device->logerror("  PACKET TYPE 2: mask=%X\n", (command >> 3) & 0x1ffffff);
1668         if (LOG_CMDFIFO) vd->device->logerror("  PACKET TYPE 2: mask=%X\n", (command >> 3) & 0x1ffffff);
17311669
17321670         /* loop over all registers and write them one at a time */
17331671         for (i = 3; i <= 31; i++)
17341672            if (command & (1 << i))
1735               cycles += register_w(v, banshee2D_clip0Min + (i - 3), *src++);
1673               cycles += register_w(vd, banshee2D_clip0Min + (i - 3), *src++);
17361674         break;
17371675
17381676      /*
r253153r253154
17641702         count = (command >> 6) & 15;
17651703         code = (command >> 3) & 7;
17661704
1767         if (LOG_CMDFIFO) v->device->logerror("  PACKET TYPE 3: count=%d code=%d mask=%03X smode=%02X pc=%d\n", count, code, (command >> 10) & 0xfff, (command >> 22) & 0x3f, (command >> 28) & 1);
1705         if (LOG_CMDFIFO) vd->device->logerror("  PACKET TYPE 3: count=%d code=%d mask=%03X smode=%02X pc=%d\n", count, code, (command >> 10) & 0xfff, (command >> 22) & 0x3f, (command >> 28) & 1);
17681706
17691707         /* copy relevant bits into the setup mode register */
1770         v->reg[sSetupMode].u = ((command >> 10) & 0xff) | ((command >> 6) & 0xf0000);
1708         vd->reg[sSetupMode].u = ((command >> 10) & 0xff) | ((command >> 6) & 0xf0000);
17711709
17721710         /* loop over triangles */
17731711         for (i = 0; i < count; i++)
r253153r253154
18341772            /* for a series of individual triangles, initialize all the verts */
18351773            if ((code == 1 && i == 0) || (code == 0 && i % 3 == 0))
18361774            {
1837               v->fbi.sverts = 1;
1838               v->fbi.svert[0] = v->fbi.svert[1] = v->fbi.svert[2] = svert;
1775               vd->fbi.sverts = 1;
1776               vd->fbi.svert[0] = vd->fbi.svert[1] = vd->fbi.svert[2] = svert;
18391777            }
18401778
18411779            /* otherwise, add this to the list */
r253153r253154
18431781            {
18441782               /* for strip mode, shuffle vertex 1 down to 0 */
18451783               if (!(command & (1 << 22)))
1846                  v->fbi.svert[0] = v->fbi.svert[1];
1784                  vd->fbi.svert[0] = vd->fbi.svert[1];
18471785
18481786               /* copy 2 down to 1 and add our new one regardless */
1849               v->fbi.svert[1] = v->fbi.svert[2];
1850               v->fbi.svert[2] = svert;
1787               vd->fbi.svert[1] = vd->fbi.svert[2];
1788               vd->fbi.svert[2] = svert;
18511789
18521790               /* if we have enough, draw */
1853               if (++v->fbi.sverts >= 3)
1854                  cycles += setup_and_draw_triangle(v);
1791               if (++vd->fbi.sverts >= 3)
1792                  cycles += setup_and_draw_triangle(vd);
18551793            }
18561794         }
18571795
r253153r253154
18741812         /* extract parameters */
18751813         target = (command >> 3) & 0xfff;
18761814
1877         if (LOG_CMDFIFO) v->device->logerror("  PACKET TYPE 4: mask=%X reg=%04X pad=%d\n", (command >> 15) & 0x3fff, target, command >> 29);
1815         if (LOG_CMDFIFO) vd->device->logerror("  PACKET TYPE 4: mask=%X reg=%04X pad=%d\n", (command >> 15) & 0x3fff, target, command >> 29);
18781816
1879         if (v->type >= TYPE_VOODOO_BANSHEE && (target & 0x800))
1817         if (vd->vd_type >= TYPE_VOODOO_BANSHEE && (target & 0x800))
18801818         {
18811819            //  Banshee/Voodoo3 2D register writes
18821820
r253153r253154
18861824            {
18871825               if (command & (1 << i))
18881826               {
1889                  cycles += banshee_2d_w(v, target + (i - 15), *src);
1827                  cycles += banshee_2d_w(vd, target + (i - 15), *src);
18901828                  //logerror("    2d reg: %03x = %08X\n", target & 0x7ff, *src);
18911829                  src++;
18921830               }
r253153r253154
18971835            /* loop over all registers and write them one at a time */
18981836            for (i = 15; i <= 28; i++)
18991837               if (command & (1 << i))
1900                  cycles += register_w(v, target + (i - 15), *src++);
1838                  cycles += register_w(vd, target + (i - 15), *src++);
19011839         }
19021840
19031841         /* account for the extra dummy words */
r253153r253154
19281866         {
19291867            case 0:     // Linear FB
19301868            {
1931               if (LOG_CMDFIFO) v->device->logerror("  PACKET TYPE 5: FB count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15);
1869               if (LOG_CMDFIFO) vd->device->logerror("  PACKET TYPE 5: FB count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15);
19321870
19331871               UINT32 addr = target * 4;
19341872               for (i=0; i < count; i++)
19351873               {
19361874                  UINT32 data = *src++;
19371875
1938                  v->fbi.ram[BYTE_XOR_LE(addr + 0)] = (UINT8)(data);
1939                  v->fbi.ram[BYTE_XOR_LE(addr + 1)] = (UINT8)(data >> 8);
1940                  v->fbi.ram[BYTE_XOR_LE(addr + 2)] = (UINT8)(data >> 16);
1941                  v->fbi.ram[BYTE_XOR_LE(addr + 3)] = (UINT8)(data >> 24);
1876                  vd->fbi.ram[BYTE_XOR_LE(addr + 0)] = (UINT8)(data);
1877                  vd->fbi.ram[BYTE_XOR_LE(addr + 1)] = (UINT8)(data >> 8);
1878                  vd->fbi.ram[BYTE_XOR_LE(addr + 2)] = (UINT8)(data >> 16);
1879                  vd->fbi.ram[BYTE_XOR_LE(addr + 3)] = (UINT8)(data >> 24);
19421880
19431881                  addr += 4;
19441882               }
r253153r253154
19461884            }
19471885            case 2:     // 3D LFB
19481886            {
1949               if (LOG_CMDFIFO) v->device->logerror("  PACKET TYPE 5: 3D LFB count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15);
1887               if (LOG_CMDFIFO) vd->device->logerror("  PACKET TYPE 5: 3D LFB count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15);
19501888
19511889               /* loop over words */
19521890               for (i = 0; i < count; i++)
1953                  cycles += lfb_w(v, target++, *src++, 0xffffffff);
1891                  cycles += lfb_w(vd, target++, *src++, 0xffffffff);
19541892
19551893               break;
19561894            }
r253153r253154
19711909
19721910            case 3:     // Texture Port
19731911            {
1974               if (LOG_CMDFIFO) v->device->logerror("  PACKET TYPE 5: textureRAM count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15);
1912               if (LOG_CMDFIFO) vd->device->logerror("  PACKET TYPE 5: textureRAM count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15);
19751913
19761914               /* loop over words */
19771915               for (i = 0; i < count; i++)
1978                  cycles += texture_w(v, target++, *src++);
1916                  cycles += texture_w(vd, target++, *src++);
19791917
19801918               break;
19811919            }
r253153r253154
20011939 *
20021940 *************************************/
20031941
2004static INT32 cmdfifo_execute_if_ready(voodoo_state *v, cmdfifo_info *f)
1942INT32 voodoo_device::cmdfifo_execute_if_ready(voodoo_device* vd, cmdfifo_info *f)
20051943{
20061944   int needed_depth;
20071945   int cycles;
r253153r253154
20111949      return -1;
20121950
20131951   /* see if we have enough for the current command */
2014   needed_depth = cmdfifo_compute_expected_depth(v, f);
1952   needed_depth = cmdfifo_compute_expected_depth(vd, f);
20151953   if (f->depth < needed_depth)
20161954      return -1;
20171955
20181956   /* execute */
2019   cycles = cmdfifo_execute(v, f);
1957   cycles = cmdfifo_execute(vd, f);
20201958   f->depth -= needed_depth;
20211959   return cycles;
20221960}
r253153r253154
20291967 *
20301968 *************************************/
20311969
2032static void cmdfifo_w(voodoo_state *v, cmdfifo_info *f, offs_t offset, UINT32 data)
1970void voodoo_device::cmdfifo_w(voodoo_device *vd, cmdfifo_info *f, offs_t offset, UINT32 data)
20331971{
20341972   UINT32 addr = f->base + offset * 4;
2035   UINT32 *fifobase = (UINT32 *)v->fbi.ram;
1973   UINT32 *fifobase = (UINT32 *)vd->fbi.ram;
20361974
2037   if (LOG_CMDFIFO_VERBOSE) v->device->logerror("CMDFIFO_w(%04X) = %08X\n", offset, data);
1975   if (LOG_CMDFIFO_VERBOSE) vd->device->logerror("CMDFIFO_w(%04X) = %08X\n", offset, data);
20381976
20391977   /* write the data */
20401978   if (addr < f->end)
r253153r253154
20541992      else if (addr < f->amin)
20551993      {
20561994         if (f->holes != 0)
2057            v->device->logerror("Unexpected CMDFIFO: AMin=%08X AMax=%08X Holes=%d WroteTo:%08X\n",
1995            vd->device->logerror("Unexpected CMDFIFO: AMin=%08X AMax=%08X Holes=%d WroteTo:%08X\n",
20581996                  f->amin, f->amax, f->holes, addr);
20591997         //f->amin = f->amax = addr;
20601998         f->holes += (addr - f->base) / 4;
r253153r253154
20842022   }
20852023
20862024   /* execute if we can */
2087   if (!v->pci.op_pending)
2025   if (!vd->pci.op_pending)
20882026   {
2089      INT32 cycles = cmdfifo_execute_if_ready(v, f);
2027      INT32 cycles = cmdfifo_execute_if_ready(vd, f);
20902028      if (cycles > 0)
20912029      {
2092         v->pci.op_pending = TRUE;
2093         v->pci.op_end_time = v->device->machine().time() + attotime(0, (attoseconds_t)cycles * v->attoseconds_per_cycle);
2030         vd->pci.op_pending = TRUE;
2031         vd->pci.op_end_time = vd->device->machine().time() + attotime(0, (attoseconds_t)cycles * vd->attoseconds_per_cycle);
20942032
2095         if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:direct write start at %d.%08X%08X end at %d.%08X%08X\n", v->index,
2096            v->device->machine().time().seconds(), (UINT32)(v->device->machine().time().attoseconds() >> 32), (UINT32)v->device->machine().time().attoseconds(),
2097            v->pci.op_end_time.seconds(), (UINT32)(v->pci.op_end_time.attoseconds() >> 32), (UINT32)v->pci.op_end_time.attoseconds());
2033         if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:direct write start at %d.%08X%08X end at %d.%08X%08X\n", vd->index,
2034            vd->device->machine().time().seconds(), (UINT32)(vd->device->machine().time().attoseconds() >> 32), (UINT32)vd->device->machine().time().attoseconds(),
2035            vd->pci.op_end_time.seconds(), (UINT32)(vd->pci.op_end_time.attoseconds() >> 32), (UINT32)vd->pci.op_end_time.attoseconds());
20982036      }
20992037   }
21002038}
r253153r253154
21082046 *
21092047 *************************************/
21102048
2111static TIMER_CALLBACK( stall_cpu_callback )
2049TIMER_CALLBACK_MEMBER( voodoo_device::stall_cpu_callback )
21122050{
2113   check_stalled_cpu((voodoo_state *)ptr, machine.time());
2051   check_stalled_cpu(this, machine().time());
21142052}
21152053
21162054
2117static void check_stalled_cpu(voodoo_state *v, attotime current_time)
2055void voodoo_device::check_stalled_cpu(voodoo_device* vd, attotime current_time)
21182056{
21192057   int resume = FALSE;
21202058
21212059   /* flush anything we can */
2122   if (v->pci.op_pending)
2123      flush_fifos(v, current_time);
2060   if (vd->pci.op_pending)
2061      flush_fifos(vd, current_time);
21242062
21252063   /* if we're just stalled until the LWM is passed, see if we're ok now */
2126   if (v->pci.stall_state == STALLED_UNTIL_FIFO_LWM)
2064   if (vd->pci.stall_state == STALLED_UNTIL_FIFO_LWM)
21272065   {
21282066      /* if there's room in the memory FIFO now, we can proceed */
2129      if (FBIINIT0_ENABLE_MEMORY_FIFO(v->reg[fbiInit0].u))
2067      if (FBIINIT0_ENABLE_MEMORY_FIFO(vd->reg[fbiInit0].u))
21302068      {
2131         if (fifo_items(&v->fbi.fifo) < 2 * 32 * FBIINIT0_MEMORY_FIFO_HWM(v->reg[fbiInit0].u))
2069         if (fifo_items(&vd->fbi.fifo) < 2 * 32 * FBIINIT0_MEMORY_FIFO_HWM(vd->reg[fbiInit0].u))
21322070            resume = TRUE;
21332071      }
2134      else if (fifo_space(&v->pci.fifo) > 2 * FBIINIT0_PCI_FIFO_LWM(v->reg[fbiInit0].u))
2072      else if (fifo_space(&vd->pci.fifo) > 2 * FBIINIT0_PCI_FIFO_LWM(vd->reg[fbiInit0].u))
21352073         resume = TRUE;
21362074   }
21372075
21382076   /* if we're stalled until the FIFOs are empty, check now */
2139   else if (v->pci.stall_state == STALLED_UNTIL_FIFO_EMPTY)
2077   else if (vd->pci.stall_state == STALLED_UNTIL_FIFO_EMPTY)
21402078   {
2141      if (FBIINIT0_ENABLE_MEMORY_FIFO(v->reg[fbiInit0].u))
2079      if (FBIINIT0_ENABLE_MEMORY_FIFO(vd->reg[fbiInit0].u))
21422080      {
2143         if (fifo_empty(&v->fbi.fifo) && fifo_empty(&v->pci.fifo))
2081         if (fifo_empty(&vd->fbi.fifo) && fifo_empty(&vd->pci.fifo))
21442082            resume = TRUE;
21452083      }
2146      else if (fifo_empty(&v->pci.fifo))
2084      else if (fifo_empty(&vd->pci.fifo))
21472085         resume = TRUE;
21482086   }
21492087
21502088   /* resume if necessary */
2151   if (resume || !v->pci.op_pending)
2089   if (resume || !vd->pci.op_pending)
21522090   {
2153      if (LOG_FIFO) v->device->logerror("VOODOO.%d.FIFO:Stall condition cleared; resuming\n", v->index);
2154      v->pci.stall_state = NOT_STALLED;
2091      if (LOG_FIFO) vd->device->logerror("VOODOO.%d.FIFO:Stall condition cleared; resuming\n", vd->index);
2092      vd->pci.stall_state = NOT_STALLED;
21552093
21562094      /* either call the callback, or trigger the trigger */
2157      if (!v->device->m_stall.isnull())
2158         v->device->m_stall(FALSE);
2095      if (!vd->device->m_stall.isnull())
2096         vd->device->m_stall(FALSE);
21592097      else
2160         v->device->machine().scheduler().trigger(v->trigger);
2098         vd->device->machine().scheduler().trigger(vd->trigger);
21612099   }
21622100
21632101   /* if not, set a timer for the next one */
21642102   else
21652103   {
2166      v->pci.continue_timer->adjust(v->pci.op_end_time - current_time);
2104      vd->pci.continue_timer->adjust(vd->pci.op_end_time - current_time);
21672105   }
21682106}
21692107
21702108
2171static void stall_cpu(voodoo_state *v, int state, attotime current_time)
2109void voodoo_device::stall_cpu(voodoo_device *vd, int state, attotime current_time)
21722110{
21732111   /* sanity check */
2174   if (!v->pci.op_pending) fatalerror("FIFOs not empty, no op pending!\n");
2112   if (!vd->pci.op_pending) fatalerror("FIFOs not empty, no op pending!\n");
21752113
21762114   /* set the state and update statistics */
2177   v->pci.stall_state = state;
2178   v->stats.stalls++;
2115   vd->pci.stall_state = state;
2116   vd->stats.stalls++;
21792117
21802118   /* either call the callback, or spin the CPU */
2181   if (!v->device->m_stall.isnull())
2182      v->device->m_stall(TRUE);
2119   if (!vd->device->m_stall.isnull())
2120      vd->device->m_stall(TRUE);
21832121   else
2184      v->cpu->execute().spin_until_trigger(v->trigger);
2122      vd->cpu->execute().spin_until_trigger(vd->trigger);
21852123
21862124   /* set a timer to clear the stall */
2187   v->pci.continue_timer->adjust(v->pci.op_end_time - current_time);
2125   vd->pci.continue_timer->adjust(vd->pci.op_end_time - current_time);
21882126}
21892127
21902128
r253153r253154
21952133 *
21962134 *************************************/
21972135
2198static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data)
2136INT32 voodoo_device::register_w(voodoo_device *vd, offs_t offset, UINT32 data)
21992137{
22002138   UINT32 origdata = data;
22012139   INT32 cycles = 0;
r253153r253154
22042142   UINT8 chips;
22052143
22062144   /* statistics */
2207   v->stats.reg_writes++;
2145   vd->stats.reg_writes++;
22082146
22092147   /* determine which chips we are addressing */
22102148   chips = (offset >> 8) & 0xf;
22112149   if (chips == 0)
22122150      chips = 0xf;
2213   chips &= v->chipmask;
2151   chips &= vd->chipmask;
22142152
22152153   /* the first 64 registers can be aliased differently */
2216   if ((offset & 0x800c0) == 0x80000 && v->alt_regmap)
2154   if ((offset & 0x800c0) == 0x80000 && vd->alt_regmap)
22172155      regnum = register_alias_map[offset & 0x3f];
22182156   else
22192157      regnum = offset & 0xff;
22202158
22212159   /* first make sure this register is readable */
2222   if (!(v->regaccess[regnum] & REGISTER_WRITE))
2160   if (!(vd->regaccess[regnum] & REGISTER_WRITE))
22232161   {
2224      v->device->logerror("VOODOO.%d.ERROR:Invalid attempt to write %s\n", v->index, v->regnames[regnum]);
2162      vd->device->logerror("VOODOO.%d.ERROR:Invalid attempt to write %s\n", vd->index, vd->regnames[regnum]);
22252163      return 0;
22262164   }
22272165
r253153r253154
22322170      case fvertexAx:
22332171         data = float_to_int32(data, 4);
22342172      case vertexAx:
2235         if (chips & 1) v->fbi.ax = (INT16)data;
2173         if (chips & 1) vd->fbi.ax = (INT16)data;
22362174         break;
22372175
22382176      case fvertexAy:
22392177         data = float_to_int32(data, 4);
22402178      case vertexAy:
2241         if (chips & 1) v->fbi.ay = (INT16)data;
2179         if (chips & 1) vd->fbi.ay = (INT16)data;
22422180         break;
22432181
22442182      case fvertexBx:
22452183         data = float_to_int32(data, 4);
22462184      case vertexBx:
2247         if (chips & 1) v->fbi.bx = (INT16)data;
2185         if (chips & 1) vd->fbi.bx = (INT16)data;
22482186         break;
22492187
22502188      case fvertexBy:
22512189         data = float_to_int32(data, 4);
22522190      case vertexBy:
2253         if (chips & 1) v->fbi.by = (INT16)data;
2191         if (chips & 1) vd->fbi.by = (INT16)data;
22542192         break;
22552193
22562194      case fvertexCx:
22572195         data = float_to_int32(data, 4);
22582196      case vertexCx:
2259         if (chips & 1) v->fbi.cx = (INT16)data;
2197         if (chips & 1) vd->fbi.cx = (INT16)data;
22602198         break;
22612199
22622200      case fvertexCy:
22632201         data = float_to_int32(data, 4);
22642202      case vertexCy:
2265         if (chips & 1) v->fbi.cy = (INT16)data;
2203         if (chips & 1) vd->fbi.cy = (INT16)data;
22662204         break;
22672205
22682206      /* RGB data is 12.12 formatted fixed point */
22692207      case fstartR:
22702208         data = float_to_int32(data, 12);
22712209      case startR:
2272         if (chips & 1) v->fbi.startr = (INT32)(data << 8) >> 8;
2210         if (chips & 1) vd->fbi.startr = (INT32)(data << 8) >> 8;
22732211         break;
22742212
22752213      case fstartG:
22762214         data = float_to_int32(data, 12);
22772215      case startG:
2278         if (chips & 1) v->fbi.startg = (INT32)(data << 8) >> 8;
2216         if (chips & 1) vd->fbi.startg = (INT32)(data << 8) >> 8;
22792217         break;
22802218
22812219      case fstartB:
22822220         data = float_to_int32(data, 12);
22832221      case startB:
2284         if (chips & 1) v->fbi.startb = (INT32)(data << 8) >> 8;
2222         if (chips & 1) vd->fbi.startb = (INT32)(data << 8) >> 8;
22852223         break;
22862224
22872225      case fstartA:
22882226         data = float_to_int32(data, 12);
22892227      case startA:
2290         if (chips & 1) v->fbi.starta = (INT32)(data << 8) >> 8;
2228         if (chips & 1) vd->fbi.starta = (INT32)(data << 8) >> 8;
22912229         break;
22922230
22932231      case fdRdX:
22942232         data = float_to_int32(data, 12);
22952233      case dRdX:
2296         if (chips & 1) v->fbi.drdx = (INT32)(data << 8) >> 8;
2234         if (chips & 1) vd->fbi.drdx = (INT32)(data << 8) >> 8;
22972235         break;
22982236
22992237      case fdGdX:
23002238         data = float_to_int32(data, 12);
23012239      case dGdX:
2302         if (chips & 1) v->fbi.dgdx = (INT32)(data << 8) >> 8;
2240         if (chips & 1) vd->fbi.dgdx = (INT32)(data << 8) >> 8;
23032241         break;
23042242
23052243      case fdBdX:
23062244         data = float_to_int32(data, 12);
23072245      case dBdX:
2308         if (chips & 1) v->fbi.dbdx = (INT32)(data << 8) >> 8;
2246         if (chips & 1) vd->fbi.dbdx = (INT32)(data << 8) >> 8;
23092247         break;
23102248
23112249      case fdAdX:
23122250         data = float_to_int32(data, 12);
23132251      case dAdX:
2314         if (chips & 1) v->fbi.dadx = (INT32)(data << 8) >> 8;
2252         if (chips & 1) vd->fbi.dadx = (INT32)(data << 8) >> 8;
23152253         break;
23162254
23172255      case fdRdY:
23182256         data = float_to_int32(data, 12);
23192257      case dRdY:
2320         if (chips & 1) v->fbi.drdy = (INT32)(data << 8) >> 8;
2258         if (chips & 1) vd->fbi.drdy = (INT32)(data << 8) >> 8;
23212259         break;
23222260
23232261      case fdGdY:
23242262         data = float_to_int32(data, 12);
23252263      case dGdY:
2326         if (chips & 1) v->fbi.dgdy = (INT32)(data << 8) >> 8;
2264         if (chips & 1) vd->fbi.dgdy = (INT32)(data << 8) >> 8;
23272265         break;
23282266
23292267      case fdBdY:
23302268         data = float_to_int32(data, 12);
23312269      case dBdY:
2332         if (chips & 1) v->fbi.dbdy = (INT32)(data << 8) >> 8;
2270         if (chips & 1) vd->fbi.dbdy = (INT32)(data << 8) >> 8;
23332271         break;
23342272
23352273      case fdAdY:
23362274         data = float_to_int32(data, 12);
23372275      case dAdY:
2338         if (chips & 1) v->fbi.dady = (INT32)(data << 8) >> 8;
2276         if (chips & 1) vd->fbi.dady = (INT32)(data << 8) >> 8;
23392277         break;
23402278
23412279      /* Z data is 20.12 formatted fixed point */
23422280      case fstartZ:
23432281         data = float_to_int32(data, 12);
23442282      case startZ:
2345         if (chips & 1) v->fbi.startz = (INT32)data;
2283         if (chips & 1) vd->fbi.startz = (INT32)data;
23462284         break;
23472285
23482286      case fdZdX:
23492287         data = float_to_int32(data, 12);
23502288      case dZdX:
2351         if (chips & 1) v->fbi.dzdx = (INT32)data;
2289         if (chips & 1) vd->fbi.dzdx = (INT32)data;
23522290         break;
23532291
23542292      case fdZdY:
23552293         data = float_to_int32(data, 12);
23562294      case dZdY:
2357         if (chips & 1) v->fbi.dzdy = (INT32)data;
2295         if (chips & 1) vd->fbi.dzdy = (INT32)data;
23582296         break;
23592297
23602298      /* S,T data is 14.18 formatted fixed point, converted to 16.32 internally */
23612299      case fstartS:
23622300         data64 = float_to_int64(data, 32);
2363         if (chips & 2) v->tmu[0].starts = data64;
2364         if (chips & 4) v->tmu[1].starts = data64;
2301         if (chips & 2) vd->tmu[0].starts = data64;
2302         if (chips & 4) vd->tmu[1].starts = data64;
23652303         break;
23662304      case startS:
2367         if (chips & 2) v->tmu[0].starts = (INT64)(INT32)data << 14;
2368         if (chips & 4) v->tmu[1].starts = (INT64)(INT32)data << 14;
2305         if (chips & 2) vd->tmu[0].starts = (INT64)(INT32)data << 14;
2306         if (chips & 4) vd->tmu[1].starts = (INT64)(INT32)data << 14;
23692307         break;
23702308
23712309      case fstartT:
23722310         data64 = float_to_int64(data, 32);
2373         if (chips & 2) v->tmu[0].startt = data64;
2374         if (chips & 4) v->tmu[1].startt = data64;
2311         if (chips & 2) vd->tmu[0].startt = data64;
2312         if (chips & 4) vd->tmu[1].startt = data64;
23752313         break;
23762314      case startT:
2377         if (chips & 2) v->tmu[0].startt = (INT64)(INT32)data << 14;
2378         if (chips & 4) v->tmu[1].startt = (INT64)(INT32)data << 14;
2315         if (chips & 2) vd->tmu[0].startt = (INT64)(INT32)data << 14;
2316         if (chips & 4) vd->tmu[1].startt = (INT64)(INT32)data << 14;
23792317         break;
23802318
23812319      case fdSdX:
23822320         data64 = float_to_int64(data, 32);
2383         if (chips & 2) v->tmu[0].dsdx = data64;
2384         if (chips & 4) v->tmu[1].dsdx = data64;
2321         if (chips & 2) vd->tmu[0].dsdx = data64;
2322         if (chips & 4) vd->tmu[1].dsdx = data64;
23852323         break;
23862324      case dSdX:
2387         if (chips & 2) v->tmu[0].dsdx = (INT64)(INT32)data << 14;
2388         if (chips & 4) v->tmu[1].dsdx = (INT64)(INT32)data << 14;
2325         if (chips & 2) vd->tmu[0].dsdx = (INT64)(INT32)data << 14;
2326         if (chips & 4) vd->tmu[1].dsdx = (INT64)(INT32)data << 14;
23892327         break;
23902328
23912329      case fdTdX:
23922330         data64 = float_to_int64(data, 32);
2393         if (chips & 2) v->tmu[0].dtdx = data64;
2394         if (chips & 4) v->tmu[1].dtdx = data64;
2331         if (chips & 2) vd->tmu[0].dtdx = data64;
2332         if (chips & 4) vd->tmu[1].dtdx = data64;
23952333         break;
23962334      case dTdX:
2397         if (chips & 2) v->tmu[0].dtdx = (INT64)(INT32)data << 14;
2398         if (chips & 4) v->tmu[1].dtdx = (INT64)(INT32)data << 14;
2335         if (chips & 2) vd->tmu[0].dtdx = (INT64)(INT32)data << 14;
2336         if (chips & 4) vd->tmu[1].dtdx = (INT64)(INT32)data << 14;
23992337         break;
24002338
24012339      case fdSdY:
24022340         data64 = float_to_int64(data, 32);
2403         if (chips & 2) v->tmu[0].dsdy = data64;
2404         if (chips & 4) v->tmu[1].dsdy = data64;
2341         if (chips & 2) vd->tmu[0].dsdy = data64;
2342         if (chips & 4) vd->tmu[1].dsdy = data64;
24052343         break;
24062344      case dSdY:
2407         if (chips & 2) v->tmu[0].dsdy = (INT64)(INT32)data << 14;
2408         if (chips & 4) v->tmu[1].dsdy = (INT64)(INT32)data << 14;
2345         if (chips & 2) vd->tmu[0].dsdy = (INT64)(INT32)data << 14;
2346         if (chips & 4) vd->tmu[1].dsdy = (INT64)(INT32)data << 14;
24092347         break;
24102348
24112349      case fdTdY:
24122350         data64 = float_to_int64(data, 32);
2413         if (chips & 2) v->tmu[0].dtdy = data64;
2414         if (chips & 4) v->tmu[1].dtdy = data64;
2351         if (chips & 2) vd->tmu[0].dtdy = data64;
2352         if (chips & 4) vd->tmu[1].dtdy = data64;
24152353         break;
24162354      case dTdY:
2417         if (chips & 2) v->tmu[0].dtdy = (INT64)(INT32)data << 14;
2418         if (chips & 4) v->tmu[1].dtdy = (INT64)(INT32)data << 14;
2355         if (chips & 2) vd->tmu[0].dtdy = (INT64)(INT32)data << 14;
2356         if (chips & 4) vd->tmu[1].dtdy = (INT64)(INT32)data << 14;
24192357         break;
24202358
24212359      /* W data is 2.30 formatted fixed point, converted to 16.32 internally */
24222360      case fstartW:
24232361         data64 = float_to_int64(data, 32);
2424         if (chips & 1) v->fbi.startw = data64;
2425         if (chips & 2) v->tmu[0].startw = data64;
2426         if (chips & 4) v->tmu[1].startw = data64;
2362         if (chips & 1) vd->fbi.startw = data64;
2363         if (chips & 2) vd->tmu[0].startw = data64;
2364         if (chips & 4) vd->tmu[1].startw = data64;
24272365         break;
24282366      case startW:
2429         if (chips & 1) v->fbi.startw = (INT64)(INT32)data << 2;
2430         if (chips & 2) v->tmu[0].startw = (INT64)(INT32)data << 2;
2431         if (chips & 4) v->tmu[1].startw = (INT64)(INT32)data << 2;
2367         if (chips & 1) vd->fbi.startw = (INT64)(INT32)data << 2;
2368         if (chips & 2) vd->tmu[0].startw = (INT64)(INT32)data << 2;
2369         if (chips & 4) vd->tmu[1].startw = (INT64)(INT32)data << 2;
24322370         break;
24332371
24342372      case fdWdX:
24352373         data64 = float_to_int64(data, 32);
2436         if (chips & 1) v->fbi.dwdx = data64;
2437         if (chips & 2) v->tmu[0].dwdx = data64;
2438         if (chips & 4) v->tmu[1].dwdx = data64;
2374         if (chips & 1) vd->fbi.dwdx = data64;
2375         if (chips & 2) vd->tmu[0].dwdx = data64;
2376         if (chips & 4) vd->tmu[1].dwdx = data64;
24392377         break;
24402378      case dWdX:
2441         if (chips & 1) v->fbi.dwdx = (INT64)(INT32)data << 2;
2442         if (chips & 2) v->tmu[0].dwdx = (INT64)(INT32)data << 2;
2443         if (chips & 4) v->tmu[1].dwdx = (INT64)(INT32)data << 2;
2379         if (chips & 1) vd->fbi.dwdx = (INT64)(INT32)data << 2;
2380         if (chips & 2) vd->tmu[0].dwdx = (INT64)(INT32)data << 2;
2381         if (chips & 4) vd->tmu[1].dwdx = (INT64)(INT32)data << 2;
24442382         break;
24452383
24462384      case fdWdY:
24472385         data64 = float_to_int64(data, 32);
2448         if (chips & 1) v->fbi.dwdy = data64;
2449         if (chips & 2) v->tmu[0].dwdy = data64;
2450         if (chips & 4) v->tmu[1].dwdy = data64;
2386         if (chips & 1) vd->fbi.dwdy = data64;
2387         if (chips & 2) vd->tmu[0].dwdy = data64;
2388         if (chips & 4) vd->tmu[1].dwdy = data64;
24512389         break;
24522390      case dWdY:
2453         if (chips & 1) v->fbi.dwdy = (INT64)(INT32)data << 2;
2454         if (chips & 2) v->tmu[0].dwdy = (INT64)(INT32)data << 2;
2455         if (chips & 4) v->tmu[1].dwdy = (INT64)(INT32)data << 2;
2391         if (chips & 1) vd->fbi.dwdy = (INT64)(INT32)data << 2;
2392         if (chips & 2) vd->tmu[0].dwdy = (INT64)(INT32)data << 2;
2393         if (chips & 4) vd->tmu[1].dwdy = (INT64)(INT32)data << 2;
24562394         break;
24572395
24582396      /* setup bits */
r253153r253154
24602398         if (chips & 1)
24612399         {
24622400            rgb_t rgbdata(data);
2463            v->reg[sAlpha].f = rgbdata.a();
2464            v->reg[sRed].f = rgbdata.r();
2465            v->reg[sGreen].f = rgbdata.g();
2466            v->reg[sBlue].f = rgbdata.b();
2401            vd->reg[sAlpha].f = rgbdata.a();
2402            vd->reg[sRed].f = rgbdata.r();
2403            vd->reg[sGreen].f = rgbdata.g();
2404            vd->reg[sBlue].f = rgbdata.b();
24672405         }
24682406         break;
24692407
24702408      /* mask off invalid bits for different cards */
24712409      case fbzColorPath:
2472         poly_wait(v->poly, v->regnames[regnum]);
2473         if (v->type < TYPE_VOODOO_2)
2410         poly_wait(vd->poly, vd->regnames[regnum]);
2411         if (vd->vd_type < TYPE_VOODOO_2)
24742412            data &= 0x0fffffff;
2475         if (chips & 1) v->reg[fbzColorPath].u = data;
2413         if (chips & 1) vd->reg[fbzColorPath].u = data;
24762414         break;
24772415
24782416      case fbzMode:
2479         poly_wait(v->poly, v->regnames[regnum]);
2480         if (v->type < TYPE_VOODOO_2)
2417         poly_wait(vd->poly, vd->regnames[regnum]);
2418         if (vd->vd_type < TYPE_VOODOO_2)
24812419            data &= 0x001fffff;
2482         if (chips & 1) v->reg[fbzMode].u = data;
2420         if (chips & 1) vd->reg[fbzMode].u = data;
24832421         break;
24842422
24852423      case fogMode:
2486         poly_wait(v->poly, v->regnames[regnum]);
2487         if (v->type < TYPE_VOODOO_2)
2424         poly_wait(vd->poly, vd->regnames[regnum]);
2425         if (vd->vd_type < TYPE_VOODOO_2)
24882426            data &= 0x0000003f;
2489         if (chips & 1) v->reg[fogMode].u = data;
2427         if (chips & 1) vd->reg[fogMode].u = data;
24902428         break;
24912429
24922430      /* triangle drawing */
24932431      case triangleCMD:
2494         v->fbi.cheating_allowed = (v->fbi.ax != 0 || v->fbi.ay != 0 || v->fbi.bx > 50 || v->fbi.by != 0 || v->fbi.cx != 0 || v->fbi.cy > 50);
2495         v->fbi.sign = data;
2496         cycles = triangle(v);
2432         vd->fbi.cheating_allowed = (vd->fbi.ax != 0 || vd->fbi.ay != 0 || vd->fbi.bx > 50 || vd->fbi.by != 0 || vd->fbi.cx != 0 || vd->fbi.cy > 50);
2433         vd->fbi.sign = data;
2434         cycles = triangle(vd);
24972435         break;
24982436
24992437      case ftriangleCMD:
2500         v->fbi.cheating_allowed = TRUE;
2501         v->fbi.sign = data;
2502         cycles = triangle(v);
2438         vd->fbi.cheating_allowed = TRUE;
2439         vd->fbi.sign = data;
2440         cycles = triangle(vd);
25032441         break;
25042442
25052443      case sBeginTriCMD:
2506         cycles = begin_triangle(v);
2444         cycles = begin_triangle(vd);
25072445         break;
25082446
25092447      case sDrawTriCMD:
2510         cycles = draw_triangle(v);
2448         cycles = draw_triangle(vd);
25112449         break;
25122450
25132451      /* other commands */
25142452      case nopCMD:
2515         poly_wait(v->poly, v->regnames[regnum]);
2453         poly_wait(vd->poly, vd->regnames[regnum]);
25162454         if (data & 1)
2517            reset_counters(v);
2455            reset_counters(vd);
25182456         if (data & 2)
2519            v->reg[fbiTrianglesOut].u = 0;
2457            vd->reg[fbiTrianglesOut].u = 0;
25202458         break;
25212459
25222460      case fastfillCMD:
2523         cycles = fastfill(v);
2461         cycles = fastfill(vd);
25242462         break;
25252463
25262464      case swapbufferCMD:
2527         poly_wait(v->poly, v->regnames[regnum]);
2528         cycles = swapbuffer(v, data);
2465         poly_wait(vd->poly, vd->regnames[regnum]);
2466         cycles = swapbuffer(vd, data);
25292467         break;
25302468
25312469      case userIntrCMD:
2532         poly_wait(v->poly, v->regnames[regnum]);
2470         poly_wait(vd->poly, vd->regnames[regnum]);
25332471         //fatalerror("userIntrCMD\n");
25342472
2535         v->reg[intrCtrl].u |= 0x1800;
2536         v->reg[intrCtrl].u &= ~0x80000000;
2473         vd->reg[intrCtrl].u |= 0x1800;
2474         vd->reg[intrCtrl].u &= ~0x80000000;
25372475
25382476         // TODO: rename vblank_client for less confusion?
2539         if (!v->device->m_vblank.isnull())
2540            v->device->m_vblank(TRUE);
2477         if (!vd->device->m_vblank.isnull())
2478            vd->device->m_vblank(TRUE);
25412479         break;
25422480
25432481      /* gamma table access -- Voodoo/Voodoo2 only */
25442482      case clutData:
2545         if (v->type <= TYPE_VOODOO_2 && (chips & 1))
2483         if (vd->vd_type <= TYPE_VOODOO_2 && (chips & 1))
25462484         {
2547            poly_wait(v->poly, v->regnames[regnum]);
2548            if (!FBIINIT1_VIDEO_TIMING_RESET(v->reg[fbiInit1].u))
2485            poly_wait(vd->poly, vd->regnames[regnum]);
2486            if (!FBIINIT1_VIDEO_TIMING_RESET(vd->reg[fbiInit1].u))
25492487            {
25502488               int index = data >> 24;
25512489               if (index <= 32)
25522490               {
2553                  v->fbi.clut[index] = data;
2554                  v->fbi.clut_dirty = TRUE;
2491                  vd->fbi.clut[index] = data;
2492                  vd->fbi.clut_dirty = TRUE;
25552493               }
25562494            }
25572495            else
2558               v->device->logerror("clutData ignored because video timing reset = 1\n");
2496               vd->device->logerror("clutData ignored because video timing reset = 1\n");
25592497         }
25602498         break;
25612499
25622500      /* external DAC access -- Voodoo/Voodoo2 only */
25632501      case dacData:
2564         if (v->type <= TYPE_VOODOO_2 && (chips & 1))
2502         if (vd->vd_type <= TYPE_VOODOO_2 && (chips & 1))
25652503         {
2566            poly_wait(v->poly, v->regnames[regnum]);
2504            poly_wait(vd->poly, vd->regnames[regnum]);
25672505            if (!(data & 0x800))
2568               dacdata_w(&v->dac, (data >> 8) & 7, data & 0xff);
2506               dacdata_w(&vd->dac, (data >> 8) & 7, data & 0xff);
25692507            else
2570               dacdata_r(&v->dac, (data >> 8) & 7);
2508               dacdata_r(&vd->dac, (data >> 8) & 7);
25712509         }
25722510         break;
25732511
r253153r253154
25762514      case vSync:
25772515      case backPorch:
25782516      case videoDimensions:
2579         if (v->type <= TYPE_VOODOO_2 && (chips & 1))
2517         if (vd->vd_type <= TYPE_VOODOO_2 && (chips & 1))
25802518         {
2581            poly_wait(v->poly, v->regnames[regnum]);
2582            v->reg[regnum].u = data;
2583            if (v->reg[hSync].u != 0 && v->reg[vSync].u != 0 && v->reg[videoDimensions].u != 0)
2519            poly_wait(vd->poly, vd->regnames[regnum]);
2520            vd->reg[regnum].u = data;
2521            if (vd->reg[hSync].u != 0 && vd->reg[vSync].u != 0 && vd->reg[videoDimensions].u != 0)
25842522            {
25852523               int hvis, vvis, htotal, vtotal, hbp, vbp;
2586               attoseconds_t refresh = v->screen->frame_period().attoseconds();
2524               attoseconds_t refresh = vd->screen->frame_period().attoseconds();
25872525               attoseconds_t stdperiod, medperiod, vgaperiod;
25882526               attoseconds_t stddiff, meddiff, vgadiff;
25892527               rectangle visarea;
25902528
2591               if (v->type == TYPE_VOODOO_2)
2529               if (vd->vd_type == TYPE_VOODOO_2)
25922530               {
2593                  htotal = ((v->reg[hSync].u >> 16) & 0x7ff) + 1 + (v->reg[hSync].u & 0x1ff) + 1;
2594                  vtotal = ((v->reg[vSync].u >> 16) & 0x1fff) + (v->reg[vSync].u & 0x1fff);
2595                  hvis = v->reg[videoDimensions].u & 0x7ff;
2596                  vvis = (v->reg[videoDimensions].u >> 16) & 0x7ff;
2597                  hbp = (v->reg[backPorch].u & 0x1ff) + 2;
2598                  vbp = (v->reg[backPorch].u >> 16) & 0x1ff;
2531                  htotal = ((vd->reg[hSync].u >> 16) & 0x7ff) + 1 + (vd->reg[hSync].u & 0x1ff) + 1;
2532                  vtotal = ((vd->reg[vSync].u >> 16) & 0x1fff) + (vd->reg[vSync].u & 0x1fff);
2533                  hvis = vd->reg[videoDimensions].u & 0x7ff;
2534                  vvis = (vd->reg[videoDimensions].u >> 16) & 0x7ff;
2535                  hbp = (vd->reg[backPorch].u & 0x1ff) + 2;
2536                  vbp = (vd->reg[backPorch].u >> 16) & 0x1ff;
25992537               }
26002538               else
26012539               {
2602                  htotal = ((v->reg[hSync].u >> 16) & 0x3ff) + 1 + (v->reg[hSync].u & 0xff) + 1;
2603                  vtotal = ((v->reg[vSync].u >> 16) & 0xfff) + (v->reg[vSync].u & 0xfff);
2604                  hvis = v->reg[videoDimensions].u & 0x3ff;
2605                  vvis = (v->reg[videoDimensions].u >> 16) & 0x3ff;
2606                  hbp = (v->reg[backPorch].u & 0xff) + 2;
2607                  vbp = (v->reg[backPorch].u >> 16) & 0xff;
2540                  htotal = ((vd->reg[hSync].u >> 16) & 0x3ff) + 1 + (vd->reg[hSync].u & 0xff) + 1;
2541                  vtotal = ((vd->reg[vSync].u >> 16) & 0xfff) + (vd->reg[vSync].u & 0xfff);
2542                  hvis = vd->reg[videoDimensions].u & 0x3ff;
2543                  vvis = (vd->reg[videoDimensions].u >> 16) & 0x3ff;
2544                  hbp = (vd->reg[backPorch].u & 0xff) + 2;
2545                  vbp = (vd->reg[backPorch].u >> 16) & 0xff;
26082546               }
26092547
26102548               /* create a new visarea */
r253153r253154
26282566               if (vgadiff < 0) vgadiff = -vgadiff;
26292567
26302568               osd_printf_debug("hSync=%08X  vSync=%08X  backPorch=%08X  videoDimensions=%08X\n",
2631                  v->reg[hSync].u, v->reg[vSync].u, v->reg[backPorch].u, v->reg[videoDimensions].u);
2569                  vd->reg[hSync].u, vd->reg[vSync].u, vd->reg[backPorch].u, vd->reg[videoDimensions].u);
26322570               osd_printf_debug("Horiz: %d-%d (%d total)  Vert: %d-%d (%d total) -- ", visarea.min_x, visarea.max_x, htotal, visarea.min_y, visarea.max_y, vtotal);
26332571
26342572               /* configure the screen based on which one matches the closest */
26352573               if (stddiff < meddiff && stddiff < vgadiff)
26362574               {
2637                  v->screen->configure(htotal, vtotal, visarea, stdperiod);
2575                  vd->screen->configure(htotal, vtotal, visarea, stdperiod);
26382576                  osd_printf_debug("Standard resolution, %f Hz\n", ATTOSECONDS_TO_HZ(stdperiod));
26392577               }
26402578               else if (meddiff < vgadiff)
26412579               {
2642                  v->screen->configure(htotal, vtotal, visarea, medperiod);
2580                  vd->screen->configure(htotal, vtotal, visarea, medperiod);
26432581                  osd_printf_debug("Medium resolution, %f Hz\n", ATTOSECONDS_TO_HZ(medperiod));
26442582               }
26452583               else
26462584               {
2647                  v->screen->configure(htotal, vtotal, visarea, vgaperiod);
2585                  vd->screen->configure(htotal, vtotal, visarea, vgaperiod);
26482586                  osd_printf_debug("VGA resolution, %f Hz\n", ATTOSECONDS_TO_HZ(vgaperiod));
26492587               }
26502588
26512589               /* configure the new framebuffer info */
2652               v->fbi.width = hvis;
2653               v->fbi.height = vvis;
2654               v->fbi.xoffs = hbp;
2655               v->fbi.yoffs = vbp;
2656               v->fbi.vsyncscan = (v->reg[vSync].u >> 16) & 0xfff;
2590               vd->fbi.width = hvis;
2591               vd->fbi.height = vvis;
2592               vd->fbi.xoffs = hbp;
2593               vd->fbi.yoffs = vbp;
2594               vd->fbi.vsyncscan = (vd->reg[vSync].u >> 16) & 0xfff;
26572595
26582596               /* recompute the time of VBLANK */
2659               adjust_vblank_timer(v);
2597               adjust_vblank_timer(vd);
26602598
26612599               /* if changing dimensions, update video memory layout */
26622600               if (regnum == videoDimensions)
2663                  recompute_video_memory(v);
2601                  recompute_video_memory(vd);
26642602            }
26652603         }
26662604         break;
26672605
26682606      /* fbiInit0 can only be written if initEnable says we can -- Voodoo/Voodoo2 only */
26692607      case fbiInit0:
2670         poly_wait(v->poly, v->regnames[regnum]);
2671         if (v->type <= TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(v->pci.init_enable))
2608         poly_wait(vd->poly, vd->regnames[regnum]);
2609         if (vd->vd_type <= TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(vd->pci.init_enable))
26722610         {
2673            v->reg[fbiInit0].u = data;
2611            vd->reg[fbiInit0].u = data;
26742612            if (FBIINIT0_GRAPHICS_RESET(data))
2675               soft_reset(v);
2613               soft_reset(vd);
26762614            if (FBIINIT0_FIFO_RESET(data))
2677               fifo_reset(&v->pci.fifo);
2678            recompute_video_memory(v);
2615               fifo_reset(&vd->pci.fifo);
2616            recompute_video_memory(vd);
26792617         }
26802618         break;
26812619
26822620      /* fbiInit5-7 are Voodoo 2-only; ignore them on anything else */
26832621      case fbiInit5:
26842622      case fbiInit6:
2685         if (v->type < TYPE_VOODOO_2)
2623         if (vd->vd_type < TYPE_VOODOO_2)
26862624            break;
26872625         /* else fall through... */
26882626
r253153r253154
26912629      case fbiInit1:
26922630      case fbiInit2:
26932631      case fbiInit4:
2694         poly_wait(v->poly, v->regnames[regnum]);
2695         if (v->type <= TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(v->pci.init_enable))
2632         poly_wait(vd->poly, vd->regnames[regnum]);
2633         if (vd->vd_type <= TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(vd->pci.init_enable))
26962634         {
2697            v->reg[regnum].u = data;
2698            recompute_video_memory(v);
2699            v->fbi.video_changed = TRUE;
2635            vd->reg[regnum].u = data;
2636            recompute_video_memory(vd);
2637            vd->fbi.video_changed = TRUE;
27002638         }
27012639         break;
27022640
27032641      case fbiInit3:
2704         poly_wait(v->poly, v->regnames[regnum]);
2705         if (v->type <= TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(v->pci.init_enable))
2642         poly_wait(vd->poly, vd->regnames[regnum]);
2643         if (vd->vd_type <= TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(vd->pci.init_enable))
27062644         {
2707            v->reg[regnum].u = data;
2708            v->alt_regmap = FBIINIT3_TRI_REGISTER_REMAP(data);
2709            v->fbi.yorigin = FBIINIT3_YORIGIN_SUBTRACT(v->reg[fbiInit3].u);
2710            recompute_video_memory(v);
2645            vd->reg[regnum].u = data;
2646            vd->alt_regmap = FBIINIT3_TRI_REGISTER_REMAP(data);
2647            vd->fbi.yorigin = FBIINIT3_YORIGIN_SUBTRACT(vd->reg[fbiInit3].u);
2648            recompute_video_memory(vd);
27112649         }
27122650         break;
27132651
27142652      case fbiInit7:
27152653/*      case swapPending: -- Banshee */
2716         if (v->type == TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(v->pci.init_enable))
2654         if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(vd->pci.init_enable))
27172655         {
2718            poly_wait(v->poly, v->regnames[regnum]);
2719            v->reg[regnum].u = data;
2720            v->fbi.cmdfifo[0].enable = FBIINIT7_CMDFIFO_ENABLE(data);
2721            v->fbi.cmdfifo[0].count_holes = !FBIINIT7_DISABLE_CMDFIFO_HOLES(data);
2656            poly_wait(vd->poly, vd->regnames[regnum]);
2657            vd->reg[regnum].u = data;
2658            vd->fbi.cmdfifo[0].enable = FBIINIT7_CMDFIFO_ENABLE(data);
2659            vd->fbi.cmdfifo[0].count_holes = !FBIINIT7_DISABLE_CMDFIFO_HOLES(data);
27222660         }
2723         else if (v->type >= TYPE_VOODOO_BANSHEE)
2724            v->fbi.swaps_pending++;
2661         else if (vd->vd_type >= TYPE_VOODOO_BANSHEE)
2662            vd->fbi.swaps_pending++;
27252663         break;
27262664
27272665      /* cmdFifo -- Voodoo2 only */
27282666      case cmdFifoBaseAddr:
2729         if (v->type == TYPE_VOODOO_2 && (chips & 1))
2667         if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1))
27302668         {
2731            poly_wait(v->poly, v->regnames[regnum]);
2732            v->reg[regnum].u = data;
2733            v->fbi.cmdfifo[0].base = (data & 0x3ff) << 12;
2734            v->fbi.cmdfifo[0].end = (((data >> 16) & 0x3ff) + 1) << 12;
2669            poly_wait(vd->poly, vd->regnames[regnum]);
2670            vd->reg[regnum].u = data;
2671            vd->fbi.cmdfifo[0].base = (data & 0x3ff) << 12;
2672            vd->fbi.cmdfifo[0].end = (((data >> 16) & 0x3ff) + 1) << 12;
27352673         }
27362674         break;
27372675
27382676      case cmdFifoBump:
2739         if (v->type == TYPE_VOODOO_2 && (chips & 1))
2677         if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1))
27402678            fatalerror("cmdFifoBump\n");
27412679         break;
27422680
27432681      case cmdFifoRdPtr:
2744         if (v->type == TYPE_VOODOO_2 && (chips & 1))
2745            v->fbi.cmdfifo[0].rdptr = data;
2682         if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1))
2683            vd->fbi.cmdfifo[0].rdptr = data;
27462684         break;
27472685
27482686      case cmdFifoAMin:
27492687/*      case colBufferAddr: -- Banshee */
2750         if (v->type == TYPE_VOODOO_2 && (chips & 1))
2751            v->fbi.cmdfifo[0].amin = data;
2752         else if (v->type >= TYPE_VOODOO_BANSHEE && (chips & 1))
2753            v->fbi.rgboffs[1] = data & v->fbi.mask & ~0x0f;
2688         if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1))
2689            vd->fbi.cmdfifo[0].amin = data;
2690         else if (vd->vd_type >= TYPE_VOODOO_BANSHEE && (chips & 1))
2691            vd->fbi.rgboffs[1] = data & vd->fbi.mask & ~0x0f;
27542692         break;
27552693
27562694      case cmdFifoAMax:
27572695/*      case colBufferStride: -- Banshee */
2758         if (v->type == TYPE_VOODOO_2 && (chips & 1))
2759            v->fbi.cmdfifo[0].amax = data;
2760         else if (v->type >= TYPE_VOODOO_BANSHEE && (chips & 1))
2696         if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1))
2697            vd->fbi.cmdfifo[0].amax = data;
2698         else if (vd->vd_type >= TYPE_VOODOO_BANSHEE && (chips & 1))
27612699         {
27622700            if (data & 0x8000)
2763               v->fbi.rowpixels = (data & 0x7f) << 6;
2701               vd->fbi.rowpixels = (data & 0x7f) << 6;
27642702            else
2765               v->fbi.rowpixels = (data & 0x3fff) >> 1;
2703               vd->fbi.rowpixels = (data & 0x3fff) >> 1;
27662704         }
27672705         break;
27682706
27692707      case cmdFifoDepth:
27702708/*      case auxBufferAddr: -- Banshee */
2771         if (v->type == TYPE_VOODOO_2 && (chips & 1))
2772            v->fbi.cmdfifo[0].depth = data;
2773         else if (v->type >= TYPE_VOODOO_BANSHEE && (chips & 1))
2774            v->fbi.auxoffs = data & v->fbi.mask & ~0x0f;
2709         if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1))
2710            vd->fbi.cmdfifo[0].depth = data;
2711         else if (vd->vd_type >= TYPE_VOODOO_BANSHEE && (chips & 1))
2712            vd->fbi.auxoffs = data & vd->fbi.mask & ~0x0f;
27752713         break;
27762714
27772715      case cmdFifoHoles:
27782716/*      case auxBufferStride: -- Banshee */
2779         if (v->type == TYPE_VOODOO_2 && (chips & 1))
2780            v->fbi.cmdfifo[0].holes = data;
2781         else if (v->type >= TYPE_VOODOO_BANSHEE && (chips & 1))
2717         if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1))
2718            vd->fbi.cmdfifo[0].holes = data;
2719         else if (vd->vd_type >= TYPE_VOODOO_BANSHEE && (chips & 1))
27822720         {
27832721            int rowpixels;
27842722
r253153r253154
27862724               rowpixels = (data & 0x7f) << 6;
27872725            else
27882726               rowpixels = (data & 0x3fff) >> 1;
2789            if (v->fbi.rowpixels != rowpixels)
2727            if (vd->fbi.rowpixels != rowpixels)
27902728               fatalerror("aux buffer stride differs from color buffer stride\n");
27912729         }
27922730         break;
r253153r253154
28042742      case nccTable+9:
28052743      case nccTable+10:
28062744      case nccTable+11:
2807         poly_wait(v->poly, v->regnames[regnum]);
2808         if (chips & 2) ncc_table_write(&v->tmu[0].ncc[0], regnum - nccTable, data);
2809         if (chips & 4) ncc_table_write(&v->tmu[1].ncc[0], regnum - nccTable, data);
2745         poly_wait(vd->poly, vd->regnames[regnum]);
2746         if (chips & 2) ncc_table_write(&vd->tmu[0].ncc[0], regnum - nccTable, data);
2747         if (chips & 4) ncc_table_write(&vd->tmu[1].ncc[0], regnum - nccTable, data);
28102748         break;
28112749
28122750      case nccTable+12:
r253153r253154
28212759      case nccTable+21:
28222760      case nccTable+22:
28232761      case nccTable+23:
2824         poly_wait(v->poly, v->regnames[regnum]);
2825         if (chips & 2) ncc_table_write(&v->tmu[0].ncc[1], regnum - (nccTable+12), data);
2826         if (chips & 4) ncc_table_write(&v->tmu[1].ncc[1], regnum - (nccTable+12), data);
2762         poly_wait(vd->poly, vd->regnames[regnum]);
2763         if (chips & 2) ncc_table_write(&vd->tmu[0].ncc[1], regnum - (nccTable+12), data);
2764         if (chips & 4) ncc_table_write(&vd->tmu[1].ncc[1], regnum - (nccTable+12), data);
28272765         break;
28282766
28292767      /* fogTable entries are processed and expanded immediately */
r253153r253154
28592797      case fogTable+29:
28602798      case fogTable+30:
28612799      case fogTable+31:
2862         poly_wait(v->poly, v->regnames[regnum]);
2800         poly_wait(vd->poly, vd->regnames[regnum]);
28632801         if (chips & 1)
28642802         {
28652803            int base = 2 * (regnum - fogTable);
2866            v->fbi.fogdelta[base + 0] = (data >> 0) & 0xff;
2867            v->fbi.fogblend[base + 0] = (data >> 8) & 0xff;
2868            v->fbi.fogdelta[base + 1] = (data >> 16) & 0xff;
2869            v->fbi.fogblend[base + 1] = (data >> 24) & 0xff;
2804            vd->fbi.fogdelta[base + 0] = (data >> 0) & 0xff;
2805            vd->fbi.fogblend[base + 0] = (data >> 8) & 0xff;
2806            vd->fbi.fogdelta[base + 1] = (data >> 16) & 0xff;
2807            vd->fbi.fogblend[base + 1] = (data >> 24) & 0xff;
28702808         }
28712809         break;
28722810
r253153r253154
28782816      case texBaseAddr_1:
28792817      case texBaseAddr_2:
28802818      case texBaseAddr_3_8:
2881         poly_wait(v->poly, v->regnames[regnum]);
2819         poly_wait(vd->poly, vd->regnames[regnum]);
28822820         if (chips & 2)
28832821         {
2884            v->tmu[0].reg[regnum].u = data;
2885            v->tmu[0].regdirty = TRUE;
2822            vd->tmu[0].reg[regnum].u = data;
2823            vd->tmu[0].regdirty = TRUE;
28862824         }
28872825         if (chips & 4)
28882826         {
2889            v->tmu[1].reg[regnum].u = data;
2890            v->tmu[1].regdirty = TRUE;
2827            vd->tmu[1].reg[regnum].u = data;
2828            vd->tmu[1].regdirty = TRUE;
28912829         }
28922830         break;
28932831
28942832      case trexInit1:
28952833         /* send tmu config data to the frame buffer */
2896         v->send_config = (TREXINIT_SEND_TMU_CONFIG(data) > 0);
2834         vd->send_config = (TREXINIT_SEND_TMU_CONFIG(data) > 0);
28972835         goto default_case;
28982836
28992837      /* these registers are referenced in the renderer; we must wait for pending work before changing */
r253153r253154
29072845      case color0:
29082846      case clipLowYHighY:
29092847      case clipLeftRight:
2910         poly_wait(v->poly, v->regnames[regnum]);
2848         poly_wait(vd->poly, vd->regnames[regnum]);
29112849         /* fall through to default implementation */
29122850
29132851      /* by default, just feed the data to the chips */
29142852      default:
29152853default_case:
2916         if (chips & 1) v->reg[0x000 + regnum].u = data;
2917         if (chips & 2) v->reg[0x100 + regnum].u = data;
2918         if (chips & 4) v->reg[0x200 + regnum].u = data;
2919         if (chips & 8) v->reg[0x300 + regnum].u = data;
2854         if (chips & 1) vd->reg[0x000 + regnum].u = data;
2855         if (chips & 2) vd->reg[0x100 + regnum].u = data;
2856         if (chips & 4) vd->reg[0x200 + regnum].u = data;
2857         if (chips & 8) vd->reg[0x300 + regnum].u = data;
29202858         break;
29212859   }
29222860
29232861   if (LOG_REGISTERS)
29242862   {
29252863      if (regnum < fvertexAx || regnum > fdWdY)
2926         v->device->logerror("VOODOO.%d.REG:%s(%d) write = %08X\n", v->index, (regnum < 0x384/4) ? v->regnames[regnum] : "oob", chips, origdata);
2864         vd->device->logerror("VOODOO.%d.REG:%s(%d) write = %08X\n", vd->index, (regnum < 0x384/4) ? vd->regnames[regnum] : "oob", chips, origdata);
29272865      else
2928         v->device->logerror("VOODOO.%d.REG:%s(%d) write = %f\n", v->index, (regnum < 0x384/4) ? v->regnames[regnum] : "oob", chips, (double) u2f(origdata));
2866         vd->device->logerror("VOODOO.%d.REG:%s(%d) write = %f\n", vd->index, (regnum < 0x384/4) ? vd->regnames[regnum] : "oob", chips, (double) u2f(origdata));
29292867   }
29302868
29312869   return cycles;
r253153r253154
29382876 *  Voodoo LFB writes
29392877 *
29402878 *************************************/
2941static INT32 lfb_direct_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask)
2942{
2879INT32 voodoo_device::lfb_direct_w(voodoo_device *vd, offs_t offset, UINT32 data, UINT32 mem_mask)
2880{   
29432881   UINT16 *dest;
29442882   UINT32 destmax;
29452883   int x, y;
29462884   UINT32 bufoffs;
29472885
29482886   /* statistics */
2949   v->stats.lfb_writes++;
2887   vd->stats.lfb_writes++;
29502888
29512889   /* byte swizzling */
2952   if (LFBMODE_BYTE_SWIZZLE_WRITES(v->reg[lfbMode].u))
2890   if (LFBMODE_BYTE_SWIZZLE_WRITES(vd->reg[lfbMode].u))
29532891   {
29542892      data = FLIPENDIAN_INT32(data);
29552893      mem_mask = FLIPENDIAN_INT32(mem_mask);
29562894   }
29572895
29582896   /* word swapping */
2959   if (LFBMODE_WORD_SWAP_WRITES(v->reg[lfbMode].u))
2897   if (LFBMODE_WORD_SWAP_WRITES(vd->reg[lfbMode].u))
29602898   {
29612899      data = (data << 16) | (data >> 16);
29622900      mem_mask = (mem_mask << 16) | (mem_mask >> 16);
r253153r253154
29662904   // For direct lfb access just write the data
29672905   /* compute X,Y */
29682906   offset <<= 1;
2969   x = offset & ((1 << v->fbi.lfb_stride) - 1);
2970   y = (offset >> v->fbi.lfb_stride);
2971   dest = (UINT16 *)(v->fbi.ram + v->fbi.lfb_base*4);
2972   destmax = (v->fbi.mask + 1 - v->fbi.lfb_base*4) / 2;
2973   bufoffs = y * v->fbi.rowpixels + x;
2907   x = offset & ((1 << vd->fbi.lfb_stride) - 1);
2908   y = (offset >> vd->fbi.lfb_stride);
2909   dest = (UINT16 *)(vd->fbi.ram + vd->fbi.lfb_base*4);
2910   destmax = (vd->fbi.mask + 1 - vd->fbi.lfb_base*4) / 2;
2911   bufoffs = y * vd->fbi.rowpixels + x;
29742912   if (bufoffs >= destmax) {
2975      v->device->logerror("lfb_direct_w: Buffer offset out of bounds x=%i y=%i offset=%08X bufoffs=%08X data=%08X\n", x, y, offset, (UINT32) bufoffs, data);
2913      vd->device->logerror("lfb_direct_w: Buffer offset out of bounds x=%i y=%i offset=%08X bufoffs=%08X data=%08X\n", x, y, offset, (UINT32) bufoffs, data);
29762914      return 0;
29772915   }
29782916   if (ACCESSING_BITS_0_15)
29792917      dest[bufoffs + 0] = data&0xffff;
29802918   if (ACCESSING_BITS_16_31)
29812919      dest[bufoffs + 1] = data>>16;
2982   if (LOG_LFB) v->device->logerror("VOODOO.%d.LFB:write direct (%d,%d) = %08X & %08X\n", v->index, x, y, data, mem_mask);
2920   if (LOG_LFB) vd->device->logerror("VOODOO.%d.LFB:write direct (%d,%d) = %08X & %08X\n", vd->index, x, y, data, mem_mask);
29832921   return 0;
29842922}
29852923
2986static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask)
2924INT32 voodoo_device::lfb_w(voodoo_device* vd, offs_t offset, UINT32 data, UINT32 mem_mask)
29872925{
2926
29882927   UINT16 *dest, *depth;
29892928   UINT32 destmax, depthmax;
29902929   int sr[2], sg[2], sb[2], sa[2], sw[2];
r253153r253154
29922931   int pix, destbuf;
29932932
29942933   /* statistics */
2995   v->stats.lfb_writes++;
2934   vd->stats.lfb_writes++;
29962935
29972936   /* byte swizzling */
2998   if (LFBMODE_BYTE_SWIZZLE_WRITES(v->reg[lfbMode].u))
2937   if (LFBMODE_BYTE_SWIZZLE_WRITES(vd->reg[lfbMode].u))
29992938   {
30002939      data = FLIPENDIAN_INT32(data);
30012940      mem_mask = FLIPENDIAN_INT32(mem_mask);
30022941   }
30032942
30042943   /* word swapping */
3005   if (LFBMODE_WORD_SWAP_WRITES(v->reg[lfbMode].u))
2944   if (LFBMODE_WORD_SWAP_WRITES(vd->reg[lfbMode].u))
30062945   {
30072946      data = (data << 16) | (data >> 16);
30082947      mem_mask = (mem_mask << 16) | (mem_mask >> 16);
30092948   }
30102949
30112950   /* extract default depth and alpha values */
3012   sw[0] = sw[1] = v->reg[zaColor].u & 0xffff;
3013   sa[0] = sa[1] = v->reg[zaColor].u >> 24;
2951   sw[0] = sw[1] = vd->reg[zaColor].u & 0xffff;
2952   sa[0] = sa[1] = vd->reg[zaColor].u >> 24;
30142953
30152954   /* first extract A,R,G,B from the data */
3016   switch (LFBMODE_WRITE_FORMAT(v->reg[lfbMode].u) + 16 * LFBMODE_RGBA_LANES(v->reg[lfbMode].u))
2955   switch (LFBMODE_WRITE_FORMAT(vd->reg[lfbMode].u) + 16 * LFBMODE_RGBA_LANES(vd->reg[lfbMode].u))
30172956   {
30182957      case 16*0 + 0:      /* ARGB, 16-bit RGB 5-6-5 */
30192958      case 16*2 + 0:      /* RGBA, 16-bit RGB 5-6-5 */
r253153r253154
31803119         break;
31813120
31823121      default:            /* reserved */
3183         v->device->logerror("lfb_w: Unknown format\n");
3122         vd->device->logerror("lfb_w: Unknown format\n");
31843123         return 0;
31853124   }
31863125
31873126   /* compute X,Y */
3188   x = offset & ((1 << v->fbi.lfb_stride) - 1);
3189   y = (offset >> v->fbi.lfb_stride) & 0x3ff;
3127   x = offset & ((1 << vd->fbi.lfb_stride) - 1);
3128   y = (offset >> vd->fbi.lfb_stride) & 0x3ff;
31903129
31913130   /* adjust the mask based on which half of the data is written */
31923131   if (!ACCESSING_BITS_0_15)
r253153r253154
31953134      mask &= ~(0xf0 + LFB_DEPTH_PRESENT_MSW);
31963135
31973136   /* select the target buffer */
3198   destbuf = (v->type >= TYPE_VOODOO_BANSHEE) ? 1 : LFBMODE_WRITE_BUFFER_SELECT(v->reg[lfbMode].u);
3137   destbuf = (vd->vd_type >= TYPE_VOODOO_BANSHEE) ? 1 : LFBMODE_WRITE_BUFFER_SELECT(vd->reg[lfbMode].u);
31993138   switch (destbuf)
32003139   {
32013140      case 0:         /* front buffer */
3202         dest = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.frontbuf]);
3203         destmax = (v->fbi.mask + 1 - v->fbi.rgboffs[v->fbi.frontbuf]) / 2;
3204         v->fbi.video_changed = TRUE;
3141         dest = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.frontbuf]);
3142         destmax = (vd->fbi.mask + 1 - vd->fbi.rgboffs[vd->fbi.frontbuf]) / 2;
3143         vd->fbi.video_changed = TRUE;
32053144         break;
32063145
32073146      case 1:         /* back buffer */
3208         dest = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.backbuf]);
3209         destmax = (v->fbi.mask + 1 - v->fbi.rgboffs[v->fbi.backbuf]) / 2;
3147         dest = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.backbuf]);
3148         destmax = (vd->fbi.mask + 1 - vd->fbi.rgboffs[vd->fbi.backbuf]) / 2;
32103149         break;
32113150
32123151      default:        /* reserved */
32133152         return 0;
32143153   }
3215   depth = (UINT16 *)(v->fbi.ram + v->fbi.auxoffs);
3216   depthmax = (v->fbi.mask + 1 - v->fbi.auxoffs) / 2;
3154   depth = (UINT16 *)(vd->fbi.ram + vd->fbi.auxoffs);
3155   depthmax = (vd->fbi.mask + 1 - vd->fbi.auxoffs) / 2;
32173156
32183157   /* simple case: no pipeline */
3219   if (!LFBMODE_ENABLE_PIXEL_PIPELINE(v->reg[lfbMode].u))
3158   if (!LFBMODE_ENABLE_PIXEL_PIPELINE(vd->reg[lfbMode].u))
32203159   {
32213160      DECLARE_DITHER_POINTERS_NO_DITHER_VAR;
32223161      UINT32 bufoffs;
32233162
3224      if (LOG_LFB) v->device->logerror("VOODOO.%d.LFB:write raw mode %X (%d,%d) = %08X & %08X\n", v->index, LFBMODE_WRITE_FORMAT(v->reg[lfbMode].u), x, y, data, mem_mask);
3163      if (LOG_LFB) vd->device->logerror("VOODOO.%d.LFB:write raw mode %X (%d,%d) = %08X & %08X\n", vd->index, LFBMODE_WRITE_FORMAT(vd->reg[lfbMode].u), x, y, data, mem_mask);
32253164
32263165      /* determine the screen Y */
32273166      scry = y;
3228      if (LFBMODE_Y_ORIGIN(v->reg[lfbMode].u))
3229         scry = (v->fbi.yorigin - y) & 0x3ff;
3167      if (LFBMODE_Y_ORIGIN(vd->reg[lfbMode].u))
3168         scry = (vd->fbi.yorigin - y) & 0x3ff;
32303169
32313170      /* advance pointers to the proper row */
3232      bufoffs = scry * v->fbi.rowpixels + x;
3171      bufoffs = scry * vd->fbi.rowpixels + x;
32333172
32343173      /* compute dithering */
3235      COMPUTE_DITHER_POINTERS_NO_DITHER_VAR(v->reg[fbzMode].u, y);
3174      COMPUTE_DITHER_POINTERS_NO_DITHER_VAR(vd->reg[fbzMode].u, y);
32363175
32373176      /* wait for any outstanding work to finish */
3238      poly_wait(v->poly, "LFB Write");
3177      poly_wait(vd->poly, "LFB Write");
32393178
32403179      /* loop over up to two pixels */
32413180      for (pix = 0; mask; pix++)
r253153r253154
32473186            if ((mask & LFB_RGB_PRESENT) && bufoffs < destmax)
32483187            {
32493188               /* apply dithering and write to the screen */
3250               APPLY_DITHER(v->reg[fbzMode].u, x, dither_lookup, sr[pix], sg[pix], sb[pix]);
3189               APPLY_DITHER(vd->reg[fbzMode].u, x, dither_lookup, sr[pix], sg[pix], sb[pix]);
32513190               dest[bufoffs] = (sr[pix] << 11) | (sg[pix] << 5) | sb[pix];
32523191            }
32533192
r253153r253154
32553194            if (depth && bufoffs < depthmax)
32563195            {
32573196               /* write to the alpha buffer */
3258               if ((mask & LFB_ALPHA_PRESENT) && FBZMODE_ENABLE_ALPHA_PLANES(v->reg[fbzMode].u))
3197               if ((mask & LFB_ALPHA_PRESENT) && FBZMODE_ENABLE_ALPHA_PLANES(vd->reg[fbzMode].u))
32593198                  depth[bufoffs] = sa[pix];
32603199
32613200               /* write to the depth buffer */
3262               if ((mask & (LFB_DEPTH_PRESENT | LFB_DEPTH_PRESENT_MSW)) && !FBZMODE_ENABLE_ALPHA_PLANES(v->reg[fbzMode].u))
3201               if ((mask & (LFB_DEPTH_PRESENT | LFB_DEPTH_PRESENT_MSW)) && !FBZMODE_ENABLE_ALPHA_PLANES(vd->reg[fbzMode].u))
32633202                  depth[bufoffs] = sw[pix];
32643203            }
32653204
32663205            /* track pixel writes to the frame buffer regardless of mask */
3267            v->reg[fbiPixelsOut].u++;
3206            vd->reg[fbiPixelsOut].u++;
32683207         }
32693208
32703209         /* advance our pointers */
r253153r253154
32793218   {
32803219      DECLARE_DITHER_POINTERS;
32813220
3282      if (LOG_LFB) v->device->logerror("VOODOO.%d.LFB:write pipelined mode %X (%d,%d) = %08X & %08X\n", v->index, LFBMODE_WRITE_FORMAT(v->reg[lfbMode].u), x, y, data, mem_mask);
3221      if (LOG_LFB) vd->device->logerror("VOODOO.%d.LFB:write pipelined mode %X (%d,%d) = %08X & %08X\n", vd->index, LFBMODE_WRITE_FORMAT(vd->reg[lfbMode].u), x, y, data, mem_mask);
32833222
32843223      /* determine the screen Y */
32853224      scry = y;
3286      if (FBZMODE_Y_ORIGIN(v->reg[fbzMode].u))
3287         scry = (v->fbi.yorigin - y) & 0x3ff;
3225      if (FBZMODE_Y_ORIGIN(vd->reg[fbzMode].u))
3226         scry = (vd->fbi.yorigin - y) & 0x3ff;
32883227
32893228      /* advance pointers to the proper row */
3290      dest += scry * v->fbi.rowpixels;
3229      dest += scry * vd->fbi.rowpixels;
32913230      if (depth)
3292         depth += scry * v->fbi.rowpixels;
3231         depth += scry * vd->fbi.rowpixels;
32933232
32943233      /* compute dithering */
3295      COMPUTE_DITHER_POINTERS(v->reg[fbzMode].u, y);
3234      COMPUTE_DITHER_POINTERS(vd->reg[fbzMode].u, y);
32963235
32973236      /* loop over up to two pixels */
32983237      for (pix = 0; mask; pix++)
r253153r253154
33003239         /* make sure we care about this pixel */
33013240         if (mask & 0x0f)
33023241         {
3303            stats_block *stats = &v->fbi.lfb_stats;
3242            stats_block *stats = &vd->fbi.lfb_stats;
33043243            INT64 iterw;
3305            if (LFBMODE_WRITE_W_SELECT(v->reg[lfbMode].u)) {
3306               iterw = (UINT32) v->reg[zaColor].u << 16;
3244            if (LFBMODE_WRITE_W_SELECT(vd->reg[lfbMode].u)) {
3245               iterw = (UINT32) vd->reg[zaColor].u << 16;
33073246            } else {
33083247               // The most significant fractional bits of 16.32 W are set to z
33093248               iterw = (UINT32) sw[pix] << 16;
r253153r253154
33113250            INT32 iterz = sw[pix] << 12;
33123251
33133252            /* apply clipping */
3314            if (FBZMODE_ENABLE_CLIPPING(v->reg[fbzMode].u))
3253            if (FBZMODE_ENABLE_CLIPPING(vd->reg[fbzMode].u))
33153254            {
3316               if (x < ((v->reg[clipLeftRight].u >> 16) & 0x3ff) ||
3317                  x >= (v->reg[clipLeftRight].u & 0x3ff) ||
3318                  scry < ((v->reg[clipLowYHighY].u >> 16) & 0x3ff) ||
3319                  scry >= (v->reg[clipLowYHighY].u & 0x3ff))
3255               if (x < ((vd->reg[clipLeftRight].u >> 16) & 0x3ff) ||
3256                  x >= (vd->reg[clipLeftRight].u & 0x3ff) ||
3257                  scry < ((vd->reg[clipLowYHighY].u >> 16) & 0x3ff) ||
3258                  scry >= (vd->reg[clipLowYHighY].u & 0x3ff))
33203259               {
33213260                  stats->pixels_in++;
33223261                  stats->clip_fail++;
r253153r253154
33293268
33303269
33313270            /* pixel pipeline part 1 handles depth testing and stippling */
3332            //PIXEL_PIPELINE_BEGIN(v, stats, x, y, v->reg[fbzColorPath].u, v->reg[fbzMode].u, iterz, iterw);
3271            //PIXEL_PIPELINE_BEGIN(v, stats, x, y, vd->reg[fbzColorPath].u, vd->reg[fbzMode].u, iterz, iterw);
33333272// Start PIXEL_PIPE_BEGIN copy
33343273            //#define PIXEL_PIPELINE_BEGIN(VV, STATS, XX, YY, FBZCOLORPATH, FBZMODE, ITERZ, ITERW)
33353274               INT32 fogdepth, biasdepth;
r253153r253154
33413280               /* note that for perf reasons, we assume the caller has done clipping */
33423281
33433282               /* handle stippling */
3344               if (FBZMODE_ENABLE_STIPPLE(v->reg[fbzMode].u))
3283               if (FBZMODE_ENABLE_STIPPLE(vd->reg[fbzMode].u))
33453284               {
33463285                  /* rotate mode */
3347                  if (FBZMODE_STIPPLE_PATTERN(v->reg[fbzMode].u) == 0)
3286                  if (FBZMODE_STIPPLE_PATTERN(vd->reg[fbzMode].u) == 0)
33483287                  {
3349                     v->reg[stipple].u = (v->reg[stipple].u << 1) | (v->reg[stipple].u >> 31);
3350                     if ((v->reg[stipple].u & 0x80000000) == 0)
3288                     vd->reg[stipple].u = (vd->reg[stipple].u << 1) | (vd->reg[stipple].u >> 31);
3289                     if ((vd->reg[stipple].u & 0x80000000) == 0)
33513290                     {
3352                        v->stats.total_stippled++;
3291                        vd->stats.total_stippled++;
33533292                        goto skipdrawdepth;
33543293                     }
33553294                  }
r253153r253154
33583297                  else
33593298                  {
33603299                     int stipple_index = ((y & 3) << 3) | (~x & 7);
3361                     if (((v->reg[stipple].u >> stipple_index) & 1) == 0)
3300                     if (((vd->reg[stipple].u >> stipple_index) & 1) == 0)
33623301                     {
3363                        v->stats.total_stippled++;
3302                        vd->stats.total_stippled++;
33643303                        goto nextpixel;
33653304                     }
33663305                  }
r253153r253154
33723311
33733312
33743313            /* Perform depth testing */
3375            if (!depthTest((UINT16) v->reg[zaColor].u, stats, depth[x], v->reg[fbzMode].u, biasdepth))
3314            if (!depthTest((UINT16) vd->reg[zaColor].u, stats, depth[x], vd->reg[fbzMode].u, biasdepth))
33763315               goto nextpixel;
33773316
33783317            /* use the RGBA we stashed above */
33793318            color.set(sa[pix], sr[pix], sg[pix], sb[pix]);
33803319
33813320            /* handle chroma key */
3382            if (!chromaKeyTest(v, stats, v->reg[fbzMode].u, color))
3321            if (!chromaKeyTest(vd, stats, vd->reg[fbzMode].u, color))
33833322               goto nextpixel;
33843323            /* handle alpha mask */
3385            if (!alphaMaskTest(stats, v->reg[fbzMode].u, color.get_a()))
3324            if (!alphaMaskTest(stats, vd->reg[fbzMode].u, color.get_a()))
33863325               goto nextpixel;
33873326            /* handle alpha test */
3388            if (!alphaTest(v, stats, v->reg[alphaMode].u, color.get_a()))
3327            if (!alphaTest(vd, stats, vd->reg[alphaMode].u, color.get_a()))
33893328               goto nextpixel;
33903329
33913330
33923331            /* wait for any outstanding work to finish */
3393            poly_wait(v->poly, "LFB Write");
3332            poly_wait(vd->poly, "LFB Write");
33943333
33953334            /* pixel pipeline part 2 handles color combine, fog, alpha, and final output */
3396            PIXEL_PIPELINE_END(v, stats, dither, dither4, dither_lookup, x, dest, depth,
3397               v->reg[fbzMode].u, v->reg[fbzColorPath].u, v->reg[alphaMode].u, v->reg[fogMode].u,
3335            PIXEL_PIPELINE_END(vd, stats, dither, dither4, dither_lookup, x, dest, depth,
3336               vd->reg[fbzMode].u, vd->reg[fbzColorPath].u, vd->reg[alphaMode].u, vd->reg[fogMode].u,
33983337               iterz, iterw, iterargb) {};
33993338nextpixel:
34003339         /* advance our pointers */
r253153r253154
34143353 *
34153354 *************************************/
34163355
3417static INT32 texture_w(voodoo_state *v, offs_t offset, UINT32 data)
3356INT32 voodoo_device::texture_w(voodoo_device *vd, offs_t offset, UINT32 data)
34183357{
34193358   int tmunum = (offset >> 19) & 0x03;
34203359   tmu_state *t;
34213360
34223361   /* statistics */
3423   v->stats.tex_writes++;
3362   vd->stats.tex_writes++;
34243363
34253364   /* point to the right TMU */
3426   if (!(v->chipmask & (2 << tmunum)))
3365   if (!(vd->chipmask & (2 << tmunum)))
34273366      return 0;
3428   t = &v->tmu[tmunum];
3367   t = &vd->tmu[tmunum];
34293368
34303369   if (TEXLOD_TDIRECT_WRITE(t->reg[tLOD].u))
34313370      fatalerror("Texture direct write!\n");
34323371
34333372   /* wait for any outstanding work to finish */
3434   poly_wait(v->poly, "Texture write");
3373   poly_wait(vd->poly, "Texture write");
34353374
34363375   /* update texture info if dirty */
34373376   if (t->regdirty)
r253153r253154
34513390      UINT8 *dest;
34523391
34533392      /* extract info */
3454      if (v->type <= TYPE_VOODOO_2)
3393      if (vd->vd_type <= TYPE_VOODOO_2)
34553394      {
34563395         lod = (offset >> 15) & 0x0f;
34573396         tt = (offset >> 7) & 0xff;
34583397
34593398         /* old code has a bit about how this is broken in gauntleg unless we always look at TMU0 */
3460         if (TEXMODE_SEQ_8_DOWNLD(v->tmu[0].reg/*t->reg*/[textureMode].u))
3399         if (TEXMODE_SEQ_8_DOWNLD(vd->tmu[0].reg/*t->reg*/[textureMode].u))
34613400            ts = (offset << 2) & 0xfc;
34623401         else
34633402            ts = (offset << 1) & 0xfc;
r253153r253154
34703409         tbaseaddr = t->lodoffset[lod];
34713410         tbaseaddr += tt * ((t->wmask >> lod) + 1) + ts;
34723411
3473         if (LOG_TEXTURE_RAM) v->device->logerror("Texture 8-bit w: lod=%d s=%d t=%d data=%08X\n", lod, ts, tt, data);
3412         if (LOG_TEXTURE_RAM) vd->device->logerror("Texture 8-bit w: lod=%d s=%d t=%d data=%08X\n", lod, ts, tt, data);
34743413      }
34753414      else
34763415      {
34773416         tbaseaddr = t->lodoffset[0] + offset*4;
34783417
3479         if (LOG_TEXTURE_RAM) v->device->logerror("Texture 8-bit w: offset=%X data=%08X\n", offset*4, data);
3418         if (LOG_TEXTURE_RAM) vd->device->logerror("Texture 8-bit w: offset=%X data=%08X\n", offset*4, data);
34803419      }
34813420
34823421      /* write the four bytes in little-endian order */
r253153r253154
34963435      UINT16 *dest;
34973436
34983437      /* extract info */
3499      if (v->type <= TYPE_VOODOO_2)
3438      if (vd->vd_type <= TYPE_VOODOO_2)
35003439      {
35013440         lod = (offset >> 15) & 0x0f;
35023441         tt = (offset >> 7) & 0xff;
r253153r253154
35103449         tbaseaddr = t->lodoffset[lod];
35113450         tbaseaddr += 2 * (tt * ((t->wmask >> lod) + 1) + ts);
35123451
3513         if (LOG_TEXTURE_RAM) v->device->logerror("Texture 16-bit w: lod=%d s=%d t=%d data=%08X\n", lod, ts, tt, data);
3452         if (LOG_TEXTURE_RAM) vd->device->logerror("Texture 16-bit w: lod=%d s=%d t=%d data=%08X\n", lod, ts, tt, data);
35143453      }
35153454      else
35163455      {
35173456         tbaseaddr = t->lodoffset[0] + offset*4;
35183457
3519         if (LOG_TEXTURE_RAM) v->device->logerror("Texture 16-bit w: offset=%X data=%08X\n", offset*4, data);
3458         if (LOG_TEXTURE_RAM) vd->device->logerror("Texture 16-bit w: offset=%X data=%08X\n", offset*4, data);
35203459      }
35213460
35223461      /* write the two words in little-endian order */
r253153r253154
35383477 *
35393478 *************************************/
35403479
3541static void flush_fifos(voodoo_state *v, attotime current_time)
3480void voodoo_device::flush_fifos(voodoo_device *vd, attotime current_time)
35423481{
35433482   static UINT8 in_flush;
35443483
r253153r253154
35473486      return;
35483487   in_flush = TRUE;
35493488
3550   if (!v->pci.op_pending) fatalerror("flush_fifos called with no pending operation\n");
3489   if (!vd->pci.op_pending) fatalerror("flush_fifos called with no pending operation\n");
35513490
3552   if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:flush_fifos start -- pending=%d.%08X%08X cur=%d.%08X%08X\n", v->index,
3553      v->pci.op_end_time.seconds(), (UINT32)(v->pci.op_end_time.attoseconds() >> 32), (UINT32)v->pci.op_end_time.attoseconds(),
3491   if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:flush_fifos start -- pending=%d.%08X%08X cur=%d.%08X%08X\n", vd->index,
3492      vd->pci.op_end_time.seconds(), (UINT32)(vd->pci.op_end_time.attoseconds() >> 32), (UINT32)vd->pci.op_end_time.attoseconds(),
35543493      current_time.seconds(), (UINT32)(current_time.attoseconds() >> 32), (UINT32)current_time.attoseconds());
35553494
35563495   /* loop while we still have cycles to burn */
3557   while (v->pci.op_end_time <= current_time)
3496   while (vd->pci.op_end_time <= current_time)
35583497   {
35593498      INT32 extra_cycles = 0;
35603499      INT32 cycles;
r253153r253154
35673506         UINT32 data;
35683507
35693508         /* we might be in CMDFIFO mode */
3570         if (v->fbi.cmdfifo[0].enable)
3509         if (vd->fbi.cmdfifo[0].enable)
35713510         {
35723511            /* if we don't have anything to execute, we're done for now */
3573            cycles = cmdfifo_execute_if_ready(v, &v->fbi.cmdfifo[0]);
3512            cycles = cmdfifo_execute_if_ready(vd, &vd->fbi.cmdfifo[0]);
35743513            if (cycles == -1)
35753514            {
3576               v->pci.op_pending = FALSE;
3515               vd->pci.op_pending = FALSE;
35773516               in_flush = FALSE;
3578               if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- CMDFIFO empty\n", v->index);
3517               if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- CMDFIFO empty\n", vd->index);
35793518               return;
35803519            }
35813520         }
3582         else if (v->fbi.cmdfifo[1].enable)
3521         else if (vd->fbi.cmdfifo[1].enable)
35833522         {
35843523            /* if we don't have anything to execute, we're done for now */
3585            cycles = cmdfifo_execute_if_ready(v, &v->fbi.cmdfifo[1]);
3524            cycles = cmdfifo_execute_if_ready(vd, &vd->fbi.cmdfifo[1]);
35863525            if (cycles == -1)
35873526            {
3588               v->pci.op_pending = FALSE;
3527               vd->pci.op_pending = FALSE;
35893528               in_flush = FALSE;
3590               if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- CMDFIFO empty\n", v->index);
3529               if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- CMDFIFO empty\n", vd->index);
35913530               return;
35923531            }
35933532         }
r253153r253154
35963535         else
35973536         {
35983537            /* choose which FIFO to read from */
3599            if (!fifo_empty(&v->fbi.fifo))
3600               fifo = &v->fbi.fifo;
3601            else if (!fifo_empty(&v->pci.fifo))
3602               fifo = &v->pci.fifo;
3538            if (!fifo_empty(&vd->fbi.fifo))
3539               fifo = &vd->fbi.fifo;
3540            else if (!fifo_empty(&vd->pci.fifo))
3541               fifo = &vd->pci.fifo;
36033542            else
36043543            {
3605               v->pci.op_pending = FALSE;
3544               vd->pci.op_pending = FALSE;
36063545               in_flush = FALSE;
3607               if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- FIFOs empty\n", v->index);
3546               if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- FIFOs empty\n", vd->index);
36083547               return;
36093548            }
36103549
r253153r253154
36143553
36153554            /* target the appropriate location */
36163555            if ((address & (0xc00000/4)) == 0)
3617               cycles = register_w(v, address, data);
3556               cycles = register_w(vd, address, data);
36183557            else if (address & (0x800000/4))
3619               cycles = texture_w(v, address, data);
3558               cycles = texture_w(vd, address, data);
36203559            else
36213560            {
36223561               UINT32 mem_mask = 0xffffffff;
r253153r253154
36283567                  mem_mask &= 0xffff0000;
36293568               address &= 0xffffff;
36303569
3631               cycles = lfb_w(v, address, data, mem_mask);
3570               cycles = lfb_w(vd, address, data, mem_mask);
36323571            }
36333572         }
36343573
r253153r253154
36453584      cycles += extra_cycles;
36463585
36473586      /* account for those cycles */
3648      v->pci.op_end_time += attotime(0, (attoseconds_t)cycles * v->attoseconds_per_cycle);
3587      vd->pci.op_end_time += attotime(0, (attoseconds_t)cycles * vd->attoseconds_per_cycle);
36493588
3650      if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:update -- pending=%d.%08X%08X cur=%d.%08X%08X\n", v->index,
3651         v->pci.op_end_time.seconds(), (UINT32)(v->pci.op_end_time.attoseconds() >> 32), (UINT32)v->pci.op_end_time.attoseconds(),
3589      if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:update -- pending=%d.%08X%08X cur=%d.%08X%08X\n", vd->index,
3590         vd->pci.op_end_time.seconds(), (UINT32)(vd->pci.op_end_time.attoseconds() >> 32), (UINT32)vd->pci.op_end_time.attoseconds(),
36523591         current_time.seconds(), (UINT32)(current_time.attoseconds() >> 32), (UINT32)current_time.attoseconds());
36533592   }
36543593
3655   if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- pending command complete at %d.%08X%08X\n", v->index,
3656      v->pci.op_end_time.seconds(), (UINT32)(v->pci.op_end_time.attoseconds() >> 32), (UINT32)v->pci.op_end_time.attoseconds());
3594   if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- pending command complete at %d.%08X%08X\n", vd->index,
3595      vd->pci.op_end_time.seconds(), (UINT32)(vd->pci.op_end_time.attoseconds() >> 32), (UINT32)vd->pci.op_end_time.attoseconds());
36573596
36583597   in_flush = FALSE;
36593598}
r253153r253154
36693608
36703609WRITE32_MEMBER( voodoo_device::voodoo_w )
36713610{
3672   voodoo_state *v = get_safe_token(this);
36733611   int stall = FALSE;
36743612
36753613   g_profiler.start(PROFILER_USER1);
36763614
36773615   /* should not be getting accesses while stalled */
3678   if (v->pci.stall_state != NOT_STALLED)
3616   if (pci.stall_state != NOT_STALLED)
36793617      logerror("voodoo_w while stalled!\n");
36803618
36813619   /* if we have something pending, flush the FIFOs up to the current time */
3682   if (v->pci.op_pending)
3683      flush_fifos(v, machine().time());
3620   if (pci.op_pending)
3621      flush_fifos(this, machine().time());
36843622
36853623   /* special handling for registers */
36863624   if ((offset & 0xc00000/4) == 0)
r253153r253154
36883626      UINT8 access;
36893627
36903628      /* some special stuff for Voodoo 2 */
3691      if (v->type >= TYPE_VOODOO_2)
3629      if (vd_type >= TYPE_VOODOO_2)
36923630      {
36933631         /* we might be in CMDFIFO mode */
3694         if (FBIINIT7_CMDFIFO_ENABLE(v->reg[fbiInit7].u))
3632         if (FBIINIT7_CMDFIFO_ENABLE(reg[fbiInit7].u))
36953633         {
36963634            /* if bit 21 is set, we're writing to the FIFO */
36973635            if (offset & 0x200000/4)
r253153r253154
36993637               /* check for byte swizzling (bit 18) */
37003638               if (offset & 0x40000/4)
37013639                  data = FLIPENDIAN_INT32(data);
3702               cmdfifo_w(v, &v->fbi.cmdfifo[0], offset & 0xffff, data);
3640               cmdfifo_w(this, &fbi.cmdfifo[0], offset & 0xffff, data);
37033641               g_profiler.stop();
37043642               return;
37053643            }
37063644
37073645            /* we're a register access; but only certain ones are allowed */
3708            access = v->regaccess[offset & 0xff];
3646            access = regaccess[offset & 0xff];
37093647            if (!(access & REGISTER_WRITETHRU))
37103648            {
37113649               /* track swap buffers regardless */
37123650               if ((offset & 0xff) == swapbufferCMD)
3713                  v->fbi.swaps_pending++;
3651                  fbi.swaps_pending++;
37143652
3715               logerror("Ignoring write to %s in CMDFIFO mode\n", v->regnames[offset & 0xff]);
3653               logerror("Ignoring write to %s in CMDFIFO mode\n", regnames[offset & 0xff]);
37163654               g_profiler.stop();
37173655               return;
37183656            }
r253153r253154
37253663
37263664      /* check the access behavior; note that the table works even if the */
37273665      /* alternate mapping is used */
3728      access = v->regaccess[offset & 0xff];
3666      access = regaccess[offset & 0xff];
37293667
37303668      /* ignore if writes aren't allowed */
37313669      if (!(access & REGISTER_WRITE))
r253153r253154
37403678
37413679      /* track swap buffers */
37423680      if ((offset & 0xff) == swapbufferCMD)
3743         v->fbi.swaps_pending++;
3681         fbi.swaps_pending++;
37443682   }
37453683
37463684   /* if we don't have anything pending, or if FIFOs are disabled, just execute */
3747   if (!v->pci.op_pending || !INITEN_ENABLE_PCI_FIFO(v->pci.init_enable))
3685   if (!pci.op_pending || !INITEN_ENABLE_PCI_FIFO(pci.init_enable))
37483686   {
37493687      int cycles;
37503688
37513689      /* target the appropriate location */
37523690      if ((offset & (0xc00000/4)) == 0)
3753         cycles = register_w(v, offset, data);
3691         cycles = register_w(this, offset, data);
37543692      else if (offset & (0x800000/4))
3755         cycles = texture_w(v, offset, data);
3693         cycles = texture_w(this, offset, data);
37563694      else
3757         cycles = lfb_w(v, offset, data, mem_mask);
3695         cycles = lfb_w(this, offset, data, mem_mask);
37583696
37593697      /* if we ended up with cycles, mark the operation pending */
37603698      if (cycles)
37613699      {
3762         v->pci.op_pending = TRUE;
3763         v->pci.op_end_time = machine().time() + attotime(0, (attoseconds_t)cycles * v->attoseconds_per_cycle);
3700         pci.op_pending = TRUE;
3701         pci.op_end_time = machine().time() + attotime(0, (attoseconds_t)cycles * attoseconds_per_cycle);
37643702
3765         if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:direct write start at %d.%08X%08X end at %d.%08X%08X\n", v->index,
3703         if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:direct write start at %d.%08X%08X end at %d.%08X%08X\n", index,
37663704            machine().time().seconds(), (UINT32)(machine().time().attoseconds() >> 32), (UINT32)machine().time().attoseconds(),
3767            v->pci.op_end_time.seconds(), (UINT32)(v->pci.op_end_time.attoseconds() >> 32), (UINT32)v->pci.op_end_time.attoseconds());
3705            pci.op_end_time.seconds(), (UINT32)(pci.op_end_time.attoseconds() >> 32), (UINT32)pci.op_end_time.attoseconds());
37683706      }
37693707      g_profiler.stop();
37703708      return;
r253153r253154
37803718   }
37813719
37823720   /* if there's room in the PCI FIFO, add there */
3783   if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:voodoo_w adding to PCI FIFO @ %08X=%08X\n", v->index, offset, data);
3784   if (!fifo_full(&v->pci.fifo))
3721   if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:voodoo_w adding to PCI FIFO @ %08X=%08X\n", this, offset, data);
3722   if (!fifo_full(&pci.fifo))
37853723   {
3786      fifo_add(&v->pci.fifo, offset);
3787      fifo_add(&v->pci.fifo, data);
3724      fifo_add(&pci.fifo, offset);
3725      fifo_add(&pci.fifo, data);
37883726   }
37893727   else
37903728      fatalerror("PCI FIFO full\n");
37913729
37923730   /* handle flushing to the memory FIFO */
3793   if (FBIINIT0_ENABLE_MEMORY_FIFO(v->reg[fbiInit0].u) &&
3794      fifo_space(&v->pci.fifo) <= 2 * FBIINIT4_MEMORY_FIFO_LWM(v->reg[fbiInit4].u))
3731   if (FBIINIT0_ENABLE_MEMORY_FIFO(reg[fbiInit0].u) &&
3732      fifo_space(&pci.fifo) <= 2 * FBIINIT4_MEMORY_FIFO_LWM(reg[fbiInit4].u))
37953733   {
37963734      UINT8 valid[4];
37973735
37983736      /* determine which types of data can go to the memory FIFO */
37993737      valid[0] = TRUE;
3800      valid[1] = FBIINIT0_LFB_TO_MEMORY_FIFO(v->reg[fbiInit0].u);
3801      valid[2] = valid[3] = FBIINIT0_TEXMEM_TO_MEMORY_FIFO(v->reg[fbiInit0].u);
3738      valid[1] = FBIINIT0_LFB_TO_MEMORY_FIFO(reg[fbiInit0].u);
3739      valid[2] = valid[3] = FBIINIT0_TEXMEM_TO_MEMORY_FIFO(reg[fbiInit0].u);
38023740
38033741      /* flush everything we can */
3804      if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:voodoo_w moving PCI FIFO to memory FIFO\n", v->index);
3805      while (!fifo_empty(&v->pci.fifo) && valid[(fifo_peek(&v->pci.fifo) >> 22) & 3])
3742      if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:voodoo_w moving PCI FIFO to memory FIFO\n", index);
3743      while (!fifo_empty(&pci.fifo) && valid[(fifo_peek(&pci.fifo) >> 22) & 3])
38063744      {
3807         fifo_add(&v->fbi.fifo, fifo_remove(&v->pci.fifo));
3808         fifo_add(&v->fbi.fifo, fifo_remove(&v->pci.fifo));
3745         fifo_add(&fbi.fifo, fifo_remove(&pci.fifo));
3746         fifo_add(&fbi.fifo, fifo_remove(&pci.fifo));
38093747      }
38103748
38113749      /* if we're above the HWM as a result, stall */
3812      if (FBIINIT0_STALL_PCIE_FOR_HWM(v->reg[fbiInit0].u) &&
3813         fifo_items(&v->fbi.fifo) >= 2 * 32 * FBIINIT0_MEMORY_FIFO_HWM(v->reg[fbiInit0].u))
3750      if (FBIINIT0_STALL_PCIE_FOR_HWM(reg[fbiInit0].u) &&
3751         fifo_items(&fbi.fifo) >= 2 * 32 * FBIINIT0_MEMORY_FIFO_HWM(reg[fbiInit0].u))
38143752      {
3815         if (LOG_FIFO) logerror("VOODOO.%d.FIFO:voodoo_w hit memory FIFO HWM -- stalling\n", v->index);
3816         stall_cpu(v, STALLED_UNTIL_FIFO_LWM, machine().time());
3753         if (LOG_FIFO) logerror("VOODOO.%d.FIFO:voodoo_w hit memory FIFO HWM -- stalling\n", index);
3754         stall_cpu(this, STALLED_UNTIL_FIFO_LWM, machine().time());
38173755      }
38183756   }
38193757
38203758   /* if we're at the LWM for the PCI FIFO, stall */
3821   if (FBIINIT0_STALL_PCIE_FOR_HWM(v->reg[fbiInit0].u) &&
3822      fifo_space(&v->pci.fifo) <= 2 * FBIINIT0_PCI_FIFO_LWM(v->reg[fbiInit0].u))
3759   if (FBIINIT0_STALL_PCIE_FOR_HWM(reg[fbiInit0].u) &&
3760      fifo_space(&pci.fifo) <= 2 * FBIINIT0_PCI_FIFO_LWM(reg[fbiInit0].u))
38233761   {
3824      if (LOG_FIFO) logerror("VOODOO.%d.FIFO:voodoo_w hit PCI FIFO free LWM -- stalling\n", v->index);
3825      stall_cpu(v, STALLED_UNTIL_FIFO_LWM, machine().time());
3762      if (LOG_FIFO) logerror("VOODOO.%d.FIFO:voodoo_w hit PCI FIFO free LWM -- stalling\n", index);
3763      stall_cpu(this, STALLED_UNTIL_FIFO_LWM, machine().time());
38263764   }
38273765
38283766   /* if we weren't ready, and this is a non-FIFO access, stall until the FIFOs are clear */
38293767   if (stall)
38303768   {
3831      if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:voodoo_w wrote non-FIFO register -- stalling until clear\n", v->index);
3832      stall_cpu(v, STALLED_UNTIL_FIFO_EMPTY, machine().time());
3769      if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:voodoo_w wrote non-FIFO register -- stalling until clear\n", index);
3770      stall_cpu(this, STALLED_UNTIL_FIFO_EMPTY, machine().time());
38333771   }
38343772
38353773   g_profiler.stop();
r253153r253154
38433781 *
38443782 *************************************/
38453783
3846static UINT32 register_r(voodoo_state *v, offs_t offset)
3784static UINT32 register_r(voodoo_device *vd, offs_t offset)
38473785{
3786
38483787   int regnum = offset & 0xff;
38493788   UINT32 result;
38503789
38513790   /* statistics */
3852   v->stats.reg_reads++;
3791   vd->stats.reg_reads++;
38533792
38543793   /* first make sure this register is readable */
3855   if (!(v->regaccess[regnum] & REGISTER_READ))
3794   if (!(vd->regaccess[regnum] & REGISTER_READ))
38563795   {
3857      v->device->logerror("VOODOO.%d.ERROR:Invalid attempt to read %s\n", v->index, regnum < 225 ? v->regnames[regnum] : "unknown register");
3796      vd->device->logerror("VOODOO.%d.ERROR:Invalid attempt to read %s\n", vd->index, regnum < 225 ? vd->regnames[regnum] : "unknown register");
38583797      return 0xffffffff;
38593798   }
38603799
38613800   /* default result is the FBI register value */
3862   result = v->reg[regnum].u;
3801   result = vd->reg[regnum].u;
38633802
38643803   /* some registers are dynamic; compute them */
38653804   switch (regnum)
38663805   {
3867      case status:
3806      case vdstatus:
38683807
38693808         /* start with a blank slate */
38703809         result = 0;
38713810
38723811         /* bits 5:0 are the PCI FIFO free space */
3873         if (fifo_empty(&v->pci.fifo))
3812         if (fifo_empty(&vd->pci.fifo))
38743813            result |= 0x3f << 0;
38753814         else
38763815         {
3877            int temp = fifo_space(&v->pci.fifo)/2;
3816            int temp = fifo_space(&vd->pci.fifo)/2;
38783817            if (temp > 0x3f)
38793818               temp = 0x3f;
38803819            result |= temp << 0;
38813820         }
38823821
38833822         /* bit 6 is the vertical retrace */
3884         result |= v->fbi.vblank << 6;
3823         result |= vd->fbi.vblank << 6;
38853824
38863825         /* bit 7 is FBI graphics engine busy */
3887         if (v->pci.op_pending)
3826         if (vd->pci.op_pending)
38883827            result |= 1 << 7;
38893828
38903829         /* bit 8 is TREX busy */
3891         if (v->pci.op_pending)
3830         if (vd->pci.op_pending)
38923831            result |= 1 << 8;
38933832
38943833         /* bit 9 is overall busy */
3895         if (v->pci.op_pending)
3834         if (vd->pci.op_pending)
38963835            result |= 1 << 9;
38973836
38983837         /* Banshee is different starting here */
3899         if (v->type < TYPE_VOODOO_BANSHEE)
3838         if (vd->vd_type < TYPE_VOODOO_BANSHEE)
39003839         {
39013840            /* bits 11:10 specifies which buffer is visible */
3902            result |= v->fbi.frontbuf << 10;
3841            result |= vd->fbi.frontbuf << 10;
39033842
39043843            /* bits 27:12 indicate memory FIFO freespace */
3905            if (!FBIINIT0_ENABLE_MEMORY_FIFO(v->reg[fbiInit0].u) || fifo_empty(&v->fbi.fifo))
3844            if (!FBIINIT0_ENABLE_MEMORY_FIFO(vd->reg[fbiInit0].u) || fifo_empty(&vd->fbi.fifo))
39063845               result |= 0xffff << 12;
39073846            else
39083847            {
3909               int temp = fifo_space(&v->fbi.fifo)/2;
3848               int temp = fifo_space(&vd->fbi.fifo)/2;
39103849               if (temp > 0xffff)
39113850                  temp = 0xffff;
39123851               result |= temp << 12;
r253153r253154
39173856            /* bit 10 is 2D busy */
39183857
39193858            /* bit 11 is cmd FIFO 0 busy */
3920            if (v->fbi.cmdfifo[0].enable && v->fbi.cmdfifo[0].depth > 0)
3859            if (vd->fbi.cmdfifo[0].enable && vd->fbi.cmdfifo[0].depth > 0)
39213860               result |= 1 << 11;
39223861
39233862            /* bit 12 is cmd FIFO 1 busy */
3924            if (v->fbi.cmdfifo[1].enable && v->fbi.cmdfifo[1].depth > 0)
3863            if (vd->fbi.cmdfifo[1].enable && vd->fbi.cmdfifo[1].depth > 0)
39253864               result |= 1 << 12;
39263865         }
39273866
39283867         /* bits 30:28 are the number of pending swaps */
3929         if (v->fbi.swaps_pending > 7)
3868         if (vd->fbi.swaps_pending > 7)
39303869            result |= 7 << 28;
39313870         else
3932            result |= v->fbi.swaps_pending << 28;
3871            result |= vd->fbi.swaps_pending << 28;
39333872
39343873         /* bit 31 is not used */
39353874
39363875         /* eat some cycles since people like polling here */
3937         if (EAT_CYCLES) v->cpu->execute().eat_cycles(1000);
3876         if (EAT_CYCLES) vd->cpu->execute().eat_cycles(1000);
39383877         break;
39393878
39403879      /* bit 2 of the initEnable register maps this to dacRead */
39413880      case fbiInit2:
3942         if (INITEN_REMAP_INIT_TO_DAC(v->pci.init_enable))
3943            result = v->dac.read_result;
3881         if (INITEN_REMAP_INIT_TO_DAC(vd->pci.init_enable))
3882            result = vd->dac.read_result;
39443883         break;
39453884
39463885      /* return the current scanline for now */
39473886      case vRetrace:
39483887
39493888         /* eat some cycles since people like polling here */
3950         if (EAT_CYCLES) v->cpu->execute().eat_cycles(10);
3951         result = v->screen->vpos();
3889         if (EAT_CYCLES) vd->cpu->execute().eat_cycles(10);
3890         result = vd->screen->vpos();
39523891         break;
39533892
39543893      /* reserved area in the TMU read by the Vegas startup sequence */
r253153r253154
39593898
39603899      /* cmdFifo -- Voodoo2 only */
39613900      case cmdFifoRdPtr:
3962         result = v->fbi.cmdfifo[0].rdptr;
3901         result = vd->fbi.cmdfifo[0].rdptr;
39633902
39643903         /* eat some cycles since people like polling here */
3965         if (EAT_CYCLES) v->cpu->execute().eat_cycles(1000);
3904         if (EAT_CYCLES) vd->cpu->execute().eat_cycles(1000);
39663905         break;
39673906
39683907      case cmdFifoAMin:
3969         result = v->fbi.cmdfifo[0].amin;
3908         result = vd->fbi.cmdfifo[0].amin;
39703909         break;
39713910
39723911      case cmdFifoAMax:
3973         result = v->fbi.cmdfifo[0].amax;
3912         result = vd->fbi.cmdfifo[0].amax;
39743913         break;
39753914
39763915      case cmdFifoDepth:
3977         result = v->fbi.cmdfifo[0].depth;
3916         result = vd->fbi.cmdfifo[0].depth;
39783917         break;
39793918
39803919      case cmdFifoHoles:
3981         result = v->fbi.cmdfifo[0].holes;
3920         result = vd->fbi.cmdfifo[0].holes;
39823921         break;
39833922
39843923      /* all counters are 24-bit only */
r253153r253154
39873926      case fbiZfuncFail:
39883927      case fbiAfuncFail:
39893928      case fbiPixelsOut:
3990         update_statistics(v, TRUE);
3929         update_statistics(vd, TRUE);
39913930      case fbiTrianglesOut:
3992         result = v->reg[regnum].u & 0xffffff;
3931         result = vd->reg[regnum].u & 0xffffff;
39933932         break;
39943933   }
39953934
r253153r253154
39983937      int logit = TRUE;
39993938
40003939      /* don't log multiple identical status reads from the same address */
4001      if (regnum == status)
3940      if (regnum == vdstatus)
40023941      {
4003         offs_t pc = v->cpu->safe_pc();
4004         if (pc == v->last_status_pc && result == v->last_status_value)
3942         offs_t pc = vd->cpu->safe_pc();
3943         if (pc == vd->last_status_pc && result == vd->last_status_value)
40053944            logit = FALSE;
4006         v->last_status_pc = pc;
4007         v->last_status_value = result;
3945         vd->last_status_pc = pc;
3946         vd->last_status_value = result;
40083947      }
40093948      if (regnum == cmdFifoRdPtr)
40103949         logit = FALSE;
40113950
40123951      if (logit)
4013         v->device->logerror("VOODOO.%d.REG:%s read = %08X\n", v->index, v->regnames[regnum], result);
3952         vd->device->logerror("VOODOO.%d.REG:%s read = %08X\n", vd->index, vd->regnames[regnum], result);
40143953   }
40153954
40163955   return result;
r253153r253154
40243963 *
40253964 *************************************/
40263965
4027static UINT32 lfb_r(voodoo_state *v, offs_t offset, bool lfb_3d)
3966static UINT32 lfb_r(voodoo_device *vd, offs_t offset, bool lfb_3d)
40283967{
40293968   UINT16 *buffer;
40303969   UINT32 bufmax;
r253153r253154
40333972   int x, y, scry, destbuf;
40343973
40353974   /* statistics */
4036   v->stats.lfb_reads++;
3975   vd->stats.lfb_reads++;
40373976
40383977   /* compute X,Y */
40393978   offset <<= 1;
4040   x = offset & ((1 << v->fbi.lfb_stride) - 1);
4041   y = (offset >> v->fbi.lfb_stride);
3979   x = offset & ((1 << vd->fbi.lfb_stride) - 1);
3980   y = (offset >> vd->fbi.lfb_stride);
40423981
40433982   /* select the target buffer */
40443983   if (lfb_3d) {
40453984      y &= 0x3ff;
4046      destbuf = (v->type >= TYPE_VOODOO_BANSHEE) ? 1 : LFBMODE_READ_BUFFER_SELECT(v->reg[lfbMode].u);
3985      destbuf = (vd->vd_type >= TYPE_VOODOO_BANSHEE) ? 1 : LFBMODE_READ_BUFFER_SELECT(vd->reg[lfbMode].u);
40473986      switch (destbuf)
40483987      {
40493988         case 0:         /* front buffer */
4050            buffer = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.frontbuf]);
4051            bufmax = (v->fbi.mask + 1 - v->fbi.rgboffs[v->fbi.frontbuf]) / 2;
3989            buffer = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.frontbuf]);
3990            bufmax = (vd->fbi.mask + 1 - vd->fbi.rgboffs[vd->fbi.frontbuf]) / 2;
40523991            break;
40533992
40543993         case 1:         /* back buffer */
4055            buffer = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.backbuf]);
4056            bufmax = (v->fbi.mask + 1 - v->fbi.rgboffs[v->fbi.backbuf]) / 2;
3994            buffer = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.backbuf]);
3995            bufmax = (vd->fbi.mask + 1 - vd->fbi.rgboffs[vd->fbi.backbuf]) / 2;
40573996            break;
40583997
40593998         case 2:         /* aux buffer */
4060            if (v->fbi.auxoffs == ~0)
3999            if (vd->fbi.auxoffs == ~0)
40614000               return 0xffffffff;
4062            buffer = (UINT16 *)(v->fbi.ram + v->fbi.auxoffs);
4063            bufmax = (v->fbi.mask + 1 - v->fbi.auxoffs) / 2;
4001            buffer = (UINT16 *)(vd->fbi.ram + vd->fbi.auxoffs);
4002            bufmax = (vd->fbi.mask + 1 - vd->fbi.auxoffs) / 2;
40644003            break;
40654004
40664005         default:        /* reserved */
r253153r253154
40694008
40704009      /* determine the screen Y */
40714010      scry = y;
4072      if (LFBMODE_Y_ORIGIN(v->reg[lfbMode].u))
4073         scry = (v->fbi.yorigin - y) & 0x3ff;
4011      if (LFBMODE_Y_ORIGIN(vd->reg[lfbMode].u))
4012         scry = (vd->fbi.yorigin - y) & 0x3ff;
40744013   } else {
40754014      // Direct lfb access
4076      buffer = (UINT16 *)(v->fbi.ram + v->fbi.lfb_base*4);
4077      bufmax = (v->fbi.mask + 1 - v->fbi.lfb_base*4) / 2;
4015      buffer = (UINT16 *)(vd->fbi.ram + vd->fbi.lfb_base*4);
4016      bufmax = (vd->fbi.mask + 1 - vd->fbi.lfb_base*4) / 2;
40784017      scry = y;
40794018   }
40804019
40814020   /* advance pointers to the proper row */
4082   bufoffs = scry * v->fbi.rowpixels + x;
4021   bufoffs = scry * vd->fbi.rowpixels + x;
40834022   if (bufoffs >= bufmax) {
4084      v->device->logerror("LFB_R: Buffer offset out of bounds x=%i y=%i lfb_3d=%i offset=%08X bufoffs=%08X\n", x, y, lfb_3d, offset, (UINT32) bufoffs);
4023      vd->device->logerror("LFB_R: Buffer offset out of bounds x=%i y=%i lfb_3d=%i offset=%08X bufoffs=%08X\n", x, y, lfb_3d, offset, (UINT32) bufoffs);
40854024      return 0xffffffff;
40864025   }
40874026
40884027   /* wait for any outstanding work to finish */
4089   poly_wait(v->poly, "LFB read");
4028   poly_wait(vd->poly, "LFB read");
40904029
40914030   /* compute the data */
40924031   data = buffer[bufoffs + 0] | (buffer[bufoffs + 1] << 16);
40934032
40944033   /* word swapping */
4095   if (LFBMODE_WORD_SWAP_READS(v->reg[lfbMode].u))
4034   if (LFBMODE_WORD_SWAP_READS(vd->reg[lfbMode].u))
40964035      data = (data << 16) | (data >> 16);
40974036
40984037   /* byte swizzling */
4099   if (LFBMODE_BYTE_SWIZZLE_READS(v->reg[lfbMode].u))
4038   if (LFBMODE_BYTE_SWIZZLE_READS(vd->reg[lfbMode].u))
41004039      data = FLIPENDIAN_INT32(data);
41014040
4102   if (LOG_LFB) v->device->logerror("VOODOO.%d.LFB:read (%d,%d) = %08X\n", v->index, x, y, data);
4041   if (LOG_LFB) vd->device->logerror("VOODOO.%d.LFB:read (%d,%d) = %08X\n", vd->index, x, y, data);
41034042   return data;
41044043}
41054044
r253153r253154
41144053
41154054READ32_MEMBER( voodoo_device::voodoo_r )
41164055{
4117   voodoo_state *v = get_safe_token(this);
41184056
41194057   /* if we have something pending, flush the FIFOs up to the current time */
4120   if (v->pci.op_pending)
4121      flush_fifos(v, machine().time());
4058   if (pci.op_pending)
4059      flush_fifos(this, machine().time());
41224060
41234061   /* target the appropriate location */
41244062   if (!(offset & (0xc00000/4)))
4125      return register_r(v, offset);
4063      return register_r(this, offset);
41264064   else if (!(offset & (0x800000/4)))
4127      return lfb_r(v, offset, true);
4065      return lfb_r(this, offset, true);
41284066
41294067   return 0xffffffff;
41304068}
r253153r253154
41404078
41414079READ32_MEMBER( voodoo_banshee_device::banshee_agp_r )
41424080{
4143   voodoo_state *v = get_safe_token(this);
41444081   UINT32 result;
41454082
41464083   offset &= 0x1ff/4;
r253153r253154
41494086   switch (offset)
41504087   {
41514088      case cmdRdPtrL0:
4152         result = v->fbi.cmdfifo[0].rdptr;
4089         result = fbi.cmdfifo[0].rdptr;
41534090         break;
41544091
41554092      case cmdAMin0:
4156         result = v->fbi.cmdfifo[0].amin;
4093         result = fbi.cmdfifo[0].amin;
41574094         break;
41584095
41594096      case cmdAMax0:
4160         result = v->fbi.cmdfifo[0].amax;
4097         result = fbi.cmdfifo[0].amax;
41614098         break;
41624099
41634100      case cmdFifoDepth0:
4164         result = v->fbi.cmdfifo[0].depth;
4101         result = fbi.cmdfifo[0].depth;
41654102         break;
41664103
41674104      case cmdHoleCnt0:
4168         result = v->fbi.cmdfifo[0].holes;
4105         result = fbi.cmdfifo[0].holes;
41694106         break;
41704107
41714108      case cmdRdPtrL1:
4172         result = v->fbi.cmdfifo[1].rdptr;
4109         result = fbi.cmdfifo[1].rdptr;
41734110         break;
41744111
41754112      case cmdAMin1:
4176         result = v->fbi.cmdfifo[1].amin;
4113         result = fbi.cmdfifo[1].amin;
41774114         break;
41784115
41794116      case cmdAMax1:
4180         result = v->fbi.cmdfifo[1].amax;
4117         result = fbi.cmdfifo[1].amax;
41814118         break;
41824119
41834120      case cmdFifoDepth1:
4184         result = v->fbi.cmdfifo[1].depth;
4121         result = fbi.cmdfifo[1].depth;
41854122         break;
41864123
41874124      case cmdHoleCnt1:
4188         result = v->fbi.cmdfifo[1].holes;
4125         result = fbi.cmdfifo[1].holes;
41894126         break;
41904127
41914128      default:
4192         result = v->banshee.agp[offset];
4129         result = banshee.agp[offset];
41934130         break;
41944131   }
41954132
41964133   if (LOG_REGISTERS)
4197      logerror("%s:banshee_r(AGP:%s)\n", v->device->machine().describe_context(), banshee_agp_reg_name[offset]);
4134      logerror("%s:banshee_r(AGP:%s)\n", device->machine().describe_context(), banshee_agp_reg_name[offset]);
41984135   return result;
41994136}
42004137
42014138
42024139READ32_MEMBER( voodoo_banshee_device::banshee_r )
42034140{
4204   voodoo_state *v = get_safe_token(this);
42054141   UINT32 result = 0xffffffff;
42064142
42074143   /* if we have something pending, flush the FIFOs up to the current time */
4208   if (v->pci.op_pending)
4209      flush_fifos(v, machine().time());
4144   if (pci.op_pending)
4145      flush_fifos(this, machine().time());
42104146
42114147   if (offset < 0x80000/4)
42124148      result = banshee_io_r(space, offset, mem_mask);
r253153r253154
42154151   else if (offset < 0x200000/4)
42164152      logerror("%s:banshee_r(2D:%X)\n", machine().describe_context(), (offset*4) & 0xfffff);
42174153   else if (offset < 0x600000/4)
4218      result = register_r(v, offset & 0x1fffff/4);
4154      result = register_r(this, offset & 0x1fffff/4);
42194155   else if (offset < 0x800000/4)
42204156      logerror("%s:banshee_r(TEX0:%X)\n", machine().describe_context(), (offset*4) & 0x1fffff);
42214157   else if (offset < 0xa00000/4)
r253153r253154
42264162      logerror("%s:banshee_r(YUV:%X)\n", machine().describe_context(), (offset*4) & 0x3fffff);
42274163   else if (offset < 0x2000000/4)
42284164   {
4229      result = lfb_r(v, offset & 0xffffff/4, true);
4165      result = lfb_r(this, offset & 0xffffff/4, true);
42304166   } else {
42314167         logerror("%s:banshee_r(%X) Access out of bounds\n", machine().describe_context(), offset*4);
42324168   }
r253153r253154
42364172
42374173READ32_MEMBER( voodoo_banshee_device::banshee_fb_r )
42384174{
4239   voodoo_state *v = get_safe_token(this);
42404175   UINT32 result = 0xffffffff;
42414176
42424177   /* if we have something pending, flush the FIFOs up to the current time */
4243   if (v->pci.op_pending)
4244      flush_fifos(v, machine().time());
4178   if (pci.op_pending)
4179      flush_fifos(this, machine().time());
42454180
4246   if (offset < v->fbi.lfb_base)
4181   if (offset < fbi.lfb_base)
42474182   {
42484183#if LOG_LFB
42494184      logerror("%s:banshee_fb_r(%X)\n", machine().describe_context(), offset*4);
42504185#endif
4251      if (offset*4 <= v->fbi.mask)
4252         result = ((UINT32 *)v->fbi.ram)[offset];
4186      if (offset*4 <= fbi.mask)
4187         result = ((UINT32 *)fbi.ram)[offset];
42534188      else
42544189         logerror("%s:banshee_fb_r(%X) Access out of bounds\n", machine().describe_context(), offset*4);
42554190   }
42564191   else {
42574192      if (LOG_LFB)
4258         logerror("%s:banshee_fb_r(%X) to lfb_r: %08X lfb_base=%08X\n", machine().describe_context(), offset*4, offset - v->fbi.lfb_base, v->fbi.lfb_base);
4259      result = lfb_r(v, offset - v->fbi.lfb_base, false);
4193         logerror("%s:banshee_fb_r(%X) to lfb_r: %08X lfb_base=%08X\n", machine().describe_context(), offset*4, offset - fbi.lfb_base, fbi.lfb_base);
4194      result = lfb_r(this, offset - fbi.lfb_base, false);
42604195   }
42614196   return result;
42624197}
r253153r253154
42644199
42654200READ8_MEMBER( voodoo_banshee_device::banshee_vga_r )
42664201{
4267   voodoo_state *v = get_safe_token(this);
42684202   UINT8 result = 0xff;
42694203
42704204   offset &= 0x1f;
r253153r253154
42744208   {
42754209      /* attribute access */
42764210      case 0x3c0:
4277         if (v->banshee.vga[0x3c1 & 0x1f] < ARRAY_LENGTH(v->banshee.att))
4278            result = v->banshee.att[v->banshee.vga[0x3c1 & 0x1f]];
4211         if (banshee.vga[0x3c1 & 0x1f] < ARRAY_LENGTH(banshee.att))
4212            result = banshee.att[banshee.vga[0x3c1 & 0x1f]];
42794213         if (LOG_REGISTERS)
4280            logerror("%s:banshee_att_r(%X)\n", machine().describe_context(), v->banshee.vga[0x3c1 & 0x1f]);
4214            logerror("%s:banshee_att_r(%X)\n", machine().describe_context(), banshee.vga[0x3c1 & 0x1f]);
42814215         break;
42824216
42834217      /* Input status 0 */
r253153r253154
42954229
42964230      /* Sequencer access */
42974231      case 0x3c5:
4298         if (v->banshee.vga[0x3c4 & 0x1f] < ARRAY_LENGTH(v->banshee.seq))
4299            result = v->banshee.seq[v->banshee.vga[0x3c4 & 0x1f]];
4232         if (banshee.vga[0x3c4 & 0x1f] < ARRAY_LENGTH(banshee.seq))
4233            result = banshee.seq[banshee.vga[0x3c4 & 0x1f]];
43004234         if (LOG_REGISTERS)
4301            logerror("%s:banshee_seq_r(%X)\n", machine().describe_context(), v->banshee.vga[0x3c4 & 0x1f]);
4235            logerror("%s:banshee_seq_r(%X)\n", machine().describe_context(), banshee.vga[0x3c4 & 0x1f]);
43024236         break;
43034237
43044238      /* Feature control */
43054239      case 0x3ca:
4306         result = v->banshee.vga[0x3da & 0x1f];
4307         v->banshee.attff = 0;
4240         result = banshee.vga[0x3da & 0x1f];
4241         banshee.attff = 0;
43084242         if (LOG_REGISTERS)
43094243            logerror("%s:banshee_vga_r(%X)\n", machine().describe_context(), 0x300+offset);
43104244         break;
43114245
43124246      /* Miscellaneous output */
43134247      case 0x3cc:
4314         result = v->banshee.vga[0x3c2 & 0x1f];
4248         result = banshee.vga[0x3c2 & 0x1f];
43154249         if (LOG_REGISTERS)
43164250            logerror("%s:banshee_vga_r(%X)\n", machine().describe_context(), 0x300+offset);
43174251         break;
43184252
43194253      /* Graphics controller access */
43204254      case 0x3cf:
4321         if (v->banshee.vga[0x3ce & 0x1f] < ARRAY_LENGTH(v->banshee.gc))
4322            result = v->banshee.gc[v->banshee.vga[0x3ce & 0x1f]];
4255         if (banshee.vga[0x3ce & 0x1f] < ARRAY_LENGTH(banshee.gc))
4256            result = banshee.gc[banshee.vga[0x3ce & 0x1f]];
43234257         if (LOG_REGISTERS)
4324            logerror("%s:banshee_gc_r(%X)\n", machine().describe_context(), v->banshee.vga[0x3ce & 0x1f]);
4258            logerror("%s:banshee_gc_r(%X)\n", machine().describe_context(), banshee.vga[0x3ce & 0x1f]);
43254259         break;
43264260
43274261      /* CRTC access */
43284262      case 0x3d5:
4329         if (v->banshee.vga[0x3d4 & 0x1f] < ARRAY_LENGTH(v->banshee.crtc))
4330            result = v->banshee.crtc[v->banshee.vga[0x3d4 & 0x1f]];
4263         if (banshee.vga[0x3d4 & 0x1f] < ARRAY_LENGTH(banshee.crtc))
4264            result = banshee.crtc[banshee.vga[0x3d4 & 0x1f]];
43314265         if (LOG_REGISTERS)
4332            logerror("%s:banshee_crtc_r(%X)\n", machine().describe_context(), v->banshee.vga[0x3d4 & 0x1f]);
4266            logerror("%s:banshee_crtc_r(%X)\n", machine().describe_context(), banshee.vga[0x3d4 & 0x1f]);
43334267         break;
43344268
43354269      /* Input status 1 */
r253153r253154
43494283         break;
43504284
43514285      default:
4352         result = v->banshee.vga[offset];
4286         result = banshee.vga[offset];
43534287         if (LOG_REGISTERS)
43544288            logerror("%s:banshee_vga_r(%X)\n", machine().describe_context(), 0x300+offset);
43554289         break;
r253153r253154
43604294
43614295READ32_MEMBER( voodoo_banshee_device::banshee_io_r )
43624296{
4363   voodoo_state *v = get_safe_token(this);
43644297   UINT32 result;
43654298
43664299   offset &= 0xff/4;
r253153r253154
43694302   switch (offset)
43704303   {
43714304      case io_status:
4372         result = register_r(v, 0);
4305         result = register_r(this, 0);
43734306         break;
43744307
43754308      case io_dacData:
4376         result = v->fbi.clut[v->banshee.io[io_dacAddr] & 0x1ff] = v->banshee.io[offset];
4309         result = fbi.clut[banshee.io[io_dacAddr] & 0x1ff] = banshee.io[offset];
43774310         if (LOG_REGISTERS)
4378            logerror("%s:banshee_dac_r(%X)\n", machine().describe_context(), v->banshee.io[io_dacAddr] & 0x1ff);
4311            logerror("%s:banshee_dac_r(%X)\n", machine().describe_context(), banshee.io[io_dacAddr] & 0x1ff);
43794312         break;
43804313
43814314      case io_vgab0:  case io_vgab4:  case io_vgab8:  case io_vgabc:
r253153r253154
43934326         break;
43944327
43954328      default:
4396         result = v->banshee.io[offset];
4329         result = banshee.io[offset];
43974330         if (LOG_REGISTERS)
43984331            logerror("%s:banshee_io_r(%s)\n", machine().describe_context(), banshee_io_reg_name[offset]);
43994332         break;
r253153r253154
44094342   return 0xffffffff;
44104343}
44114344
4412static void blit_2d(voodoo_state *v, UINT32 data)
4345static void blit_2d(voodoo_device *vd, UINT32 data)
44134346{
4414   switch (v->banshee.blt_cmd)
4347   switch (vd->banshee.blt_cmd)
44154348   {
44164349      case 0:         // NOP - wait for idle
44174350      {
r253153r253154
44344367
44354368      case 3:         // Host-to-screen blit
44364369      {
4437         UINT32 addr = v->banshee.blt_dst_base;
4370         UINT32 addr = vd->banshee.blt_dst_base;
44384371
4439         addr += (v->banshee.blt_dst_y * v->banshee.blt_dst_stride) + (v->banshee.blt_dst_x * v->banshee.blt_dst_bpp);
4372         addr += (vd->banshee.blt_dst_y * vd->banshee.blt_dst_stride) + (vd->banshee.blt_dst_x * vd->banshee.blt_dst_bpp);
44404373
44414374#if LOG_BANSHEE_2D
4442         logerror("   blit_2d:host_to_screen: %08x -> %08x, %d, %d\n", data, addr, v->banshee.blt_dst_x, v->banshee.blt_dst_y);
4375         logerror("   blit_2d:host_to_screen: %08x -> %08x, %d, %d\n", data, addr, vd->banshee.blt_dst_x, vd->banshee.blt_dst_y);
44434376#endif
44444377
4445         switch (v->banshee.blt_dst_bpp)
4378         switch (vd->banshee.blt_dst_bpp)
44464379         {
44474380            case 1:
4448               v->fbi.ram[addr+0] = data & 0xff;
4449               v->fbi.ram[addr+1] = (data >> 8) & 0xff;
4450               v->fbi.ram[addr+2] = (data >> 16) & 0xff;
4451               v->fbi.ram[addr+3] = (data >> 24) & 0xff;
4452               v->banshee.blt_dst_x += 4;
4381               vd->fbi.ram[addr+0] = data & 0xff;
4382               vd->fbi.ram[addr+1] = (data >> 8) & 0xff;
4383               vd->fbi.ram[addr+2] = (data >> 16) & 0xff;
4384               vd->fbi.ram[addr+3] = (data >> 24) & 0xff;
4385               vd->banshee.blt_dst_x += 4;
44534386               break;
44544387            case 2:
4455               v->fbi.ram[addr+1] = data & 0xff;
4456               v->fbi.ram[addr+0] = (data >> 8) & 0xff;
4457               v->fbi.ram[addr+3] = (data >> 16) & 0xff;
4458               v->fbi.ram[addr+2] = (data >> 24) & 0xff;
4459               v->banshee.blt_dst_x += 2;
4388               vd->fbi.ram[addr+1] = data & 0xff;
4389               vd->fbi.ram[addr+0] = (data >> 8) & 0xff;
4390               vd->fbi.ram[addr+3] = (data >> 16) & 0xff;
4391               vd->fbi.ram[addr+2] = (data >> 24) & 0xff;
4392               vd->banshee.blt_dst_x += 2;
44604393               break;
44614394            case 3:
4462               v->banshee.blt_dst_x += 1;
4395               vd->banshee.blt_dst_x += 1;
44634396               break;
44644397            case 4:
4465               v->fbi.ram[addr+3] = data & 0xff;
4466               v->fbi.ram[addr+2] = (data >> 8) & 0xff;
4467               v->fbi.ram[addr+1] = (data >> 16) & 0xff;
4468               v->fbi.ram[addr+0] = (data >> 24) & 0xff;
4469               v->banshee.blt_dst_x += 1;
4398               vd->fbi.ram[addr+3] = data & 0xff;
4399               vd->fbi.ram[addr+2] = (data >> 8) & 0xff;
4400               vd->fbi.ram[addr+1] = (data >> 16) & 0xff;
4401               vd->fbi.ram[addr+0] = (data >> 24) & 0xff;
4402               vd->banshee.blt_dst_x += 1;
44704403               break;
44714404         }
44724405
4473         if (v->banshee.blt_dst_x >= v->banshee.blt_dst_width)
4406         if (vd->banshee.blt_dst_x >= vd->banshee.blt_dst_width)
44744407         {
4475            v->banshee.blt_dst_x = 0;
4476            v->banshee.blt_dst_y++;
4408            vd->banshee.blt_dst_x = 0;
4409            vd->banshee.blt_dst_y++;
44774410         }
44784411         break;
44794412      }
r253153r253154
45004433
45014434      default:
45024435      {
4503         fatalerror("blit_2d: unknown command %d\n", v->banshee.blt_cmd);
4436         fatalerror("blit_2d: unknown command %d\n", vd->banshee.blt_cmd);
45044437      }
45054438   }
45064439}
45074440
4508static INT32 banshee_2d_w(voodoo_state *v, offs_t offset, UINT32 data)
4441INT32 voodoo_device::banshee_2d_w(voodoo_device *vd, offs_t offset, UINT32 data)
45094442{
45104443   switch (offset)
45114444   {
r253153r253154
45144447         logerror("   2D:command: cmd %d, ROP0 %02X\n", data & 0xf, data >> 24);
45154448#endif
45164449
4517         v->banshee.blt_src_x        = v->banshee.blt_regs[banshee2D_srcXY] & 0xfff;
4518         v->banshee.blt_src_y        = (v->banshee.blt_regs[banshee2D_srcXY] >> 16) & 0xfff;
4519         v->banshee.blt_src_base     = v->banshee.blt_regs[banshee2D_srcBaseAddr] & 0xffffff;
4520         v->banshee.blt_src_stride   = v->banshee.blt_regs[banshee2D_srcFormat] & 0x3fff;
4521         v->banshee.blt_src_width    = v->banshee.blt_regs[banshee2D_srcSize] & 0xfff;
4522         v->banshee.blt_src_height   = (v->banshee.blt_regs[banshee2D_srcSize] >> 16) & 0xfff;
4450         vd->banshee.blt_src_x        = vd->banshee.blt_regs[banshee2D_srcXY] & 0xfff;
4451         vd->banshee.blt_src_y        = (vd->banshee.blt_regs[banshee2D_srcXY] >> 16) & 0xfff;
4452         vd->banshee.blt_src_base     = vd->banshee.blt_regs[banshee2D_srcBaseAddr] & 0xffffff;
4453         vd->banshee.blt_src_stride   = vd->banshee.blt_regs[banshee2D_srcFormat] & 0x3fff;
4454         vd->banshee.blt_src_width    = vd->banshee.blt_regs[banshee2D_srcSize] & 0xfff;
4455         vd->banshee.blt_src_height   = (vd->banshee.blt_regs[banshee2D_srcSize] >> 16) & 0xfff;
45234456
4524         switch ((v->banshee.blt_regs[banshee2D_srcFormat] >> 16) & 0xf)
4457         switch ((vd->banshee.blt_regs[banshee2D_srcFormat] >> 16) & 0xf)
45254458         {
4526            case 1: v->banshee.blt_src_bpp = 1; break;
4527            case 3: v->banshee.blt_src_bpp = 2; break;
4528            case 4: v->banshee.blt_src_bpp = 3; break;
4529            case 5: v->banshee.blt_src_bpp = 4; break;
4530            case 8: v->banshee.blt_src_bpp = 2; break;
4531            case 9: v->banshee.blt_src_bpp = 2; break;
4532            default: v->banshee.blt_src_bpp = 1; break;
4459            case 1: vd->banshee.blt_src_bpp = 1; break;
4460            case 3: vd->banshee.blt_src_bpp = 2; break;
4461            case 4: vd->banshee.blt_src_bpp = 3; break;
4462            case 5: vd->banshee.blt_src_bpp = 4; break;
4463            case 8: vd->banshee.blt_src_bpp = 2; break;
4464            case 9: vd->banshee.blt_src_bpp = 2; break;
4465            default: vd->banshee.blt_src_bpp = 1; break;
45334466         }
45344467
4535         v->banshee.blt_dst_x        = v->banshee.blt_regs[banshee2D_dstXY] & 0xfff;
4536         v->banshee.blt_dst_y        = (v->banshee.blt_regs[banshee2D_dstXY] >> 16) & 0xfff;
4537         v->banshee.blt_dst_base     = v->banshee.blt_regs[banshee2D_dstBaseAddr] & 0xffffff;
4538         v->banshee.blt_dst_stride   = v->banshee.blt_regs[banshee2D_dstFormat] & 0x3fff;
4539         v->banshee.blt_dst_width    = v->banshee.blt_regs[banshee2D_dstSize] & 0xfff;
4540         v->banshee.blt_dst_height   = (v->banshee.blt_regs[banshee2D_dstSize] >> 16) & 0xfff;
4468         vd->banshee.blt_dst_x        = vd->banshee.blt_regs[banshee2D_dstXY] & 0xfff;
4469         vd->banshee.blt_dst_y        = (vd->banshee.blt_regs[banshee2D_dstXY] >> 16) & 0xfff;
4470         vd->banshee.blt_dst_base     = vd->banshee.blt_regs[banshee2D_dstBaseAddr] & 0xffffff;
4471         vd->banshee.blt_dst_stride   = vd->banshee.blt_regs[banshee2D_dstFormat] & 0x3fff;
4472         vd->banshee.blt_dst_width    = vd->banshee.blt_regs[banshee2D_dstSize] & 0xfff;
4473         vd->banshee.blt_dst_height   = (vd->banshee.blt_regs[banshee2D_dstSize] >> 16) & 0xfff;
45414474
4542         switch ((v->banshee.blt_regs[banshee2D_dstFormat] >> 16) & 0x7)
4475         switch ((vd->banshee.blt_regs[banshee2D_dstFormat] >> 16) & 0x7)
45434476         {
4544            case 1: v->banshee.blt_dst_bpp = 1; break;
4545            case 3: v->banshee.blt_dst_bpp = 2; break;
4546            case 4: v->banshee.blt_dst_bpp = 3; break;
4547            case 5: v->banshee.blt_dst_bpp = 4; break;
4548            default: v->banshee.blt_dst_bpp = 1; break;
4477            case 1: vd->banshee.blt_dst_bpp = 1; break;
4478            case 3: vd->banshee.blt_dst_bpp = 2; break;
4479            case 4: vd->banshee.blt_dst_bpp = 3; break;
4480            case 5: vd->banshee.blt_dst_bpp = 4; break;
4481            default: vd->banshee.blt_dst_bpp = 1; break;
45494482         }
45504483
4551         v->banshee.blt_cmd = data & 0xf;
4484         vd->banshee.blt_cmd = data & 0xf;
45524485         break;
45534486
45544487      case banshee2D_colorBack:
45554488#if LOG_BANSHEE_2D
45564489         logerror("   2D:colorBack: %08X\n", data);
45574490#endif
4558         v->banshee.blt_regs[banshee2D_colorBack] = data;
4491         vd->banshee.blt_regs[banshee2D_colorBack] = data;
45594492         break;
45604493
45614494      case banshee2D_colorFore:
45624495#if LOG_BANSHEE_2D
45634496         logerror("   2D:colorFore: %08X\n", data);
45644497#endif
4565         v->banshee.blt_regs[banshee2D_colorFore] = data;
4498         vd->banshee.blt_regs[banshee2D_colorFore] = data;
45664499         break;
45674500
45684501      case banshee2D_srcBaseAddr:
45694502#if LOG_BANSHEE_2D
45704503         logerror("   2D:srcBaseAddr: %08X, %s\n", data & 0xffffff, data & 0x80000000 ? "tiled" : "non-tiled");
45714504#endif
4572         v->banshee.blt_regs[banshee2D_srcBaseAddr] = data;
4505         vd->banshee.blt_regs[banshee2D_srcBaseAddr] = data;
45734506         break;
45744507
45754508      case banshee2D_dstBaseAddr:
45764509#if LOG_BANSHEE_2D
45774510         logerror("   2D:dstBaseAddr: %08X, %s\n", data & 0xffffff, data & 0x80000000 ? "tiled" : "non-tiled");
45784511#endif
4579         v->banshee.blt_regs[banshee2D_dstBaseAddr] = data;
4512         vd->banshee.blt_regs[banshee2D_dstBaseAddr] = data;
45804513         break;
45814514
45824515      case banshee2D_srcSize:
45834516#if LOG_BANSHEE_2D
45844517         logerror("   2D:srcSize: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff);
45854518#endif
4586         v->banshee.blt_regs[banshee2D_srcSize] = data;
4519         vd->banshee.blt_regs[banshee2D_srcSize] = data;
45874520         break;
45884521
45894522      case banshee2D_dstSize:
45904523#if LOG_BANSHEE_2D
45914524         logerror("   2D:dstSize: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff);
45924525#endif
4593         v->banshee.blt_regs[banshee2D_dstSize] = data;
4526         vd->banshee.blt_regs[banshee2D_dstSize] = data;
45944527         break;
45954528
45964529      case banshee2D_srcXY:
45974530#if LOG_BANSHEE_2D
45984531         logerror("   2D:srcXY: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff);
45994532#endif
4600         v->banshee.blt_regs[banshee2D_srcXY] = data;
4533         vd->banshee.blt_regs[banshee2D_srcXY] = data;
46014534         break;
46024535
46034536      case banshee2D_dstXY:
46044537#if LOG_BANSHEE_2D
46054538         logerror("   2D:dstXY: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff);
46064539#endif
4607         v->banshee.blt_regs[banshee2D_dstXY] = data;
4540         vd->banshee.blt_regs[banshee2D_dstXY] = data;
46084541         break;
46094542
46104543      case banshee2D_srcFormat:
46114544#if LOG_BANSHEE_2D
46124545         logerror("   2D:srcFormat: str %d, fmt %d, packing %d\n", data & 0x3fff, (data >> 16) & 0xf, (data >> 22) & 0x3);
46134546#endif
4614         v->banshee.blt_regs[banshee2D_srcFormat] = data;
4547         vd->banshee.blt_regs[banshee2D_srcFormat] = data;
46154548         break;
46164549
46174550      case banshee2D_dstFormat:
46184551#if LOG_BANSHEE_2D
46194552         logerror("   2D:dstFormat: str %d, fmt %d\n", data & 0x3fff, (data >> 16) & 0xf);
46204553#endif
4621         v->banshee.blt_regs[banshee2D_dstFormat] = data;
4554         vd->banshee.blt_regs[banshee2D_dstFormat] = data;
46224555         break;
46234556
46244557      case banshee2D_clip0Min:
46254558#if LOG_BANSHEE_2D
46264559         logerror("   2D:clip0Min: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff);
46274560#endif
4628         v->banshee.blt_regs[banshee2D_clip0Min] = data;
4561         vd->banshee.blt_regs[banshee2D_clip0Min] = data;
46294562         break;
46304563
46314564      case banshee2D_clip0Max:
46324565#if LOG_BANSHEE_2D
46334566         logerror("   2D:clip0Max: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff);
46344567#endif
4635         v->banshee.blt_regs[banshee2D_clip0Max] = data;
4568         vd->banshee.blt_regs[banshee2D_clip0Max] = data;
46364569         break;
46374570
46384571      case banshee2D_clip1Min:
46394572#if LOG_BANSHEE_2D
46404573         logerror("   2D:clip1Min: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff);
46414574#endif
4642         v->banshee.blt_regs[banshee2D_clip1Min] = data;
4575         vd->banshee.blt_regs[banshee2D_clip1Min] = data;
46434576         break;
46444577
46454578      case banshee2D_clip1Max:
46464579#if LOG_BANSHEE_2D
46474580         logerror("   2D:clip1Max: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff);
46484581#endif
4649         v->banshee.blt_regs[banshee2D_clip1Max] = data;
4582         vd->banshee.blt_regs[banshee2D_clip1Max] = data;
46504583         break;
46514584
46524585      case banshee2D_rop:
46534586#if LOG_BANSHEE_2D
46544587         logerror("   2D:rop: %d, %d, %d\n",  data & 0xff, (data >> 8) & 0xff, (data >> 16) & 0xff);
46554588#endif
4656         v->banshee.blt_regs[banshee2D_rop] = data;
4589         vd->banshee.blt_regs[banshee2D_rop] = data;
46574590         break;
46584591
46594592      default:
46604593         if (offset >= 0x20 && offset < 0x40)
46614594         {
4662            blit_2d(v, data);
4595            blit_2d(vd, data);
46634596         }
46644597         else if (offset >= 0x40 && offset < 0x80)
46654598         {
r253153r253154
46774610
46784611WRITE32_MEMBER( voodoo_banshee_device::banshee_agp_w )
46794612{
4680   voodoo_state *v = get_safe_token(this);
46814613   offset &= 0x1ff/4;
46824614
46834615   /* switch off the offset */
46844616   switch (offset)
46854617   {
46864618      case cmdBaseAddr0:
4687         COMBINE_DATA(&v->banshee.agp[offset]);
4688         v->fbi.cmdfifo[0].base = (data & 0xffffff) << 12;
4689         v->fbi.cmdfifo[0].end = v->fbi.cmdfifo[0].base + (((v->banshee.agp[cmdBaseSize0] & 0xff) + 1) << 12);
4619         COMBINE_DATA(&banshee.agp[offset]);
4620         fbi.cmdfifo[0].base = (data & 0xffffff) << 12;
4621         fbi.cmdfifo[0].end = fbi.cmdfifo[0].base + (((banshee.agp[cmdBaseSize0] & 0xff) + 1) << 12);
46904622         break;
46914623
46924624      case cmdBaseSize0:
4693         COMBINE_DATA(&v->banshee.agp[offset]);
4694         v->fbi.cmdfifo[0].end = v->fbi.cmdfifo[0].base + (((v->banshee.agp[cmdBaseSize0] & 0xff) + 1) << 12);
4695         v->fbi.cmdfifo[0].enable = (data >> 8) & 1;
4696         v->fbi.cmdfifo[0].count_holes = (~data >> 10) & 1;
4625         COMBINE_DATA(&banshee.agp[offset]);
4626         fbi.cmdfifo[0].end = fbi.cmdfifo[0].base + (((banshee.agp[cmdBaseSize0] & 0xff) + 1) << 12);
4627         fbi.cmdfifo[0].enable = (data >> 8) & 1;
4628         fbi.cmdfifo[0].count_holes = (~data >> 10) & 1;
46974629         break;
46984630
46994631      case cmdBump0:
47004632         fatalerror("cmdBump0\n");
47014633
47024634      case cmdRdPtrL0:
4703         v->fbi.cmdfifo[0].rdptr = data;
4635         fbi.cmdfifo[0].rdptr = data;
47044636         break;
47054637
47064638      case cmdAMin0:
4707         v->fbi.cmdfifo[0].amin = data;
4639         fbi.cmdfifo[0].amin = data;
47084640         break;
47094641
47104642      case cmdAMax0:
4711         v->fbi.cmdfifo[0].amax = data;
4643         fbi.cmdfifo[0].amax = data;
47124644         break;
47134645
47144646      case cmdFifoDepth0:
4715         v->fbi.cmdfifo[0].depth = data;
4647         fbi.cmdfifo[0].depth = data;
47164648         break;
47174649
47184650      case cmdHoleCnt0:
4719         v->fbi.cmdfifo[0].holes = data;
4651         fbi.cmdfifo[0].holes = data;
47204652         break;
47214653
47224654      case cmdBaseAddr1:
4723         COMBINE_DATA(&v->banshee.agp[offset]);
4724         v->fbi.cmdfifo[1].base = (data & 0xffffff) << 12;
4725         v->fbi.cmdfifo[1].end = v->fbi.cmdfifo[1].base + (((v->banshee.agp[cmdBaseSize1] & 0xff) + 1) << 12);
4655         COMBINE_DATA(&banshee.agp[offset]);
4656         fbi.cmdfifo[1].base = (data & 0xffffff) << 12;
4657         fbi.cmdfifo[1].end = fbi.cmdfifo[1].base + (((banshee.agp[cmdBaseSize1] & 0xff) + 1) << 12);
47264658         break;
47274659
47284660      case cmdBaseSize1:
4729         COMBINE_DATA(&v->banshee.agp[offset]);
4730         v->fbi.cmdfifo[1].end = v->fbi.cmdfifo[1].base + (((v->banshee.agp[cmdBaseSize1] & 0xff) + 1) << 12);
4731         v->fbi.cmdfifo[1].enable = (data >> 8) & 1;
4732         v->fbi.cmdfifo[1].count_holes = (~data >> 10) & 1;
4661         COMBINE_DATA(&banshee.agp[offset]);
4662         fbi.cmdfifo[1].end = fbi.cmdfifo[1].base + (((banshee.agp[cmdBaseSize1] & 0xff) + 1) << 12);
4663         fbi.cmdfifo[1].enable = (data >> 8) & 1;
4664         fbi.cmdfifo[1].count_holes = (~data >> 10) & 1;
47334665         break;
47344666
47354667      case cmdBump1:
47364668         fatalerror("cmdBump1\n");
47374669
47384670      case cmdRdPtrL1:
4739         v->fbi.cmdfifo[1].rdptr = data;
4671         fbi.cmdfifo[1].rdptr = data;
47404672         break;
47414673
47424674      case cmdAMin1:
4743         v->fbi.cmdfifo[1].amin = data;
4675         fbi.cmdfifo[1].amin = data;
47444676         break;
47454677
47464678      case cmdAMax1:
4747         v->fbi.cmdfifo[1].amax = data;
4679         fbi.cmdfifo[1].amax = data;
47484680         break;
47494681
47504682      case cmdFifoDepth1:
4751         v->fbi.cmdfifo[1].depth = data;
4683         fbi.cmdfifo[1].depth = data;
47524684         break;
47534685
47544686      case cmdHoleCnt1:
4755         v->fbi.cmdfifo[1].holes = data;
4687         fbi.cmdfifo[1].holes = data;
47564688         break;
47574689
47584690      default:
4759         COMBINE_DATA(&v->banshee.agp[offset]);
4691         COMBINE_DATA(&banshee.agp[offset]);
47604692         break;
47614693   }
47624694
r253153r253154
47674699
47684700WRITE32_MEMBER( voodoo_banshee_device::banshee_w )
47694701{
4770   voodoo_state *v = get_safe_token(this);
47714702
47724703   /* if we have something pending, flush the FIFOs up to the current time */
4773   if (v->pci.op_pending)
4774      flush_fifos(v, machine().time());
4704   if (pci.op_pending)
4705      flush_fifos(this, machine().time());
47754706
47764707   if (offset < 0x80000/4)
47774708      banshee_io_w(space, offset, data, mem_mask);
r253153r253154
47804711   else if (offset < 0x200000/4)
47814712      logerror("%s:banshee_w(2D:%X) = %08X & %08X\n", machine().describe_context(), (offset*4) & 0xfffff, data, mem_mask);
47824713   else if (offset < 0x600000/4)
4783      register_w(v, offset & 0x1fffff/4, data);
4714      register_w(this, offset & 0x1fffff/4, data);
47844715   else if (offset < 0x800000/4)
47854716      logerror("%s:banshee_w(TEX0:%X) = %08X & %08X\n", machine().describe_context(), (offset*4) & 0x1fffff, data, mem_mask);
47864717   else if (offset < 0xa00000/4)
r253153r253154
47914722      logerror("%s:banshee_w(YUV:%X) = %08X & %08X\n", machine().describe_context(), (offset*4) & 0x3fffff, data, mem_mask);
47924723   else if (offset < 0x2000000/4)
47934724   {
4794      lfb_w(v, offset & 0xffffff/4, data, mem_mask);
4725      lfb_w(this, offset & 0xffffff/4, data, mem_mask);
47954726   } else {
47964727      logerror("%s:banshee_w Address out of range %08X = %08X & %08X\n", machine().describe_context(), (offset*4), data, mem_mask);
47974728   }
r253153r253154
48004731
48014732WRITE32_MEMBER( voodoo_banshee_device::banshee_fb_w )
48024733{
4803   voodoo_state *v = get_safe_token(this);
48044734   UINT32 addr = offset*4;
48054735
48064736   /* if we have something pending, flush the FIFOs up to the current time */
4807   if (v->pci.op_pending)
4808      flush_fifos(v, machine().time());
4737   if (pci.op_pending)
4738      flush_fifos(this, machine().time());
48094739
4810   if (offset < v->fbi.lfb_base)
4740   if (offset < fbi.lfb_base)
48114741   {
4812      if (v->fbi.cmdfifo[0].enable && addr >= v->fbi.cmdfifo[0].base && addr < v->fbi.cmdfifo[0].end)
4813         cmdfifo_w(v, &v->fbi.cmdfifo[0], (addr - v->fbi.cmdfifo[0].base) / 4, data);
4814      else if (v->fbi.cmdfifo[1].enable && addr >= v->fbi.cmdfifo[1].base && addr < v->fbi.cmdfifo[1].end)
4815         cmdfifo_w(v, &v->fbi.cmdfifo[1], (addr - v->fbi.cmdfifo[1].base) / 4, data);
4742      if (fbi.cmdfifo[0].enable && addr >= fbi.cmdfifo[0].base && addr < fbi.cmdfifo[0].end)
4743         cmdfifo_w(this, &fbi.cmdfifo[0], (addr - fbi.cmdfifo[0].base) / 4, data);
4744      else if (fbi.cmdfifo[1].enable && addr >= fbi.cmdfifo[1].base && addr < fbi.cmdfifo[1].end)
4745         cmdfifo_w(this, &fbi.cmdfifo[1], (addr - fbi.cmdfifo[1].base) / 4, data);
48164746      else
48174747      {
4818         if (offset*4 <= v->fbi.mask)
4819            COMBINE_DATA(&((UINT32 *)v->fbi.ram)[offset]);
4748         if (offset*4 <= fbi.mask)
4749            COMBINE_DATA(&((UINT32 *)fbi.ram)[offset]);
48204750         else
48214751            logerror("%s:banshee_fb_w Out of bounds (%X) = %08X & %08X\n", machine().describe_context(), offset*4, data, mem_mask);
48224752#if LOG_LFB
r253153r253154
48254755      }
48264756   }
48274757   else
4828      lfb_direct_w(v, offset - v->fbi.lfb_base, data, mem_mask);
4758      lfb_direct_w(this, offset - fbi.lfb_base, data, mem_mask);
48294759}
48304760
48314761
48324762WRITE8_MEMBER( voodoo_banshee_device::banshee_vga_w )
48334763{
4834   voodoo_state *v = get_safe_token(this);
48354764   offset &= 0x1f;
48364765
48374766   /* switch off the offset */
r253153r253154
48404769      /* attribute access */
48414770      case 0x3c0:
48424771      case 0x3c1:
4843         if (v->banshee.attff == 0)
4772         if (banshee.attff == 0)
48444773         {
4845            v->banshee.vga[0x3c1 & 0x1f] = data;
4774            banshee.vga[0x3c1 & 0x1f] = data;
48464775            if (LOG_REGISTERS)
48474776               logerror("%s:banshee_vga_w(%X) = %02X\n", machine().describe_context(), 0x3c0+offset, data);
48484777         }
48494778         else
48504779         {
4851            if (v->banshee.vga[0x3c1 & 0x1f] < ARRAY_LENGTH(v->banshee.att))
4852               v->banshee.att[v->banshee.vga[0x3c1 & 0x1f]] = data;
4780            if (banshee.vga[0x3c1 & 0x1f] < ARRAY_LENGTH(banshee.att))
4781               banshee.att[banshee.vga[0x3c1 & 0x1f]] = data;
48534782            if (LOG_REGISTERS)
4854               logerror("%s:banshee_att_w(%X) = %02X\n", machine().describe_context(), v->banshee.vga[0x3c1 & 0x1f], data);
4783               logerror("%s:banshee_att_w(%X) = %02X\n", machine().describe_context(), banshee.vga[0x3c1 & 0x1f], data);
48554784         }
4856         v->banshee.attff ^= 1;
4785         banshee.attff ^= 1;
48574786         break;
48584787
48594788      /* Sequencer access */
48604789      case 0x3c5:
4861         if (v->banshee.vga[0x3c4 & 0x1f] < ARRAY_LENGTH(v->banshee.seq))
4862            v->banshee.seq[v->banshee.vga[0x3c4 & 0x1f]] = data;
4790         if (banshee.vga[0x3c4 & 0x1f] < ARRAY_LENGTH(banshee.seq))
4791            banshee.seq[banshee.vga[0x3c4 & 0x1f]] = data;
48634792         if (LOG_REGISTERS)
4864            logerror("%s:banshee_seq_w(%X) = %02X\n", machine().describe_context(), v->banshee.vga[0x3c4 & 0x1f], data);
4793            logerror("%s:banshee_seq_w(%X) = %02X\n", machine().describe_context(), banshee.vga[0x3c4 & 0x1f], data);
48654794         break;
48664795
48674796      /* Graphics controller access */
48684797      case 0x3cf:
4869         if (v->banshee.vga[0x3ce & 0x1f] < ARRAY_LENGTH(v->banshee.gc))
4870            v->banshee.gc[v->banshee.vga[0x3ce & 0x1f]] = data;
4798         if (banshee.vga[0x3ce & 0x1f] < ARRAY_LENGTH(banshee.gc))
4799            banshee.gc[banshee.vga[0x3ce & 0x1f]] = data;
48714800         if (LOG_REGISTERS)
4872            logerror("%s:banshee_gc_w(%X) = %02X\n", machine().describe_context(), v->banshee.vga[0x3ce & 0x1f], data);
4801            logerror("%s:banshee_gc_w(%X) = %02X\n", machine().describe_context(), banshee.vga[0x3ce & 0x1f], data);
48734802         break;
48744803
48754804      /* CRTC access */
48764805      case 0x3d5:
4877         if (v->banshee.vga[0x3d4 & 0x1f] < ARRAY_LENGTH(v->banshee.crtc))
4878            v->banshee.crtc[v->banshee.vga[0x3d4 & 0x1f]] = data;
4806         if (banshee.vga[0x3d4 & 0x1f] < ARRAY_LENGTH(banshee.crtc))
4807            banshee.crtc[banshee.vga[0x3d4 & 0x1f]] = data;
48794808         if (LOG_REGISTERS)
4880            logerror("%s:banshee_crtc_w(%X) = %02X\n", machine().describe_context(), v->banshee.vga[0x3d4 & 0x1f], data);
4809            logerror("%s:banshee_crtc_w(%X) = %02X\n", machine().describe_context(), banshee.vga[0x3d4 & 0x1f], data);
48814810         break;
48824811
48834812      default:
4884         v->banshee.vga[offset] = data;
4813         banshee.vga[offset] = data;
48854814         if (LOG_REGISTERS)
48864815            logerror("%s:banshee_vga_w(%X) = %02X\n", machine().describe_context(), 0x3c0+offset, data);
48874816         break;
r253153r253154
48914820
48924821WRITE32_MEMBER( voodoo_banshee_device::banshee_io_w )
48934822{
4894   voodoo_state *v = get_safe_token(this);
48954823   UINT32 old;
48964824
48974825   offset &= 0xff/4;
4898   old = v->banshee.io[offset];
4826   old = banshee.io[offset];
48994827
49004828   /* switch off the offset */
49014829   switch (offset)
49024830   {
49034831      case io_vidProcCfg:
4904         COMBINE_DATA(&v->banshee.io[offset]);
4905         if ((v->banshee.io[offset] ^ old) & 0x2800)
4906            v->fbi.clut_dirty = TRUE;
4832         COMBINE_DATA(&banshee.io[offset]);
4833         if ((banshee.io[offset] ^ old) & 0x2800)
4834            fbi.clut_dirty = TRUE;
49074835         if (LOG_REGISTERS)
49084836            logerror("%s:banshee_io_w(%s) = %08X & %08X\n", machine().describe_context(), banshee_io_reg_name[offset], data, mem_mask);
49094837         break;
49104838
49114839      case io_dacData:
4912         COMBINE_DATA(&v->banshee.io[offset]);
4913         if (v->banshee.io[offset] != v->fbi.clut[v->banshee.io[io_dacAddr] & 0x1ff])
4840         COMBINE_DATA(&banshee.io[offset]);
4841         if (banshee.io[offset] != fbi.clut[banshee.io[io_dacAddr] & 0x1ff])
49144842         {
4915            v->fbi.clut[v->banshee.io[io_dacAddr] & 0x1ff] = v->banshee.io[offset];
4916            v->fbi.clut_dirty = TRUE;
4843            fbi.clut[banshee.io[io_dacAddr] & 0x1ff] = banshee.io[offset];
4844            fbi.clut_dirty = TRUE;
49174845         }
49184846         if (LOG_REGISTERS)
4919            logerror("%s:banshee_dac_w(%X) = %08X & %08X\n", machine().describe_context(), v->banshee.io[io_dacAddr] & 0x1ff, data, mem_mask);
4847            logerror("%s:banshee_dac_w(%X) = %08X & %08X\n", machine().describe_context(), banshee.io[io_dacAddr] & 0x1ff, data, mem_mask);
49204848         break;
49214849
49224850      case io_miscInit0:
4923         COMBINE_DATA(&v->banshee.io[offset]);
4924         v->fbi.yorigin = (data >> 18) & 0xfff;
4851         COMBINE_DATA(&banshee.io[offset]);
4852         fbi.yorigin = (data >> 18) & 0xfff;
49254853         if (LOG_REGISTERS)
49264854            logerror("%s:banshee_io_w(%s) = %08X & %08X\n", machine().describe_context(), banshee_io_reg_name[offset], data, mem_mask);
49274855         break;
49284856
49294857      case io_vidScreenSize:
49304858         if (data & 0xfff)
4931            v->fbi.width = data & 0xfff;
4859            fbi.width = data & 0xfff;
49324860         if (data & 0xfff000)
4933            v->fbi.height = (data >> 12) & 0xfff;
4861            fbi.height = (data >> 12) & 0xfff;
49344862         /* fall through */
49354863      case io_vidOverlayDudx:
49364864      case io_vidOverlayDvdy:
49374865      {
49384866         /* warning: this is a hack for now! We should really compute the screen size */
49394867         /* from the CRTC registers */
4940         COMBINE_DATA(&v->banshee.io[offset]);
4868         COMBINE_DATA(&banshee.io[offset]);
49414869
4942         int width = v->fbi.width;
4943         int height = v->fbi.height;
4870         int width = fbi.width;
4871         int height = fbi.height;
49444872
4945         if (v->banshee.io[io_vidOverlayDudx] != 0)
4946            width = (v->fbi.width * v->banshee.io[io_vidOverlayDudx]) / 1048576;
4947         if (v->banshee.io[io_vidOverlayDvdy] != 0)
4948            height = (v->fbi.height * v->banshee.io[io_vidOverlayDvdy]) / 1048576;
4873         if (banshee.io[io_vidOverlayDudx] != 0)
4874            width = (fbi.width * banshee.io[io_vidOverlayDudx]) / 1048576;
4875         if (banshee.io[io_vidOverlayDvdy] != 0)
4876            height = (fbi.height * banshee.io[io_vidOverlayDvdy]) / 1048576;
49494877
4950         v->screen->set_visible_area(0, width - 1, 0, height - 1);
4878         screen->set_visible_area(0, width - 1, 0, height - 1);
49514879
4952         adjust_vblank_timer(v);
4880         adjust_vblank_timer(this);
49534881         if (LOG_REGISTERS)
49544882            logerror("%s:banshee_io_w(%s) = %08X & %08X\n", machine().describe_context(), banshee_io_reg_name[offset], data, mem_mask);
49554883         break;
49564884      }
49574885
49584886      case io_lfbMemoryConfig:
4959         v->fbi.lfb_base = (data & 0x1fff) << (12-2);
4960         v->fbi.lfb_stride = ((data >> 13) & 7) + 9;
4887         fbi.lfb_base = (data & 0x1fff) << (12-2);
4888         fbi.lfb_stride = ((data >> 13) & 7) + 9;
49614889         if (LOG_REGISTERS)
49624890            logerror("%s:banshee_io_w(%s) = %08X & %08X\n", machine().describe_context(), banshee_io_reg_name[offset], data, mem_mask);
49634891         break;
r253153r253154
49764904         break;
49774905
49784906      default:
4979         COMBINE_DATA(&v->banshee.io[offset]);
4907         COMBINE_DATA(&banshee.io[offset]);
49804908         if (LOG_REGISTERS)
49814909            logerror("%s:banshee_io_w(%s) = %08X & %08X\n", machine().describe_context(), banshee_io_reg_name[offset], data, mem_mask);
49824910         break;
r253153r253154
49954923
49964924void voodoo_device::common_start_voodoo(UINT8 type)
49974925{
4998   voodoo_state *v = get_safe_token(this);
49994926   const raster_info *info;
50004927   void *fbmem, *tmumem[2];
50014928   UINT32 tmumem0, tmumem1;
r253153r253154
50074934   assert(m_fbmem > 0);
50084935
50094936   /* store a pointer back to the device */
5010   v->device = this;
5011   v->type = type;
4937   device = this;
4938   vd_type = type;
50124939
50134940   /* copy config data */
5014   v->freq = clock();
5015   v->device->m_vblank.resolve();
5016   v->device->m_stall.resolve();
4941   freq = clock();
4942   device->m_vblank.resolve();
4943   device->m_stall.resolve();
50174944
50184945   /* create a multiprocessor work queue */
5019   v->poly = poly_alloc(machine(), 64, sizeof(poly_extra_data), 0);
5020   v->thread_stats = auto_alloc_array(machine(), stats_block, WORK_MAX_THREADS);
4946   poly = poly_alloc(machine(), 64, sizeof(poly_extra_data), 0);
4947   thread_stats = auto_alloc_array(machine(), stats_block, WORK_MAX_THREADS);
50214948
50224949   /* create a table of precomputed 1/n and log2(n) values */
50234950   /* n ranges from 1.0000 to 2.0000 */
r253153r253154
50484975      }
50494976   }
50504977
5051   v->tmu_config = 0x11;   // revision 1
4978   tmu_config = 0x11;   // revision 1
50524979
50534980   /* configure type-specific values */
5054   switch (v->type)
4981   switch (vd_type)
50554982   {
50564983      case TYPE_VOODOO_1:
5057         v->regaccess = voodoo_register_access;
5058         v->regnames = voodoo_reg_name;
5059         v->alt_regmap = 0;
5060         v->fbi.lfb_stride = 10;
4984         regaccess = voodoo_register_access;
4985         regnames = voodoo_reg_name;
4986         alt_regmap = 0;
4987         fbi.lfb_stride = 10;
50614988         break;
50624989
50634990      case TYPE_VOODOO_2:
5064         v->regaccess = voodoo2_register_access;
5065         v->regnames = voodoo_reg_name;
5066         v->alt_regmap = 0;
5067         v->fbi.lfb_stride = 10;
5068         v->tmu_config |= 0x800;
4991         regaccess = voodoo2_register_access;
4992         regnames = voodoo_reg_name;
4993         alt_regmap = 0;
4994         fbi.lfb_stride = 10;
4995         tmu_config |= 0x800;
50694996         break;
50704997
50714998      case TYPE_VOODOO_BANSHEE:
5072         v->regaccess = banshee_register_access;
5073         v->regnames = banshee_reg_name;
5074         v->alt_regmap = 1;
5075         v->fbi.lfb_stride = 11;
4999         regaccess = banshee_register_access;
5000         regnames = banshee_reg_name;
5001         alt_regmap = 1;
5002         fbi.lfb_stride = 11;
50765003         break;
50775004
50785005      case TYPE_VOODOO_3:
5079         v->regaccess = banshee_register_access;
5080         v->regnames = banshee_reg_name;
5081         v->alt_regmap = 1;
5082         v->fbi.lfb_stride = 11;
5006         regaccess = banshee_register_access;
5007         regnames = banshee_reg_name;
5008         alt_regmap = 1;
5009         fbi.lfb_stride = 11;
50835010         break;
50845011
50855012      default:
r253153r253154
50885015
50895016   /* set the type, and initialize the chip mask */
50905017   device_iterator iter(machine().root_device());
5091   v->index = 0;
5018   index = 0;
50925019   for (device_t *scan = iter.first(); scan != nullptr; scan = iter.next())
50935020      if (scan->type() == this->type())
50945021      {
50955022         if (scan == this)
50965023            break;
5097         v->index++;
5024         index++;
50985025      }
5099   v->screen = downcast<screen_device *>(machine().device(m_screen));
5100   assert_always(v->screen != nullptr, "Unable to find screen attached to voodoo");
5101   v->cpu = machine().device(m_cputag);
5102   assert_always(v->cpu != nullptr, "Unable to find CPU attached to voodoo");
5026   screen = downcast<screen_device *>(machine().device(m_screen));
5027   assert_always(screen != nullptr, "Unable to find screen attached to voodoo");
5028   cpu = machine().device(m_cputag);
5029   assert_always(cpu != nullptr, "Unable to find CPU attached to voodoo");
51035030
51045031   if (m_tmumem1 != 0)
5105      v->tmu_config |= 0xc0;  // two TMUs
5032      tmu_config |= 0xc0;  // two TMUs
51065033
5107   v->chipmask = 0x01;
5108   v->attoseconds_per_cycle = ATTOSECONDS_PER_SECOND / v->freq;
5109   v->trigger = 51324 + v->index;
5034   chipmask = 0x01;
5035   attoseconds_per_cycle = ATTOSECONDS_PER_SECOND / freq;
5036   trigger = 51324 + index;
51105037
51115038   /* build the rasterizer table */
51125039   for (info = predef_raster_table; info->callback; info++)
5113      add_rasterizer(v, info);
5040      add_rasterizer(this, info);
51145041
51155042   /* set up the PCI FIFO */
5116   v->pci.fifo.base = v->pci.fifo_mem;
5117   v->pci.fifo.size = 64*2;
5118   v->pci.fifo.in = v->pci.fifo.out = 0;
5119   v->pci.stall_state = NOT_STALLED;
5120   v->pci.continue_timer = machine().scheduler().timer_alloc(FUNC(stall_cpu_callback), v);
5121
5043   pci.fifo.base = pci.fifo_mem;
5044   pci.fifo.size = 64*2;
5045   pci.fifo.in = pci.fifo.out = 0;
5046   pci.stall_state = NOT_STALLED;
5047   pci.continue_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(voodoo_device::stall_cpu_callback),this), nullptr);
5048   
51225049   /* allocate memory */
51235050   tmumem0 = m_tmumem0;
51245051   tmumem1 = m_tmumem1;
5125   if (v->type <= TYPE_VOODOO_2)
5052   if (vd_type <= TYPE_VOODOO_2)
51265053   {
51275054      /* separate FB/TMU memory */
51285055      fbmem = auto_alloc_array(machine(), UINT8, m_fbmem << 20);
r253153r253154
51345061      /* shared memory */
51355062      tmumem[0] = tmumem[1] = fbmem = auto_alloc_array(machine(), UINT8, m_fbmem << 20);
51365063      tmumem0 = m_fbmem;
5137      if (v->type == TYPE_VOODOO_3)
5064      if (vd_type == TYPE_VOODOO_3)
51385065         tmumem1 = m_fbmem;
51395066   }
51405067
51415068   /* set up frame buffer */
5142   init_fbi(v, &v->fbi, fbmem, m_fbmem << 20);
5069   init_fbi(this, &fbi, fbmem, m_fbmem << 20);
51435070
51445071   /* build shared TMU tables */
5145   init_tmu_shared(&v->tmushare);
5072   init_tmu_shared(&tmushare);
51465073
51475074   /* set up the TMUs */
5148   init_tmu(v, &v->tmu[0], &v->reg[0x100], tmumem[0], tmumem0 << 20);
5149   v->chipmask |= 0x02;
5075   init_tmu(this, &tmu[0], &reg[0x100], tmumem[0], tmumem0 << 20);
5076   chipmask |= 0x02;
51505077   if (tmumem1 != 0)
51515078   {
5152      init_tmu(v, &v->tmu[1], &v->reg[0x200], tmumem[1], tmumem1 << 20);
5153      v->chipmask |= 0x04;
5154      v->tmu_config |= 0x40;
5079      init_tmu(this, &tmu[1], &reg[0x200], tmumem[1], tmumem1 << 20);
5080      chipmask |= 0x04;
5081      tmu_config |= 0x40;
51555082   }
51565083
51575084   /* initialize some registers */
5158   memset(v->reg, 0, sizeof(v->reg));
5159   v->pci.init_enable = 0;
5160   v->reg[fbiInit0].u = (1 << 4) | (0x10 << 6);
5161   v->reg[fbiInit1].u = (1 << 1) | (1 << 8) | (1 << 12) | (2 << 20);
5162   v->reg[fbiInit2].u = (1 << 6) | (0x100 << 23);
5163   v->reg[fbiInit3].u = (2 << 13) | (0xf << 17);
5164   v->reg[fbiInit4].u = (1 << 0);
5085   memset(reg, 0, sizeof(reg));
5086   pci.init_enable = 0;
5087   reg[fbiInit0].u = (1 << 4) | (0x10 << 6);
5088   reg[fbiInit1].u = (1 << 1) | (1 << 8) | (1 << 12) | (2 << 20);
5089   reg[fbiInit2].u = (1 << 6) | (0x100 << 23);
5090   reg[fbiInit3].u = (2 << 13) | (0xf << 17);
5091   reg[fbiInit4].u = (1 << 0);
51655092
51665093   /* initialize banshee registers */
5167   memset(v->banshee.io, 0, sizeof(v->banshee.io));
5168   v->banshee.io[io_pciInit0] = 0x01800040;
5169   v->banshee.io[io_sipMonitor] = 0x40000000;
5170   v->banshee.io[io_lfbMemoryConfig] = 0x000a2200;
5171   v->banshee.io[io_dramInit0] = 0x00579d29;
5172   v->banshee.io[io_dramInit0] |= 0x08000000;      // Konami Viper expects 16MBit SGRAMs
5173   v->banshee.io[io_dramInit1] = 0x00f02200;
5174   v->banshee.io[io_tmuGbeInit] = 0x00000bfb;
5094   memset(banshee.io, 0, sizeof(banshee.io));
5095   banshee.io[io_pciInit0] = 0x01800040;
5096   banshee.io[io_sipMonitor] = 0x40000000;
5097   banshee.io[io_lfbMemoryConfig] = 0x000a2200;
5098   banshee.io[io_dramInit0] = 0x00579d29;
5099   banshee.io[io_dramInit0] |= 0x08000000;      // Konami Viper expects 16MBit SGRAMs
5100   banshee.io[io_dramInit1] = 0x00f02200;
5101   banshee.io[io_tmuGbeInit] = 0x00000bfb;
51755102
51765103   /* do a soft reset to reset everything else */
5177   soft_reset(v);
5104   soft_reset(this);
51785105
51795106   /* register for save states */
51805107   init_save_state(this);
r253153r253154
51915118    command
51925119-------------------------------------------------*/
51935120
5194static INT32 fastfill(voodoo_state *v)
5121INT32 voodoo_device::fastfill(voodoo_device *vd)
51955122{
5196   int sx = (v->reg[clipLeftRight].u >> 16) & 0x3ff;
5197   int ex = (v->reg[clipLeftRight].u >> 0) & 0x3ff;
5198   int sy = (v->reg[clipLowYHighY].u >> 16) & 0x3ff;
5199   int ey = (v->reg[clipLowYHighY].u >> 0) & 0x3ff;
5123   int sx = (vd->reg[clipLeftRight].u >> 16) & 0x3ff;
5124   int ex = (vd->reg[clipLeftRight].u >> 0) & 0x3ff;
5125   int sy = (vd->reg[clipLowYHighY].u >> 16) & 0x3ff;
5126   int ey = (vd->reg[clipLowYHighY].u >> 0) & 0x3ff;
52005127   poly_extent extents[64];
52015128   UINT16 dithermatrix[16];
52025129   UINT16 *drawbuf = nullptr;
r253153r253154
52045131   int extnum, x, y;
52055132
52065133   /* if we're not clearing either, take no time */
5207   if (!FBZMODE_RGB_BUFFER_MASK(v->reg[fbzMode].u) && !FBZMODE_AUX_BUFFER_MASK(v->reg[fbzMode].u))
5134   if (!FBZMODE_RGB_BUFFER_MASK(vd->reg[fbzMode].u) && !FBZMODE_AUX_BUFFER_MASK(vd->reg[fbzMode].u))
52085135      return 0;
52095136
52105137   /* are we clearing the RGB buffer? */
5211   if (FBZMODE_RGB_BUFFER_MASK(v->reg[fbzMode].u))
5138   if (FBZMODE_RGB_BUFFER_MASK(vd->reg[fbzMode].u))
52125139   {
52135140      /* determine the draw buffer */
5214      int destbuf = (v->type >= TYPE_VOODOO_BANSHEE) ? 1 : FBZMODE_DRAW_BUFFER(v->reg[fbzMode].u);
5141      int destbuf = (vd->vd_type >= TYPE_VOODOO_BANSHEE) ? 1 : FBZMODE_DRAW_BUFFER(vd->reg[fbzMode].u);
52155142      switch (destbuf)
52165143      {
52175144         case 0:     /* front buffer */
5218            drawbuf = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.frontbuf]);
5145            drawbuf = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.frontbuf]);
52195146            break;
52205147
52215148         case 1:     /* back buffer */
5222            drawbuf = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.backbuf]);
5149            drawbuf = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.backbuf]);
52235150            break;
52245151
52255152         default:    /* reserved */
r253153r253154
52305157      for (y = 0; y < 4; y++)
52315158      {
52325159         DECLARE_DITHER_POINTERS_NO_DITHER_VAR;
5233         COMPUTE_DITHER_POINTERS_NO_DITHER_VAR(v->reg[fbzMode].u, y);
5160         COMPUTE_DITHER_POINTERS_NO_DITHER_VAR(vd->reg[fbzMode].u, y);
52345161         for (x = 0; x < 4; x++)
52355162         {
5236            int r = v->reg[color1].rgb.r;
5237            int g = v->reg[color1].rgb.g;
5238            int b = v->reg[color1].rgb.b;
5163            int r = vd->reg[color1].rgb.r;
5164            int g = vd->reg[color1].rgb.g;
5165            int b = vd->reg[color1].rgb.b;
52395166
5240            APPLY_DITHER(v->reg[fbzMode].u, x, dither_lookup, r, g, b);
5167            APPLY_DITHER(vd->reg[fbzMode].u, x, dither_lookup, r, g, b);
52415168            dithermatrix[y*4 + x] = (r << 11) | (g << 5) | b;
52425169         }
52435170      }
r253153r253154
52525179   /* iterate over blocks of extents */
52535180   for (y = sy; y < ey; y += ARRAY_LENGTH(extents))
52545181   {
5255      poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(v->poly);
5182      poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(vd->poly);
52565183      int count = MIN(ey - y, ARRAY_LENGTH(extents));
52575184
5258      extra->state = v;
5185      extra->device= vd;
52595186      memcpy(extra->dither, dithermatrix, sizeof(extra->dither));
52605187
5261      pixels += poly_render_triangle_custom(v->poly, drawbuf, global_cliprect, raster_fastfill, y, count, extents);
5188      pixels += poly_render_triangle_custom(vd->poly, drawbuf, global_cliprect, raster_fastfill, y, count, extents);
52625189   }
52635190
52645191   /* 2 pixels per clock */
r253153r253154
52715198    command
52725199-------------------------------------------------*/
52735200
5274static INT32 swapbuffer(voodoo_state *v, UINT32 data)
5201INT32 voodoo_device::swapbuffer(voodoo_device* vd, UINT32 data)
52755202{
52765203   /* set the don't swap value for Voodoo 2 */
5277   v->fbi.vblank_swap_pending = TRUE;
5278   v->fbi.vblank_swap = (data >> 1) & 0xff;
5279   v->fbi.vblank_dont_swap = (data >> 9) & 1;
5204   vd->fbi.vblank_swap_pending = TRUE;
5205   vd->fbi.vblank_swap = (data >> 1) & 0xff;
5206   vd->fbi.vblank_dont_swap = (data >> 9) & 1;
52805207
52815208   /* if we're not syncing to the retrace, process the command immediately */
52825209   if (!(data & 1))
52835210   {
5284      swap_buffers(v);
5211      swap_buffers(vd);
52855212      return 0;
52865213   }
52875214
52885215   /* determine how many cycles to wait; we deliberately overshoot here because */
52895216   /* the final count gets updated on the VBLANK */
5290   return (v->fbi.vblank_swap + 1) * v->freq / 30;
5217   return (vd->fbi.vblank_swap + 1) * vd->freq / 30;
52915218}
52925219
52935220
r253153r253154
52965223    command
52975224-------------------------------------------------*/
52985225
5299static INT32 triangle(voodoo_state *v)
5226INT32 voodoo_device::triangle(voodoo_device *vd)
53005227{
53015228   int texcount;
53025229   UINT16 *drawbuf;
r253153r253154
53075234
53085235   /* determine the number of TMUs involved */
53095236   texcount = 0;
5310   if (!FBIINIT3_DISABLE_TMUS(v->reg[fbiInit3].u) && FBZCP_TEXTURE_ENABLE(v->reg[fbzColorPath].u))
5237   if (!FBIINIT3_DISABLE_TMUS(vd->reg[fbiInit3].u) && FBZCP_TEXTURE_ENABLE(vd->reg[fbzColorPath].u))
53115238   {
53125239      texcount = 1;
5313      if (v->chipmask & 0x04)
5240      if (vd->chipmask & 0x04)
53145241         texcount = 2;
53155242   }
53165243
53175244   /* perform subpixel adjustments */
5318   if (FBZCP_CCA_SUBPIXEL_ADJUST(v->reg[fbzColorPath].u))
5245   if (FBZCP_CCA_SUBPIXEL_ADJUST(vd->reg[fbzColorPath].u))
53195246   {
5320      INT32 dx = 8 - (v->fbi.ax & 15);
5321      INT32 dy = 8 - (v->fbi.ay & 15);
5247      INT32 dx = 8 - (vd->fbi.ax & 15);
5248      INT32 dy = 8 - (vd->fbi.ay & 15);
53225249
53235250      /* adjust iterated R,G,B,A and W/Z */
5324      v->fbi.startr += (dy * v->fbi.drdy + dx * v->fbi.drdx) >> 4;
5325      v->fbi.startg += (dy * v->fbi.dgdy + dx * v->fbi.dgdx) >> 4;
5326      v->fbi.startb += (dy * v->fbi.dbdy + dx * v->fbi.dbdx) >> 4;
5327      v->fbi.starta += (dy * v->fbi.dady + dx * v->fbi.dadx) >> 4;
5328      v->fbi.startw += (dy * v->fbi.dwdy + dx * v->fbi.dwdx) >> 4;
5329      v->fbi.startz += mul_32x32_shift(dy, v->fbi.dzdy, 4) + mul_32x32_shift(dx, v->fbi.dzdx, 4);
5251      vd->fbi.startr += (dy * vd->fbi.drdy + dx * vd->fbi.drdx) >> 4;
5252      vd->fbi.startg += (dy * vd->fbi.dgdy + dx * vd->fbi.dgdx) >> 4;
5253      vd->fbi.startb += (dy * vd->fbi.dbdy + dx * vd->fbi.dbdx) >> 4;
5254      vd->fbi.starta += (dy * vd->fbi.dady + dx * vd->fbi.dadx) >> 4;
5255      vd->fbi.startw += (dy * vd->fbi.dwdy + dx * vd->fbi.dwdx) >> 4;
5256      vd->fbi.startz += mul_32x32_shift(dy, vd->fbi.dzdy, 4) + mul_32x32_shift(dx, vd->fbi.dzdx, 4);
53305257
53315258      /* adjust iterated W/S/T for TMU 0 */
53325259      if (texcount >= 1)
53335260      {
5334         v->tmu[0].startw += (dy * v->tmu[0].dwdy + dx * v->tmu[0].dwdx) >> 4;
5335         v->tmu[0].starts += (dy * v->tmu[0].dsdy + dx * v->tmu[0].dsdx) >> 4;
5336         v->tmu[0].startt += (dy * v->tmu[0].dtdy + dx * v->tmu[0].dtdx) >> 4;
5261         vd->tmu[0].startw += (dy * vd->tmu[0].dwdy + dx * vd->tmu[0].dwdx) >> 4;
5262         vd->tmu[0].starts += (dy * vd->tmu[0].dsdy + dx * vd->tmu[0].dsdx) >> 4;
5263         vd->tmu[0].startt += (dy * vd->tmu[0].dtdy + dx * vd->tmu[0].dtdx) >> 4;
53375264
53385265         /* adjust iterated W/S/T for TMU 1 */
53395266         if (texcount >= 2)
53405267         {
5341            v->tmu[1].startw += (dy * v->tmu[1].dwdy + dx * v->tmu[1].dwdx) >> 4;
5342            v->tmu[1].starts += (dy * v->tmu[1].dsdy + dx * v->tmu[1].dsdx) >> 4;
5343            v->tmu[1].startt += (dy * v->tmu[1].dtdy + dx * v->tmu[1].dtdx) >> 4;
5268            vd->tmu[1].startw += (dy * vd->tmu[1].dwdy + dx * vd->tmu[1].dwdx) >> 4;
5269            vd->tmu[1].starts += (dy * vd->tmu[1].dsdy + dx * vd->tmu[1].dsdx) >> 4;
5270            vd->tmu[1].startt += (dy * vd->tmu[1].dtdy + dx * vd->tmu[1].dtdx) >> 4;
53445271         }
53455272      }
53465273   }
53475274
53485275   /* wait for any outstanding work to finish */
5349//  poly_wait(v->poly, "triangle");
5276//  poly_wait(vd->poly, "triangle");
53505277
53515278   /* determine the draw buffer */
5352   destbuf = (v->type >= TYPE_VOODOO_BANSHEE) ? 1 : FBZMODE_DRAW_BUFFER(v->reg[fbzMode].u);
5279   destbuf = (vd->vd_type >= TYPE_VOODOO_BANSHEE) ? 1 : FBZMODE_DRAW_BUFFER(vd->reg[fbzMode].u);
53535280   switch (destbuf)
53545281   {
53555282      case 0:     /* front buffer */
5356         drawbuf = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.frontbuf]);
5357         v->fbi.video_changed = TRUE;
5283         drawbuf = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.frontbuf]);
5284         vd->fbi.video_changed = TRUE;
53585285         break;
53595286
53605287      case 1:     /* back buffer */
5361         drawbuf = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.backbuf]);
5288         drawbuf = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.backbuf]);
53625289         break;
53635290
53645291      default:    /* reserved */
r253153r253154
53665293   }
53675294
53685295   /* find a rasterizer that matches our current state */
5369   pixels = triangle_create_work_item(v, drawbuf, texcount);
5296   pixels = triangle_create_work_item(vd, drawbuf, texcount);
53705297
53715298   /* update stats */
5372   v->reg[fbiTrianglesOut].u++;
5299   vd->reg[fbiTrianglesOut].u++;
53735300
53745301   /* update stats */
5375   v->stats.total_triangles++;
5302   vd->stats.total_triangles++;
53765303
53775304   g_profiler.stop();
53785305
53795306   /* 1 pixel per clock, plus some setup time */
5380   if (LOG_REGISTERS) v->device->logerror("cycles = %d\n", TRIANGLE_SETUP_CLOCKS + pixels);
5307   if (LOG_REGISTERS) vd->device->logerror("cycles = %d\n", TRIANGLE_SETUP_CLOCKS + pixels);
53815308   return TRIANGLE_SETUP_CLOCKS + pixels;
53825309}
53835310
r253153r253154
53875314    command
53885315-------------------------------------------------*/
53895316
5390static INT32 begin_triangle(voodoo_state *v)
5317INT32 voodoo_device::begin_triangle(voodoo_device *vd)
53915318{
5392   setup_vertex *sv = &v->fbi.svert[2];
5319   setup_vertex *sv = &vd->fbi.svert[2];
53935320
53945321   /* extract all the data from registers */
5395   sv->x = v->reg[sVx].f;
5396   sv->y = v->reg[sVy].f;
5397   sv->wb = v->reg[sWb].f;
5398   sv->w0 = v->reg[sWtmu0].f;
5399   sv->s0 = v->reg[sS_W0].f;
5400   sv->t0 = v->reg[sT_W0].f;
5401   sv->w1 = v->reg[sWtmu1].f;
5402   sv->s1 = v->reg[sS_Wtmu1].f;
5403   sv->t1 = v->reg[sT_Wtmu1].f;
5404   sv->a = v->reg[sAlpha].f;
5405   sv->r = v->reg[sRed].f;
5406   sv->g = v->reg[sGreen].f;
5407   sv->b = v->reg[sBlue].f;
5322   sv->x = vd->reg[sVx].f;
5323   sv->y = vd->reg[sVy].f;
5324   sv->wb = vd->reg[sWb].f;
5325   sv->w0 = vd->reg[sWtmu0].f;
5326   sv->s0 = vd->reg[sS_W0].f;
5327   sv->t0 = vd->reg[sT_W0].f;
5328   sv->w1 = vd->reg[sWtmu1].f;
5329   sv->s1 = vd->reg[sS_Wtmu1].f;
5330   sv->t1 = vd->reg[sT_Wtmu1].f;
5331   sv->a = vd->reg[sAlpha].f;
5332   sv->r = vd->reg[sRed].f;
5333   sv->g = vd->reg[sGreen].f;
5334   sv->b = vd->reg[sBlue].f;
54085335
54095336   /* spread it across all three verts and reset the count */
5410   v->fbi.svert[0] = v->fbi.svert[1] = v->fbi.svert[2];
5411   v->fbi.sverts = 1;
5337   vd->fbi.svert[0] = vd->fbi.svert[1] = vd->fbi.svert[2];
5338   vd->fbi.sverts = 1;
54125339
54135340   return 0;
54145341}
r253153r253154
54195346    command
54205347-------------------------------------------------*/
54215348
5422static INT32 draw_triangle(voodoo_state *v)
5349INT32 voodoo_device::draw_triangle(voodoo_device *vd)
54235350{
5424   setup_vertex *sv = &v->fbi.svert[2];
5351   setup_vertex *sv = &vd->fbi.svert[2];
54255352   int cycles = 0;
54265353
54275354   /* for strip mode, shuffle vertex 1 down to 0 */
5428   if (!(v->reg[sSetupMode].u & (1 << 16)))
5429      v->fbi.svert[0] = v->fbi.svert[1];
5355   if (!(vd->reg[sSetupMode].u & (1 << 16)))
5356      vd->fbi.svert[0] = vd->fbi.svert[1];
54305357
54315358   /* copy 2 down to 1 regardless */
5432   v->fbi.svert[1] = v->fbi.svert[2];
5359   vd->fbi.svert[1] = vd->fbi.svert[2];
54335360
54345361   /* extract all the data from registers */
5435   sv->x = v->reg[sVx].f;
5436   sv->y = v->reg[sVy].f;
5437   sv->wb = v->reg[sWb].f;
5438   sv->w0 = v->reg[sWtmu0].f;
5439   sv->s0 = v->reg[sS_W0].f;
5440   sv->t0 = v->reg[sT_W0].f;
5441   sv->w1 = v->reg[sWtmu1].f;
5442   sv->s1 = v->reg[sS_Wtmu1].f;
5443   sv->t1 = v->reg[sT_Wtmu1].f;
5444   sv->a = v->reg[sAlpha].f;
5445   sv->r = v->reg[sRed].f;
5446   sv->g = v->reg[sGreen].f;
5447   sv->b = v->reg[sBlue].f;
5362   sv->x = vd->reg[sVx].f;
5363   sv->y = vd->reg[sVy].f;
5364   sv->wb = vd->reg[sWb].f;
5365   sv->w0 = vd->reg[sWtmu0].f;
5366   sv->s0 = vd->reg[sS_W0].f;
5367   sv->t0 = vd->reg[sT_W0].f;
5368   sv->w1 = vd->reg[sWtmu1].f;
5369   sv->s1 = vd->reg[sS_Wtmu1].f;
5370   sv->t1 = vd->reg[sT_Wtmu1].f;
5371   sv->a = vd->reg[sAlpha].f;
5372   sv->r = vd->reg[sRed].f;
5373   sv->g = vd->reg[sGreen].f;
5374   sv->b = vd->reg[sBlue].f;
54485375
54495376   /* if we have enough verts, go ahead and draw */
5450   if (++v->fbi.sverts >= 3)
5451      cycles = setup_and_draw_triangle(v);
5377   if (++vd->fbi.sverts >= 3)
5378      cycles = setup_and_draw_triangle(vd);
54525379
54535380   return cycles;
54545381}
r253153r253154
54645391    parameters and render the triangle
54655392-------------------------------------------------*/
54665393
5467static INT32 setup_and_draw_triangle(voodoo_state *v)
5394INT32 voodoo_device::setup_and_draw_triangle(voodoo_device *vd)
54685395{
54695396   float dx1, dy1, dx2, dy2;
54705397   float divisor, tdiv;
54715398
54725399   /* grab the X/Ys at least */
5473   v->fbi.ax = (INT16)(v->fbi.svert[0].x * 16.0f);
5474   v->fbi.ay = (INT16)(v->fbi.svert[0].y * 16.0f);
5475   v->fbi.bx = (INT16)(v->fbi.svert[1].x * 16.0f);
5476   v->fbi.by = (INT16)(v->fbi.svert[1].y * 16.0f);
5477   v->fbi.cx = (INT16)(v->fbi.svert[2].x * 16.0f);
5478   v->fbi.cy = (INT16)(v->fbi.svert[2].y * 16.0f);
5400   vd->fbi.ax = (INT16)(vd->fbi.svert[0].x * 16.0f);
5401   vd->fbi.ay = (INT16)(vd->fbi.svert[0].y * 16.0f);
5402   vd->fbi.bx = (INT16)(vd->fbi.svert[1].x * 16.0f);
5403   vd->fbi.by = (INT16)(vd->fbi.svert[1].y * 16.0f);
5404   vd->fbi.cx = (INT16)(vd->fbi.svert[2].x * 16.0f);
5405   vd->fbi.cy = (INT16)(vd->fbi.svert[2].y * 16.0f);
54795406
54805407   /* compute the divisor */
5481   divisor = 1.0f / ((v->fbi.svert[0].x - v->fbi.svert[1].x) * (v->fbi.svert[0].y - v->fbi.svert[2].y) -
5482                  (v->fbi.svert[0].x - v->fbi.svert[2].x) * (v->fbi.svert[0].y - v->fbi.svert[1].y));
5408   divisor = 1.0f / ((vd->fbi.svert[0].x - vd->fbi.svert[1].x) * (vd->fbi.svert[0].y - vd->fbi.svert[2].y) -
5409                  (vd->fbi.svert[0].x - vd->fbi.svert[2].x) * (vd->fbi.svert[0].y - vd->fbi.svert[1].y));
54835410
54845411   /* backface culling */
5485   if (v->reg[sSetupMode].u & 0x20000)
5412   if (vd->reg[sSetupMode].u & 0x20000)
54865413   {
5487      int culling_sign = (v->reg[sSetupMode].u >> 18) & 1;
5414      int culling_sign = (vd->reg[sSetupMode].u >> 18) & 1;
54885415      int divisor_sign = (divisor < 0);
54895416
54905417      /* if doing strips and ping pong is enabled, apply the ping pong */
5491      if ((v->reg[sSetupMode].u & 0x90000) == 0x00000)
5492         culling_sign ^= (v->fbi.sverts - 3) & 1;
5418      if ((vd->reg[sSetupMode].u & 0x90000) == 0x00000)
5419         culling_sign ^= (vd->fbi.sverts - 3) & 1;
54935420
54945421      /* if our sign matches the culling sign, we're done for */
54955422      if (divisor_sign == culling_sign)
r253153r253154
54975424   }
54985425
54995426   /* compute the dx/dy values */
5500   dx1 = v->fbi.svert[0].y - v->fbi.svert[2].y;
5501   dx2 = v->fbi.svert[0].y - v->fbi.svert[1].y;
5502   dy1 = v->fbi.svert[0].x - v->fbi.svert[1].x;
5503   dy2 = v->fbi.svert[0].x - v->fbi.svert[2].x;
5427   dx1 = vd->fbi.svert[0].y - vd->fbi.svert[2].y;
5428   dx2 = vd->fbi.svert[0].y - vd->fbi.svert[1].y;
5429   dy1 = vd->fbi.svert[0].x - vd->fbi.svert[1].x;
5430   dy2 = vd->fbi.svert[0].x - vd->fbi.svert[2].x;
55045431
55055432   /* set up R,G,B */
55065433   tdiv = divisor * 4096.0f;
5507   if (v->reg[sSetupMode].u & (1 << 0))
5434   if (vd->reg[sSetupMode].u & (1 << 0))
55085435   {
5509      v->fbi.startr = (INT32)(v->fbi.svert[0].r * 4096.0f);
5510      v->fbi.drdx = (INT32)(((v->fbi.svert[0].r - v->fbi.svert[1].r) * dx1 - (v->fbi.svert[0].r - v->fbi.svert[2].r) * dx2) * tdiv);
5511      v->fbi.drdy = (INT32)(((v->fbi.svert[0].r - v->fbi.svert[2].r) * dy1 - (v->fbi.svert[0].r - v->fbi.svert[1].r) * dy2) * tdiv);
5512      v->fbi.startg = (INT32)(v->fbi.svert[0].g * 4096.0f);
5513      v->fbi.dgdx = (INT32)(((v->fbi.svert[0].g - v->fbi.svert[1].g) * dx1 - (v->fbi.svert[0].g - v->fbi.svert[2].g) * dx2) * tdiv);
5514      v->fbi.dgdy = (INT32)(((v->fbi.svert[0].g - v->fbi.svert[2].g) * dy1 - (v->fbi.svert[0].g - v->fbi.svert[1].g) * dy2) * tdiv);
5515      v->fbi.startb = (INT32)(v->fbi.svert[0].b * 4096.0f);
5516      v->fbi.dbdx = (INT32)(((v->fbi.svert[0].b - v->fbi.svert[1].b) * dx1 - (v->fbi.svert[0].b - v->fbi.svert[2].b) * dx2) * tdiv);
5517      v->fbi.dbdy = (INT32)(((v->fbi.svert[0].b - v->fbi.svert[2].b) * dy1 - (v->fbi.svert[0].b - v->fbi.svert[1].b) * dy2) * tdiv);
5436      vd->fbi.startr = (INT32)(vd->fbi.svert[0].r * 4096.0f);
5437      vd->fbi.drdx = (INT32)(((vd->fbi.svert[0].r - vd->fbi.svert[1].r) * dx1 - (vd->fbi.svert[0].r - vd->fbi.svert[2].r) * dx2) * tdiv);
5438      vd->fbi.drdy = (INT32)(((vd->fbi.svert[0].r - vd->fbi.svert[2].r) * dy1 - (vd->fbi.svert[0].r - vd->fbi.svert[1].r) * dy2) * tdiv);
5439      vd->fbi.startg = (INT32)(vd->fbi.svert[0].g * 4096.0f);
5440      vd->fbi.dgdx = (INT32)(((vd->fbi.svert[0].g - vd->fbi.svert[1].g) * dx1 - (vd->fbi.svert[0].g - vd->fbi.svert[2].g) * dx2) * tdiv);
5441      vd->fbi.dgdy = (INT32)(((vd->fbi.svert[0].g - vd->fbi.svert[2].g) * dy1 - (vd->fbi.svert[0].g - vd->fbi.svert[1].g) * dy2) * tdiv);
5442      vd->fbi.startb = (INT32)(vd->fbi.svert[0].b * 4096.0f);
5443      vd->fbi.dbdx = (INT32)(((vd->fbi.svert[0].b - vd->fbi.svert[1].b) * dx1 - (vd->fbi.svert[0].b - vd->fbi.svert[2].b) * dx2) * tdiv);
5444      vd->fbi.dbdy = (INT32)(((vd->fbi.svert[0].b - vd->fbi.svert[2].b) * dy1 - (vd->fbi.svert[0].b - vd->fbi.svert[1].b) * dy2) * tdiv);
55185445   }
55195446
55205447   /* set up alpha */
5521   if (v->reg[sSetupMode].u & (1 << 1))
5448   if (vd->reg[sSetupMode].u & (1 << 1))
55225449   {
5523      v->fbi.starta = (INT32)(v->fbi.svert[0].a * 4096.0f);
5524      v->fbi.dadx = (INT32)(((v->fbi.svert[0].a - v->fbi.svert[1].a) * dx1 - (v->fbi.svert[0].a - v->fbi.svert[2].a) * dx2) * tdiv);
5525      v->fbi.dady = (INT32)(((v->fbi.svert[0].a - v->fbi.svert[2].a) * dy1 - (v->fbi.svert[0].a - v->fbi.svert[1].a) * dy2) * tdiv);
5450      vd->fbi.starta = (INT32)(vd->fbi.svert[0].a * 4096.0f);
5451      vd->fbi.dadx = (INT32)(((vd->fbi.svert[0].a - vd->fbi.svert[1].a) * dx1 - (vd->fbi.svert[0].a - vd->fbi.svert[2].a) * dx2) * tdiv);
5452      vd->fbi.dady = (INT32)(((vd->fbi.svert[0].a - vd->fbi.svert[2].a) * dy1 - (vd->fbi.svert[0].a - vd->fbi.svert[1].a) * dy2) * tdiv);
55265453   }
55275454
55285455   /* set up Z */
5529   if (v->reg[sSetupMode].u & (1 << 2))
5456   if (vd->reg[sSetupMode].u & (1 << 2))
55305457   {
5531      v->fbi.startz = (INT32)(v->fbi.svert[0].z * 4096.0f);
5532      v->fbi.dzdx = (INT32)(((v->fbi.svert[0].z - v->fbi.svert[1].z) * dx1 - (v->fbi.svert[0].z - v->fbi.svert[2].z) * dx2) * tdiv);
5533      v->fbi.dzdy = (INT32)(((v->fbi.svert[0].z - v->fbi.svert[2].z) * dy1 - (v->fbi.svert[0].z - v->fbi.svert[1].z) * dy2) * tdiv);
5458      vd->fbi.startz = (INT32)(vd->fbi.svert[0].z * 4096.0f);
5459      vd->fbi.dzdx = (INT32)(((vd->fbi.svert[0].z - vd->fbi.svert[1].z) * dx1 - (vd->fbi.svert[0].z - vd->fbi.svert[2].z) * dx2) * tdiv);
5460      vd->fbi.dzdy = (INT32)(((vd->fbi.svert[0].z - vd->fbi.svert[2].z) * dy1 - (vd->fbi.svert[0].z - vd->fbi.svert[1].z) * dy2) * tdiv);
55345461   }
55355462
55365463   /* set up Wb */
55375464   tdiv = divisor * 65536.0f * 65536.0f;
5538   if (v->reg[sSetupMode].u & (1 << 3))
5465   if (vd->reg[sSetupMode].u & (1 << 3))
55395466   {
5540      v->fbi.startw = v->tmu[0].startw = v->tmu[1].startw = (INT64)(v->fbi.svert[0].wb * 65536.0f * 65536.0f);
5541      v->fbi.dwdx = v->tmu[0].dwdx = v->tmu[1].dwdx = ((v->fbi.svert[0].wb - v->fbi.svert[1].wb) * dx1 - (v->fbi.svert[0].wb - v->fbi.svert[2].wb) * dx2) * tdiv;
5542      v->fbi.dwdy = v->tmu[0].dwdy = v->tmu[1].dwdy = ((v->fbi.svert[0].wb - v->fbi.svert[2].wb) * dy1 - (v->fbi.svert[0].wb - v->fbi.svert[1].wb) * dy2) * tdiv;
5467      vd->fbi.startw = vd->tmu[0].startw = vd->tmu[1].startw = (INT64)(vd->fbi.svert[0].wb * 65536.0f * 65536.0f);
5468      vd->fbi.dwdx = vd->tmu[0].dwdx = vd->tmu[1].dwdx = ((vd->fbi.svert[0].wb - vd->fbi.svert[1].wb) * dx1 - (vd->fbi.svert[0].wb - vd->fbi.svert[2].wb) * dx2) * tdiv;
5469      vd->fbi.dwdy = vd->tmu[0].dwdy = vd->tmu[1].dwdy = ((vd->fbi.svert[0].wb - vd->fbi.svert[2].wb) * dy1 - (vd->fbi.svert[0].wb - vd->fbi.svert[1].wb) * dy2) * tdiv;
55435470   }
55445471
55455472   /* set up W0 */
5546   if (v->reg[sSetupMode].u & (1 << 4))
5473   if (vd->reg[sSetupMode].u & (1 << 4))
55475474   {
5548      v->tmu[0].startw = v->tmu[1].startw = (INT64)(v->fbi.svert[0].w0 * 65536.0f * 65536.0f);
5549      v->tmu[0].dwdx = v->tmu[1].dwdx = ((v->fbi.svert[0].w0 - v->fbi.svert[1].w0) * dx1 - (v->fbi.svert[0].w0 - v->fbi.svert[2].w0) * dx2) * tdiv;
5550      v->tmu[0].dwdy = v->tmu[1].dwdy = ((v->fbi.svert[0].w0 - v->fbi.svert[2].w0) * dy1 - (v->fbi.svert[0].w0 - v->fbi.svert[1].w0) * dy2) * tdiv;
5475      vd->tmu[0].startw = vd->tmu[1].startw = (INT64)(vd->fbi.svert[0].w0 * 65536.0f * 65536.0f);
5476      vd->tmu[0].dwdx = vd->tmu[1].dwdx = ((vd->fbi.svert[0].w0 - vd->fbi.svert[1].w0) * dx1 - (vd->fbi.svert[0].w0 - vd->fbi.svert[2].w0) * dx2) * tdiv;
5477      vd->tmu[0].dwdy = vd->tmu[1].dwdy = ((vd->fbi.svert[0].w0 - vd->fbi.svert[2].w0) * dy1 - (vd->fbi.svert[0].w0 - vd->fbi.svert[1].w0) * dy2) * tdiv;
55515478   }
55525479
55535480   /* set up S0,T0 */
5554   if (v->reg[sSetupMode].u & (1 << 5))
5481   if (vd->reg[sSetupMode].u & (1 << 5))
55555482   {
5556      v->tmu[0].starts = v->tmu[1].starts = (INT64)(v->fbi.svert[0].s0 * 65536.0f * 65536.0f);
5557      v->tmu[0].dsdx = v->tmu[1].dsdx = ((v->fbi.svert[0].s0 - v->fbi.svert[1].s0) * dx1 - (v->fbi.svert[0].s0 - v->fbi.svert[2].s0) * dx2) * tdiv;
5558      v->tmu[0].dsdy = v->tmu[1].dsdy = ((v->fbi.svert[0].s0 - v->fbi.svert[2].s0) * dy1 - (v->fbi.svert[0].s0 - v->fbi.svert[1].s0) * dy2) * tdiv;
5559      v->tmu[0].startt = v->tmu[1].startt = (INT64)(v->fbi.svert[0].t0 * 65536.0f * 65536.0f);
5560      v->tmu[0].dtdx = v->tmu[1].dtdx = ((v->fbi.svert[0].t0 - v->fbi.svert[1].t0) * dx1 - (v->fbi.svert[0].t0 - v->fbi.svert[2].t0) * dx2) * tdiv;
5561      v->tmu[0].dtdy = v->tmu[1].dtdy = ((v->fbi.svert[0].t0 - v->fbi.svert[2].t0) * dy1 - (v->fbi.svert[0].t0 - v->fbi.svert[1].t0) * dy2) * tdiv;
5483      vd->tmu[0].starts = vd->tmu[1].starts = (INT64)(vd->fbi.svert[0].s0 * 65536.0f * 65536.0f);
5484      vd->tmu[0].dsdx = vd->tmu[1].dsdx = ((vd->fbi.svert[0].s0 - vd->fbi.svert[1].s0) * dx1 - (vd->fbi.svert[0].s0 - vd->fbi.svert[2].s0) * dx2) * tdiv;
5485      vd->tmu[0].dsdy = vd->tmu[1].dsdy = ((vd->fbi.svert[0].s0 - vd->fbi.svert[2].s0) * dy1 - (vd->fbi.svert[0].s0 - vd->fbi.svert[1].s0) * dy2) * tdiv;
5486      vd->tmu[0].startt = vd->tmu[1].startt = (INT64)(vd->fbi.svert[0].t0 * 65536.0f * 65536.0f);
5487      vd->tmu[0].dtdx = vd->tmu[1].dtdx = ((vd->fbi.svert[0].t0 - vd->fbi.svert[1].t0) * dx1 - (vd->fbi.svert[0].t0 - vd->fbi.svert[2].t0) * dx2) * tdiv;
5488      vd->tmu[0].dtdy = vd->tmu[1].dtdy = ((vd->fbi.svert[0].t0 - vd->fbi.svert[2].t0) * dy1 - (vd->fbi.svert[0].t0 - vd->fbi.svert[1].t0) * dy2) * tdiv;
55625489   }
55635490
55645491   /* set up W1 */
5565   if (v->reg[sSetupMode].u & (1 << 6))
5492   if (vd->reg[sSetupMode].u & (1 << 6))
55665493   {
5567      v->tmu[1].startw = (INT64)(v->fbi.svert[0].w1 * 65536.0f * 65536.0f);
5568      v->tmu[1].dwdx = ((v->fbi.svert[0].w1 - v->fbi.svert[1].w1) * dx1 - (v->fbi.svert[0].w1 - v->fbi.svert[2].w1) * dx2) * tdiv;
5569      v->tmu[1].dwdy = ((v->fbi.svert[0].w1 - v->fbi.svert[2].w1) * dy1 - (v->fbi.svert[0].w1 - v->fbi.svert[1].w1) * dy2) * tdiv;
5494      vd->tmu[1].startw = (INT64)(vd->fbi.svert[0].w1 * 65536.0f * 65536.0f);
5495      vd->tmu[1].dwdx = ((vd->fbi.svert[0].w1 - vd->fbi.svert[1].w1) * dx1 - (vd->fbi.svert[0].w1 - vd->fbi.svert[2].w1) * dx2) * tdiv;
5496      vd->tmu[1].dwdy = ((vd->fbi.svert[0].w1 - vd->fbi.svert[2].w1) * dy1 - (vd->fbi.svert[0].w1 - vd->fbi.svert[1].w1) * dy2) * tdiv;
55705497   }
55715498
55725499   /* set up S1,T1 */
5573   if (v->reg[sSetupMode].u & (1 << 7))
5500   if (vd->reg[sSetupMode].u & (1 << 7))
55745501   {
5575      v->tmu[1].starts = (INT64)(v->fbi.svert[0].s1 * 65536.0f * 65536.0f);
5576      v->tmu[1].dsdx = ((v->fbi.svert[0].s1 - v->fbi.svert[1].s1) * dx1 - (v->fbi.svert[0].s1 - v->fbi.svert[2].s1) * dx2) * tdiv;
5577      v->tmu[1].dsdy = ((v->fbi.svert[0].s1 - v->fbi.svert[2].s1) * dy1 - (v->fbi.svert[0].s1 - v->fbi.svert[1].s1) * dy2) * tdiv;
5578      v->tmu[1].startt = (INT64)(v->fbi.svert[0].t1 * 65536.0f * 65536.0f);
5579      v->tmu[1].dtdx = ((v->fbi.svert[0].t1 - v->fbi.svert[1].t1) * dx1 - (v->fbi.svert[0].t1 - v->fbi.svert[2].t1) * dx2) * tdiv;
5580      v->tmu[1].dtdy = ((v->fbi.svert[0].t1 - v->fbi.svert[2].t1) * dy1 - (v->fbi.svert[0].t1 - v->fbi.svert[1].t1) * dy2) * tdiv;
5502      vd->tmu[1].starts = (INT64)(vd->fbi.svert[0].s1 * 65536.0f * 65536.0f);
5503      vd->tmu[1].dsdx = ((vd->fbi.svert[0].s1 - vd->fbi.svert[1].s1) * dx1 - (vd->fbi.svert[0].s1 - vd->fbi.svert[2].s1) * dx2) * tdiv;
5504      vd->tmu[1].dsdy = ((vd->fbi.svert[0].s1 - vd->fbi.svert[2].s1) * dy1 - (vd->fbi.svert[0].s1 - vd->fbi.svert[1].s1) * dy2) * tdiv;
5505      vd->tmu[1].startt = (INT64)(vd->fbi.svert[0].t1 * 65536.0f * 65536.0f);
5506      vd->tmu[1].dtdx = ((vd->fbi.svert[0].t1 - vd->fbi.svert[1].t1) * dx1 - (vd->fbi.svert[0].t1 - vd->fbi.svert[2].t1) * dx2) * tdiv;
5507      vd->tmu[1].dtdy = ((vd->fbi.svert[0].t1 - vd->fbi.svert[2].t1) * dy1 - (vd->fbi.svert[0].t1 - vd->fbi.svert[1].t1) * dy2) * tdiv;
55815508   }
55825509
55835510   /* draw the triangle */
5584   v->fbi.cheating_allowed = 1;
5585   return triangle(v);
5511   vd->fbi.cheating_allowed = 1;
5512   return triangle(vd);
55865513}
55875514
55885515
r253153r253154
55915518    setup and create the work item
55925519-------------------------------------------------*/
55935520
5594static INT32 triangle_create_work_item(voodoo_state *v, UINT16 *drawbuf, int texcount)
5521INT32 voodoo_device::triangle_create_work_item(voodoo_device* vd, UINT16 *drawbuf, int texcount)
55955522{
5596   poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(v->poly);
5597   raster_info *info = find_rasterizer(v, texcount);
5523   poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(vd->poly);
5524
5525   raster_info *info = find_rasterizer(vd, texcount);
55985526   poly_vertex vert[3];
55995527
56005528   /* fill in the vertex data */
5601   vert[0].x = (float)v->fbi.ax * (1.0f / 16.0f);
5602   vert[0].y = (float)v->fbi.ay * (1.0f / 16.0f);
5603   vert[1].x = (float)v->fbi.bx * (1.0f / 16.0f);
5604   vert[1].y = (float)v->fbi.by * (1.0f / 16.0f);
5605   vert[2].x = (float)v->fbi.cx * (1.0f / 16.0f);
5606   vert[2].y = (float)v->fbi.cy * (1.0f / 16.0f);
5529   vert[0].x = (float)vd->fbi.ax * (1.0f / 16.0f);
5530   vert[0].y = (float)vd->fbi.ay * (1.0f / 16.0f);
5531   vert[1].x = (float)vd->fbi.bx * (1.0f / 16.0f);
5532   vert[1].y = (float)vd->fbi.by * (1.0f / 16.0f);
5533   vert[2].x = (float)vd->fbi.cx * (1.0f / 16.0f);
5534   vert[2].y = (float)vd->fbi.cy * (1.0f / 16.0f);
56075535
56085536   /* fill in the extra data */
5609   extra->state = v;
5537   extra->device = vd;
56105538   extra->info = info;
56115539
56125540   /* fill in triangle parameters */
5613   extra->ax = v->fbi.ax;
5614   extra->ay = v->fbi.ay;
5615   extra->startr = v->fbi.startr;
5616   extra->startg = v->fbi.startg;
5617   extra->startb = v->fbi.startb;
5618   extra->starta = v->fbi.starta;
5619   extra->startz = v->fbi.startz;
5620   extra->startw = v->fbi.startw;
5621   extra->drdx = v->fbi.drdx;
5622   extra->dgdx = v->fbi.dgdx;
5623   extra->dbdx = v->fbi.dbdx;
5624   extra->dadx = v->fbi.dadx;
5625   extra->dzdx = v->fbi.dzdx;
5626   extra->dwdx = v->fbi.dwdx;
5627   extra->drdy = v->fbi.drdy;
5628   extra->dgdy = v->fbi.dgdy;
5629   extra->dbdy = v->fbi.dbdy;
5630   extra->dady = v->fbi.dady;
5631   extra->dzdy = v->fbi.dzdy;
5632   extra->dwdy = v->fbi.dwdy;
5541   extra->ax = vd->fbi.ax;
5542   extra->ay = vd->fbi.ay;
5543   extra->startr = vd->fbi.startr;
5544   extra->startg = vd->fbi.startg;
5545   extra->startb = vd->fbi.startb;
5546   extra->starta = vd->fbi.starta;
5547   extra->startz = vd->fbi.startz;
5548   extra->startw = vd->fbi.startw;
5549   extra->drdx = vd->fbi.drdx;
5550   extra->dgdx = vd->fbi.dgdx;
5551   extra->dbdx = vd->fbi.dbdx;
5552   extra->dadx = vd->fbi.dadx;
5553   extra->dzdx = vd->fbi.dzdx;
5554   extra->dwdx = vd->fbi.dwdx;
5555   extra->drdy = vd->fbi.drdy;
5556   extra->dgdy = vd->fbi.dgdy;
5557   extra->dbdy = vd->fbi.dbdy;
5558   extra->dady = vd->fbi.dady;
5559   extra->dzdy = vd->fbi.dzdy;
5560   extra->dwdy = vd->fbi.dwdy;
56335561
56345562   /* fill in texture 0 parameters */
56355563   if (texcount > 0)
56365564   {
5637      extra->starts0 = v->tmu[0].starts;
5638      extra->startt0 = v->tmu[0].startt;
5639      extra->startw0 = v->tmu[0].startw;
5640      extra->ds0dx = v->tmu[0].dsdx;
5641      extra->dt0dx = v->tmu[0].dtdx;
5642      extra->dw0dx = v->tmu[0].dwdx;
5643      extra->ds0dy = v->tmu[0].dsdy;
5644      extra->dt0dy = v->tmu[0].dtdy;
5645      extra->dw0dy = v->tmu[0].dwdy;
5646      extra->lodbase0 = prepare_tmu(&v->tmu[0]);
5647      v->stats.texture_mode[TEXMODE_FORMAT(v->tmu[0].reg[textureMode].u)]++;
5565      extra->starts0 = vd->tmu[0].starts;
5566      extra->startt0 = vd->tmu[0].startt;
5567      extra->startw0 = vd->tmu[0].startw;
5568      extra->ds0dx = vd->tmu[0].dsdx;
5569      extra->dt0dx = vd->tmu[0].dtdx;
5570      extra->dw0dx = vd->tmu[0].dwdx;
5571      extra->ds0dy = vd->tmu[0].dsdy;
5572      extra->dt0dy = vd->tmu[0].dtdy;
5573      extra->dw0dy = vd->tmu[0].dwdy;
5574      extra->lodbase0 = prepare_tmu(&vd->tmu[0]);
5575      vd->stats.texture_mode[TEXMODE_FORMAT(vd->tmu[0].reg[textureMode].u)]++;
56485576
56495577      /* fill in texture 1 parameters */
56505578      if (texcount > 1)
56515579      {
5652         extra->starts1 = v->tmu[1].starts;
5653         extra->startt1 = v->tmu[1].startt;
5654         extra->startw1 = v->tmu[1].startw;
5655         extra->ds1dx = v->tmu[1].dsdx;
5656         extra->dt1dx = v->tmu[1].dtdx;
5657         extra->dw1dx = v->tmu[1].dwdx;
5658         extra->ds1dy = v->tmu[1].dsdy;
5659         extra->dt1dy = v->tmu[1].dtdy;
5660         extra->dw1dy = v->tmu[1].dwdy;
5661         extra->lodbase1 = prepare_tmu(&v->tmu[1]);
5662         v->stats.texture_mode[TEXMODE_FORMAT(v->tmu[1].reg[textureMode].u)]++;
5580         extra->starts1 = vd->tmu[1].starts;
5581         extra->startt1 = vd->tmu[1].startt;
5582         extra->startw1 = vd->tmu[1].startw;
5583         extra->ds1dx = vd->tmu[1].dsdx;
5584         extra->dt1dx = vd->tmu[1].dtdx;
5585         extra->dw1dx = vd->tmu[1].dwdx;
5586         extra->ds1dy = vd->tmu[1].dsdy;
5587         extra->dt1dy = vd->tmu[1].dtdy;
5588         extra->dw1dy = vd->tmu[1].dwdy;
5589         extra->lodbase1 = prepare_tmu(&vd->tmu[1]);
5590         vd->stats.texture_mode[TEXMODE_FORMAT(vd->tmu[1].reg[textureMode].u)]++;
56635591      }
56645592   }
56655593
56665594   /* farm the rasterization out to other threads */
56675595   info->polys++;
5668   return poly_render_triangle(v->poly, drawbuf, global_cliprect, info->callback, 0, &vert[0], &vert[1], &vert[2]);
5596   return poly_render_triangle(vd->poly, drawbuf, global_cliprect, info->callback, 0, &vert[0], &vert[1], &vert[2]);
56695597}
56705598
56715599
r253153r253154
56795607    hash table
56805608-------------------------------------------------*/
56815609
5682static raster_info *add_rasterizer(voodoo_state *v, const raster_info *cinfo)
5610raster_info *voodoo_device::add_rasterizer(voodoo_device *vd, const raster_info *cinfo)
56835611{
5684   raster_info *info = &v->rasterizer[v->next_rasterizer++];
5612   raster_info *info = &vd->rasterizer[vd->next_rasterizer++];
56855613   int hash = compute_raster_hash(cinfo);
56865614
5687   assert_always(v->next_rasterizer <= MAX_RASTERIZERS, "Out of space for new rasterizers!");
5615   assert_always(vd->next_rasterizer <= MAX_RASTERIZERS, "Out of space for new rasterizers!");
56885616
56895617   /* make a copy of the info */
56905618   *info = *cinfo;
r253153r253154
56955623   info->hash = hash;
56965624
56975625   /* hook us into the hash table */
5698   info->next = v->raster_hash[hash];
5699   v->raster_hash[hash] = info;
5626   info->next = vd->raster_hash[hash];
5627   vd->raster_hash[hash] = info;
57005628
57015629   if (LOG_RASTERIZERS)
57025630      printf("Adding rasterizer @ %p : cp=%08X am=%08X %08X fbzM=%08X tm0=%08X tm1=%08X (hash=%d)\n",
r253153r253154
57145642    it, creating a new one if necessary
57155643-------------------------------------------------*/
57165644
5717static raster_info *find_rasterizer(voodoo_state *v, int texcount)
5645raster_info *voodoo_device::find_rasterizer(voodoo_device *vd, int texcount)
57185646{
57195647   raster_info *info, *prev = nullptr;
57205648   raster_info curinfo;
57215649   int hash;
57225650
57235651   /* build an info struct with all the parameters */
5724   curinfo.eff_color_path = normalize_color_path(v->reg[fbzColorPath].u);
5725   curinfo.eff_alpha_mode = normalize_alpha_mode(v->reg[alphaMode].u);
5726   curinfo.eff_fog_mode = normalize_fog_mode(v->reg[fogMode].u);
5727   curinfo.eff_fbz_mode = normalize_fbz_mode(v->reg[fbzMode].u);
5728   curinfo.eff_tex_mode_0 = (texcount >= 1) ? normalize_tex_mode(v->tmu[0].reg[textureMode].u) : 0xffffffff;
5729   curinfo.eff_tex_mode_1 = (texcount >= 2) ? normalize_tex_mode(v->tmu[1].reg[textureMode].u) : 0xffffffff;
5652   curinfo.eff_color_path = normalize_color_path(vd->reg[fbzColorPath].u);
5653   curinfo.eff_alpha_mode = normalize_alpha_mode(vd->reg[alphaMode].u);
5654   curinfo.eff_fog_mode = normalize_fog_mode(vd->reg[fogMode].u);
5655   curinfo.eff_fbz_mode = normalize_fbz_mode(vd->reg[fbzMode].u);
5656   curinfo.eff_tex_mode_0 = (texcount >= 1) ? normalize_tex_mode(vd->tmu[0].reg[textureMode].u) : 0xffffffff;
5657   curinfo.eff_tex_mode_1 = (texcount >= 2) ? normalize_tex_mode(vd->tmu[1].reg[textureMode].u) : 0xffffffff;
57305658
57315659   /* compute the hash */
57325660   hash = compute_raster_hash(&curinfo);
57335661
57345662   /* find the appropriate hash entry */
5735   for (info = v->raster_hash[hash]; info; prev = info, info = info->next)
5663   for (info = vd->raster_hash[hash]; info; prev = info, info = info->next)
57365664      if (info->eff_color_path == curinfo.eff_color_path &&
57375665         info->eff_alpha_mode == curinfo.eff_alpha_mode &&
57385666         info->eff_fog_mode == curinfo.eff_fog_mode &&
r253153r253154
57445672         if (prev)
57455673         {
57465674            prev->next = info->next;
5747            info->next = v->raster_hash[hash];
5748            v->raster_hash[hash] = info;
5675            info->next = vd->raster_hash[hash];
5676            vd->raster_hash[hash] = info;
57495677         }
57505678
57515679         /* return the result */
r253153r253154
57615689   curinfo.next = nullptr;
57625690   curinfo.hash = hash;
57635691
5764   return add_rasterizer(v, &curinfo);
5692   return add_rasterizer(vd, &curinfo);
57655693}
57665694
57675695
r253153r253154
57705698    the current rasterizer usage patterns
57715699-------------------------------------------------*/
57725700
5773static void dump_rasterizer_stats(voodoo_state *v)
5701void voodoo_device::dump_rasterizer_stats(voodoo_device *vd)
57745702{
57755703   static UINT8 display_index;
57765704   raster_info *cur, *best;
r253153r253154
57865714
57875715      /* find the highest entry */
57885716      for (hash = 0; hash < RASTER_HASH_SIZE; hash++)
5789         for (cur = v->raster_hash[hash]; cur; cur = cur->next)
5717         for (cur = vd->raster_hash[hash]; cur; cur = cur->next)
57905718            if (cur->display != display_index && (best == nullptr || cur->hits > best->hits))
57915719               best = cur;
57925720
r253153r253154
58225750      m_vblank(*this),
58235751      m_stall(*this)
58245752{
5825   m_token = global_alloc_clear<voodoo_state>();
58265753}
58275754
58285755voodoo_device::~voodoo_device()
58295756{
5830   global_free(m_token);
58315757}
58325758
58335759//-------------------------------------------------
r253153r253154
58465772
58475773void voodoo_device::device_reset()
58485774{
5849   voodoo_state *v = get_safe_token(this);
5850   soft_reset(v);
5775   soft_reset(this);
58515776}
58525777
58535778//-------------------------------------------------
r253153r253154
58565781
58575782void voodoo_device::device_stop()
58585783{
5859   voodoo_state *v = get_safe_token(this);
5860
58615784   /* release the work queue, ensuring all work is finished */
5862   if (v->poly != nullptr)
5863      poly_free(v->poly);
5785   if (poly != nullptr)
5786      poly_free(poly);
58645787}
58655788
58665789
r253153r253154
59475870    implementation of the 'fastfill' command
59485871-------------------------------------------------*/
59495872
5950static void raster_fastfill(void *destbase, INT32 y, const poly_extent *extent, const void *extradata, int threadid)
5873void voodoo_device::raster_fastfill(void *destbase, INT32 y, const poly_extent *extent, const void *extradata, int threadid)
59515874{
59525875   const poly_extra_data *extra = (const poly_extra_data *)extradata;
5953   voodoo_state *v = extra->state;
5954   stats_block *stats = &v->thread_stats[threadid];
5876   voodoo_device* vd = extra->device;
5877   stats_block *stats = &vd->thread_stats[threadid];
59555878   INT32 startx = extent->startx;
59565879   INT32 stopx = extent->stopx;
59575880   int scry, x;
59585881
59595882   /* determine the screen Y */
59605883   scry = y;
5961   if (FBZMODE_Y_ORIGIN(v->reg[fbzMode].u))
5962      scry = (v->fbi.yorigin - y) & 0x3ff;
5884   if (FBZMODE_Y_ORIGIN(vd->reg[fbzMode].u))
5885      scry = (vd->fbi.yorigin - y) & 0x3ff;
59635886
59645887   /* fill this RGB row */
5965   if (FBZMODE_RGB_BUFFER_MASK(v->reg[fbzMode].u))
5888   if (FBZMODE_RGB_BUFFER_MASK(vd->reg[fbzMode].u))
59665889   {
59675890      const UINT16 *ditherow = &extra->dither[(y & 3) * 4];
59685891      UINT64 expanded = *(UINT64 *)ditherow;
5969      UINT16 *dest = (UINT16 *)destbase + scry * v->fbi.rowpixels;
5892      UINT16 *dest = (UINT16 *)destbase + scry * vd->fbi.rowpixels;
59705893
59715894      for (x = startx; x < stopx && (x & 3) != 0; x++)
59725895         dest[x] = ditherow[x & 3];
r253153r253154
59785901   }
59795902
59805903   /* fill this dest buffer row */
5981   if (FBZMODE_AUX_BUFFER_MASK(v->reg[fbzMode].u) && v->fbi.auxoffs != ~0)
5904   if (FBZMODE_AUX_BUFFER_MASK(vd->reg[fbzMode].u) && vd->fbi.auxoffs != ~0)
59825905   {
5983      UINT16 color = v->reg[zaColor].u;
5906      UINT16 color = vd->reg[zaColor].u;
59845907      UINT64 expanded = ((UINT64)color << 48) | ((UINT64)color << 32) | (color << 16) | color;
5985      UINT16 *dest = (UINT16 *)(v->fbi.ram + v->fbi.auxoffs) + scry * v->fbi.rowpixels;
5908      UINT16 *dest = (UINT16 *)(vd->fbi.ram + vd->fbi.auxoffs) + scry * vd->fbi.rowpixels;
59865909
59875910      for (x = startx; x < stopx && (x & 3) != 0; x++)
59885911         dest[x] = color;
r253153r253154
59985921    generic_0tmu - generic rasterizer for 0 TMUs
59995922-------------------------------------------------*/
60005923
6001RASTERIZER(generic_0tmu, 0, v->reg[fbzColorPath].u, v->reg[fbzMode].u, v->reg[alphaMode].u,
6002         v->reg[fogMode].u, 0, 0)
5924RASTERIZER(generic_0tmu, 0, vd->reg[fbzColorPath].u, vd->reg[fbzMode].u, vd->reg[alphaMode].u,
5925         vd->reg[fogMode].u, 0, 0)
60035926
60045927
60055928/*-------------------------------------------------
60065929    generic_1tmu - generic rasterizer for 1 TMU
60075930-------------------------------------------------*/
60085931
6009RASTERIZER(generic_1tmu, 1, v->reg[fbzColorPath].u, v->reg[fbzMode].u, v->reg[alphaMode].u,
6010         v->reg[fogMode].u, v->tmu[0].reg[textureMode].u, 0)
5932RASTERIZER(generic_1tmu, 1, vd->reg[fbzColorPath].u, vd->reg[fbzMode].u, vd->reg[alphaMode].u,
5933         vd->reg[fogMode].u, vd->tmu[0].reg[textureMode].u, 0)
60115934
60125935
60135936/*-------------------------------------------------
60145937    generic_2tmu - generic rasterizer for 2 TMUs
60155938-------------------------------------------------*/
60165939
6017RASTERIZER(generic_2tmu, 2, v->reg[fbzColorPath].u, v->reg[fbzMode].u, v->reg[alphaMode].u,
6018         v->reg[fogMode].u, v->tmu[0].reg[textureMode].u, v->tmu[1].reg[textureMode].u)
5940RASTERIZER(generic_2tmu, 2, vd->reg[fbzColorPath].u, vd->reg[fbzMode].u, vd->reg[alphaMode].u,
5941         vd->reg[fogMode].u, vd->tmu[0].reg[textureMode].u, vd->tmu[1].reg[textureMode].u)
trunk/src/devices/video/voodoo.h
r253153r253154
1111#ifndef __VOODOO_H__
1212#define __VOODOO_H__
1313
14#include "video/polylgcy.h"
15
1416#pragma once
1517
1618
19/*************************************
20 *
21 *  Misc. constants
22 *
23 *************************************/
1724
25/* enumeration describing reasons we might be stalled */
26enum
27{
28   NOT_STALLED = 0,
29   STALLED_UNTIL_FIFO_LWM,
30   STALLED_UNTIL_FIFO_EMPTY
31};
32
33
34
35// Use old table lookup versus straight double divide
36#define USE_FAST_RECIP  0
37
38/* maximum number of TMUs */
39#define MAX_TMU                 2
40
41/* accumulate operations less than this number of clocks */
42#define ACCUMULATE_THRESHOLD    0
43
44/* number of clocks to set up a triangle (just a guess) */
45#define TRIANGLE_SETUP_CLOCKS   100
46
47/* maximum number of rasterizers */
48#define MAX_RASTERIZERS         1024
49
50/* size of the rasterizer hash table */
51#define RASTER_HASH_SIZE        97
52
53/* flags for LFB writes */
54#define LFB_RGB_PRESENT         1
55#define LFB_ALPHA_PRESENT       2
56#define LFB_DEPTH_PRESENT       4
57#define LFB_DEPTH_PRESENT_MSW   8
58
59/* flags for the register access array */
60#define REGISTER_READ           0x01        /* reads are allowed */
61#define REGISTER_WRITE          0x02        /* writes are allowed */
62#define REGISTER_PIPELINED      0x04        /* writes are pipelined */
63#define REGISTER_FIFO           0x08        /* writes go to FIFO */
64#define REGISTER_WRITETHRU      0x10        /* writes are valid even for CMDFIFO */
65
66/* shorter combinations to make the table smaller */
67#define REG_R                   (REGISTER_READ)
68#define REG_W                   (REGISTER_WRITE)
69#define REG_WT                  (REGISTER_WRITE | REGISTER_WRITETHRU)
70#define REG_RW                  (REGISTER_READ | REGISTER_WRITE)
71#define REG_RWT                 (REGISTER_READ | REGISTER_WRITE | REGISTER_WRITETHRU)
72#define REG_RP                  (REGISTER_READ | REGISTER_PIPELINED)
73#define REG_WP                  (REGISTER_WRITE | REGISTER_PIPELINED)
74#define REG_RWP                 (REGISTER_READ | REGISTER_WRITE | REGISTER_PIPELINED)
75#define REG_RWPT                (REGISTER_READ | REGISTER_WRITE | REGISTER_PIPELINED | REGISTER_WRITETHRU)
76#define REG_RF                  (REGISTER_READ | REGISTER_FIFO)
77#define REG_WF                  (REGISTER_WRITE | REGISTER_FIFO)
78#define REG_RWF                 (REGISTER_READ | REGISTER_WRITE | REGISTER_FIFO)
79#define REG_RPF                 (REGISTER_READ | REGISTER_PIPELINED | REGISTER_FIFO)
80#define REG_WPF                 (REGISTER_WRITE | REGISTER_PIPELINED | REGISTER_FIFO)
81#define REG_RWPF                (REGISTER_READ | REGISTER_WRITE | REGISTER_PIPELINED | REGISTER_FIFO)
82
83/* lookup bits is the log2 of the size of the reciprocal/log table */
84#define RECIPLOG_LOOKUP_BITS    9
85
86/* input precision is how many fraction bits the input value has; this is a 64-bit number */
87#define RECIPLOG_INPUT_PREC     32
88
89/* lookup precision is how many fraction bits each table entry contains */
90#define RECIPLOG_LOOKUP_PREC    22
91
92/* output precision is how many fraction bits the result should have */
93#define RECIP_OUTPUT_PREC       15
94#define LOG_OUTPUT_PREC         8
95
96
97
98/*************************************
99 *
100 *  Register constants
101 *
102 *************************************/
103
104/* Codes to the right:
105    R = readable
106    W = writeable
107    P = pipelined
108    F = goes to FIFO
109*/
110
111/* 0x000 */
112#define vdstatus        (0x000/4)   /* R  P  */
113#define intrCtrl        (0x004/4)   /* RW P   -- Voodoo2/Banshee only */
114#define vertexAx        (0x008/4)   /*  W PF */
115#define vertexAy        (0x00c/4)   /*  W PF */
116#define vertexBx        (0x010/4)   /*  W PF */
117#define vertexBy        (0x014/4)   /*  W PF */
118#define vertexCx        (0x018/4)   /*  W PF */
119#define vertexCy        (0x01c/4)   /*  W PF */
120#define startR          (0x020/4)   /*  W PF */
121#define startG          (0x024/4)   /*  W PF */
122#define startB          (0x028/4)   /*  W PF */
123#define startZ          (0x02c/4)   /*  W PF */
124#define startA          (0x030/4)   /*  W PF */
125#define startS          (0x034/4)   /*  W PF */
126#define startT          (0x038/4)   /*  W PF */
127#define startW          (0x03c/4)   /*  W PF */
128
129/* 0x040 */
130#define dRdX            (0x040/4)   /*  W PF */
131#define dGdX            (0x044/4)   /*  W PF */
132#define dBdX            (0x048/4)   /*  W PF */
133#define dZdX            (0x04c/4)   /*  W PF */
134#define dAdX            (0x050/4)   /*  W PF */
135#define dSdX            (0x054/4)   /*  W PF */
136#define dTdX            (0x058/4)   /*  W PF */
137#define dWdX            (0x05c/4)   /*  W PF */
138#define dRdY            (0x060/4)   /*  W PF */
139#define dGdY            (0x064/4)   /*  W PF */
140#define dBdY            (0x068/4)   /*  W PF */
141#define dZdY            (0x06c/4)   /*  W PF */
142#define dAdY            (0x070/4)   /*  W PF */
143#define dSdY            (0x074/4)   /*  W PF */
144#define dTdY            (0x078/4)   /*  W PF */
145#define dWdY            (0x07c/4)   /*  W PF */
146
147/* 0x080 */
148#define triangleCMD     (0x080/4)   /*  W PF */
149#define fvertexAx       (0x088/4)   /*  W PF */
150#define fvertexAy       (0x08c/4)   /*  W PF */
151#define fvertexBx       (0x090/4)   /*  W PF */
152#define fvertexBy       (0x094/4)   /*  W PF */
153#define fvertexCx       (0x098/4)   /*  W PF */
154#define fvertexCy       (0x09c/4)   /*  W PF */
155#define fstartR         (0x0a0/4)   /*  W PF */
156#define fstartG         (0x0a4/4)   /*  W PF */
157#define fstartB         (0x0a8/4)   /*  W PF */
158#define fstartZ         (0x0ac/4)   /*  W PF */
159#define fstartA         (0x0b0/4)   /*  W PF */
160#define fstartS         (0x0b4/4)   /*  W PF */
161#define fstartT         (0x0b8/4)   /*  W PF */
162#define fstartW         (0x0bc/4)   /*  W PF */
163
164/* 0x0c0 */
165#define fdRdX           (0x0c0/4)   /*  W PF */
166#define fdGdX           (0x0c4/4)   /*  W PF */
167#define fdBdX           (0x0c8/4)   /*  W PF */
168#define fdZdX           (0x0cc/4)   /*  W PF */
169#define fdAdX           (0x0d0/4)   /*  W PF */
170#define fdSdX           (0x0d4/4)   /*  W PF */
171#define fdTdX           (0x0d8/4)   /*  W PF */
172#define fdWdX           (0x0dc/4)   /*  W PF */
173#define fdRdY           (0x0e0/4)   /*  W PF */
174#define fdGdY           (0x0e4/4)   /*  W PF */
175#define fdBdY           (0x0e8/4)   /*  W PF */
176#define fdZdY           (0x0ec/4)   /*  W PF */
177#define fdAdY           (0x0f0/4)   /*  W PF */
178#define fdSdY           (0x0f4/4)   /*  W PF */
179#define fdTdY           (0x0f8/4)   /*  W PF */
180#define fdWdY           (0x0fc/4)   /*  W PF */
181
182/* 0x100 */
183#define ftriangleCMD    (0x100/4)   /*  W PF */
184#define fbzColorPath    (0x104/4)   /* RW PF */
185#define fogMode         (0x108/4)   /* RW PF */
186#define alphaMode       (0x10c/4)   /* RW PF */
187#define fbzMode         (0x110/4)   /* RW  F */
188#define lfbMode         (0x114/4)   /* RW  F */
189#define clipLeftRight   (0x118/4)   /* RW  F */
190#define clipLowYHighY   (0x11c/4)   /* RW  F */
191#define nopCMD          (0x120/4)   /*  W  F */
192#define fastfillCMD     (0x124/4)   /*  W  F */
193#define swapbufferCMD   (0x128/4)   /*  W  F */
194#define fogColor        (0x12c/4)   /*  W  F */
195#define zaColor         (0x130/4)   /*  W  F */
196#define chromaKey       (0x134/4)   /*  W  F */
197#define chromaRange     (0x138/4)   /*  W  F  -- Voodoo2/Banshee only */
198#define userIntrCMD     (0x13c/4)   /*  W  F  -- Voodoo2/Banshee only */
199
200/* 0x140 */
201#define stipple         (0x140/4)   /* RW  F */
202#define color0          (0x144/4)   /* RW  F */
203#define color1          (0x148/4)   /* RW  F */
204#define fbiPixelsIn     (0x14c/4)   /* R     */
205#define fbiChromaFail   (0x150/4)   /* R     */
206#define fbiZfuncFail    (0x154/4)   /* R     */
207#define fbiAfuncFail    (0x158/4)   /* R     */
208#define fbiPixelsOut    (0x15c/4)   /* R     */
209#define fogTable        (0x160/4)   /*  W  F */
210
211/* 0x1c0 */
212#define cmdFifoBaseAddr (0x1e0/4)   /* RW     -- Voodoo2 only */
213#define cmdFifoBump     (0x1e4/4)   /* RW     -- Voodoo2 only */
214#define cmdFifoRdPtr    (0x1e8/4)   /* RW     -- Voodoo2 only */
215#define cmdFifoAMin     (0x1ec/4)   /* RW     -- Voodoo2 only */
216#define colBufferAddr   (0x1ec/4)   /* RW     -- Banshee only */
217#define cmdFifoAMax     (0x1f0/4)   /* RW     -- Voodoo2 only */
218#define colBufferStride (0x1f0/4)   /* RW     -- Banshee only */
219#define cmdFifoDepth    (0x1f4/4)   /* RW     -- Voodoo2 only */
220#define auxBufferAddr   (0x1f4/4)   /* RW     -- Banshee only */
221#define cmdFifoHoles    (0x1f8/4)   /* RW     -- Voodoo2 only */
222#define auxBufferStride (0x1f8/4)   /* RW     -- Banshee only */
223
224/* 0x200 */
225#define fbiInit4        (0x200/4)   /* RW     -- Voodoo/Voodoo2 only */
226#define clipLeftRight1  (0x200/4)   /* RW     -- Banshee only */
227#define vRetrace        (0x204/4)   /* R      -- Voodoo/Voodoo2 only */
228#define clipTopBottom1  (0x204/4)   /* RW     -- Banshee only */
229#define backPorch       (0x208/4)   /* RW     -- Voodoo/Voodoo2 only */
230#define videoDimensions (0x20c/4)   /* RW     -- Voodoo/Voodoo2 only */
231#define fbiInit0        (0x210/4)   /* RW     -- Voodoo/Voodoo2 only */
232#define fbiInit1        (0x214/4)   /* RW     -- Voodoo/Voodoo2 only */
233#define fbiInit2        (0x218/4)   /* RW     -- Voodoo/Voodoo2 only */
234#define fbiInit3        (0x21c/4)   /* RW     -- Voodoo/Voodoo2 only */
235#define hSync           (0x220/4)   /*  W     -- Voodoo/Voodoo2 only */
236#define vSync           (0x224/4)   /*  W     -- Voodoo/Voodoo2 only */
237#define clutData        (0x228/4)   /*  W  F  -- Voodoo/Voodoo2 only */
238#define dacData         (0x22c/4)   /*  W     -- Voodoo/Voodoo2 only */
239#define maxRgbDelta     (0x230/4)   /*  W     -- Voodoo/Voodoo2 only */
240#define hBorder         (0x234/4)   /*  W     -- Voodoo2 only */
241#define vBorder         (0x238/4)   /*  W     -- Voodoo2 only */
242#define borderColor     (0x23c/4)   /*  W     -- Voodoo2 only */
243
244/* 0x240 */
245#define hvRetrace       (0x240/4)   /* R      -- Voodoo2 only */
246#define fbiInit5        (0x244/4)   /* RW     -- Voodoo2 only */
247#define fbiInit6        (0x248/4)   /* RW     -- Voodoo2 only */
248#define fbiInit7        (0x24c/4)   /* RW     -- Voodoo2 only */
249#define swapPending     (0x24c/4)   /*  W     -- Banshee only */
250#define leftOverlayBuf  (0x250/4)   /*  W     -- Banshee only */
251#define rightOverlayBuf (0x254/4)   /*  W     -- Banshee only */
252#define fbiSwapHistory  (0x258/4)   /* R      -- Voodoo2/Banshee only */
253#define fbiTrianglesOut (0x25c/4)   /* R      -- Voodoo2/Banshee only */
254#define sSetupMode      (0x260/4)   /*  W PF  -- Voodoo2/Banshee only */
255#define sVx             (0x264/4)   /*  W PF  -- Voodoo2/Banshee only */
256#define sVy             (0x268/4)   /*  W PF  -- Voodoo2/Banshee only */
257#define sARGB           (0x26c/4)   /*  W PF  -- Voodoo2/Banshee only */
258#define sRed            (0x270/4)   /*  W PF  -- Voodoo2/Banshee only */
259#define sGreen          (0x274/4)   /*  W PF  -- Voodoo2/Banshee only */
260#define sBlue           (0x278/4)   /*  W PF  -- Voodoo2/Banshee only */
261#define sAlpha          (0x27c/4)   /*  W PF  -- Voodoo2/Banshee only */
262
263/* 0x280 */
264#define sVz             (0x280/4)   /*  W PF  -- Voodoo2/Banshee only */
265#define sWb             (0x284/4)   /*  W PF  -- Voodoo2/Banshee only */
266#define sWtmu0          (0x288/4)   /*  W PF  -- Voodoo2/Banshee only */
267#define sS_W0           (0x28c/4)   /*  W PF  -- Voodoo2/Banshee only */
268#define sT_W0           (0x290/4)   /*  W PF  -- Voodoo2/Banshee only */
269#define sWtmu1          (0x294/4)   /*  W PF  -- Voodoo2/Banshee only */
270#define sS_Wtmu1        (0x298/4)   /*  W PF  -- Voodoo2/Banshee only */
271#define sT_Wtmu1        (0x29c/4)   /*  W PF  -- Voodoo2/Banshee only */
272#define sDrawTriCMD     (0x2a0/4)   /*  W PF  -- Voodoo2/Banshee only */
273#define sBeginTriCMD    (0x2a4/4)   /*  W PF  -- Voodoo2/Banshee only */
274
275/* 0x2c0 */
276#define bltSrcBaseAddr  (0x2c0/4)   /* RW PF  -- Voodoo2 only */
277#define bltDstBaseAddr  (0x2c4/4)   /* RW PF  -- Voodoo2 only */
278#define bltXYStrides    (0x2c8/4)   /* RW PF  -- Voodoo2 only */
279#define bltSrcChromaRange (0x2cc/4) /* RW PF  -- Voodoo2 only */
280#define bltDstChromaRange (0x2d0/4) /* RW PF  -- Voodoo2 only */
281#define bltClipX        (0x2d4/4)   /* RW PF  -- Voodoo2 only */
282#define bltClipY        (0x2d8/4)   /* RW PF  -- Voodoo2 only */
283#define bltSrcXY        (0x2e0/4)   /* RW PF  -- Voodoo2 only */
284#define bltDstXY        (0x2e4/4)   /* RW PF  -- Voodoo2 only */
285#define bltSize         (0x2e8/4)   /* RW PF  -- Voodoo2 only */
286#define bltRop          (0x2ec/4)   /* RW PF  -- Voodoo2 only */
287#define bltColor        (0x2f0/4)   /* RW PF  -- Voodoo2 only */
288#define bltCommand      (0x2f8/4)   /* RW PF  -- Voodoo2 only */
289#define bltData         (0x2fc/4)   /*  W PF  -- Voodoo2 only */
290
291/* 0x300 */
292#define textureMode     (0x300/4)   /*  W PF */
293#define tLOD            (0x304/4)   /*  W PF */
294#define tDetail         (0x308/4)   /*  W PF */
295#define texBaseAddr     (0x30c/4)   /*  W PF */
296#define texBaseAddr_1   (0x310/4)   /*  W PF */
297#define texBaseAddr_2   (0x314/4)   /*  W PF */
298#define texBaseAddr_3_8 (0x318/4)   /*  W PF */
299#define trexInit0       (0x31c/4)   /*  W  F  -- Voodoo/Voodoo2 only */
300#define trexInit1       (0x320/4)   /*  W  F */
301#define nccTable        (0x324/4)   /*  W  F */
302
303
304
305// 2D registers
306#define banshee2D_clip0Min          (0x008/4)
307#define banshee2D_clip0Max          (0x00c/4)
308#define banshee2D_dstBaseAddr       (0x010/4)
309#define banshee2D_dstFormat         (0x014/4)
310#define banshee2D_srcColorkeyMin    (0x018/4)
311#define banshee2D_srcColorkeyMax    (0x01c/4)
312#define banshee2D_dstColorkeyMin    (0x020/4)
313#define banshee2D_dstColorkeyMax    (0x024/4)
314#define banshee2D_bresError0        (0x028/4)
315#define banshee2D_bresError1        (0x02c/4)
316#define banshee2D_rop               (0x030/4)
317#define banshee2D_srcBaseAddr       (0x034/4)
318#define banshee2D_commandExtra      (0x038/4)
319#define banshee2D_lineStipple       (0x03c/4)
320#define banshee2D_lineStyle         (0x040/4)
321#define banshee2D_pattern0Alias     (0x044/4)
322#define banshee2D_pattern1Alias     (0x048/4)
323#define banshee2D_clip1Min          (0x04c/4)
324#define banshee2D_clip1Max          (0x050/4)
325#define banshee2D_srcFormat         (0x054/4)
326#define banshee2D_srcSize           (0x058/4)
327#define banshee2D_srcXY             (0x05c/4)
328#define banshee2D_colorBack         (0x060/4)
329#define banshee2D_colorFore         (0x064/4)
330#define banshee2D_dstSize           (0x068/4)
331#define banshee2D_dstXY             (0x06c/4)
332#define banshee2D_command           (0x070/4)
333
334
335/*************************************
336 *
337 *  Alias map of the first 64
338 *  registers when remapped
339 *
340 *************************************/
341
342static const UINT8 register_alias_map[0x40] =
343{
344   vdstatus,     0x004/4,    vertexAx,   vertexAy,
345   vertexBx,   vertexBy,   vertexCx,   vertexCy,
346   startR,     dRdX,       dRdY,       startG,
347   dGdX,       dGdY,       startB,     dBdX,
348   dBdY,       startZ,     dZdX,       dZdY,
349   startA,     dAdX,       dAdY,       startS,
350   dSdX,       dSdY,       startT,     dTdX,
351   dTdY,       startW,     dWdX,       dWdY,
352
353   triangleCMD,0x084/4,    fvertexAx,  fvertexAy,
354   fvertexBx,  fvertexBy,  fvertexCx,  fvertexCy,
355   fstartR,    fdRdX,      fdRdY,      fstartG,
356   fdGdX,      fdGdY,      fstartB,    fdBdX,
357   fdBdY,      fstartZ,    fdZdX,      fdZdY,
358   fstartA,    fdAdX,      fdAdY,      fstartS,
359   fdSdX,      fdSdY,      fstartT,    fdTdX,
360   fdTdY,      fstartW,    fdWdX,      fdWdY
361};
362
363
364
365/*************************************
366 *
367 *  Table of per-register access rights
368 *
369 *************************************/
370
371static const UINT8 voodoo_register_access[0x100] =
372{
373   /* 0x000 */
374   REG_RP,     0,          REG_WPF,    REG_WPF,
375   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
376   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
377   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
378
379   /* 0x040 */
380   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
381   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
382   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
383   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
384
385   /* 0x080 */
386   REG_WPF,    0,          REG_WPF,    REG_WPF,
387   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
388   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
389   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
390
391   /* 0x0c0 */
392   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
393   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
394   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
395   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
396
397   /* 0x100 */
398   REG_WPF,    REG_RWPF,   REG_RWPF,   REG_RWPF,
399   REG_RWF,    REG_RWF,    REG_RWF,    REG_RWF,
400   REG_WF,     REG_WF,     REG_WF,     REG_WF,
401   REG_WF,     REG_WF,     0,          0,
402
403   /* 0x140 */
404   REG_RWF,    REG_RWF,    REG_RWF,    REG_R,
405   REG_R,      REG_R,      REG_R,      REG_R,
406   REG_WF,     REG_WF,     REG_WF,     REG_WF,
407   REG_WF,     REG_WF,     REG_WF,     REG_WF,
408
409   /* 0x180 */
410   REG_WF,     REG_WF,     REG_WF,     REG_WF,
411   REG_WF,     REG_WF,     REG_WF,     REG_WF,
412   REG_WF,     REG_WF,     REG_WF,     REG_WF,
413   REG_WF,     REG_WF,     REG_WF,     REG_WF,
414
415   /* 0x1c0 */
416   REG_WF,     REG_WF,     REG_WF,     REG_WF,
417   REG_WF,     REG_WF,     REG_WF,     REG_WF,
418   0,          0,          0,          0,
419   0,          0,          0,          0,
420
421   /* 0x200 */
422   REG_RW,     REG_R,      REG_RW,     REG_RW,
423   REG_RW,     REG_RW,     REG_RW,     REG_RW,
424   REG_W,      REG_W,      REG_W,      REG_W,
425   REG_W,      0,          0,          0,
426
427   /* 0x240 */
428   0,          0,          0,          0,
429   0,          0,          0,          0,
430   0,          0,          0,          0,
431   0,          0,          0,          0,
432
433   /* 0x280 */
434   0,          0,          0,          0,
435   0,          0,          0,          0,
436   0,          0,          0,          0,
437   0,          0,          0,          0,
438
439   /* 0x2c0 */
440   0,          0,          0,          0,
441   0,          0,          0,          0,
442   0,          0,          0,          0,
443   0,          0,          0,          0,
444
445   /* 0x300 */
446   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
447   REG_WPF,    REG_WPF,    REG_WPF,    REG_WF,
448   REG_WF,     REG_WF,     REG_WF,     REG_WF,
449   REG_WF,     REG_WF,     REG_WF,     REG_WF,
450
451   /* 0x340 */
452   REG_WF,     REG_WF,     REG_WF,     REG_WF,
453   REG_WF,     REG_WF,     REG_WF,     REG_WF,
454   REG_WF,     REG_WF,     REG_WF,     REG_WF,
455   REG_WF,     REG_WF,     REG_WF,     REG_WF,
456
457   /* 0x380 */
458   REG_WF
459};
460
461
462static const UINT8 voodoo2_register_access[0x100] =
463{
464   /* 0x000 */
465   REG_RP,     REG_RWPT,   REG_WPF,    REG_WPF,
466   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
467   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
468   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
469
470   /* 0x040 */
471   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
472   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
473   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
474   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
475
476   /* 0x080 */
477   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
478   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
479   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
480   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
481
482   /* 0x0c0 */
483   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
484   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
485   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
486   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
487
488   /* 0x100 */
489   REG_WPF,    REG_RWPF,   REG_RWPF,   REG_RWPF,
490   REG_RWF,    REG_RWF,    REG_RWF,    REG_RWF,
491   REG_WF,     REG_WF,     REG_WF,     REG_WF,
492   REG_WF,     REG_WF,     REG_WF,     REG_WF,
493
494   /* 0x140 */
495   REG_RWF,    REG_RWF,    REG_RWF,    REG_R,
496   REG_R,      REG_R,      REG_R,      REG_R,
497   REG_WF,     REG_WF,     REG_WF,     REG_WF,
498   REG_WF,     REG_WF,     REG_WF,     REG_WF,
499
500   /* 0x180 */
501   REG_WF,     REG_WF,     REG_WF,     REG_WF,
502   REG_WF,     REG_WF,     REG_WF,     REG_WF,
503   REG_WF,     REG_WF,     REG_WF,     REG_WF,
504   REG_WF,     REG_WF,     REG_WF,     REG_WF,
505
506   /* 0x1c0 */
507   REG_WF,     REG_WF,     REG_WF,     REG_WF,
508   REG_WF,     REG_WF,     REG_WF,     REG_WF,
509   REG_RWT,    REG_RWT,    REG_RWT,    REG_RWT,
510   REG_RWT,    REG_RWT,    REG_RWT,    REG_RW,
511
512   /* 0x200 */
513   REG_RWT,    REG_R,      REG_RWT,    REG_RWT,
514   REG_RWT,    REG_RWT,    REG_RWT,    REG_RWT,
515   REG_WT,     REG_WT,     REG_WF,     REG_WT,
516   REG_WT,     REG_WT,     REG_WT,     REG_WT,
517
518   /* 0x240 */
519   REG_R,      REG_RWT,    REG_RWT,    REG_RWT,
520   0,          0,          REG_R,      REG_R,
521   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
522   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
523
524   /* 0x280 */
525   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
526   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
527   REG_WPF,    REG_WPF,    0,          0,
528   0,          0,          0,          0,
529
530   /* 0x2c0 */
531   REG_RWPF,   REG_RWPF,   REG_RWPF,   REG_RWPF,
532   REG_RWPF,   REG_RWPF,   REG_RWPF,   REG_RWPF,
533   REG_RWPF,   REG_RWPF,   REG_RWPF,   REG_RWPF,
534   REG_RWPF,   REG_RWPF,   REG_RWPF,   REG_WPF,
535
536   /* 0x300 */
537   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
538   REG_WPF,    REG_WPF,    REG_WPF,    REG_WF,
539   REG_WF,     REG_WF,     REG_WF,     REG_WF,
540   REG_WF,     REG_WF,     REG_WF,     REG_WF,
541
542   /* 0x340 */
543   REG_WF,     REG_WF,     REG_WF,     REG_WF,
544   REG_WF,     REG_WF,     REG_WF,     REG_WF,
545   REG_WF,     REG_WF,     REG_WF,     REG_WF,
546   REG_WF,     REG_WF,     REG_WF,     REG_WF,
547
548   /* 0x380 */
549   REG_WF
550};
551
552
553static const UINT8 banshee_register_access[0x100] =
554{
555   /* 0x000 */
556   REG_RP,     REG_RWPT,   REG_WPF,    REG_WPF,
557   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
558   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
559   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
560
561   /* 0x040 */
562   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
563   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
564   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
565   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
566
567   /* 0x080 */
568   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
569   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
570   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
571   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
572
573   /* 0x0c0 */
574   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
575   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
576   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
577   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
578
579   /* 0x100 */
580   REG_WPF,    REG_RWPF,   REG_RWPF,   REG_RWPF,
581   REG_RWF,    REG_RWF,    REG_RWF,    REG_RWF,
582   REG_WF,     REG_WF,     REG_WF,     REG_WF,
583   REG_WF,     REG_WF,     REG_WF,     REG_WF,
584
585   /* 0x140 */
586   REG_RWF,    REG_RWF,    REG_RWF,    REG_R,
587   REG_R,      REG_R,      REG_R,      REG_R,
588   REG_WF,     REG_WF,     REG_WF,     REG_WF,
589   REG_WF,     REG_WF,     REG_WF,     REG_WF,
590
591   /* 0x180 */
592   REG_WF,     REG_WF,     REG_WF,     REG_WF,
593   REG_WF,     REG_WF,     REG_WF,     REG_WF,
594   REG_WF,     REG_WF,     REG_WF,     REG_WF,
595   REG_WF,     REG_WF,     REG_WF,     REG_WF,
596
597   /* 0x1c0 */
598   REG_WF,     REG_WF,     REG_WF,     REG_WF,
599   REG_WF,     REG_WF,     REG_WF,     REG_WF,
600   0,          0,          0,          REG_RWF,
601   REG_RWF,    REG_RWF,    REG_RWF,    0,
602
603   /* 0x200 */
604   REG_RWF,    REG_RWF,    0,          0,
605   0,          0,          0,          0,
606   0,          0,          0,          0,
607   0,          0,          0,          0,
608
609   /* 0x240 */
610   0,          0,          0,          REG_WT,
611   REG_RWF,    REG_RWF,    REG_WPF,    REG_WPF,
612   REG_WPF,    REG_WPF,    REG_R,      REG_R,
613   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
614
615   /* 0x280 */
616   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
617   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
618   REG_WPF,    REG_WPF,    0,          0,
619   0,          0,          0,          0,
620
621   /* 0x2c0 */
622   0,          0,          0,          0,
623   0,          0,          0,          0,
624   0,          0,          0,          0,
625   0,          0,          0,          0,
626
627   /* 0x300 */
628   REG_WPF,    REG_WPF,    REG_WPF,    REG_WPF,
629   REG_WPF,    REG_WPF,    REG_WPF,    0,
630   REG_WF,     REG_WF,     REG_WF,     REG_WF,
631   REG_WF,     REG_WF,     REG_WF,     REG_WF,
632
633   /* 0x340 */
634   REG_WF,     REG_WF,     REG_WF,     REG_WF,
635   REG_WF,     REG_WF,     REG_WF,     REG_WF,
636   REG_WF,     REG_WF,     REG_WF,     REG_WF,
637   REG_WF,     REG_WF,     REG_WF,     REG_WF,
638
639   /* 0x380 */
640   REG_WF
641};
642
643
644
645/*************************************
646 *
647 *  Register string table for debug
648 *
649 *************************************/
650
651static const char *const voodoo_reg_name[] =
652{
653   /* 0x000 */
654   "status",       "{intrCtrl}",   "vertexAx",     "vertexAy",
655   "vertexBx",     "vertexBy",     "vertexCx",     "vertexCy",
656   "startR",       "startG",       "startB",       "startZ",
657   "startA",       "startS",       "startT",       "startW",
658   /* 0x040 */
659   "dRdX",         "dGdX",         "dBdX",         "dZdX",
660   "dAdX",         "dSdX",         "dTdX",         "dWdX",
661   "dRdY",         "dGdY",         "dBdY",         "dZdY",
662   "dAdY",         "dSdY",         "dTdY",         "dWdY",
663   /* 0x080 */
664   "triangleCMD",  "reserved084",  "fvertexAx",    "fvertexAy",
665   "fvertexBx",    "fvertexBy",    "fvertexCx",    "fvertexCy",
666   "fstartR",      "fstartG",      "fstartB",      "fstartZ",
667   "fstartA",      "fstartS",      "fstartT",      "fstartW",
668   /* 0x0c0 */
669   "fdRdX",        "fdGdX",        "fdBdX",        "fdZdX",
670   "fdAdX",        "fdSdX",        "fdTdX",        "fdWdX",
671   "fdRdY",        "fdGdY",        "fdBdY",        "fdZdY",
672   "fdAdY",        "fdSdY",        "fdTdY",        "fdWdY",
673   /* 0x100 */
674   "ftriangleCMD", "fbzColorPath", "fogMode",      "alphaMode",
675   "fbzMode",      "lfbMode",      "clipLeftRight","clipLowYHighY",
676   "nopCMD",       "fastfillCMD",  "swapbufferCMD","fogColor",
677   "zaColor",      "chromaKey",    "{chromaRange}","{userIntrCMD}",
678   /* 0x140 */
679   "stipple",      "color0",       "color1",       "fbiPixelsIn",
680   "fbiChromaFail","fbiZfuncFail", "fbiAfuncFail", "fbiPixelsOut",
681   "fogTable160",  "fogTable164",  "fogTable168",  "fogTable16c",
682   "fogTable170",  "fogTable174",  "fogTable178",  "fogTable17c",
683   /* 0x180 */
684   "fogTable180",  "fogTable184",  "fogTable188",  "fogTable18c",
685   "fogTable190",  "fogTable194",  "fogTable198",  "fogTable19c",
686   "fogTable1a0",  "fogTable1a4",  "fogTable1a8",  "fogTable1ac",
687   "fogTable1b0",  "fogTable1b4",  "fogTable1b8",  "fogTable1bc",
688   /* 0x1c0 */
689   "fogTable1c0",  "fogTable1c4",  "fogTable1c8",  "fogTable1cc",
690   "fogTable1d0",  "fogTable1d4",  "fogTable1d8",  "fogTable1dc",
691   "{cmdFifoBaseAddr}","{cmdFifoBump}","{cmdFifoRdPtr}","{cmdFifoAMin}",
692   "{cmdFifoAMax}","{cmdFifoDepth}","{cmdFifoHoles}","reserved1fc",
693   /* 0x200 */
694   "fbiInit4",     "vRetrace",     "backPorch",    "videoDimensions",
695   "fbiInit0",     "fbiInit1",     "fbiInit2",     "fbiInit3",
696   "hSync",        "vSync",        "clutData",     "dacData",
697   "maxRgbDelta",  "{hBorder}",    "{vBorder}",    "{borderColor}",
698   /* 0x240 */
699   "{hvRetrace}",  "{fbiInit5}",   "{fbiInit6}",   "{fbiInit7}",
700   "reserved250",  "reserved254",  "{fbiSwapHistory}","{fbiTrianglesOut}",
701   "{sSetupMode}", "{sVx}",        "{sVy}",        "{sARGB}",
702   "{sRed}",       "{sGreen}",     "{sBlue}",      "{sAlpha}",
703   /* 0x280 */
704   "{sVz}",        "{sWb}",        "{sWtmu0}",     "{sS/Wtmu0}",
705   "{sT/Wtmu0}",   "{sWtmu1}",     "{sS/Wtmu1}",   "{sT/Wtmu1}",
706   "{sDrawTriCMD}","{sBeginTriCMD}","reserved2a8", "reserved2ac",
707   "reserved2b0",  "reserved2b4",  "reserved2b8",  "reserved2bc",
708   /* 0x2c0 */
709   "{bltSrcBaseAddr}","{bltDstBaseAddr}","{bltXYStrides}","{bltSrcChromaRange}",
710   "{bltDstChromaRange}","{bltClipX}","{bltClipY}","reserved2dc",
711   "{bltSrcXY}",   "{bltDstXY}",   "{bltSize}",    "{bltRop}",
712   "{bltColor}",   "reserved2f4",  "{bltCommand}", "{bltData}",
713   /* 0x300 */
714   "textureMode",  "tLOD",         "tDetail",      "texBaseAddr",
715   "texBaseAddr_1","texBaseAddr_2","texBaseAddr_3_8","trexInit0",
716   "trexInit1",    "nccTable0.0",  "nccTable0.1",  "nccTable0.2",
717   "nccTable0.3",  "nccTable0.4",  "nccTable0.5",  "nccTable0.6",
718   /* 0x340 */
719   "nccTable0.7",  "nccTable0.8",  "nccTable0.9",  "nccTable0.A",
720   "nccTable0.B",  "nccTable1.0",  "nccTable1.1",  "nccTable1.2",
721   "nccTable1.3",  "nccTable1.4",  "nccTable1.5",  "nccTable1.6",
722   "nccTable1.7",  "nccTable1.8",  "nccTable1.9",  "nccTable1.A",
723   /* 0x380 */
724   "nccTable1.B"
725};
726
727
728static const char *const banshee_reg_name[] =
729{
730   /* 0x000 */
731   "status",       "intrCtrl",     "vertexAx",     "vertexAy",
732   "vertexBx",     "vertexBy",     "vertexCx",     "vertexCy",
733   "startR",       "startG",       "startB",       "startZ",
734   "startA",       "startS",       "startT",       "startW",
735   /* 0x040 */
736   "dRdX",         "dGdX",         "dBdX",         "dZdX",
737   "dAdX",         "dSdX",         "dTdX",         "dWdX",
738   "dRdY",         "dGdY",         "dBdY",         "dZdY",
739   "dAdY",         "dSdY",         "dTdY",         "dWdY",
740   /* 0x080 */
741   "triangleCMD",  "reserved084",  "fvertexAx",    "fvertexAy",
742   "fvertexBx",    "fvertexBy",    "fvertexCx",    "fvertexCy",
743   "fstartR",      "fstartG",      "fstartB",      "fstartZ",
744   "fstartA",      "fstartS",      "fstartT",      "fstartW",
745   /* 0x0c0 */
746   "fdRdX",        "fdGdX",        "fdBdX",        "fdZdX",
747   "fdAdX",        "fdSdX",        "fdTdX",        "fdWdX",
748   "fdRdY",        "fdGdY",        "fdBdY",        "fdZdY",
749   "fdAdY",        "fdSdY",        "fdTdY",        "fdWdY",
750   /* 0x100 */
751   "ftriangleCMD", "fbzColorPath", "fogMode",      "alphaMode",
752   "fbzMode",      "lfbMode",      "clipLeftRight","clipLowYHighY",
753   "nopCMD",       "fastfillCMD",  "swapbufferCMD","fogColor",
754   "zaColor",      "chromaKey",    "chromaRange",  "userIntrCMD",
755   /* 0x140 */
756   "stipple",      "color0",       "color1",       "fbiPixelsIn",
757   "fbiChromaFail","fbiZfuncFail", "fbiAfuncFail", "fbiPixelsOut",
758   "fogTable160",  "fogTable164",  "fogTable168",  "fogTable16c",
759   "fogTable170",  "fogTable174",  "fogTable178",  "fogTable17c",
760   /* 0x180 */
761   "fogTable180",  "fogTable184",  "fogTable188",  "fogTable18c",
762   "fogTable190",  "fogTable194",  "fogTable198",  "fogTable19c",
763   "fogTable1a0",  "fogTable1a4",  "fogTable1a8",  "fogTable1ac",
764   "fogTable1b0",  "fogTable1b4",  "fogTable1b8",  "fogTable1bc",
765   /* 0x1c0 */
766   "fogTable1c0",  "fogTable1c4",  "fogTable1c8",  "fogTable1cc",
767   "fogTable1d0",  "fogTable1d4",  "fogTable1d8",  "fogTable1dc",
768   "reserved1e0",  "reserved1e4",  "reserved1e8",  "colBufferAddr",
769   "colBufferStride","auxBufferAddr","auxBufferStride","reserved1fc",
770   /* 0x200 */
771   "clipLeftRight1","clipTopBottom1","reserved208","reserved20c",
772   "reserved210",  "reserved214",  "reserved218",  "reserved21c",
773   "reserved220",  "reserved224",  "reserved228",  "reserved22c",
774   "reserved230",  "reserved234",  "reserved238",  "reserved23c",
775   /* 0x240 */
776   "reserved240",  "reserved244",  "reserved248",  "swapPending",
777   "leftOverlayBuf","rightOverlayBuf","fbiSwapHistory","fbiTrianglesOut",
778   "sSetupMode",   "sVx",          "sVy",          "sARGB",
779   "sRed",         "sGreen",       "sBlue",        "sAlpha",
780   /* 0x280 */
781   "sVz",          "sWb",          "sWtmu0",       "sS/Wtmu0",
782   "sT/Wtmu0",     "sWtmu1",       "sS/Wtmu1",     "sT/Wtmu1",
783   "sDrawTriCMD",  "sBeginTriCMD", "reserved2a8",  "reserved2ac",
784   "reserved2b0",  "reserved2b4",  "reserved2b8",  "reserved2bc",
785   /* 0x2c0 */
786   "reserved2c0",  "reserved2c4",  "reserved2c8",  "reserved2cc",
787   "reserved2d0",  "reserved2d4",  "reserved2d8",  "reserved2dc",
788   "reserved2e0",  "reserved2e4",  "reserved2e8",  "reserved2ec",
789   "reserved2f0",  "reserved2f4",  "reserved2f8",  "reserved2fc",
790   /* 0x300 */
791   "textureMode",  "tLOD",         "tDetail",      "texBaseAddr",
792   "texBaseAddr_1","texBaseAddr_2","texBaseAddr_3_8","reserved31c",
793   "trexInit1",    "nccTable0.0",  "nccTable0.1",  "nccTable0.2",
794   "nccTable0.3",  "nccTable0.4",  "nccTable0.5",  "nccTable0.6",
795   /* 0x340 */
796   "nccTable0.7",  "nccTable0.8",  "nccTable0.9",  "nccTable0.A",
797   "nccTable0.B",  "nccTable1.0",  "nccTable1.1",  "nccTable1.2",
798   "nccTable1.3",  "nccTable1.4",  "nccTable1.5",  "nccTable1.6",
799   "nccTable1.7",  "nccTable1.8",  "nccTable1.9",  "nccTable1.A",
800   /* 0x380 */
801   "nccTable1.B"
802};
803
804
805
806/*************************************
807 *
808 *  Voodoo Banshee I/O space registers
809 *
810 *************************************/
811
812/* 0x000 */
813#define io_status                       (0x000/4)   /*  */
814#define io_pciInit0                     (0x004/4)   /*  */
815#define io_sipMonitor                   (0x008/4)   /*  */
816#define io_lfbMemoryConfig              (0x00c/4)   /*  */
817#define io_miscInit0                    (0x010/4)   /*  */
818#define io_miscInit1                    (0x014/4)   /*  */
819#define io_dramInit0                    (0x018/4)   /*  */
820#define io_dramInit1                    (0x01c/4)   /*  */
821#define io_agpInit                      (0x020/4)   /*  */
822#define io_tmuGbeInit                   (0x024/4)   /*  */
823#define io_vgaInit0                     (0x028/4)   /*  */
824#define io_vgaInit1                     (0x02c/4)   /*  */
825#define io_dramCommand                  (0x030/4)   /*  */
826#define io_dramData                     (0x034/4)   /*  */
827
828/* 0x040 */
829#define io_pllCtrl0                     (0x040/4)   /*  */
830#define io_pllCtrl1                     (0x044/4)   /*  */
831#define io_pllCtrl2                     (0x048/4)   /*  */
832#define io_dacMode                      (0x04c/4)   /*  */
833#define io_dacAddr                      (0x050/4)   /*  */
834#define io_dacData                      (0x054/4)   /*  */
835#define io_rgbMaxDelta                  (0x058/4)   /*  */
836#define io_vidProcCfg                   (0x05c/4)   /*  */
837#define io_hwCurPatAddr                 (0x060/4)   /*  */
838#define io_hwCurLoc                     (0x064/4)   /*  */
839#define io_hwCurC0                      (0x068/4)   /*  */
840#define io_hwCurC1                      (0x06c/4)   /*  */
841#define io_vidInFormat                  (0x070/4)   /*  */
842#define io_vidInStatus                  (0x074/4)   /*  */
843#define io_vidSerialParallelPort        (0x078/4)   /*  */
844#define io_vidInXDecimDeltas            (0x07c/4)   /*  */
845
846/* 0x080 */
847#define io_vidInDecimInitErrs           (0x080/4)   /*  */
848#define io_vidInYDecimDeltas            (0x084/4)   /*  */
849#define io_vidPixelBufThold             (0x088/4)   /*  */
850#define io_vidChromaMin                 (0x08c/4)   /*  */
851#define io_vidChromaMax                 (0x090/4)   /*  */
852#define io_vidCurrentLine               (0x094/4)   /*  */
853#define io_vidScreenSize                (0x098/4)   /*  */
854#define io_vidOverlayStartCoords        (0x09c/4)   /*  */
855#define io_vidOverlayEndScreenCoord     (0x0a0/4)   /*  */
856#define io_vidOverlayDudx               (0x0a4/4)   /*  */
857#define io_vidOverlayDudxOffsetSrcWidth (0x0a8/4)   /*  */
858#define io_vidOverlayDvdy               (0x0ac/4)   /*  */
859#define io_vgab0                        (0x0b0/4)   /*  */
860#define io_vgab4                        (0x0b4/4)   /*  */
861#define io_vgab8                        (0x0b8/4)   /*  */
862#define io_vgabc                        (0x0bc/4)   /*  */
863
864/* 0x0c0 */
865#define io_vgac0                        (0x0c0/4)   /*  */
866#define io_vgac4                        (0x0c4/4)   /*  */
867#define io_vgac8                        (0x0c8/4)   /*  */
868#define io_vgacc                        (0x0cc/4)   /*  */
869#define io_vgad0                        (0x0d0/4)   /*  */
870#define io_vgad4                        (0x0d4/4)   /*  */
871#define io_vgad8                        (0x0d8/4)   /*  */
872#define io_vgadc                        (0x0dc/4)   /*  */
873#define io_vidOverlayDvdyOffset         (0x0e0/4)   /*  */
874#define io_vidDesktopStartAddr          (0x0e4/4)   /*  */
875#define io_vidDesktopOverlayStride      (0x0e8/4)   /*  */
876#define io_vidInAddr0                   (0x0ec/4)   /*  */
877#define io_vidInAddr1                   (0x0f0/4)   /*  */
878#define io_vidInAddr2                   (0x0f4/4)   /*  */
879#define io_vidInStride                  (0x0f8/4)   /*  */
880#define io_vidCurrOverlayStartAddr      (0x0fc/4)   /*  */
881
882
883
884/*************************************
885 *
886 *  Register string table for debug
887 *
888 *************************************/
889
890static const char *const banshee_io_reg_name[] =
891{
892   /* 0x000 */
893   "status",       "pciInit0",     "sipMonitor",   "lfbMemoryConfig",
894   "miscInit0",    "miscInit1",    "dramInit0",    "dramInit1",
895   "agpInit",      "tmuGbeInit",   "vgaInit0",     "vgaInit1",
896   "dramCommand",  "dramData",     "reserved38",   "reserved3c",
897
898   /* 0x040 */
899   "pllCtrl0",     "pllCtrl1",     "pllCtrl2",     "dacMode",
900   "dacAddr",      "dacData",      "rgbMaxDelta",  "vidProcCfg",
901   "hwCurPatAddr", "hwCurLoc",     "hwCurC0",      "hwCurC1",
902   "vidInFormat",  "vidInStatus",  "vidSerialParallelPort","vidInXDecimDeltas",
903
904   /* 0x080 */
905   "vidInDecimInitErrs","vidInYDecimDeltas","vidPixelBufThold","vidChromaMin",
906   "vidChromaMax", "vidCurrentLine","vidScreenSize","vidOverlayStartCoords",
907   "vidOverlayEndScreenCoord","vidOverlayDudx","vidOverlayDudxOffsetSrcWidth","vidOverlayDvdy",
908   "vga[b0]",      "vga[b4]",      "vga[b8]",      "vga[bc]",
909
910   /* 0x0c0 */
911   "vga[c0]",      "vga[c4]",      "vga[c8]",      "vga[cc]",
912   "vga[d0]",      "vga[d4]",      "vga[d8]",      "vga[dc]",
913   "vidOverlayDvdyOffset","vidDesktopStartAddr","vidDesktopOverlayStride","vidInAddr0",
914   "vidInAddr1",   "vidInAddr2",   "vidInStride",  "vidCurrOverlayStartAddr"
915};
916
917
918
919/*************************************
920 *
921 *  Voodoo Banshee AGP space registers
922 *
923 *************************************/
924
925/* 0x000 */
926#define agpReqSize              (0x000/4)   /*  */
927#define agpHostAddressLow       (0x004/4)   /*  */
928#define agpHostAddressHigh      (0x008/4)   /*  */
929#define agpGraphicsAddress      (0x00c/4)   /*  */
930#define agpGraphicsStride       (0x010/4)   /*  */
931#define agpMoveCMD              (0x014/4)   /*  */
932#define cmdBaseAddr0            (0x020/4)   /*  */
933#define cmdBaseSize0            (0x024/4)   /*  */
934#define cmdBump0                (0x028/4)   /*  */
935#define cmdRdPtrL0              (0x02c/4)   /*  */
936#define cmdRdPtrH0              (0x030/4)   /*  */
937#define cmdAMin0                (0x034/4)   /*  */
938#define cmdAMax0                (0x03c/4)   /*  */
939
940/* 0x040 */
941#define cmdFifoDepth0           (0x044/4)   /*  */
942#define cmdHoleCnt0             (0x048/4)   /*  */
943#define cmdBaseAddr1            (0x050/4)   /*  */
944#define cmdBaseSize1            (0x054/4)   /*  */
945#define cmdBump1                (0x058/4)   /*  */
946#define cmdRdPtrL1              (0x05c/4)   /*  */
947#define cmdRdPtrH1              (0x060/4)   /*  */
948#define cmdAMin1                (0x064/4)   /*  */
949#define cmdAMax1                (0x06c/4)   /*  */
950#define cmdFifoDepth1           (0x074/4)   /*  */
951#define cmdHoleCnt1             (0x078/4)   /*  */
952
953/* 0x080 */
954#define cmdFifoThresh           (0x080/4)   /*  */
955#define cmdHoleInt              (0x084/4)   /*  */
956
957/* 0x100 */
958#define yuvBaseAddress          (0x100/4)   /*  */
959#define yuvStride               (0x104/4)   /*  */
960#define crc1                    (0x120/4)   /*  */
961#define crc2                    (0x130/4)   /*  */
962
963
964
965/*************************************
966 *
967 *  Register string table for debug
968 *
969 *************************************/
970
971static const char *const banshee_agp_reg_name[] =
972{
973   /* 0x000 */
974   "agpReqSize",   "agpHostAddressLow","agpHostAddressHigh","agpGraphicsAddress",
975   "agpGraphicsStride","agpMoveCMD","reserved18",  "reserved1c",
976   "cmdBaseAddr0", "cmdBaseSize0", "cmdBump0",     "cmdRdPtrL0",
977   "cmdRdPtrH0",   "cmdAMin0",     "reserved38",   "cmdAMax0",
978
979   /* 0x040 */
980   "reserved40",   "cmdFifoDepth0","cmdHoleCnt0",  "reserved4c",
981   "cmdBaseAddr1", "cmdBaseSize1", "cmdBump1",     "cmdRdPtrL1",
982   "cmdRdPtrH1",   "cmdAMin1",     "reserved68",   "cmdAMax1",
983   "reserved70",   "cmdFifoDepth1","cmdHoleCnt1",  "reserved7c",
984
985   /* 0x080 */
986   "cmdFifoThresh","cmdHoleInt",   "reserved88",   "reserved8c",
987   "reserved90",   "reserved94",   "reserved98",   "reserved9c",
988   "reserveda0",   "reserveda4",   "reserveda8",   "reservedac",
989   "reservedb0",   "reservedb4",   "reservedb8",   "reservedbc",
990
991   /* 0x0c0 */
992   "reservedc0",   "reservedc4",   "reservedc8",   "reservedcc",
993   "reservedd0",   "reservedd4",   "reservedd8",   "reserveddc",
994   "reservede0",   "reservede4",   "reservede8",   "reservedec",
995   "reservedf0",   "reservedf4",   "reservedf8",   "reservedfc",
996
997   /* 0x100 */
998   "yuvBaseAddress","yuvStride",   "reserved108",  "reserved10c",
999   "reserved110",  "reserved114",  "reserved118",  "reserved11c",
1000   "crc1",         "reserved124",  "reserved128",  "reserved12c",
1001   "crc2",         "reserved134",  "reserved138",  "reserved13c"
1002};
1003
1004
1005
1006/*************************************
1007 *
1008 *  Dithering tables
1009 *
1010 *************************************/
1011
1012static const UINT8 dither_matrix_4x4[16] =
1013{
1014      0,  8,  2, 10,
1015   12,  4, 14,  6,
1016      3, 11,  1,  9,
1017   15,  7, 13,  5
1018};
1019
1020static const UINT8 dither_matrix_2x2[16] =
1021{
1022      2, 10,  2, 10,
1023   14,  6, 14,  6,
1024      2, 10,  2, 10,
1025   14,  6, 14,  6
1026};
1027
1028
1029
1030/*************************************
1031 *
1032 *  Macros for extracting pixels
1033 *
1034 *************************************/
1035
1036#define EXTRACT_565_TO_888(val, a, b, c)                    \
1037   (a) = (((val) >> 8) & 0xf8) | (((val) >> 13) & 0x07);   \
1038   (b) = (((val) >> 3) & 0xfc) | (((val) >> 9) & 0x03);    \
1039   (c) = (((val) << 3) & 0xf8) | (((val) >> 2) & 0x07);
1040#define EXTRACT_x555_TO_888(val, a, b, c)                   \
1041   (a) = (((val) >> 7) & 0xf8) | (((val) >> 12) & 0x07);   \
1042   (b) = (((val) >> 2) & 0xf8) | (((val) >> 7) & 0x07);    \
1043   (c) = (((val) << 3) & 0xf8) | (((val) >> 2) & 0x07);
1044#define EXTRACT_555x_TO_888(val, a, b, c)                   \
1045   (a) = (((val) >> 8) & 0xf8) | (((val) >> 13) & 0x07);   \
1046   (b) = (((val) >> 3) & 0xf8) | (((val) >> 8) & 0x07);    \
1047   (c) = (((val) << 2) & 0xf8) | (((val) >> 3) & 0x07);
1048#define EXTRACT_1555_TO_8888(val, a, b, c, d)               \
1049   (a) = ((INT16)(val) >> 15) & 0xff;                      \
1050   EXTRACT_x555_TO_888(val, b, c, d)
1051#define EXTRACT_5551_TO_8888(val, a, b, c, d)               \
1052   EXTRACT_555x_TO_888(val, a, b, c)                       \
1053   (d) = ((val) & 0x0001) ? 0xff : 0x00;
1054#define EXTRACT_x888_TO_888(val, a, b, c)                   \
1055   (a) = ((val) >> 16) & 0xff;                             \
1056   (b) = ((val) >> 8) & 0xff;                              \
1057   (c) = ((val) >> 0) & 0xff;
1058#define EXTRACT_888x_TO_888(val, a, b, c)                   \
1059   (a) = ((val) >> 24) & 0xff;                             \
1060   (b) = ((val) >> 16) & 0xff;                             \
1061   (c) = ((val) >> 8) & 0xff;
1062#define EXTRACT_8888_TO_8888(val, a, b, c, d)               \
1063   (a) = ((val) >> 24) & 0xff;                             \
1064   (b) = ((val) >> 16) & 0xff;                             \
1065   (c) = ((val) >> 8) & 0xff;                              \
1066   (d) = ((val) >> 0) & 0xff;
1067#define EXTRACT_4444_TO_8888(val, a, b, c, d)               \
1068   (a) = (((val) >> 8) & 0xf0) | (((val) >> 12) & 0x0f);   \
1069   (b) = (((val) >> 4) & 0xf0) | (((val) >> 8) & 0x0f);    \
1070   (c) = (((val) >> 0) & 0xf0) | (((val) >> 4) & 0x0f);    \
1071   (d) = (((val) << 4) & 0xf0) | (((val) >> 0) & 0x0f);
1072#define EXTRACT_332_TO_888(val, a, b, c)                    \
1073   (a) = (((val) >> 0) & 0xe0) | (((val) >> 3) & 0x1c) | (((val) >> 6) & 0x03); \
1074   (b) = (((val) << 3) & 0xe0) | (((val) >> 0) & 0x1c) | (((val) >> 3) & 0x03); \
1075   (c) = (((val) << 6) & 0xc0) | (((val) << 4) & 0x30) | (((val) << 2) & 0x0c) | (((val) << 0) & 0x03);
1076
1077
1078/*************************************
1079 *
1080 *  Misc. macros
1081 *
1082 *************************************/
1083
1084/* macro for clamping a value between minimum and maximum values */
1085#define CLAMP(val,min,max)      do { if ((val) < (min)) { (val) = (min); } else if ((val) > (max)) { (val) = (max); } } while (0)
1086
1087/* macro to compute the base 2 log for LOD calculations */
1088#define LOGB2(x)                (log((double)(x)) / log(2.0))
1089
1090
1091
1092/*************************************
1093 *
1094 *  Macros for extracting bitfields
1095 *
1096 *************************************/
1097
1098#define INITEN_ENABLE_HW_INIT(val)          (((val) >> 0) & 1)
1099#define INITEN_ENABLE_PCI_FIFO(val)         (((val) >> 1) & 1)
1100#define INITEN_REMAP_INIT_TO_DAC(val)       (((val) >> 2) & 1)
1101#define INITEN_ENABLE_SNOOP0(val)           (((val) >> 4) & 1)
1102#define INITEN_SNOOP0_MEMORY_MATCH(val)     (((val) >> 5) & 1)
1103#define INITEN_SNOOP0_READWRITE_MATCH(val)  (((val) >> 6) & 1)
1104#define INITEN_ENABLE_SNOOP1(val)           (((val) >> 7) & 1)
1105#define INITEN_SNOOP1_MEMORY_MATCH(val)     (((val) >> 8) & 1)
1106#define INITEN_SNOOP1_READWRITE_MATCH(val)  (((val) >> 9) & 1)
1107#define INITEN_SLI_BUS_OWNER(val)           (((val) >> 10) & 1)
1108#define INITEN_SLI_ODD_EVEN(val)            (((val) >> 11) & 1)
1109#define INITEN_SECONDARY_REV_ID(val)        (((val) >> 12) & 0xf)   /* voodoo 2 only */
1110#define INITEN_MFCTR_FAB_ID(val)            (((val) >> 16) & 0xf)   /* voodoo 2 only */
1111#define INITEN_ENABLE_PCI_INTERRUPT(val)    (((val) >> 20) & 1)     /* voodoo 2 only */
1112#define INITEN_PCI_INTERRUPT_TIMEOUT(val)   (((val) >> 21) & 1)     /* voodoo 2 only */
1113#define INITEN_ENABLE_NAND_TREE_TEST(val)   (((val) >> 22) & 1)     /* voodoo 2 only */
1114#define INITEN_ENABLE_SLI_ADDRESS_SNOOP(val) (((val) >> 23) & 1)    /* voodoo 2 only */
1115#define INITEN_SLI_SNOOP_ADDRESS(val)       (((val) >> 24) & 0xff)  /* voodoo 2 only */
1116
1117#define FBZCP_CC_RGBSELECT(val)             (((val) >> 0) & 3)
1118#define FBZCP_CC_ASELECT(val)               (((val) >> 2) & 3)
1119#define FBZCP_CC_LOCALSELECT(val)           (((val) >> 4) & 1)
1120#define FBZCP_CCA_LOCALSELECT(val)          (((val) >> 5) & 3)
1121#define FBZCP_CC_LOCALSELECT_OVERRIDE(val)  (((val) >> 7) & 1)
1122#define FBZCP_CC_ZERO_OTHER(val)            (((val) >> 8) & 1)
1123#define FBZCP_CC_SUB_CLOCAL(val)            (((val) >> 9) & 1)
1124#define FBZCP_CC_MSELECT(val)               (((val) >> 10) & 7)
1125#define FBZCP_CC_REVERSE_BLEND(val)         (((val) >> 13) & 1)
1126#define FBZCP_CC_ADD_ACLOCAL(val)           (((val) >> 14) & 3)
1127#define FBZCP_CC_INVERT_OUTPUT(val)         (((val) >> 16) & 1)
1128#define FBZCP_CCA_ZERO_OTHER(val)           (((val) >> 17) & 1)
1129#define FBZCP_CCA_SUB_CLOCAL(val)           (((val) >> 18) & 1)
1130#define FBZCP_CCA_MSELECT(val)              (((val) >> 19) & 7)
1131#define FBZCP_CCA_REVERSE_BLEND(val)        (((val) >> 22) & 1)
1132#define FBZCP_CCA_ADD_ACLOCAL(val)          (((val) >> 23) & 3)
1133#define FBZCP_CCA_INVERT_OUTPUT(val)        (((val) >> 25) & 1)
1134#define FBZCP_CCA_SUBPIXEL_ADJUST(val)      (((val) >> 26) & 1)
1135#define FBZCP_TEXTURE_ENABLE(val)           (((val) >> 27) & 1)
1136#define FBZCP_RGBZW_CLAMP(val)              (((val) >> 28) & 1)     /* voodoo 2 only */
1137#define FBZCP_ANTI_ALIAS(val)               (((val) >> 29) & 1)     /* voodoo 2 only */
1138
1139#define ALPHAMODE_ALPHATEST(val)            (((val) >> 0) & 1)
1140#define ALPHAMODE_ALPHAFUNCTION(val)        (((val) >> 1) & 7)
1141#define ALPHAMODE_ALPHABLEND(val)           (((val) >> 4) & 1)
1142#define ALPHAMODE_ANTIALIAS(val)            (((val) >> 5) & 1)
1143#define ALPHAMODE_SRCRGBBLEND(val)          (((val) >> 8) & 15)
1144#define ALPHAMODE_DSTRGBBLEND(val)          (((val) >> 12) & 15)
1145#define ALPHAMODE_SRCALPHABLEND(val)        (((val) >> 16) & 15)
1146#define ALPHAMODE_DSTALPHABLEND(val)        (((val) >> 20) & 15)
1147#define ALPHAMODE_ALPHAREF(val)             (((val) >> 24) & 0xff)
1148
1149#define FOGMODE_ENABLE_FOG(val)             (((val) >> 0) & 1)
1150#define FOGMODE_FOG_ADD(val)                (((val) >> 1) & 1)
1151#define FOGMODE_FOG_MULT(val)               (((val) >> 2) & 1)
1152#define FOGMODE_FOG_ZALPHA(val)             (((val) >> 3) & 3)
1153#define FOGMODE_FOG_CONSTANT(val)           (((val) >> 5) & 1)
1154#define FOGMODE_FOG_DITHER(val)             (((val) >> 6) & 1)      /* voodoo 2 only */
1155#define FOGMODE_FOG_ZONES(val)              (((val) >> 7) & 1)      /* voodoo 2 only */
1156
1157#define FBZMODE_ENABLE_CLIPPING(val)        (((val) >> 0) & 1)
1158#define FBZMODE_ENABLE_CHROMAKEY(val)       (((val) >> 1) & 1)
1159#define FBZMODE_ENABLE_STIPPLE(val)         (((val) >> 2) & 1)
1160#define FBZMODE_WBUFFER_SELECT(val)         (((val) >> 3) & 1)
1161#define FBZMODE_ENABLE_DEPTHBUF(val)        (((val) >> 4) & 1)
1162#define FBZMODE_DEPTH_FUNCTION(val)         (((val) >> 5) & 7)
1163#define FBZMODE_ENABLE_DITHERING(val)       (((val) >> 8) & 1)
1164#define FBZMODE_RGB_BUFFER_MASK(val)        (((val) >> 9) & 1)
1165#define FBZMODE_AUX_BUFFER_MASK(val)        (((val) >> 10) & 1)
1166#define FBZMODE_DITHER_TYPE(val)            (((val) >> 11) & 1)
1167#define FBZMODE_STIPPLE_PATTERN(val)        (((val) >> 12) & 1)
1168#define FBZMODE_ENABLE_ALPHA_MASK(val)      (((val) >> 13) & 1)
1169#define FBZMODE_DRAW_BUFFER(val)            (((val) >> 14) & 3)
1170#define FBZMODE_ENABLE_DEPTH_BIAS(val)      (((val) >> 16) & 1)
1171#define FBZMODE_Y_ORIGIN(val)               (((val) >> 17) & 1)
1172#define FBZMODE_ENABLE_ALPHA_PLANES(val)    (((val) >> 18) & 1)
1173#define FBZMODE_ALPHA_DITHER_SUBTRACT(val)  (((val) >> 19) & 1)
1174#define FBZMODE_DEPTH_SOURCE_COMPARE(val)   (((val) >> 20) & 1)
1175#define FBZMODE_DEPTH_FLOAT_SELECT(val)     (((val) >> 21) & 1)     /* voodoo 2 only */
1176
1177#define LFBMODE_WRITE_FORMAT(val)           (((val) >> 0) & 0xf)
1178#define LFBMODE_WRITE_BUFFER_SELECT(val)    (((val) >> 4) & 3)
1179#define LFBMODE_READ_BUFFER_SELECT(val)     (((val) >> 6) & 3)
1180#define LFBMODE_ENABLE_PIXEL_PIPELINE(val)  (((val) >> 8) & 1)
1181#define LFBMODE_RGBA_LANES(val)             (((val) >> 9) & 3)
1182#define LFBMODE_WORD_SWAP_WRITES(val)       (((val) >> 11) & 1)
1183#define LFBMODE_BYTE_SWIZZLE_WRITES(val)    (((val) >> 12) & 1)
1184#define LFBMODE_Y_ORIGIN(val)               (((val) >> 13) & 1)
1185#define LFBMODE_WRITE_W_SELECT(val)         (((val) >> 14) & 1)
1186#define LFBMODE_WORD_SWAP_READS(val)        (((val) >> 15) & 1)
1187#define LFBMODE_BYTE_SWIZZLE_READS(val)     (((val) >> 16) & 1)
1188
1189#define CHROMARANGE_BLUE_EXCLUSIVE(val)     (((val) >> 24) & 1)
1190#define CHROMARANGE_GREEN_EXCLUSIVE(val)    (((val) >> 25) & 1)
1191#define CHROMARANGE_RED_EXCLUSIVE(val)      (((val) >> 26) & 1)
1192#define CHROMARANGE_UNION_MODE(val)         (((val) >> 27) & 1)
1193#define CHROMARANGE_ENABLE(val)             (((val) >> 28) & 1)
1194
1195#define FBIINIT0_VGA_PASSTHRU(val)          (((val) >> 0) & 1)
1196#define FBIINIT0_GRAPHICS_RESET(val)        (((val) >> 1) & 1)
1197#define FBIINIT0_FIFO_RESET(val)            (((val) >> 2) & 1)
1198#define FBIINIT0_SWIZZLE_REG_WRITES(val)    (((val) >> 3) & 1)
1199#define FBIINIT0_STALL_PCIE_FOR_HWM(val)    (((val) >> 4) & 1)
1200#define FBIINIT0_PCI_FIFO_LWM(val)          (((val) >> 6) & 0x1f)
1201#define FBIINIT0_LFB_TO_MEMORY_FIFO(val)    (((val) >> 11) & 1)
1202#define FBIINIT0_TEXMEM_TO_MEMORY_FIFO(val) (((val) >> 12) & 1)
1203#define FBIINIT0_ENABLE_MEMORY_FIFO(val)    (((val) >> 13) & 1)
1204#define FBIINIT0_MEMORY_FIFO_HWM(val)       (((val) >> 14) & 0x7ff)
1205#define FBIINIT0_MEMORY_FIFO_BURST(val)     (((val) >> 25) & 0x3f)
1206
1207#define FBIINIT1_PCI_DEV_FUNCTION(val)      (((val) >> 0) & 1)
1208#define FBIINIT1_PCI_WRITE_WAIT_STATES(val) (((val) >> 1) & 1)
1209#define FBIINIT1_MULTI_SST1(val)            (((val) >> 2) & 1)      /* not on voodoo 2 */
1210#define FBIINIT1_ENABLE_LFB(val)            (((val) >> 3) & 1)
1211#define FBIINIT1_X_VIDEO_TILES(val)         (((val) >> 4) & 0xf)
1212#define FBIINIT1_VIDEO_TIMING_RESET(val)    (((val) >> 8) & 1)
1213#define FBIINIT1_SOFTWARE_OVERRIDE(val)     (((val) >> 9) & 1)
1214#define FBIINIT1_SOFTWARE_HSYNC(val)        (((val) >> 10) & 1)
1215#define FBIINIT1_SOFTWARE_VSYNC(val)        (((val) >> 11) & 1)
1216#define FBIINIT1_SOFTWARE_BLANK(val)        (((val) >> 12) & 1)
1217#define FBIINIT1_DRIVE_VIDEO_TIMING(val)    (((val) >> 13) & 1)
1218#define FBIINIT1_DRIVE_VIDEO_BLANK(val)     (((val) >> 14) & 1)
1219#define FBIINIT1_DRIVE_VIDEO_SYNC(val)      (((val) >> 15) & 1)
1220#define FBIINIT1_DRIVE_VIDEO_DCLK(val)      (((val) >> 16) & 1)
1221#define FBIINIT1_VIDEO_TIMING_VCLK(val)     (((val) >> 17) & 1)
1222#define FBIINIT1_VIDEO_CLK_2X_DELAY(val)    (((val) >> 18) & 3)
1223#define FBIINIT1_VIDEO_TIMING_SOURCE(val)   (((val) >> 20) & 3)
1224#define FBIINIT1_ENABLE_24BPP_OUTPUT(val)   (((val) >> 22) & 1)
1225#define FBIINIT1_ENABLE_SLI(val)            (((val) >> 23) & 1)
1226#define FBIINIT1_X_VIDEO_TILES_BIT5(val)    (((val) >> 24) & 1)     /* voodoo 2 only */
1227#define FBIINIT1_ENABLE_EDGE_FILTER(val)    (((val) >> 25) & 1)
1228#define FBIINIT1_INVERT_VID_CLK_2X(val)     (((val) >> 26) & 1)
1229#define FBIINIT1_VID_CLK_2X_SEL_DELAY(val)  (((val) >> 27) & 3)
1230#define FBIINIT1_VID_CLK_DELAY(val)         (((val) >> 29) & 3)
1231#define FBIINIT1_DISABLE_FAST_READAHEAD(val) (((val) >> 31) & 1)
1232
1233#define FBIINIT2_DISABLE_DITHER_SUB(val)    (((val) >> 0) & 1)
1234#define FBIINIT2_DRAM_BANKING(val)          (((val) >> 1) & 1)
1235#define FBIINIT2_ENABLE_TRIPLE_BUF(val)     (((val) >> 4) & 1)
1236#define FBIINIT2_ENABLE_FAST_RAS_READ(val)  (((val) >> 5) & 1)
1237#define FBIINIT2_ENABLE_GEN_DRAM_OE(val)    (((val) >> 6) & 1)
1238#define FBIINIT2_ENABLE_FAST_READWRITE(val) (((val) >> 7) & 1)
1239#define FBIINIT2_ENABLE_PASSTHRU_DITHER(val) (((val) >> 8) & 1)
1240#define FBIINIT2_SWAP_BUFFER_ALGORITHM(val) (((val) >> 9) & 3)
1241#define FBIINIT2_VIDEO_BUFFER_OFFSET(val)   (((val) >> 11) & 0x1ff)
1242#define FBIINIT2_ENABLE_DRAM_BANKING(val)   (((val) >> 20) & 1)
1243#define FBIINIT2_ENABLE_DRAM_READ_FIFO(val) (((val) >> 21) & 1)
1244#define FBIINIT2_ENABLE_DRAM_REFRESH(val)   (((val) >> 22) & 1)
1245#define FBIINIT2_REFRESH_LOAD_VALUE(val)    (((val) >> 23) & 0x1ff)
1246
1247#define FBIINIT3_TRI_REGISTER_REMAP(val)    (((val) >> 0) & 1)
1248#define FBIINIT3_VIDEO_FIFO_THRESH(val)     (((val) >> 1) & 0x1f)
1249#define FBIINIT3_DISABLE_TMUS(val)          (((val) >> 6) & 1)
1250#define FBIINIT3_FBI_MEMORY_TYPE(val)       (((val) >> 8) & 7)
1251#define FBIINIT3_VGA_PASS_RESET_VAL(val)    (((val) >> 11) & 1)
1252#define FBIINIT3_HARDCODE_PCI_BASE(val)     (((val) >> 12) & 1)
1253#define FBIINIT3_FBI2TREX_DELAY(val)        (((val) >> 13) & 0xf)
1254#define FBIINIT3_TREX2FBI_DELAY(val)        (((val) >> 17) & 0x1f)
1255#define FBIINIT3_YORIGIN_SUBTRACT(val)      (((val) >> 22) & 0x3ff)
1256
1257#define FBIINIT4_PCI_READ_WAITS(val)        (((val) >> 0) & 1)
1258#define FBIINIT4_ENABLE_LFB_READAHEAD(val)  (((val) >> 1) & 1)
1259#define FBIINIT4_MEMORY_FIFO_LWM(val)       (((val) >> 2) & 0x3f)
1260#define FBIINIT4_MEMORY_FIFO_START_ROW(val) (((val) >> 8) & 0x3ff)
1261#define FBIINIT4_MEMORY_FIFO_STOP_ROW(val)  (((val) >> 18) & 0x3ff)
1262#define FBIINIT4_VIDEO_CLOCKING_DELAY(val)  (((val) >> 29) & 7)     /* voodoo 2 only */
1263
1264#define FBIINIT5_DISABLE_PCI_STOP(val)      (((val) >> 0) & 1)      /* voodoo 2 only */
1265#define FBIINIT5_PCI_SLAVE_SPEED(val)       (((val) >> 1) & 1)      /* voodoo 2 only */
1266#define FBIINIT5_DAC_DATA_OUTPUT_WIDTH(val) (((val) >> 2) & 1)      /* voodoo 2 only */
1267#define FBIINIT5_DAC_DATA_17_OUTPUT(val)    (((val) >> 3) & 1)      /* voodoo 2 only */
1268#define FBIINIT5_DAC_DATA_18_OUTPUT(val)    (((val) >> 4) & 1)      /* voodoo 2 only */
1269#define FBIINIT5_GENERIC_STRAPPING(val)     (((val) >> 5) & 0xf)    /* voodoo 2 only */
1270#define FBIINIT5_BUFFER_ALLOCATION(val)     (((val) >> 9) & 3)      /* voodoo 2 only */
1271#define FBIINIT5_DRIVE_VID_CLK_SLAVE(val)   (((val) >> 11) & 1)     /* voodoo 2 only */
1272#define FBIINIT5_DRIVE_DAC_DATA_16(val)     (((val) >> 12) & 1)     /* voodoo 2 only */
1273#define FBIINIT5_VCLK_INPUT_SELECT(val)     (((val) >> 13) & 1)     /* voodoo 2 only */
1274#define FBIINIT5_MULTI_CVG_DETECT(val)      (((val) >> 14) & 1)     /* voodoo 2 only */
1275#define FBIINIT5_SYNC_RETRACE_READS(val)    (((val) >> 15) & 1)     /* voodoo 2 only */
1276#define FBIINIT5_ENABLE_RHBORDER_COLOR(val) (((val) >> 16) & 1)     /* voodoo 2 only */
1277#define FBIINIT5_ENABLE_LHBORDER_COLOR(val) (((val) >> 17) & 1)     /* voodoo 2 only */
1278#define FBIINIT5_ENABLE_BVBORDER_COLOR(val) (((val) >> 18) & 1)     /* voodoo 2 only */
1279#define FBIINIT5_ENABLE_TVBORDER_COLOR(val) (((val) >> 19) & 1)     /* voodoo 2 only */
1280#define FBIINIT5_DOUBLE_HORIZ(val)          (((val) >> 20) & 1)     /* voodoo 2 only */
1281#define FBIINIT5_DOUBLE_VERT(val)           (((val) >> 21) & 1)     /* voodoo 2 only */
1282#define FBIINIT5_ENABLE_16BIT_GAMMA(val)    (((val) >> 22) & 1)     /* voodoo 2 only */
1283#define FBIINIT5_INVERT_DAC_HSYNC(val)      (((val) >> 23) & 1)     /* voodoo 2 only */
1284#define FBIINIT5_INVERT_DAC_VSYNC(val)      (((val) >> 24) & 1)     /* voodoo 2 only */
1285#define FBIINIT5_ENABLE_24BIT_DACDATA(val)  (((val) >> 25) & 1)     /* voodoo 2 only */
1286#define FBIINIT5_ENABLE_INTERLACING(val)    (((val) >> 26) & 1)     /* voodoo 2 only */
1287#define FBIINIT5_DAC_DATA_18_CONTROL(val)   (((val) >> 27) & 1)     /* voodoo 2 only */
1288#define FBIINIT5_RASTERIZER_UNIT_MODE(val)  (((val) >> 30) & 3)     /* voodoo 2 only */
1289
1290#define FBIINIT6_WINDOW_ACTIVE_COUNTER(val) (((val) >> 0) & 7)      /* voodoo 2 only */
1291#define FBIINIT6_WINDOW_DRAG_COUNTER(val)   (((val) >> 3) & 0x1f)   /* voodoo 2 only */
1292#define FBIINIT6_SLI_SYNC_MASTER(val)       (((val) >> 8) & 1)      /* voodoo 2 only */
1293#define FBIINIT6_DAC_DATA_22_OUTPUT(val)    (((val) >> 9) & 3)      /* voodoo 2 only */
1294#define FBIINIT6_DAC_DATA_23_OUTPUT(val)    (((val) >> 11) & 3)     /* voodoo 2 only */
1295#define FBIINIT6_SLI_SYNCIN_OUTPUT(val)     (((val) >> 13) & 3)     /* voodoo 2 only */
1296#define FBIINIT6_SLI_SYNCOUT_OUTPUT(val)    (((val) >> 15) & 3)     /* voodoo 2 only */
1297#define FBIINIT6_DAC_RD_OUTPUT(val)         (((val) >> 17) & 3)     /* voodoo 2 only */
1298#define FBIINIT6_DAC_WR_OUTPUT(val)         (((val) >> 19) & 3)     /* voodoo 2 only */
1299#define FBIINIT6_PCI_FIFO_LWM_RDY(val)      (((val) >> 21) & 0x7f)  /* voodoo 2 only */
1300#define FBIINIT6_VGA_PASS_N_OUTPUT(val)     (((val) >> 28) & 3)     /* voodoo 2 only */
1301#define FBIINIT6_X_VIDEO_TILES_BIT0(val)    (((val) >> 30) & 1)     /* voodoo 2 only */
1302
1303#define FBIINIT7_GENERIC_STRAPPING(val)     (((val) >> 0) & 0xff)   /* voodoo 2 only */
1304#define FBIINIT7_CMDFIFO_ENABLE(val)        (((val) >> 8) & 1)      /* voodoo 2 only */
1305#define FBIINIT7_CMDFIFO_MEMORY_STORE(val)  (((val) >> 9) & 1)      /* voodoo 2 only */
1306#define FBIINIT7_DISABLE_CMDFIFO_HOLES(val) (((val) >> 10) & 1)     /* voodoo 2 only */
1307#define FBIINIT7_CMDFIFO_READ_THRESH(val)   (((val) >> 11) & 0x1f)  /* voodoo 2 only */
1308#define FBIINIT7_SYNC_CMDFIFO_WRITES(val)   (((val) >> 16) & 1)     /* voodoo 2 only */
1309#define FBIINIT7_SYNC_CMDFIFO_READS(val)    (((val) >> 17) & 1)     /* voodoo 2 only */
1310#define FBIINIT7_RESET_PCI_PACKER(val)      (((val) >> 18) & 1)     /* voodoo 2 only */
1311#define FBIINIT7_ENABLE_CHROMA_STUFF(val)   (((val) >> 19) & 1)     /* voodoo 2 only */
1312#define FBIINIT7_CMDFIFO_PCI_TIMEOUT(val)   (((val) >> 20) & 0x7f)  /* voodoo 2 only */
1313#define FBIINIT7_ENABLE_TEXTURE_BURST(val)  (((val) >> 27) & 1)     /* voodoo 2 only */
1314
1315#define TEXMODE_ENABLE_PERSPECTIVE(val)     (((val) >> 0) & 1)
1316#define TEXMODE_MINIFICATION_FILTER(val)    (((val) >> 1) & 1)
1317#define TEXMODE_MAGNIFICATION_FILTER(val)   (((val) >> 2) & 1)
1318#define TEXMODE_CLAMP_NEG_W(val)            (((val) >> 3) & 1)
1319#define TEXMODE_ENABLE_LOD_DITHER(val)      (((val) >> 4) & 1)
1320#define TEXMODE_NCC_TABLE_SELECT(val)       (((val) >> 5) & 1)
1321#define TEXMODE_CLAMP_S(val)                (((val) >> 6) & 1)
1322#define TEXMODE_CLAMP_T(val)                (((val) >> 7) & 1)
1323#define TEXMODE_FORMAT(val)                 (((val) >> 8) & 0xf)
1324#define TEXMODE_TC_ZERO_OTHER(val)          (((val) >> 12) & 1)
1325#define TEXMODE_TC_SUB_CLOCAL(val)          (((val) >> 13) & 1)
1326#define TEXMODE_TC_MSELECT(val)             (((val) >> 14) & 7)
1327#define TEXMODE_TC_REVERSE_BLEND(val)       (((val) >> 17) & 1)
1328#define TEXMODE_TC_ADD_ACLOCAL(val)         (((val) >> 18) & 3)
1329#define TEXMODE_TC_INVERT_OUTPUT(val)       (((val) >> 20) & 1)
1330#define TEXMODE_TCA_ZERO_OTHER(val)         (((val) >> 21) & 1)
1331#define TEXMODE_TCA_SUB_CLOCAL(val)         (((val) >> 22) & 1)
1332#define TEXMODE_TCA_MSELECT(val)            (((val) >> 23) & 7)
1333#define TEXMODE_TCA_REVERSE_BLEND(val)      (((val) >> 26) & 1)
1334#define TEXMODE_TCA_ADD_ACLOCAL(val)        (((val) >> 27) & 3)
1335#define TEXMODE_TCA_INVERT_OUTPUT(val)      (((val) >> 29) & 1)
1336#define TEXMODE_TRILINEAR(val)              (((val) >> 30) & 1)
1337#define TEXMODE_SEQ_8_DOWNLD(val)           (((val) >> 31) & 1)
1338
1339#define TEXLOD_LODMIN(val)                  (((val) >> 0) & 0x3f)
1340#define TEXLOD_LODMAX(val)                  (((val) >> 6) & 0x3f)
1341#define TEXLOD_LODBIAS(val)                 (((val) >> 12) & 0x3f)
1342#define TEXLOD_LOD_ODD(val)                 (((val) >> 18) & 1)
1343#define TEXLOD_LOD_TSPLIT(val)              (((val) >> 19) & 1)
1344#define TEXLOD_LOD_S_IS_WIDER(val)          (((val) >> 20) & 1)
1345#define TEXLOD_LOD_ASPECT(val)              (((val) >> 21) & 3)
1346#define TEXLOD_LOD_ZEROFRAC(val)            (((val) >> 23) & 1)
1347#define TEXLOD_TMULTIBASEADDR(val)          (((val) >> 24) & 1)
1348#define TEXLOD_TDATA_SWIZZLE(val)           (((val) >> 25) & 1)
1349#define TEXLOD_TDATA_SWAP(val)              (((val) >> 26) & 1)
1350#define TEXLOD_TDIRECT_WRITE(val)           (((val) >> 27) & 1)     /* Voodoo 2 only */
1351
1352#define TEXDETAIL_DETAIL_MAX(val)           (((val) >> 0) & 0xff)
1353#define TEXDETAIL_DETAIL_BIAS(val)          (((val) >> 8) & 0x3f)
1354#define TEXDETAIL_DETAIL_SCALE(val)         (((val) >> 14) & 7)
1355#define TEXDETAIL_RGB_MIN_FILTER(val)       (((val) >> 17) & 1)     /* Voodoo 2 only */
1356#define TEXDETAIL_RGB_MAG_FILTER(val)       (((val) >> 18) & 1)     /* Voodoo 2 only */
1357#define TEXDETAIL_ALPHA_MIN_FILTER(val)     (((val) >> 19) & 1)     /* Voodoo 2 only */
1358#define TEXDETAIL_ALPHA_MAG_FILTER(val)     (((val) >> 20) & 1)     /* Voodoo 2 only */
1359#define TEXDETAIL_SEPARATE_RGBA_FILTER(val) (((val) >> 21) & 1)     /* Voodoo 2 only */
1360
1361#define TREXINIT_SEND_TMU_CONFIG(val)       (((val) >> 18) & 1)
1362
1363
1364
1365struct voodoo_state;
1366struct poly_extra_data;
1367class voodoo_device;
1368
1369struct rgba
1370{
1371#ifdef LSB_FIRST
1372   UINT8               b, g, r, a;
1373#else
1374   UINT8               a, r, g, b;
1375#endif
1376};
1377
1378
1379union voodoo_reg
1380{
1381   INT32               i;
1382   UINT32              u;
1383   float               f;
1384   rgba                rgb;
1385};
1386
1387
1388
1389struct voodoo_stats
1390{
1391   UINT8               lastkey;                /* last key state */
1392   UINT8               display;                /* display stats? */
1393   INT32               swaps;                  /* total swaps */
1394   INT32               stalls;                 /* total stalls */
1395   INT32               total_triangles;        /* total triangles */
1396   INT32               total_pixels_in;        /* total pixels in */
1397   INT32               total_pixels_out;       /* total pixels out */
1398   INT32               total_chroma_fail;      /* total chroma fail */
1399   INT32               total_zfunc_fail;       /* total z func fail */
1400   INT32               total_afunc_fail;       /* total a func fail */
1401   INT32               total_clipped;          /* total clipped */
1402   INT32               total_stippled;         /* total stippled */
1403   INT32               lfb_writes;             /* LFB writes */
1404   INT32               lfb_reads;              /* LFB reads */
1405   INT32               reg_writes;             /* register writes */
1406   INT32               reg_reads;              /* register reads */
1407   INT32               tex_writes;             /* texture writes */
1408   INT32               texture_mode[16];       /* 16 different texture modes */
1409   UINT8               render_override;        /* render override */
1410   char                buffer[1024];           /* string */
1411};
1412
1413
1414/* note that this structure is an even 64 bytes long */
1415struct stats_block
1416{
1417   INT32               pixels_in;              /* pixels in statistic */
1418   INT32               pixels_out;             /* pixels out statistic */
1419   INT32               chroma_fail;            /* chroma test fail statistic */
1420   INT32               zfunc_fail;             /* z function test fail statistic */
1421   INT32               afunc_fail;             /* alpha function test fail statistic */
1422   INT32               clip_fail;              /* clipping fail statistic */
1423   INT32               stipple_count;          /* stipple statistic */
1424   INT32               filler[64/4 - 7];       /* pad this structure to 64 bytes */
1425};
1426
1427
1428struct fifo_state
1429{
1430   UINT32 *            base;                   /* base of the FIFO */
1431   INT32               size;                   /* size of the FIFO */
1432   INT32               in;                     /* input pointer */
1433   INT32               out;                    /* output pointer */
1434};
1435
1436
1437struct cmdfifo_info
1438{
1439   UINT8               enable;                 /* enabled? */
1440   UINT8               count_holes;            /* count holes? */
1441   UINT32              base;                   /* base address in framebuffer RAM */
1442   UINT32              end;                    /* end address in framebuffer RAM */
1443   UINT32              rdptr;                  /* current read pointer */
1444   UINT32              amin;                   /* minimum address */
1445   UINT32              amax;                   /* maximum address */
1446   UINT32              depth;                  /* current depth */
1447   UINT32              holes;                  /* number of holes */
1448};
1449
1450
1451struct pci_state
1452{
1453   fifo_state          fifo;                   /* PCI FIFO */
1454   UINT32              init_enable;            /* initEnable value */
1455   UINT8               stall_state;            /* state of the system if we're stalled */
1456   UINT8               op_pending;             /* true if an operation is pending */
1457   attotime            op_end_time;            /* time when the pending operation ends */
1458   emu_timer *         continue_timer;         /* timer to use to continue processing */
1459   UINT32              fifo_mem[64*2];         /* memory backing the PCI FIFO */
1460};
1461
1462
1463struct ncc_table
1464{
1465   UINT8               dirty;                  /* is the texel lookup dirty? */
1466   voodoo_reg *        reg;                    /* pointer to our registers */
1467   INT32               ir[4], ig[4], ib[4];    /* I values for R,G,B */
1468   INT32               qr[4], qg[4], qb[4];    /* Q values for R,G,B */
1469   INT32               y[16];                  /* Y values */
1470   rgb_t *             palette;                /* pointer to associated RGB palette */
1471   rgb_t *             palettea;               /* pointer to associated ARGB palette */
1472   rgb_t               texel[256];             /* texel lookup */
1473};
1474
1475
1476struct tmu_state
1477{
1478   UINT8 *             ram;                    /* pointer to our RAM */
1479   UINT32              mask;                   /* mask to apply to pointers */
1480   voodoo_reg *        reg;                    /* pointer to our register base */
1481   UINT32              regdirty;               /* true if the LOD/mode/base registers have changed */
1482
1483   UINT32              texaddr_mask;           /* mask for texture address */
1484   UINT8               texaddr_shift;          /* shift for texture address */
1485
1486   INT64               starts, startt;         /* starting S,T (14.18) */
1487   INT64               startw;                 /* starting W (2.30) */
1488   INT64               dsdx, dtdx;             /* delta S,T per X */
1489   INT64               dwdx;                   /* delta W per X */
1490   INT64               dsdy, dtdy;             /* delta S,T per Y */
1491   INT64               dwdy;                   /* delta W per Y */
1492
1493   INT32               lodmin, lodmax;         /* min, max LOD values */
1494   INT32               lodbias;                /* LOD bias */
1495   UINT32              lodmask;                /* mask of available LODs */
1496   UINT32              lodoffset[9];           /* offset of texture base for each LOD */
1497   INT32               detailmax;              /* detail clamp */
1498   INT32               detailbias;             /* detail bias */
1499   UINT8               detailscale;            /* detail scale */
1500
1501   UINT32              wmask;                  /* mask for the current texture width */
1502   UINT32              hmask;                  /* mask for the current texture height */
1503
1504   UINT32              bilinear_mask;          /* mask for bilinear resolution (0xf0 for V1, 0xff for V2) */
1505
1506   ncc_table           ncc[2];                 /* two NCC tables */
1507
1508   rgb_t *             lookup;                 /* currently selected lookup */
1509   rgb_t *             texel[16];              /* texel lookups for each format */
1510
1511   rgb_t               palette[256];           /* palette lookup table */
1512   rgb_t               palettea[256];          /* palette+alpha lookup table */
1513};
1514
1515
1516struct tmu_shared_state
1517{
1518   rgb_t               rgb332[256];            /* RGB 3-3-2 lookup table */
1519   rgb_t               alpha8[256];            /* alpha 8-bit lookup table */
1520   rgb_t               int8[256];              /* intensity 8-bit lookup table */
1521   rgb_t               ai44[256];              /* alpha, intensity 4-4 lookup table */
1522
1523   rgb_t               rgb565[65536];          /* RGB 5-6-5 lookup table */
1524   rgb_t               argb1555[65536];        /* ARGB 1-5-5-5 lookup table */
1525   rgb_t               argb4444[65536];        /* ARGB 4-4-4-4 lookup table */
1526};
1527
1528
1529struct setup_vertex
1530{
1531   float               x, y;                   /* X, Y coordinates */
1532   float               a, r, g, b;             /* A, R, G, B values */
1533   float               z, wb;                  /* Z and broadcast W values */
1534   float               w0, s0, t0;             /* W, S, T for TMU 0 */
1535   float               w1, s1, t1;             /* W, S, T for TMU 1 */
1536};
1537
1538
1539struct fbi_state
1540{
1541   UINT8 *             ram;                    /* pointer to frame buffer RAM */
1542   UINT32              mask;                   /* mask to apply to pointers */
1543   UINT32              rgboffs[3];             /* word offset to 3 RGB buffers */
1544   UINT32              auxoffs;                /* word offset to 1 aux buffer */
1545
1546   UINT8               frontbuf;               /* front buffer index */
1547   UINT8               backbuf;                /* back buffer index */
1548   UINT8               swaps_pending;          /* number of pending swaps */
1549   UINT8               video_changed;          /* did the frontbuffer video change? */
1550
1551   UINT32              yorigin;                /* Y origin subtract value */
1552   UINT32              lfb_base;               /* base of LFB in memory */
1553   UINT8               lfb_stride;             /* stride of LFB accesses in bits */
1554
1555   UINT32              width;                  /* width of current frame buffer */
1556   UINT32              height;                 /* height of current frame buffer */
1557   UINT32              xoffs;                  /* horizontal offset (back porch) */
1558   UINT32              yoffs;                  /* vertical offset (back porch) */
1559   UINT32              vsyncscan;              /* vertical sync scanline */
1560   UINT32              rowpixels;              /* pixels per row */
1561   UINT32              tile_width;             /* width of video tiles */
1562   UINT32              tile_height;            /* height of video tiles */
1563   UINT32              x_tiles;                /* number of tiles in the X direction */
1564
1565   emu_timer *         vblank_timer;           /* VBLANK timer */
1566   UINT8               vblank;                 /* VBLANK state */
1567   UINT8               vblank_count;           /* number of VBLANKs since last swap */
1568   UINT8               vblank_swap_pending;    /* a swap is pending, waiting for a vblank */
1569   UINT8               vblank_swap;            /* swap when we hit this count */
1570   UINT8               vblank_dont_swap;       /* don't actually swap when we hit this point */
1571
1572   /* triangle setup info */
1573   UINT8               cheating_allowed;       /* allow cheating? */
1574   INT32               sign;                   /* triangle sign */
1575   INT16               ax, ay;                 /* vertex A x,y (12.4) */
1576   INT16               bx, by;                 /* vertex B x,y (12.4) */
1577   INT16               cx, cy;                 /* vertex C x,y (12.4) */
1578   INT32               startr, startg, startb, starta; /* starting R,G,B,A (12.12) */
1579   INT32               startz;                 /* starting Z (20.12) */
1580   INT64               startw;                 /* starting W (16.32) */
1581   INT32               drdx, dgdx, dbdx, dadx; /* delta R,G,B,A per X */
1582   INT32               dzdx;                   /* delta Z per X */
1583   INT64               dwdx;                   /* delta W per X */
1584   INT32               drdy, dgdy, dbdy, dady; /* delta R,G,B,A per Y */
1585   INT32               dzdy;                   /* delta Z per Y */
1586   INT64               dwdy;                   /* delta W per Y */
1587
1588   stats_block         lfb_stats;              /* LFB-access statistics */
1589
1590   UINT8               sverts;                 /* number of vertices ready */
1591   setup_vertex        svert[3];               /* 3 setup vertices */
1592
1593   fifo_state          fifo;                   /* framebuffer memory fifo */
1594   cmdfifo_info        cmdfifo[2];             /* command FIFOs */
1595
1596   UINT8               fogblend[64];           /* 64-entry fog table */
1597   UINT8               fogdelta[64];           /* 64-entry fog table */
1598   UINT8               fogdelta_mask;          /* mask for for delta (0xff for V1, 0xfc for V2) */
1599
1600   rgb_t               pen[65536];             /* mapping from pixels to pens */
1601   rgb_t               clut[512];              /* clut gamma data */
1602   UINT8               clut_dirty;             /* do we need to recompute? */
1603};
1604
1605
1606struct dac_state
1607{
1608   UINT8               reg[8];                 /* 8 registers */
1609   UINT8               read_result;            /* pending read result */
1610};
1611
1612
1613struct raster_info
1614{
1615   raster_info *       next;                   /* pointer to next entry with the same hash */
1616   poly_draw_scanline_func callback;           /* callback pointer */
1617   UINT8               is_generic;             /* TRUE if this is one of the generic rasterizers */
1618   UINT8               display;                /* display index */
1619   UINT32              hits;                   /* how many hits (pixels) we've used this for */
1620   UINT32              polys;                  /* how many polys we've used this for */
1621   UINT32              eff_color_path;         /* effective fbzColorPath value */
1622   UINT32              eff_alpha_mode;         /* effective alphaMode value */
1623   UINT32              eff_fog_mode;           /* effective fogMode value */
1624   UINT32              eff_fbz_mode;           /* effective fbzMode value */
1625   UINT32              eff_tex_mode_0;         /* effective textureMode value for TMU #0 */
1626   UINT32              eff_tex_mode_1;         /* effective textureMode value for TMU #1 */
1627   UINT32              hash;
1628};
1629
1630
1631struct poly_extra_data
1632{
1633   voodoo_device * device;
1634   raster_info *       info;                   /* pointer to rasterizer information */
1635
1636   INT16               ax, ay;                 /* vertex A x,y (12.4) */
1637   INT32               startr, startg, startb, starta; /* starting R,G,B,A (12.12) */
1638   INT32               startz;                 /* starting Z (20.12) */
1639   INT64               startw;                 /* starting W (16.32) */
1640   INT32               drdx, dgdx, dbdx, dadx; /* delta R,G,B,A per X */
1641   INT32               dzdx;                   /* delta Z per X */
1642   INT64               dwdx;                   /* delta W per X */
1643   INT32               drdy, dgdy, dbdy, dady; /* delta R,G,B,A per Y */
1644   INT32               dzdy;                   /* delta Z per Y */
1645   INT64               dwdy;                   /* delta W per Y */
1646
1647   INT64               starts0, startt0;       /* starting S,T (14.18) */
1648   INT64               startw0;                /* starting W (2.30) */
1649   INT64               ds0dx, dt0dx;           /* delta S,T per X */
1650   INT64               dw0dx;                  /* delta W per X */
1651   INT64               ds0dy, dt0dy;           /* delta S,T per Y */
1652   INT64               dw0dy;                  /* delta W per Y */
1653   INT32               lodbase0;               /* used during rasterization */
1654
1655   INT64               starts1, startt1;       /* starting S,T (14.18) */
1656   INT64               startw1;                /* starting W (2.30) */
1657   INT64               ds1dx, dt1dx;           /* delta S,T per X */
1658   INT64               dw1dx;                  /* delta W per X */
1659   INT64               ds1dy, dt1dy;           /* delta S,T per Y */
1660   INT64               dw1dy;                  /* delta W per Y */
1661   INT32               lodbase1;               /* used during rasterization */
1662
1663   UINT16              dither[16];             /* dither matrix, for fastfill */
1664};
1665
1666
1667struct banshee_info
1668{
1669   UINT32              io[0x40];               /* I/O registers */
1670   UINT32              agp[0x80];              /* AGP registers */
1671   UINT8               vga[0x20];              /* VGA registers */
1672   UINT8               crtc[0x27];             /* VGA CRTC registers */
1673   UINT8               seq[0x05];              /* VGA sequencer registers */
1674   UINT8               gc[0x05];               /* VGA graphics controller registers */
1675   UINT8               att[0x15];              /* VGA attribute registers */
1676   UINT8               attff;                  /* VGA attribute flip-flop */
1677
1678   UINT32              blt_regs[0x20];         /* 2D Blitter registers */
1679   UINT32              blt_dst_base;
1680   UINT32              blt_dst_x;
1681   UINT32              blt_dst_y;
1682   UINT32              blt_dst_width;
1683   UINT32              blt_dst_height;
1684   UINT32              blt_dst_stride;
1685   UINT32              blt_dst_bpp;
1686   UINT32              blt_cmd;
1687   UINT32              blt_src_base;
1688   UINT32              blt_src_x;
1689   UINT32              blt_src_y;
1690   UINT32              blt_src_width;
1691   UINT32              blt_src_height;
1692   UINT32              blt_src_stride;
1693   UINT32              blt_src_bpp;
1694};
1695
1696
1697typedef voodoo_reg rgb_union;
1698
1699
1700
1701
1702
181703/***************************************************************************
191704    CONSTANTS
201705***************************************************************************/
r253153r253154
611746    FUNCTION PROTOTYPES
621747***************************************************************************/
631748
64int voodoo_update(device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect);
65int voodoo_get_type(device_t *device);
66int voodoo_is_stalled(device_t *device);
67void voodoo_set_init_enable(device_t *device, UINT32 newval);
1749struct stats_block;
681750
691751/* ----- device interface ----- */
701752
r253153r253154
861768   DECLARE_WRITE32_MEMBER( voodoo_w );
871769
881770   // access to legacy token
89   struct voodoo_state *token() const { assert(m_token != nullptr); return m_token; }
901771   void common_start_voodoo(UINT8 type);
911772
921773   UINT8               m_fbmem;
r253153r253154
961777   const char *        m_cputag;
971778   devcb_write_line   m_vblank;
981779   devcb_write_line   m_stall;
1780   
1781   TIMER_CALLBACK_MEMBER( vblank_off_callback );
1782   TIMER_CALLBACK_MEMBER( stall_cpu_callback );
1783   TIMER_CALLBACK_MEMBER( vblank_callback );
991784
1785   static void voodoo_postload(voodoo_device *vd);
1786
1787   int voodoo_update(bitmap_rgb32 &bitmap, const rectangle &cliprect);
1788   int voodoo_get_type();
1789   int voodoo_is_stalled();
1790   void voodoo_set_init_enable(UINT32 newval);
1791
1792   // not all of these need to be static, review.
1793
1794   static void check_stalled_cpu(voodoo_device* vd, attotime current_time);
1795   static void flush_fifos( voodoo_device* vd, attotime current_time);
1796   static void init_fbi(voodoo_device *vd, fbi_state *f, void *memory, int fbmem);
1797   static INT32 register_w(voodoo_device *vd, offs_t offset, UINT32 data);
1798   static INT32 swapbuffer(voodoo_device *vd, UINT32 data);
1799   static void init_tmu(voodoo_device *vd, tmu_state *t, voodoo_reg *reg, void *memory, int tmem);
1800   static INT32 lfb_w(voodoo_device *vd, offs_t offset, UINT32 data, UINT32 mem_mask);
1801   static INT32 texture_w(voodoo_device *vd, offs_t offset, UINT32 data);
1802   static INT32 lfb_direct_w(voodoo_device *vd, offs_t offset, UINT32 data, UINT32 mem_mask);
1803   static INT32 banshee_2d_w(voodoo_device *vd, offs_t offset, UINT32 data);
1804   static void stall_cpu(voodoo_device *vd, int state, attotime current_time);
1805   static void soft_reset(voodoo_device *vd);
1806   static void recompute_video_memory(voodoo_device *vd);
1807   static INT32 fastfill(voodoo_device *vd);
1808   static INT32 triangle(voodoo_device *vd);
1809   static INT32 begin_triangle(voodoo_device *vd);
1810   static INT32 draw_triangle(voodoo_device *vd);
1811   static INT32 setup_and_draw_triangle(voodoo_device *vd);
1812   static INT32 triangle_create_work_item(voodoo_device* vd,UINT16 *drawbuf, int texcount);
1813   static raster_info *add_rasterizer(voodoo_device *vd, const raster_info *cinfo);
1814   static raster_info *find_rasterizer(voodoo_device *vd, int texcount);
1815   static void dump_rasterizer_stats(voodoo_device *vd);
1816   static void init_tmu_shared(tmu_shared_state *s);
1817
1818   static void swap_buffers(voodoo_device *vd);
1819   static UINT32 cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f);
1820   static INT32 cmdfifo_execute_if_ready(voodoo_device* vd, cmdfifo_info *f);
1821   static void cmdfifo_w(voodoo_device *vd, cmdfifo_info *f, offs_t offset, UINT32 data);
1822
1823   static void raster_fastfill(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid);
1824   static void raster_generic_0tmu(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid);
1825   static void raster_generic_1tmu(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid);
1826   static void raster_generic_2tmu(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid);
1827
1828#define RASTERIZER_HEADER(name) \
1829   static void raster_##name(void *destbase, INT32 y, const poly_extent *extent, const void *extradata, int threadid); \
1830
1831#define RASTERIZER_ENTRY(fbzcp, alpha, fog, fbz, tex0, tex1) \
1832   RASTERIZER_HEADER(fbzcp##_##alpha##_##fog##_##fbz##_##tex0##_##tex1) \
1833
1834#include "voodoo_rast.inc"
1835
1836#undef RASTERIZER_ENTRY
1837
1838
1839
1001840protected:
1011841   // device-level overrides
1021842   virtual void device_config_complete() override;
1031843   virtual void device_stop() override;
1041844   virtual void device_reset() override;
105private:
106   // internal state
107   struct voodoo_state *m_token;
1845public:
1846   // voodoo_state
1847   UINT8               index;                  /* index of board */
1848   voodoo_device *device;               /* pointer to our containing device */
1849   screen_device *screen;              /* the screen we are acting on */
1850   device_t *cpu;                  /* the CPU we interact with */
1851   UINT8               vd_type;                   /* type of system */
1852   UINT8               chipmask;               /* mask for which chips are available */
1853   UINT32              freq;                   /* operating frequency */
1854   attoseconds_t       attoseconds_per_cycle;  /* attoseconds per cycle */
1855   UINT32              extra_cycles;           /* extra cycles not yet accounted for */
1856   int                 trigger;                /* trigger used for stalling */
1857
1858   voodoo_reg          reg[0x400];             /* raw registers */
1859   const UINT8 *       regaccess;              /* register access array */
1860   const char *const * regnames;               /* register names array */
1861   UINT8               alt_regmap;             /* enable alternate register map? */
1862
1863   pci_state           pci;                    /* PCI state */
1864   dac_state           dac;                    /* DAC state */
1865
1866   fbi_state           fbi;                    /* FBI states */
1867   tmu_state           tmu[MAX_TMU];           /* TMU states */
1868   tmu_shared_state    tmushare;               /* TMU shared state */
1869   banshee_info        banshee;                /* Banshee state */
1870
1871   legacy_poly_manager * poly;                 /* polygon manager */
1872   stats_block *       thread_stats;           /* per-thread statistics */
1873
1874   voodoo_stats        stats;                  /* internal statistics */
1875
1876   offs_t              last_status_pc;         /* PC of last status description (for logging) */
1877   UINT32              last_status_value;      /* value of last status read (for logging) */
1878
1879   int                 next_rasterizer;        /* next rasterizer index */
1880   raster_info         rasterizer[MAX_RASTERIZERS]; /* array of rasterizers */
1881   raster_info *       raster_hash[RASTER_HASH_SIZE]; /* hash table of rasterizers */
1882
1883   bool                send_config;
1884   UINT32              tmu_config;
1885
1081886};
1091887
1101888class voodoo_1_device : public voodoo_device
trunk/src/devices/video/voodoo_pci.cpp
r253153r253154
153153
154154UINT32 voodoo_pci_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
155155{
156   return voodoo_update(m_voodoo, bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
156   return m_voodoo->voodoo_update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
157157}
158158
159159// PCI bus control
r253153r253154
170170   switch (offset) {
171171      case 0x0/4:  // The address map starts at 0x40
172172         // HW initEnable
173         voodoo_set_init_enable(m_voodoo, data);
173         m_voodoo->voodoo_set_init_enable(data);
174174         logerror("%06X:voodoo_pci_device pcictrl_w to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask);
175175         break;
176176      default:
trunk/src/emu/emuopts.cpp
r253153r253154
262262      {
263263         std::string featurename = std::string(name).append("_default");
264264         const char *value = swpart->feature(featurename.c_str());
265         if (value != nullptr)
265         if (value != nullptr && (*value == '\0' || slot->option(value) != nullptr))
266266            set_default_value(name, value);
267267      }
268268   }
trunk/src/mame/arcade.lst
r253153r253154
51435143vmahjong        // 1997.02 Virtual Mahjong (Micronet)
51445144pclub2kc        // 1997.02 Print Club Kome Kome Club
51455145pclub2fc        // 1997.04 Print Club 2 Felix The Cat
5146pclub2pe      //
5147pclub2pf      //
5148pclub26w      //
5149pclub27s      //
5150pclubyo2      //
51465151groovef         // 1997.05 Groove on Fight (Atlus)
51475152nclubv3         // 1997.07 Name Club Ver. 3
5153nclubv2         //
5154nameclub      //
51485155pclb2elk        // 1997.07 Print Club Custom
51495156pclub2          // 1997.09 Print Club 2
51505157thunt           // 1997.09 Puzzle & Action Treasure Hunt (Sega (Deniam License))
r253153r253154
51525159winterht        // 1997.10 Winter Heat (Data East)
51535160pclb297w        // 1997.10 Print Club 2 '97 Winter Ver
51545161pclub298        // 1997.10 Print Club 2 '98 Spring Ver
5162pclove
51555163cotton2         // 1997.11 Cotton 2 (Success)
51565164hanagumi        // 1997.11 Sakura Taisen Hanagumi Taisen Columns
51575165findlove        // 1997.12 Find Love (Daiki / FCF)
r253153r253154
92709278bonkadv         // (c) 1994 Kaneko
92719279gtmr            // (c) 1994 Kaneko
92729280gtmra           // (c) 1994 Kaneko
9281gtmrb         // (c) 1994 Kaneko
92739282gtmro         // (c) 1994 Kaneko
92749283gtmre           // (c) 1994 Kaneko
92759284gtmrusa         // (c) 1994 Kaneko (US)
r253153r253154
98529861
98539862// ESD games
98549863// http://www.esdgame.co.kr/english/
9855multchmp        // (c) 1998 (World)
9864multchmp        // (c) 1999 (World)
98569865multchmpk       // (c) 1998 (Korea)
9866multchmpa      // (c) 1998 (World)
98579867mchampdx        // (c) 1999 ESD
98589868mchampdxa       // (c) 1999 ESD
98599869mchampdxb       // (c) 1999 ESD
r253153r253154
1085910869dorachan        // (c) 1980 Craul Denshi
1086010870ladyfrog        // (c) 1990 Mondial Games
1086110871toucheme
10872touchemea
1086210873rabbit          // (c) 1997 Electronic Arts
1086310874tmmjprd         // (c) 1997 Media / Sonnet
1086410875tmpdoki         // (c) 1998 Media Syouji
trunk/src/mame/drivers/arkanoid.cpp
r253153r253154
12451245
12461246void arkanoid_state::machine_start()
12471247{
1248   // allocate the MCU timer, even if we have no MCU, and set it to fire NEVER.
1249   m_68705_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(arkanoid_state::timer_68705_increment),this));
1250   m_68705_timer->adjust(attotime::never);
1251
12481252   save_item(NAME(m_gfxbank));
12491253   save_item(NAME(m_palettebank));
12501254
r253153r253154
12841288   m_z80HasWritten = 0;
12851289   m_68705HasWritten = 0;
12861290   if (m_mcu.found()) m_mcu->set_input_line(M68705_IRQ_LINE, CLEAR_LINE);
1291   if (m_mcu.found()) m_68705_timer->adjust(attotime::from_hz(((XTAL_12MHz/4)/4)/(1<<7)));
12871292
12881293   m_port_a_in = 0;
12891294   m_port_a_out = 0;
trunk/src/mame/drivers/esd16.cpp
r253153r253154
826826   ROM_LOAD( "esd4.su10", 0x00000, 0x20000, CRC(6e741fcd) SHA1(742e0952916c00f67dd9f8d01e721a9a538d2fc4) )
827827ROM_END
828828
829ROM_START( multchmpa )
830   ROM_REGION( 0x080000, "maincpu", 0 )        /* 68000 Code */
831   ROM_LOAD16_BYTE( "esd2.cu02", 0x000000, 0x040000, CRC(bfd39198) SHA1(11c0cb7a865daa1be9301ddfa5f5d2014e8f9908) )
832   ROM_LOAD16_BYTE( "esd1.cu03", 0x000001, 0x040000, CRC(cd769077) SHA1(741cca679393dab031691834874c96fee791241e) )
833
834   ROM_REGION( 0x40000, "audiocpu", 0 )        /* Z80 Code */
835   ROM_LOAD( "esd3.su01", 0x00000, 0x20000, CRC(7c178bd7) SHA1(8754d3c70d9b2bf369a5ce0cce4cc0696ed22750) )
836
837   ROM_REGION( 0x180000, "spr", 0 )    /* Sprites, 16x16x5 */
838   ROM_LOAD16_BYTE( "esd17.ju06", 0x000000, 0x040000, CRC(51f01067) SHA1(d5ebbc7d358b63724d2f24da8b2ce4a202be37a5) )
839   ROM_LOAD16_BYTE( "esd16.ju05", 0x000001, 0x040000, CRC(88e252e8) SHA1(07d898379798c6be42b636762b0af61b9111a480) )
840   ROM_LOAD16_BYTE( "esd15.ju04", 0x080000, 0x040000, CRC(b1ae7f08) SHA1(37dd9d4cef8b9e1d09d7b46a9794fb2b777c9a01) )
841   ROM_LOAD16_BYTE( "esd14.ju03", 0x080001, 0x040000, CRC(d8f06fa8) SHA1(f76912f93f99578529612a7f01d82ac7229a8e41) )
842   ROM_LOAD16_BYTE( "esd13.ju07", 0x100000, 0x040000, CRC(9d1590a6) SHA1(35f634dbf0df06ec62359c7bae43c7f5d14b0ab2) )
843
844   ROM_REGION( 0x400000, "bgs", 0 )    /* Layers, 16x16x8 */
845   ROM_LOAD32_BYTE( "esd9.fu28",  0x000000, 0x080000, CRC(a3cfe895) SHA1(a8dc0d5d9e64d4c5112177b8f20b5bdb86ca73af) )
846   ROM_LOAD32_BYTE( "esd11.fu29", 0x000001, 0x080000, CRC(d3c1855e) SHA1(bb547d4a45a745e9ae4a6727087cdf325105de90) )
847   ROM_LOAD32_BYTE( "esd7.fu26",  0x000002, 0x080000, CRC(042d59ff) SHA1(8e45a4757e07d8aaf50b151d8849c1a27424e64b) )
848   ROM_LOAD32_BYTE( "esd5.fu27",  0x000003, 0x080000, CRC(ed5b4e58) SHA1(82c3ee9e2525c0b370a29d5560c21ec6380d1a43) )
849   ROM_LOAD32_BYTE( "esd10.fu31", 0x200000, 0x080000, CRC(396d77b6) SHA1(f22449a7f9f50e172e36db4f399c14e527409884) )
850   ROM_LOAD32_BYTE( "esd12.fu33", 0x200001, 0x080000, CRC(a68848a8) SHA1(915239a961d76af6a1a567eb89b1569f158e714e) )
851   ROM_LOAD32_BYTE( "esd8.fu30",  0x200002, 0x080000, CRC(fa8cd2d3) SHA1(ddc1b98867e6d2eee458bf35a933e7cdc59f4c7e) )
852   ROM_LOAD32_BYTE( "esd6.fu32",  0x200003, 0x080000, CRC(97fde7b1) SHA1(b3610f6fcc1367ff079dc01121c86bc1e1f4c7a2) )
853
854   ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
855   ROM_LOAD( "esd4.su08", 0x00000, 0x20000, CRC(6e741fcd) SHA1(742e0952916c00f67dd9f8d01e721a9a538d2fc4) )
856ROM_END
857
858
859
829860/*
830861
831862Multi Champ Deluxe
r253153r253154
15301561
15311562/* ESD 11-09-98 */
15321563GAME( 1999, multchmp, 0,        esd16,    multchmp, driver_device, 0, ROT0, "ESD",         "Multi Champ (World, ver. 2.5)", MACHINE_SUPPORTS_SAVE )
1533GAME( 1998, multchmpk,multchmp, esd16,    multchmp, driver_device, 0, ROT0, "ESD",         "Multi Champ (Korea)", MACHINE_SUPPORTS_SAVE )
1564GAME( 1998, multchmpk,multchmp, esd16,    multchmp, driver_device, 0, ROT0, "ESD",         "Multi Champ (Korea, older)", MACHINE_SUPPORTS_SAVE )
1565GAME( 1998, multchmpa,multchmp, esd16,    multchmp, driver_device, 0, ROT0, "ESD",         "Multi Champ (World, older)", MACHINE_SUPPORTS_SAVE )
1566
15341567GAME( 2001, jumppop,  0,        jumppop,  jumppop, driver_device,  0, ROT0, "ESD",         "Jumping Pop (set 1)", MACHINE_SUPPORTS_SAVE ) /* Redesigned(?) ESD 11-09-98 with no ID# */
15351568GAME( 2001, jumppope, jumppop,  jumppop,  jumppop, driver_device,  0, ROT0, "Emag Soft",   "Jumping Pop (set 2)", MACHINE_SUPPORTS_SAVE )
15361569
trunk/src/mame/drivers/fidelz80.cpp
r253153r253154
15371537    Machine Drivers
15381538******************************************************************************/
15391539
1540static MACHINE_CONFIG_START( cc7, fidelz80_state )
1541
1542   /* basic machine hardware */
1543   MCFG_CPU_ADD("maincpu", Z80, XTAL_3_579545MHz)
1544   MCFG_CPU_PROGRAM_MAP(cc10_map)
1545   //MCFG_CPU_IO_MAP(vcc_io)
1546
1547   MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1))
1548   MCFG_DEFAULT_LAYOUT(layout_fidel_cc)
1549
1550   /* sound hardware */
1551   MCFG_SPEAKER_STANDARD_MONO("mono")
1552   MCFG_SOUND_ADD("beeper", BEEP, 0)
1553   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
1554MACHINE_CONFIG_END
1555
15401556static MACHINE_CONFIG_START( cc10, fidelz80_state )
15411557
15421558   /* basic machine hardware */
r253153r253154
16411657    ROM Definitions
16421658******************************************************************************/
16431659
1660ROM_START( cc7 )
1661   ROM_REGION( 0x10000, "maincpu", 0 )
1662   ROM_LOAD( "cn19103n_bcc-revb", 0x0000, 0x1000, CRC(a397d471) SHA1(9b12bc442fccee40f4d8500c792bc9d886c5e1a5) ) // 2332
1663ROM_END
1664
16441665ROM_START( cc10 )
16451666   ROM_REGION( 0x10000, "maincpu", 0 )
16461667   ROM_LOAD( "cc10b", 0x0000, 0x1000, CRC(afd3ca99) SHA1(870d09b2b52ccb8572d69642c59b5215d5fb26ab) ) // 2332
r253153r253154
18041825******************************************************************************/
18051826
18061827/*    YEAR  NAME      PARENT  COMPAT  MACHINE  INPUT   INIT              COMPANY, FULLNAME, FLAGS */
1807COMP( 1978, cc10,     0,      0,      cc10,    cc10,   driver_device, 0, "Fidelity Electronics", "Chess Challenger 10 (version B)", MACHINE_SUPPORTS_SAVE )
1828COMP( 1978, cc10,     0,      0,      cc10,    cc10,   driver_device, 0, "Fidelity Electronics", "Chess Challenger 10 (rev. B)", MACHINE_SUPPORTS_SAVE )
1829COMP( 1979, cc7,     0,      0,      cc7,    cc10,   driver_device, 0, "Fidelity Electronics", "Chess Challenger 7 (rev. B)", MACHINE_SUPPORTS_SAVE | MACHINE_NOT_WORKING )
18081830
18091831COMP( 1979, vcc,      0,      0,      vcc,     vcc,    driver_device, 0, "Fidelity Electronics", "Voice Chess Challenger (English)", MACHINE_SUPPORTS_SAVE )
18101832COMP( 1979, vccsp,    vcc,    0,      vcc,     vccsp,  driver_device, 0, "Fidelity Electronics", "Voice Chess Challenger (Spanish)", MACHINE_SUPPORTS_SAVE )
trunk/src/mame/drivers/funkball.cpp
r253153r253154
142142
143143UINT32 funkball_state::screen_update( screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect )
144144{
145   return voodoo_update(m_voodoo, bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
145   return m_voodoo->voodoo_update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
146146}
147147
148148static UINT32 voodoo_0_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask)
r253153r253154
186186         break;
187187      case 0x40:
188188         state->m_voodoo_pci_regs.init_enable = data;
189         voodoo_set_init_enable(state->m_voodoo, data);
189         state->m_voodoo->voodoo_set_init_enable(data);
190190         break;
191191   }
192192}
trunk/src/mame/drivers/gticlub.cpp
r253153r253154
910910
911911   if (strcmp(screen.tag(), ":lscreen") == 0)
912912   {
913      device_t *voodoo = machine().device("voodoo0");
913      voodoo_device *voodoo = (voodoo_device*)machine().device("voodoo0");
914914
915915   //  m_k001604_1->draw_back_layer(bitmap, cliprect);
916916
917      voodoo_update(voodoo, bitmap, cliprect);
917      voodoo->voodoo_update(bitmap, cliprect);
918918
919919      m_k001604_1->draw_front_layer(screen, bitmap, cliprect);
920920   }
921921   else if (strcmp(screen.tag(), ":rscreen") == 0)
922922   {
923      device_t *voodoo = machine().device("voodoo1");
923      voodoo_device *voodoo = (voodoo_device*)machine().device("voodoo1");
924924
925925   //  m_k001604_2->draw_back_layer(bitmap, cliprect);
926926
927      voodoo_update(voodoo, bitmap, cliprect);
927      voodoo->voodoo_update(bitmap, cliprect);
928928
929929      m_k001604_2->draw_front_layer(screen, bitmap, cliprect);
930930   }
trunk/src/mame/drivers/hornet.cpp
r253153r253154
478478
479479UINT32 hornet_state::screen_update_hornet(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
480480{
481   device_t *voodoo = machine().device("voodoo0");
481   voodoo_device* voodoo = (voodoo_device*)machine().device("voodoo0");
482482
483   voodoo_update(voodoo, bitmap, cliprect);
483   voodoo->voodoo_update(bitmap, cliprect);
484484
485485   m_k037122_1->tile_draw(screen, bitmap, cliprect);
486486
r253153r253154
493493{
494494   if (strcmp(screen.tag(), ":lscreen") == 0)
495495   {
496      device_t *voodoo = machine().device("voodoo0");
497      voodoo_update(voodoo, bitmap, cliprect);
496      voodoo_device *voodoo = (voodoo_device*)machine().device("voodoo0");
497      voodoo->voodoo_update(bitmap, cliprect);
498498
499499      /* TODO: tilemaps per screen */
500500      m_k037122_1->tile_draw(screen, bitmap, cliprect);
501501   }
502502   else if (strcmp(screen.tag(), ":rscreen") == 0)
503503   {
504      device_t *voodoo = machine().device("voodoo1");
505      voodoo_update(voodoo, bitmap, cliprect);
504      voodoo_device *voodoo = (voodoo_device*)machine().device("voodoo1");
505      voodoo->voodoo_update(bitmap, cliprect);
506506
507507      /* TODO: tilemaps per screen */
508508      m_k037122_2->tile_draw(screen, bitmap, cliprect);
trunk/src/mame/drivers/kaneko16.cpp
r253153r253154
33423342   /* Not present on this board */
33433343ROM_END
33443344
3345ROM_START( gtmrb )
3346   ROM_REGION( 0x100000, "maincpu", 0 )            /* 68000 Code */
3347   ROM_LOAD16_BYTE( "mmp0x1.u514", 0x000000, 0x080000, CRC(6c163f12) SHA1(7f33d1475dcb754c83f68b5fb686fb236ba81256) )
3348   ROM_LOAD16_BYTE( "mmp1x1.u513", 0x000001, 0x080000, CRC(424dc7e1) SHA1(a9cb8d1fd0549c8c77462552c649c180c30eef89) )
33453349
3350   ROM_REGION( 0x020000, "mcudata", 0 )            /* MCU Code */
3351   ROM_LOAD16_WORD_SWAP( "mmd0x1.u124",  0x000000, 0x020000, CRC(3d7cb329) SHA1(053106acde642a414fde0b01105fe6762b6a10f6) ) // == mmd0x2
3352
3353   ROM_REGION( 0x840000, "gfx1", 0 )   /* Sprites */
3354   ROM_LOAD( "mm-200-402-s0.bin",  0x000000, 0x200000, CRC(c0ab3efc) SHA1(e6cd15480977b036234d91e6f3a6e21b7f0a3c3e) )
3355   ROM_LOAD( "mm-201-403-s1.bin",  0x200000, 0x200000, CRC(cf6b23dc) SHA1(ccfd0b17507e091e55c169361cd6a6b19641b717) )
3356   ROM_LOAD( "mm-202-404-s2.bin",  0x400000, 0x200000, CRC(8f27f5d3) SHA1(219a86446ce2556682009d8aff837480f040a01e) )
3357   ROM_LOAD( "mm-203-405-s3.bin",  0x600000, 0x080000, CRC(e9747c8c) SHA1(2507102ec34755c6f110eadb3444e6d3a3474051) )
3358   ROM_LOAD16_BYTE( "mms1x1.u30",  0x800001, 0x020000, CRC(9463825c) SHA1(696bbfc816b564b3cff1487e1b848d375951f923) )
3359   ROM_LOAD16_BYTE( "mms0x1.u29",  0x800000, 0x020000, CRC(bd22b7d2) SHA1(ef82d00d72439590c71aed33ecfabc6ee71a6ff9) ) // == mms0x2
3360
3361   ROM_REGION( 0x200000, "gfx2", 0 )   /* Tiles (scrambled) */
3362   ROM_LOAD( "mm-300-406-a0.bin",  0x000000, 0x200000, CRC(b15f6b7f) SHA1(5e84919d788add53fc87f4d85f437df413b1dbc5) )
3363
3364   ROM_REGION( 0x200000, "gfx3", 0 )   /* Tiles (scrambled) */
3365   ROM_COPY("gfx2",0x000000,0,0x200000) // it isn't on the board twice.
3366
3367   ROM_REGION( 0x400000, "oki1", 0 )   /* Samples, plus room for expansion */
3368   ROM_LOAD( "mm-100-401-e0.bin",  0x000000, 0x100000, CRC(b9cbfbee) SHA1(051d48a68477ef9c29bd5cc0bb7955d513a0ab94) )  // 16 x $10000
3369
3370   ROM_REGION( 0x100000, "oki2", ROMREGION_ERASE00 )   /* Samples */
3371   /* Not present on this board */
3372ROM_END
3373
3374
33463375ROM_START( gtmro )
33473376   ROM_REGION( 0x100000, "maincpu", 0 )            /* 68000 Code */
33483377   ROM_LOAD16_BYTE( "u514.bin", 0x000000, 0x080000, CRC(2e857685) SHA1(43b6d88df51a3b4fb0cb910f63a5ec26b06e216a) )
r253153r253154
43804409GAME( 1994, bonkadv,  0,        bonkadv , bonkadv,  kaneko16_gtmr_state,     gtmr,     ROT0,  "Kaneko", "B.C. Kid / Bonk's Adventure / Kyukyoku!! PC Genjin", MACHINE_SUPPORTS_SAVE )
43814410GAME( 1994, bloodwar, 0,        bloodwar, bloodwar, kaneko16_gtmr_state,     gtmr,     ROT0,  "Kaneko", "Blood Warrior", MACHINE_SUPPORTS_SAVE )
43824411GAME( 1994, oedfight, bloodwar, bloodwar, bloodwar, kaneko16_gtmr_state,     gtmr,     ROT0,  "Kaneko", "Oedo Fight (Japan Bloodshed Ver.)", MACHINE_SUPPORTS_SAVE )
4383GAME( 1994, gtmr,     0,        gtmr,     gtmr,     kaneko16_gtmr_state,     gtmr,     ROT0,  "Kaneko", "1000 Miglia: Great 1000 Miles Rally (94/07/18)", MACHINE_SUPPORTS_SAVE )
4412GAME( 1994, gtmr,     0,        gtmr,     gtmr,     kaneko16_gtmr_state,     gtmr,     ROT0,  "Kaneko", "1000 Miglia: Great 1000 Miles Rally (94/07/18)", MACHINE_SUPPORTS_SAVE ) // this set shows 'PCB by Jinwei Co Ltd. ROC'
43844413GAME( 1994, gtmra,    gtmr,     gtmr,     gtmr,     kaneko16_gtmr_state,     gtmr,     ROT0,  "Kaneko", "1000 Miglia: Great 1000 Miles Rally (94/06/13)", MACHINE_SUPPORTS_SAVE )
4414GAME( 1994, gtmrb,    gtmr,     gtmr,     gtmr,     kaneko16_gtmr_state,     gtmr,     ROT0,  "Kaneko", "1000 Miglia: Great 1000 Miles Rally (94/05/26)", MACHINE_SUPPORTS_SAVE )
43854415GAME( 1994, gtmro,    gtmr,     gtmr,     gtmr,     kaneko16_gtmr_state,     gtmr,     ROT0,  "Kaneko", "1000 Miglia: Great 1000 Miles Rally (94/05/10)", MACHINE_SUPPORTS_SAVE ) // possible prototype
43864416GAME( 1994, gtmre,    gtmr,     gtmre,    gtmr,     kaneko16_gtmr_state,     gtmr,     ROT0,  "Kaneko", "Great 1000 Miles Rally: Evolution Model!!! (94/09/06)", MACHINE_SUPPORTS_SAVE )
43874417GAME( 1994, gtmrusa,  gtmr,     gtmre,    gtmr,     kaneko16_gtmr_state,     gtmr,     ROT0,  "Kaneko", "Great 1000 Miles Rally: U.S.A Version! (94/09/06)", MACHINE_SUPPORTS_SAVE ) // U.S.A version seems part of the title, rather than region
trunk/src/mame/drivers/ladyfrog.cpp
r253153r253154
365365   ROM_LOAD( "8.ic10",   0x20000, 0x10000, CRC(fc6808bf) SHA1(f1f1b75a79dfdb500012f9b52c6364f0a13dce2d) )
366366ROM_END
367367
368ROM_START( touchemea )
369   ROM_REGION( 0x10000, "maincpu", 0 )
370   ROM_LOAD( "2.ic107",   0x0000, 0x10000, CRC(4e72312d) SHA1(a7d178608f05c87a53c650298b903bcf34b3b755) ) // sldh
371
372   ROM_REGION( 0x10000, "audiocpu", 0 )
373   ROM_LOAD( "1.ic115",   0x0000, 0x8000, CRC(902589aa) SHA1(d60088fc31a67fec91f908f671af77bb87a5e59c) )
374
375   ROM_REGION( 0x60000, "gfx1", ROMREGION_INVERT )
376   ROM_LOAD( "3.ic32",   0x30000, 0x10000, CRC(223b4435) SHA1(fb5a4096012093bae5fda213a5de317e63a88ec3) )
377   ROM_LOAD( "4.ic33",   0x40000, 0x10000, CRC(96dcc2f3) SHA1(9c61f8161771e40ca41b6e102bc04583dc97cd0d) )
378   ROM_LOAD( "5.ic34",   0x50000, 0x10000, CRC(b8667a6b) SHA1(288a5cbd8fc01b24822e89fbc1e6d7f45c181483) )
379   ROM_LOAD( "6.ic8",    0x00000, 0x10000, CRC(d257382f) SHA1(9c459b90c9ddfe90de4a252f29a7bee809412b46) )
380   ROM_LOAD( "7.ic9",    0x10000, 0x10000, CRC(feb1b974) SHA1(ffd4527472cdf655fbebebf4d3abb61962e54457) )
381   ROM_LOAD( "8.ic10",   0x20000, 0x10000, CRC(fc6808bf) SHA1(f1f1b75a79dfdb500012f9b52c6364f0a13dce2d) )
382ROM_END
383
368384GAME( 1990, ladyfrog, 0, ladyfrog, ladyfrog, driver_device, 0, ORIENTATION_SWAP_XY, "Mondial Games", "Lady Frog", MACHINE_SUPPORTS_SAVE )
369385
370386// toucheme art style is similar to ladyfrog, so it's probably the same manufacturer
371GAME( 19??, toucheme, 0, toucheme, toucheme, driver_device, 0, ORIENTATION_SWAP_XY, "<unknown>",     "Touche Me", MACHINE_SUPPORTS_SAVE )
387GAME( 19??, toucheme, 0,        toucheme, toucheme, driver_device, 0, ORIENTATION_SWAP_XY, "<unknown>",     "Touche Me (set 1)", MACHINE_SUPPORTS_SAVE )
388GAME( 19??, touchemea,toucheme, toucheme, toucheme, driver_device, 0, ORIENTATION_SWAP_XY, "<unknown>",     "Touche Me (set 2, harder)", MACHINE_SUPPORTS_SAVE )
trunk/src/mame/drivers/magictg.cpp
r253153r253154
180180
181181
182182   /* 3Dfx Voodoo */
183   device_t*                           m_voodoo[2];
183   voodoo_device*                           m_voodoo[2];
184184
185185   struct
186186   {
r253153r253154
241241
242242void magictg_state::machine_start()
243243{
244   m_voodoo[0] = machine().device("voodoo_0");
245   m_voodoo[1] = machine().device("voodoo_1");
244   m_voodoo[0] = (voodoo_device*)machine().device("voodoo_0");
245   m_voodoo[1] = (voodoo_device*)machine().device("voodoo_1");
246246}
247247
248248
r253153r253154
278278
279279UINT32 magictg_state::screen_update_magictg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
280280{
281   return voodoo_update(m_voodoo[0], bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
281   return m_voodoo[0]->voodoo_update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
282282}
283283
284284
r253153r253154
338338         break;
339339      case 0x40:
340340         state->m_voodoo_pci_regs[0].init_enable = data;
341         voodoo_set_init_enable(state->m_voodoo[0], data);
341         state->m_voodoo[0]->voodoo_set_init_enable(data);
342342         break;
343343
344344      default:
r253153r253154
601601            UINT32 dst_addr = m_dma_ch[ch].dst_addr;
602602            //device_t *voodoo = dst_addr > 0xa000000 voodoo0 : voodoo1;
603603
604            assert(DWORD_ALIGNED(src_addr));
605            assert(DWORD_ALIGNED(dst_addr));
604            assert((src_addr & 3) == 0);
605            assert((dst_addr & 3) == 0);
606606
607607            while (m_dma_ch[ch].count > 3)
608608            {
trunk/src/mame/drivers/nibble.cpp
r253153r253154
22// copyright-holders:Roberto Fresca
33/*************************************************************************
44
5  Unknown 'Nibble' game
6 
7  Preliminary driver by Roberto Fresca.
5  Lucky 9, Nibble.
86
7  Driver by Roberto Fresca.
8
9  Seems some sort of gambling game with playing cards (no poker)
10  and girls graphics...
11
12
913**************************************************************************
1014 
1115  Specs:
1216 
13  1x UM6845
14  1x AY38910A/p
17  1x UM6845 (U67).
18  1x AY38910A/p (U75).
1519
16  3x HY6264P-12
17  2x IMSG171P-50G
20  3x HY6264P-12 (U153, U154, U25).
21  2x IMSG171P-50G (U32, U104).
1822
1923  2 Chips with no markings!
2024
21  8x 64K Graphics ROMs.
22  1x 64K Program ROM.
23  1x 128K unknown ROM.
25  8x 64K Graphics ROMs (U139, U141, U149, U147, U137, U143, U145, U152).
26  1x 64K Program ROM (U123).
27  1x 128K unknown ROM (U138).
2428
29  1x TI LF347N (U158) Operational Amplifier.
30  1x LM380N (U82) 2.5W Audio Power Amplifier.
31
2532  2x XTAL - 11.98135 KDS9C
2633  2x 8 DIP switches banks.
34  1x 3.6V lithium battery.
2735
2836
2937**************************************************************************
r253153r253154
3139  Tech notes...
3240
3341  About the unknown ICs:
34  DIP64 CPU with Xtal tied to pins 30 % 31. --> TMS9900? (ROM 9)
35  DIP40 CPU or sound IC driving 128k (ROM 10) data? (pin 20 tied to GND)
42  DIP64 (U101) CPU with Xtal tied to pins 30 % 31. --> TMS9900? (ROM 9)
43  DIP40 (U64) CPU or sound IC driving 128k (ROM 10) data? (pin 20 tied to GND)
3644
3745
3846*************************************************************************/
3947
48
4049#define MASTER_CLOCK    XTAL_12MHz
4150
4251#include "emu.h"
52#include "cpu/tms9900/tms9980a.h"
53//#include "cpu/tms9900/tms9900.h"
4354#include "sound/ay8910.h"
4455#include "video/mc6845.h"
4556
r253153r253154
4859{
4960public:
5061   nibble_state(const machine_config &mconfig, device_type type, const char *tag)
51      : driver_device(mconfig, type, tag)
52   //  ,m_maincpu(*this, "maincpu")
53   { }
62      : driver_device(mconfig, type, tag),
63      m_videoram(*this, "videoram"),
64      m_maincpu(*this, "maincpu"),
65      m_gfxdecode(*this, "gfxdecode") { }
5466
67   required_shared_ptr<UINT8> m_videoram;
68   tilemap_t *m_bg_tilemap;
69   DECLARE_WRITE8_MEMBER(nibble_videoram_w);
70   TILE_GET_INFO_MEMBER(get_bg_tile_info);
71
5572   virtual void machine_start() override;
5673   virtual void machine_reset() override;
74   virtual void video_start() override;
75   DECLARE_PALETTE_INIT(nibble);
76   UINT32 screen_update_nibble(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
77   INTERRUPT_GEN_MEMBER(nibble_interrupt);
78   required_device<cpu_device> m_maincpu;
79   required_device<gfxdecode_device> m_gfxdecode;
80};
5781
58//   required_device<cpu_device> m_maincpu;
5982
60};
83/*************************
84*     Video Hardware     *
85*************************/
6186
62static INPUT_PORTS_START( nibble )
63INPUT_PORTS_END
87WRITE8_MEMBER(nibble_state::nibble_videoram_w)
88{
89   m_videoram[offset] = data;
90   m_bg_tilemap->mark_tile_dirty(offset);
91}
6492
6593
94TILE_GET_INFO_MEMBER(nibble_state::get_bg_tile_info)
95{
96/*  - bits -
97    7654 3210
98    ---- ----   bank select.
99    ---- ----   color code.
100    ---- ----   seems unused.
101*/
102   int code = m_videoram[tile_index];
103
104   SET_TILE_INFO_MEMBER(0 /* bank */, code, 0 /* color */, 0);
105}
106
107void nibble_state::video_start()
108{
109   m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(nibble_state::get_bg_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
110}
111
112UINT32 nibble_state::screen_update_nibble(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
113{
114   m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
115   return 0;
116}
117
118PALETTE_INIT_MEMBER(nibble_state, nibble)
119{
120}
121
122
123/**************************
124*  Read / Write Handlers  *
125**************************/
126
127INTERRUPT_GEN_MEMBER(nibble_state::nibble_interrupt)
128{
129}
130
131
132/************************
133*     Start & Reset     *
134************************/
135
66136void nibble_state::machine_start()
67137{
68138}
69139
140
70141void nibble_state::machine_reset()
71142{
72143}
73144
74145
146/*************************
147* Memory Map Information *
148*************************/
149
150static ADDRESS_MAP_START( nibble_map, AS_PROGRAM, 8, nibble_state )
151   ADDRESS_MAP_GLOBAL_MASK(0x3fff)
152   AM_RANGE(0x0000, 0xbfff) AM_ROM
153   AM_RANGE(0xc000, 0xc3ff) AM_WRITE(nibble_videoram_w) AM_SHARE("videoram")   // placeholder
154//   AM_RANGE(0xff00, 0xff01) AM_DEVWRITE("crtc", mc6845_device, address_w)
155//   AM_RANGE(0xff02, 0xff03) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
156ADDRESS_MAP_END
157
158
159static ADDRESS_MAP_START( nibble_cru_map, AS_IO, 8, nibble_state )
160ADDRESS_MAP_END
161
162
163/*************************
164*      Input Ports       *
165*************************/
166
167static INPUT_PORTS_START( nibble )
168   PORT_START("IN0")
169   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_1) PORT_NAME("IN0-1")
170   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_2) PORT_NAME("IN0-2")
171   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_3) PORT_NAME("IN0-3")
172   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_4) PORT_NAME("IN0-4")
173   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_5) PORT_NAME("IN0-5")
174   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_6) PORT_NAME("IN0-6")
175   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_7) PORT_NAME("IN0-7")
176   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_8) PORT_NAME("IN0-8")
177
178   PORT_START("IN1")
179   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Q) PORT_NAME("IN1-1")
180   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_W) PORT_NAME("IN1-2")
181   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_E) PORT_NAME("IN1-3")
182   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_R) PORT_NAME("IN1-4")
183   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_T) PORT_NAME("IN1-5")
184   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Y) PORT_NAME("IN1-6")
185   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_U) PORT_NAME("IN1-7")
186   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_I) PORT_NAME("IN1-8")
187
188   PORT_START("IN2")
189   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_A) PORT_NAME("IN2-1")
190   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_S) PORT_NAME("IN2-2")
191   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_D) PORT_NAME("IN2-3")
192   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_F) PORT_NAME("IN2-4")
193   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_G) PORT_NAME("IN2-5")
194   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_H) PORT_NAME("IN2-6")
195   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_J) PORT_NAME("IN2-7")
196   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_K) PORT_NAME("IN2-8")
197
198   PORT_START("IN3")
199   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Z) PORT_NAME("IN3-1")
200   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_X) PORT_NAME("IN3-2")
201   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_C) PORT_NAME("IN3-3")
202   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_V) PORT_NAME("IN3-4")
203   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_B) PORT_NAME("IN3-5")
204   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_N) PORT_NAME("IN3-6")
205   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_M) PORT_NAME("IN3-7")
206   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_L) PORT_NAME("IN3-8")
207
208   PORT_START("IN4")
209   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("IN4-1")
210   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("IN4-2")
211   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("IN4-3")
212   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("IN4-4")
213   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("IN4-5")
214   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("IN4-6")
215   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("IN4-7")
216   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("IN4-8")
217
218   PORT_START("DSW1")
219   PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )
220   PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
221   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
222   PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
223   PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
224   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
225   PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
226   PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
227   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
228   PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
229   PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
230   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
231   PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
232   PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
233   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
234   PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
235   PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
236   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
237   PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
238   PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
239   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
240   PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
241   PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
242   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
243
244   PORT_START("DSW2")
245   PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )
246   PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
247   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
248   PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
249   PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
250   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
251   PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
252   PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
253   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
254   PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
255   PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
256   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
257   PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
258   PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
259   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
260   PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
261   PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
262   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
263   PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
264   PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
265   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
266   PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
267   PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
268   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
269
270INPUT_PORTS_END
271
272
273/*************************
274*    Graphics Layouts    *
275*************************/
276
277static const gfx_layout charlayout =
278{
279   8,8,
280   RGN_FRAC(1,8),
281   8,
282   { RGN_FRAC(0,8), RGN_FRAC(1,8), RGN_FRAC(2,8), RGN_FRAC(3,8), RGN_FRAC(4,8), RGN_FRAC(5,8), RGN_FRAC(6,8), RGN_FRAC(7,8) },
283   { 0, 1, 2, 3, 4, 5, 6, 7 },
284   { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
285   8*8
286};
287
288
289/******************************
290* Graphics Decode Information *
291******************************/
292
293static GFXDECODE_START( nibble )
294   GFXDECODE_ENTRY( "gfx", 0, charlayout, 0, 16 )
295GFXDECODE_END
296
297
298/*************************
299*    Machine Drivers     *
300*************************/
301
75302static MACHINE_CONFIG_START( nibble, nibble_state )
76303
77   /* basic machine hardware */
78//  MCFG_CPU_ADD("maincpu", ??, 3000000) // unknown DIP64 CPU
79//  MCFG_CPU_PROGRAM_MAP(nibble_map)
80//  MCFG_CPU_IO_MAP(nibble_io)
81//  MCFG_CPU_VBLANK_INT_DRIVER("screen", nibble_state,  irq0_line_hold)
304   // CPU should be switched to TMS9900
305   MCFG_TMS99xx_ADD("maincpu", TMS9980A, MASTER_CLOCK/4, nibble_map, nibble_cru_map)
306   MCFG_CPU_VBLANK_INT_DRIVER("screen", nibble_state,  nibble_interrupt)
82307
83   /* sound hardware */
84//   MCFG_SPEAKER_STANDARD_MONO("mono")
308   /* video hardware */
309   MCFG_SCREEN_ADD("screen", RASTER)
310   MCFG_SCREEN_REFRESH_RATE(60)
311   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
312   MCFG_SCREEN_SIZE(32*8, 32*8)
313   MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
314   MCFG_SCREEN_UPDATE_DRIVER(nibble_state, screen_update_nibble)
315   MCFG_SCREEN_PALETTE("palette")
85316
86//   MCFG_SOUND_ADD("aysnd", AY8910, MASTER_CLOCK/8)
87//   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
317   MCFG_GFXDECODE_ADD("gfxdecode", "palette", nibble)
318
319   MCFG_PALETTE_ADD("palette", 256)
320   MCFG_PALETTE_INIT_OWNER(nibble_state, nibble)
321
322   MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/8) /* guess */
323   MCFG_MC6845_SHOW_BORDER_AREA(false)
324   MCFG_MC6845_CHAR_WIDTH(8)
325
88326MACHINE_CONFIG_END
89327
90328
329/*************************
330*        Rom Load        *
331*************************/
332
91333ROM_START( l9nibble )
92334   ROM_REGION( 0x10000, "maincpu", 0 )
93   ROM_LOAD( "09.U123", 0x00000, 0x10000, CRC(dfef685d) SHA1(0aeb4257e408e8549df629a0cdb5f2b6790e32de) ) // unknown
335   ROM_LOAD( "09.U123", 0x00000, 0x10000, CRC(dfef685d) SHA1(0aeb4257e408e8549df629a0cdb5f2b6790e32de) ) // tms9900 code?
94336
95   ROM_REGION( 0x80000, "oki", 0 )
96   ROM_LOAD( "01.U139", 0x00000, 0x10000, CRC(aba06e58) SHA1(5841beec122613eed2ba9f48cb1d51bfa0ff450c) )
97   ROM_LOAD( "02.U141", 0x00000, 0x10000, CRC(a1e5d6d1) SHA1(8ec85b0544dd75bcb13600bae503ad2b20978281) )
98   ROM_LOAD( "03.U149", 0x00000, 0x10000, CRC(ae66f77c) SHA1(6c9e98cc00b72252cb238f14686c0faef47134df) )
99   ROM_LOAD( "04.U147", 0x00000, 0x10000, CRC(f1864094) SHA1(b439f9e8c2cc4575f9edbda45b9e724257015a73) )
100   ROM_LOAD( "05.U137", 0x00000, 0x10000, CRC(2e8ae9de) SHA1(5f2831f71b351e34df82af37041c9aa815eb372c) )
101   ROM_LOAD( "06.U143", 0x00000, 0x10000, CRC(8a56f324) SHA1(68790a12ca57c999bd7b7f26adc206aab3c06976) )
102   ROM_LOAD( "07.U145", 0x00000, 0x10000, CRC(4f757912) SHA1(63e5fc2672552463060680b7a5a94df45f3d4b68) )
103   ROM_LOAD( "08.U152", 0x00000, 0x10000, CRC(4f878ee4) SHA1(215f3ead0c358cc09c21515981cbb0a1e58c2ca6) )
337   ROM_REGION( 0x80000, "gfx", 0 )
338   ROM_LOAD( "01.u139", 0x00000, 0x10000, CRC(aba06e58) SHA1(5841beec122613eed2ba9f48cb1d51bfa0ff450c) )
339   ROM_LOAD( "02.u141", 0x10000, 0x10000, CRC(a1e5d6d1) SHA1(8ec85b0544dd75bcb13600bae503ad2b20978281) )
340   ROM_LOAD( "03.u149", 0x20000, 0x10000, CRC(ae66f77c) SHA1(6c9e98cc00b72252cb238f14686c0faef47134df) )
341   ROM_LOAD( "04.u147", 0x30000, 0x10000, CRC(f1864094) SHA1(b439f9e8c2cc4575f9edbda45b9e724257015a73) )
342   ROM_LOAD( "05.u137", 0x40000, 0x10000, CRC(2e8ae9de) SHA1(5f2831f71b351e34df82af37041c9aa815eb372c) )
343   ROM_LOAD( "06.u143", 0x50000, 0x10000, CRC(8a56f324) SHA1(68790a12ca57c999bd7b7f26adc206aab3c06976) )
344   ROM_LOAD( "07.u145", 0x60000, 0x10000, CRC(4f757912) SHA1(63e5fc2672552463060680b7a5a94df45f3d4b68) )
345   ROM_LOAD( "08.u152", 0x70000, 0x10000, CRC(4f878ee4) SHA1(215f3ead0c358cc09c21515981cbb0a1e58c2ca6) )
104346
105347   ROM_REGION( 0x20000, "user", 0 )
106   ROM_LOAD( "10.U138", 0x00000, 0x20000, CRC(ed831d2a) SHA1(ce5c3b24979d220215d7f0e8d50f45550aec15bd) )
348   ROM_LOAD( "10.u138", 0x00000, 0x20000, CRC(ed831d2a) SHA1(ce5c3b24979d220215d7f0e8d50f45550aec15bd) ) // unknown data...
107349
350   ROM_REGION( 0x0400, "plds", 0 )
351   ROM_LOAD( "pal16l8acn.u23",  0x0000, 0x0104, NO_DUMP )
352   ROM_LOAD( "pal16l8acn.uxx",  0x0200, 0x0104, NO_DUMP )
353
108354ROM_END
109355
110356
111/*    YEAR  NAME      PARENT  MACHINE  INPUT   STATE          INIT  ROT    COMPANY    FULLNAME              FLAGS... */
112GAME( 19??, l9nibble, 0,      nibble,  nibble, driver_device, 0,    ROT0, "Nibble?", "Unknown Nibble game", MACHINE_IS_SKELETON )
357/*************************
358*      Game Drivers      *
359*************************/
360
361/*    YEAR  NAME      PARENT  MACHINE  INPUT   STATE          INIT  ROT    COMPANY   FULLNAME   FLAGS... */
362GAME( 19??, l9nibble, 0,      nibble,  nibble, driver_device, 0,    ROT0, "Nibble", "Lucky 9",  MACHINE_NO_SOUND | MACHINE_NOT_WORKING )
trunk/src/mame/drivers/nwk-tr.cpp
r253153r253154
304304   int m_fpga_uploaded;
305305   int m_lanc2_ram_r;
306306   int m_lanc2_ram_w;
307   UINT8 m_lanc2_reg[3];
307308   std::unique_ptr<UINT8[]> m_lanc2_ram;
308309   std::unique_ptr<UINT32[]> m_sharc_dataram;
309310   DECLARE_WRITE32_MEMBER(paletteram32_w);
r253153r253154
346347
347348UINT32 nwktr_state::screen_update_nwktr(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
348349{
349   device_t *voodoo = machine().device("voodoo0");
350   voodoo_device *voodoo = (voodoo_device*)machine().device("voodoo0");
350351
351352   bitmap.fill(m_palette->pen(0), cliprect);
352353
353   voodoo_update(voodoo, bitmap, cliprect);
354   voodoo->voodoo_update(bitmap, cliprect);
354355
355356   const rectangle &visarea = screen.visible_area();
356357   const rectangle tilemap_rect(visarea.min_x, visarea.max_x, visarea.min_y+16, visarea.max_y);
r253153r253154
521522               ((value << 7) & 0x80);
522523
523524         m_fpga_uploaded = 1;
525         m_lanc2_reg[0] = (UINT8)(data >> 24);
524526
525527         //printf("lanc2_fpga_w: %02X at %08X\n", value, space.device().safe_pc());
526528      }
r253153r253154
528530      {
529531         m_lanc2_ram_r = 0;
530532         m_lanc2_ram_w = 0;
533         m_lanc2_reg[1] = (UINT8)(data >> 8);
531534      }
532535      else if (ACCESSING_BITS_16_23)
533536      {
534         m_lanc2_ram[2] = (data >> 20) & 0xf;
535         m_lanc2_ram[3] = 0;
537         if (m_lanc2_reg[0] != 0)
538         {
539            m_lanc2_ram[2] = (data >> 20) & 0xf;
540            m_lanc2_ram[3] = 0;
541         }
542         m_lanc2_reg[2] = (UINT8)(data >> 16);
536543      }
537544      else if (ACCESSING_BITS_0_7)
538545      {
trunk/src/mame/drivers/overdriv.cpp
r253153r253154
8282   {
8383      // m_screen->frame_number() & 1
8484      m_maincpu->set_input_line(4, HOLD_LINE);
85      m_subcpu->set_input_line(4, HOLD_LINE); // likely wrong
8685   }
8786   else if(m_fake_timer >= timer_threshold) // timer irq
8887   {
r253153r253154
9190   }
9291}
9392
93#ifdef UNUSED_FUNCTION
9494INTERRUPT_GEN_MEMBER(overdriv_state::cpuB_interrupt)
9595{
9696   // this doesn't get turned on until the irq has happened? wrong irq?
97   if (m_k053246->k053246_is_irq_enabled())
98      m_subcpu->set_input_line(6, HOLD_LINE); // likely wrong
9997}
98#endif
10099
101
102100WRITE16_MEMBER(overdriv_state::cpuA_ctrl_w)
103101{
104102   if (ACCESSING_BITS_0_7)
r253153r253154
142140}
143141
144142
145WRITE16_MEMBER(overdriv_state::overdriv_cpuB_irq_x_w)
143
144
145WRITE16_MEMBER(overdriv_state::slave_irq4_assert_w)
146146{
147   m_subcpu->set_input_line(5, HOLD_LINE); // likely wrong
147   // used in-game
148   m_subcpu->set_input_line(4, HOLD_LINE);
148149}
149150
150WRITE16_MEMBER(overdriv_state::overdriv_cpuB_irq_y_w)
151WRITE16_MEMBER(overdriv_state::slave_irq5_assert_w)
151152{
153   // tests GFX ROMs with this irq (indeed enabled only in test mode)
154   m_subcpu->set_input_line(5, HOLD_LINE);
152155}
153156
154157static ADDRESS_MAP_START( overdriv_master_map, AS_PROGRAM, 16, overdriv_state )
r253153r253154
174177   AM_RANGE(0x218000, 0x218fff) AM_DEVREADWRITE8("k051316_2", k051316_device, read, write, 0xff00)
175178   AM_RANGE(0x220000, 0x220fff) AM_DEVREAD8("k051316_1", k051316_device, rom_r, 0xff00)
176179   AM_RANGE(0x228000, 0x228fff) AM_DEVREAD8("k051316_2", k051316_device, rom_r, 0xff00)
177   AM_RANGE(0x230000, 0x230001) AM_WRITE(overdriv_cpuB_irq_y_w)
178   AM_RANGE(0x238000, 0x238001) AM_WRITE(overdriv_cpuB_irq_x_w)
180   AM_RANGE(0x230000, 0x230001) AM_WRITE(slave_irq4_assert_w)
181   AM_RANGE(0x238000, 0x238001) AM_WRITE(slave_irq5_assert_w)
179182ADDRESS_MAP_END
180183
181184#ifdef UNUSED_FUNCTION
r253153r253154
203206}
204207#endif
205208
209TIMER_CALLBACK_MEMBER(overdriv_state::objdma_end_cb )
210{
211   m_subcpu->set_input_line(6, HOLD_LINE);
212}
213
214WRITE16_MEMBER(overdriv_state::objdma_w)
215{
216   if(data & 0x10)
217      machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(overdriv_state::objdma_end_cb), this));
218
219   m_k053246->k053246_w(space,5,data,mem_mask);
220}
221
206222static ADDRESS_MAP_START( overdriv_slave_map, AS_PROGRAM, 16, overdriv_state )
207223   AM_RANGE(0x000000, 0x03ffff) AM_ROM
208224   AM_RANGE(0x080000, 0x083fff) AM_RAM /* work RAM */
r253153r253154
212228   AM_RANGE(0x118000, 0x118fff) AM_DEVREADWRITE("k053246", k053247_device, k053247_word_r, k053247_word_w) // data gets copied to sprite chip with DMA..
213229   AM_RANGE(0x120000, 0x120001) AM_DEVREAD("k053246", k053247_device, k053246_word_r)
214230   AM_RANGE(0x128000, 0x128001) AM_READWRITE(cpuB_ctrl_r, cpuB_ctrl_w) /* enable K053247 ROM reading, plus something else */
231   AM_RANGE(0x130004, 0x130005) AM_WRITE(objdma_w)
215232   AM_RANGE(0x130000, 0x130007) AM_DEVREADWRITE8("k053246", k053247_device, k053246_r,k053246_w,0xffff)
216   //AM_RANGE(0x140000, 0x140001) used in later stages
233   //AM_RANGE(0x140000, 0x140001) used in later stages, set after writes at 0x208000-0x20bfff range
217234   AM_RANGE(0x200000, 0x203fff) AM_RAM AM_SHARE("share1")
218   AM_RANGE(0x208000, 0x20bfff) AM_RAM
235   AM_RANGE(0x208000, 0x20bfff) AM_RAM // sprite indirect table?
219236   AM_RANGE(0x218000, 0x219fff) AM_DEVREAD("k053250_1", k053250_device, rom_r)
220237   AM_RANGE(0x220000, 0x221fff) AM_DEVREAD("k053250_2", k053250_device, rom_r)
221238ADDRESS_MAP_END
r253153r253154
303320
304321   MCFG_CPU_ADD("sub", M68000, XTAL_24MHz/2)  /* 12 MHz */
305322   MCFG_CPU_PROGRAM_MAP(overdriv_slave_map)
306   MCFG_CPU_VBLANK_INT_DRIVER("screen", overdriv_state,  cpuB_interrupt)   /* IRQ 5 and 6 are generated by the main CPU. */
307                                       /* IRQ 5 is used only in test mode, to request the checksums of the gfx ROMs. */
323   //MCFG_CPU_VBLANK_INT_DRIVER("screen", overdriv_state,  cpuB_interrupt)   
324   /* IRQ 5 and 6 are generated by the main CPU. */
325   /* IRQ 5 is used only in test mode, to request the checksums of the gfx ROMs. */
308326
309327   MCFG_CPU_ADD("audiocpu", M6809, XTAL_3_579545MHz)     /* 1.789 MHz?? This might be the right speed, but ROM testing */
310328   MCFG_CPU_PROGRAM_MAP(overdriv_sound_map)    /* takes a little too much (the counter wraps from 0000 to 9999). */
trunk/src/mame/drivers/pc9801.cpp
r253153r253154
425425#include "machine/pc9801_118.h"
426426#include "machine/pc9801_cbus.h"
427427#include "machine/pc9801_kbd.h"
428#include "machine/pc9801_cd.h"
428429
429430#include "machine/idectrl.h"
430431#include "machine/idehd.h"
r253153r253154
32183219   }
32193220}
32203221
3222SLOT_INTERFACE_START(pc9801_atapi_devices)
3223   SLOT_INTERFACE("pc9801_cd", PC9801_CD)
3224SLOT_INTERFACE_END
3225
32213226static MACHINE_CONFIG_FRAGMENT( pc9801_keyboard )
32223227   MCFG_DEVICE_ADD("keyb", PC9801_KBD, 53)
32233228   MCFG_PC9801_KBD_IRQ_CALLBACK(DEVWRITELINE("pic8259_master", pic8259_device, ir1_w))
r253153r253154
32663271static MACHINE_CONFIG_FRAGMENT( pc9801_ide )
32673272   MCFG_ATA_INTERFACE_ADD("ide1", ata_devices, "hdd", nullptr, false)
32683273   MCFG_ATA_INTERFACE_IRQ_HANDLER(WRITELINE(pc9801_state, ide1_irq_w))
3269   MCFG_ATA_INTERFACE_ADD("ide2", ata_devices, "cdrom", nullptr, false)
3274   MCFG_ATA_INTERFACE_ADD("ide2", pc9801_atapi_devices, "pc9801_cd", nullptr, false)
32703275   MCFG_ATA_INTERFACE_IRQ_HANDLER(WRITELINE(pc9801_state, ide2_irq_w))
32713276MACHINE_CONFIG_END
32723277
trunk/src/mame/drivers/savquest.cpp
r253153r253154
336336   m_pci_3dfx_regs[0x08 / 4] = 2; // revision ID
337337   m_pci_3dfx_regs[0x10 / 4] = 0xff000000;
338338   m_pci_3dfx_regs[0x40 / 4] = 0x4000; //INITEN_SECONDARY_REV_ID
339   voodoo_set_init_enable(m_voodoo, 0x4000); //INITEN_SECONDARY_REV_ID
339   m_voodoo->voodoo_set_init_enable(0x4000); //INITEN_SECONDARY_REV_ID
340340}
341341
342342static UINT32 pci_3dfx_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask)
r253153r253154
358358   }
359359   else if (reg == 0x40)
360360   {
361      voodoo_set_init_enable(state->m_voodoo, data);
361      state->m_voodoo->voodoo_set_init_enable(data);
362362   }
363363   else if (reg == 0x54)
364364   {
trunk/src/mame/drivers/seattle.cpp
r253153r253154
540540
541541UINT32 seattle_state::screen_update_seattle(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
542542{
543   return voodoo_update(m_voodoo, bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
543   return m_voodoo->voodoo_update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
544544}
545545
546546
r253153r253154
876876         break;
877877
878878      case 0x10:      /* initEnable register */
879         voodoo_set_init_enable(m_voodoo, data);
879         m_voodoo->voodoo_set_init_enable(data);
880880         break;
881881   }
882882   if (LOG_PCI)
trunk/src/mame/drivers/stv.cpp
r253153r253154
29012901ROM_END
29022902
29032903
2904ROM_START( pclub2pf ) // set to 1p
2905   STV_BIOS
2906
2907   ROM_REGION32_BE( 0x3000000, "cart", ROMREGION_ERASE00 ) /* SH2 code */
2908
2909   ROM_LOAD16_WORD_SWAP( "pclb2puf.IC22",    0x0200000, 0x0200000, CRC(a14282f2) SHA1(b96e70693d8e71b090e20efdd3aa6228e7289fa4) ) // OK
2910   ROM_LOAD16_WORD_SWAP( "pclb2puf.IC24",    0x0400000, 0x0200000, CRC(4fb4dc74) SHA1(1f174512c9cd5420d7f935cbc6b5875836f6e825) ) // OK
2911   ROM_LOAD16_WORD_SWAP( "pclb2puf.IC26",    0x0600000, 0x0200000, CRC(d20bbfb5) SHA1(5f2768e0e306bd0e3ed9b4e1d234aac8fd7155e6) ) // OK
2912   ROM_LOAD16_WORD_SWAP( "pclb2puf.IC28",    0x0800000, 0x0200000, CRC(da658ae9) SHA1(24293c2b23b3009956fc05df5177a27415754301) ) // OK
2913   ROM_LOAD16_WORD_SWAP( "pclb2puf.IC30",    0x0a00000, 0x0200000, CRC(cafc0e6b) SHA1(fa2ac54260336d5dd1ced7ccaf87115511ece1f8) ) // OK
2914
2915   ROM_REGION16_BE( 0x80, "eeprom", 0 ) // preconfigured to 1 player
2916   ROM_LOAD( "pclub2pf.nv", 0x0000, 0x0080, CRC(447bb3bd) SHA1(9fefec09849bfa0c14b49e73ff13e2a538dff511) )
2917ROM_END
2918
29042919ROM_START( pclb297w ) // set to 1p
29052920   STV_BIOS
29062921
r253153r253154
29402955   ROM_LOAD( "pclub298.nv", 0x0000, 0x0080, CRC(a23dd0f2) SHA1(457282b5d40a17477b95330bba91e05c603f951e) )
29412956ROM_END
29422957
2958
2959ROM_START( pclub26w ) // set to 1p
2960   STV_BIOS
2961
2962   ROM_REGION32_BE( 0x3000000, "cart", ROMREGION_ERASE00 ) /* SH2 code */
2963
2964   ROM_LOAD16_WORD_SWAP( "pclbvol6w_IC22",    0x0200000, 0x0200000, CRC(72aa320c) SHA1(09bc30e8cb00a5a4014c44e468cc64f6c3425d92) )
2965   ROM_LOAD16_WORD_SWAP( "pclbvol6w_IC24",    0x0400000, 0x0200000, CRC(d98371e2) SHA1(813ac5f3c5b57d07cc319c73560bc0719ddcfe6b) )
2966   ROM_LOAD16_WORD_SWAP( "pclbvol6w_IC26",    0x0600000, 0x0200000, CRC(e6bbe3a5) SHA1(b2f642b8ca0779ad66cfbbadece40f4e3dc41fd1) )
2967   ROM_LOAD16_WORD_SWAP( "pclbvol6w_IC28",    0x0800000, 0x0200000, CRC(3c330c9b) SHA1(92f8e8d4f43db7c4ce431d17501492a7f8d8a867) )
2968   ROM_LOAD16_WORD_SWAP( "pclbvol6w_IC30",    0x0a00000, 0x0200000, CRC(67646090) SHA1(ed6402a22acafa0203c587b871edc547f0ec5277) )
2969
2970   ROM_REGION16_BE( 0x80, "eeprom", 0 ) // preconfigured to 1 player
2971   ROM_LOAD( "pclub26w.nv", 0x0000, 0x0080, CRC(448f770d) SHA1(5f966c511c4c8e9d5b2d257c41c2c88a453b4944) )
2972ROM_END
2973
2974ROM_START( pclub27s ) // set to 1p
2975   STV_BIOS
2976
2977   ROM_REGION32_BE( 0x3000000, "cart", ROMREGION_ERASE00 ) /* SH2 code */
2978
2979   ROM_LOAD16_WORD_SWAP( "pclub2v7.IC22",    0x0200000, 0x0200000, CRC(44c8ab27) SHA1(65e2705b2918da32ea40375707df4e148b311159) )
2980   ROM_LOAD16_WORD_SWAP( "pclub2v7.IC24",    0x0400000, 0x0200000, CRC(24818437) SHA1(5293d45b53680301abaf0b32a62596aaaa2552d6) )
2981   ROM_LOAD16_WORD_SWAP( "pclub2v7.IC26",    0x0600000, 0x0200000, CRC(076c1d44) SHA1(d597ed4524bb03eb0ef8ada08d49f3dc0fc8136d) )
2982   ROM_LOAD16_WORD_SWAP( "pclub2v7.IC28",    0x0800000, 0x0200000, CRC(ff9643ca) SHA1(3309f970f87324b06cc48add386019f769abcd89) )
2983   ROM_LOAD16_WORD_SWAP( "pclub2v7.IC30",    0x0a00000, 0x0200000, CRC(03b9eacf) SHA1(d69c10f7613d9f52042dd6cce64e74e2b1ecc2d8) )
2984
2985   ROM_REGION16_BE( 0x80, "eeprom", 0 ) // preconfigured to 1 player
2986   ROM_LOAD( "pclub27s.nv", 0x0000, 0x0080, CRC(e58c7167) SHA1(d88b1648c5d86a90615a8c6a1bf87bc9e75dc320) )
2987ROM_END
2988
2989ROM_START( pclub2pe ) // set to 1p
2990   STV_BIOS
2991
2992   ROM_REGION32_BE( 0x3000000, "cart", ROMREGION_ERASE00 ) /* SH2 code */
2993
2994   ROM_LOAD16_WORD_SWAP( "pclb2psi_IC22",    0x0200000, 0x0200000, CRC(caadc660) SHA1(f2e84bee96266bb03d8f9009249c17c27935f82e) )
2995   ROM_LOAD16_WORD_SWAP( "pclb2psi_IC24",    0x0400000, 0x0200000, CRC(ece82698) SHA1(b17b1ea8adc13c3722067c9854d1b7fdf3917090) )
2996   ROM_LOAD16_WORD_SWAP( "pclb2psi_IC26",    0x0600000, 0x0200000, CRC(c8a1e335) SHA1(a95ddfc41fdd9f720c11208f45ef5db4bee6cb97) )
2997   ROM_LOAD16_WORD_SWAP( "pclb2psi_IC28",    0x0800000, 0x0200000, CRC(52f09627) SHA1(e2ffc321bb0f2a650d0c0b39c3ec68226e1ca7f4) )
2998   ROM_LOAD16_WORD_SWAP( "pclb2psi_IC30",    0x0a00000, 0x0200000, CRC(03b9eacf) SHA1(d69c10f7613d9f52042dd6cce64e74e2b1ecc2d8) )
2999
3000   ROM_REGION16_BE( 0x80, "eeprom", 0 ) // preconfigured to 1 player
3001   ROM_LOAD( "pclub2pe.nv", 0x0000, 0x0080, CRC(447bb3bd) SHA1(9fefec09849bfa0c14b49e73ff13e2a538dff511))
3002ROM_END
3003
3004
3005ROM_START( pclubyo2 ) // set to 1p
3006   STV_BIOS
3007
3008   ROM_REGION32_BE( 0x3000000, "cart", ROMREGION_ERASE00 ) /* SH2 code */
3009
3010   ROM_LOAD16_WORD_SWAP( "pclbyov2.IC22",    0x0200000, 0x0200000, CRC(719a4d27) SHA1(328dfb8debea02e8660e636e953982d381529945) )
3011   ROM_LOAD16_WORD_SWAP( "pclbyov2.IC24",    0x0400000, 0x0200000, CRC(790dc7b5) SHA1(829ead39930779617a9bef41d8615362ca86c4c7) )
3012   ROM_LOAD16_WORD_SWAP( "pclbyov2.IC26",    0x0600000, 0x0200000, CRC(12ae1606) SHA1(9534fb2dbf6fd2c258ba2716783cc5bab8bd8dc0) )
3013   ROM_LOAD16_WORD_SWAP( "pclbyov2.IC28",    0x0800000, 0x0200000, CRC(ff9643ca) SHA1(3309f970f87324b06cc48add386019f769abcd89) )
3014   ROM_LOAD16_WORD_SWAP( "pclbyov2.IC30",    0x0a00000, 0x0200000, CRC(03b9eacf) SHA1(d69c10f7613d9f52042dd6cce64e74e2b1ecc2d8) )
3015
3016   ROM_REGION16_BE( 0x80, "eeprom", 0 ) // preconfigured to 1 player
3017   ROM_LOAD( "pclubyo2.nv", 0x0000, 0x0080, CRC(2b26a8f7) SHA1(32f34096cac05a37c492ee389ed8e4c02694c268) )
3018ROM_END
3019
3020
29433021ROM_START( pclb298a ) // set to 1p
29443022   STV_BIOS
29453023
r253153r253154
30583136   ROM_LOAD( "pclb2elk.nv", 0x0000, 0x0080, CRC(54c7564f) SHA1(574dcc5e8fe4aac091fee1476347485ed660eddd) )
30593137ROM_END
30603138
3139ROM_START( pclove )
3140   STV_BIOS
30613141
3142   ROM_REGION32_BE( 0x3000000, "cart", ROMREGION_ERASE00 ) /* SH2 code */
3143   // note, 'IC2' in service mode (the test of IC24/IC26) fails once you map the protection device because it occupies the same memory address as the rom at IC26
3144   // there must be a way to enable / disable it.
3145   ROM_LOAD16_WORD_SWAP( "pclbLove.ic22",    0x0200000, 0x0200000, CRC(8cd25a0f) SHA1(c938d5f4f800db019abc2e17cce1e780e93f3d02) ) // OK (tested as IC7)
3146   ROM_LOAD16_WORD_SWAP( "pclbLove.ic24",    0x0400000, 0x0200000, CRC(85583e2c) SHA1(7f407d1bce40317fc10433dafcd82ee41be05839) ) // OK (tested as IC2)
3147   ROM_LOAD16_WORD_SWAP( "pclbLove.ic26",    0x0600000, 0x0200000, CRC(7efcabcc) SHA1(b99a67ab2053c3be5ce37530b65f9693c2a4eef8) ) // OK (tested as IC2)
3148   ROM_LOAD16_WORD_SWAP( "pclbLove.ic28",    0x0800000, 0x0200000, CRC(a1336da7) SHA1(ba26810067a13968a54a8867025b8d8e96384ae7) ) // OK (tested as IC3)
3149   ROM_LOAD16_WORD_SWAP( "pclbLove.ic30",    0x0a00000, 0x0200000, CRC(ec5b5e28) SHA1(89bcddb52c176c86ad4bdb9f4f052be5b75bcd1b) ) // OK (tested as IC3)
3150   ROM_LOAD16_WORD_SWAP( "pclbLove.ic32",    0x0c00000, 0x0200000, CRC(9a4109e5) SHA1(ba59caac5f5a80fc52c507d8a47f322a380aa9a1) ) // FF fill? (not tested either)
3151
3152   // protection device used to decrypt some startup code
3153
3154   ROM_REGION16_BE( 0x80, "eeprom", 0 ) // preconfigured to 1 player
3155   ROM_LOAD( "pclove.nv", 0x0000, 0x0080, CRC(3c78e3bd) SHA1(6d5fe8545f434b4cc1e8229549adb0a49ac45bd1) )
3156ROM_END
3157
3158// Name Club / Name Club vol.2
3159// have an unusual rom mapping compared to other games, the cartridge is a little different too, with a large PALCE16V8H-10 marked 315-6026
3160// For Name Club vol. 2, the protection device (317-0229 on both) is checked in the 'each game test' menu as 'RCDD2'
3161// For the service mode test the game just passes a large block of compressed data and checksums the result, it doesn't even look like it's
3162// passing 100% valid data, just an entire section of ROM, checking the result against a pre-calculated checksum.
3163
3164// The device is accessed by the game when you choose to print, it looks like it's decompressing the full-size graphics for the printer rather
3165// than anything you see onscreen.  It makes quite extensive use of the device, with lots of different dictionaries, unlike Decathlete where
3166// there are only 2 that cover all the data.
3167
3168ROM_START( nameclub )
3169   STV_BIOS
3170
3171   ROM_REGION32_BE( 0x3000000, "cart", ROMREGION_ERASEFF ) /* SH2 code */
3172   ROM_LOAD16_WORD_SWAP( "ic22",    0x0200000, 0x0200000, CRC(ac23c648) SHA1(4dd099a92ff162082eb24a61a277ca907b3f9892) ) // OK
3173   ROM_LOAD16_WORD_SWAP( "ic24",    0x0600000, 0x0200000, CRC(a16902e3) SHA1(85c582cb0d02ef028a8ae32688c20a5b5aeeaae8) ) // OK
3174   ROM_LOAD16_WORD_SWAP( "ic26",    0x0a00000, 0x0200000, CRC(a5eab3f3) SHA1(1b7263639bb8f4aa644cc46133988ef4d2b6c9de) ) // OK
3175   ROM_LOAD16_WORD_SWAP( "ic28",    0x0e00000, 0x0200000, CRC(34ed677a) SHA1(ff2c4dd8fae33ac618f6e3e28ba71c4ecb4ca88f) ) // OK
3176
3177   ROM_REGION16_BE( 0x80, "eeprom", 0 ) // preconfigured to 1 player
3178   ROM_LOAD( "nameclub.nv", 0x0000, 0x0080, CRC(680a64bc) SHA1(45194bbe4a7e67f0e44f858589881967884f63a6) )
3179ROM_END
3180
3181ROM_START( nclubv2 )
3182   STV_BIOS
3183
3184   ROM_REGION32_BE( 0x3000000, "cart", ROMREGION_ERASEFF ) /* SH2 code */
3185   ROM_LOAD16_WORD_SWAP( "nclubv2.ic22",    0x0200000, 0x0200000, CRC(7e81676d) SHA1(fc0f0dcdb4aaf71218d7c1dd0e4ddc5381e8b13b) ) // OK
3186   ROM_LOAD16_WORD_SWAP( "nclubv2.ic24",    0x0600000, 0x0200000, CRC(1b7637de) SHA1(43c3094f60a6582298a45bad923fef57e98c5b2b) ) // OK
3187   ROM_LOAD16_WORD_SWAP( "nclubv2.ic26",    0x0a00000, 0x0200000, CRC(630be99d) SHA1(ac7fbaae98b126fad5228b0ebffa91a0f0a94516) ) // OK
3188   ROM_LOAD16_WORD_SWAP( "nclubv2.ic28",    0x0e00000, 0x0200000, CRC(1a3ca5e2) SHA1(4d3aed51d29c54e71175d828f648c9feb813ac04) ) // OK
3189     
3190   ROM_REGION16_BE( 0x80, "eeprom", 0 ) // preconfigured to 1 player
3191   ROM_LOAD( "nclubv2.nv", 0x0000, 0x0080, CRC(96d55fa9) SHA1(b3c821d6cd4ed52d0e20565e12a06d8f81a08dbc) )
3192ROM_END
3193
3194
3195
30623196GAME( 1996, stvbios,   0,       stv_slot, stv, stv_state,      stv,         ROT0,   "Sega",                         "ST-V Bios", MACHINE_IS_BIOS_ROOT )
30633197
30643198//GAME YEAR, NAME,     PARENT,  MACH, INP, INIT,      MONITOR
r253153r253154
31143248GAME( 1997, znpwfv,    stvbios, stv,      stv, stv_state,        znpwfv,     ROT0,   "Sega",                         "Zen Nippon Pro-Wrestling Featuring Virtua (J 971123 V1.000)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
31153249
31163250/* Unemulated printer / camera devices */
3117GAME( 1998, stress,    stvbios, stv,      stv, stv_state,        stv,        ROT0,   "Sega",                         "Stress Busters (J 981020 V1.000)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
3118GAME( 1997, nclubv3,   stvbios, stv,      stv, stv_state,        nameclv3,   ROT0,   "Sega",                         "Name Club Ver.3 (J 970723 V1.000)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
3119GAME( 1997, pclub2,    stvbios, stv,      stv, stv_state,        stv,        ROT0,   "Atlus",                        "Print Club 2 (U 970921 V1.000)", MACHINE_NOT_WORKING )
3251// USA sets
3252GAME( 1997, pclub2,    stvbios, stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club 2 (U 970921 V1.000)", MACHINE_NOT_WORKING )
3253GAME( 1999, pclub2v3,  pclub2,  stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club 2 Vol. 3 (U 990310 V1.000)", MACHINE_NOT_WORKING ) // Hello Kitty themed
3254GAME( 1999, pclubpok,  stvbios, stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club Pokemon B (U 991126 V1.000)", MACHINE_NOT_WORKING )
3255// Japan sets
31203256GAME( 1999, pclub2fc,  pclub2,  stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club 2 Felix The Cat (Rev. A) (J 970415 V1.100)", MACHINE_NOT_WORKING )
3121GAME( 1997, pclb297w,  pclub2,  stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club 2 '97 Winter Ver (J 971017 V1.100)", MACHINE_NOT_WORKING )
3122GAME( 1997, pclub298,  pclub2,  stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club 2 '98 Spring Ver (J 971017 V1.100)", MACHINE_NOT_WORKING )
3257GAME( 1998, pclub2pf,  pclub2,  stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club 2 Puffy (Japan)", MACHINE_NOT_WORKING ) // version info is blank
3258GAME( 1997, pclb2elk,  stvbios, stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club 2 Earth Limited Kobe (Print Club Custom) (J 970808 V1.000)", MACHINE_NOT_WORKING )
3259GAME( 1997, pclub2pe,  pclub2,  stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club 2 Pepsiman (J 970618 V1.100)", MACHINE_NOT_WORKING )
3260
3261GAME( 1997, pclub26w,  pclub2,  stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club 2 Vol. 6 Winter (J 961210 V1.000)", MACHINE_NOT_WORKING ) // internal string is 'PURIKURA2 97FUYU' (but in reality it seems to be an end of 96 Winter version)
3262GAME( 1997, pclub27s,  pclub2,  stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club 2 Vol. 7 Spring (J 970313 V1.100)", MACHINE_NOT_WORKING )
3263// Summer 97?
3264// Autumn 97?
3265GAME( 1997, pclb297w,  pclub2,  stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club 2 '97 Winter Ver (J 971017 V1.100)", MACHINE_NOT_WORKING ) // internal string is '97WINTER' (3 roms bad / missing tho, need new dump)
3266GAME( 1997, pclub298,  pclub2,  stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club 2 '98 Spring Ver (J 971017 V1.100)", MACHINE_NOT_WORKING ) // date is the same as previous version, surely incorrect / not updated when the game was
3267// Summer 98?
31233268GAME( 1998, pclb298a,  pclub2,  stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club 2 '98 Autumn Ver (J 980827 V1.000)", MACHINE_NOT_WORKING )
3269
3270
31243271GAME( 1999, pclubor,   stvbios, stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club Goukakenran (J 991104 V1.000)", MACHINE_NOT_WORKING )
31253272GAME( 1999, pclubol,   stvbios, stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club Olive (J 980717 V1.000)", MACHINE_NOT_WORKING )
3126GAME( 1999, pclub2v3,  pclub2,  stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club 2 Vol. 3 (U 990310 V1.000)", MACHINE_NOT_WORKING )
3127GAME( 1999, pclubpok,  stvbios, stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club Pokemon B (U 991126 V1.000)", MACHINE_NOT_WORKING )
31283273GAME( 1997, pclub2kc,  stvbios, stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club Kome Kome Club (J 970203 V1.000)", MACHINE_NOT_WORKING )
3129GAME( 1997, pclb2elk,  stvbios, stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club 2 Earth Limited Kobe (Print Club Custom) (J 970808 V1.000)", MACHINE_NOT_WORKING )
3274GAME( 1997, pclove,    stvbios, stv_5838, stv, stv_state,       decathlt,   ROT0,   "Atlus",                        "Print Club LoveLove (J 970421 V1.000)", MACHINE_NOT_WORKING ) // uses the same type of protection as decathlete!!
3275GAME( 1997, pclubyo2,  stvbios, stv,      stv, stv_state,       stv,        ROT0,   "Atlus",                        "Print Club Yoshimoto V2 (J 970422 V1.100)", MACHINE_NOT_WORKING )
31303276
3277GAME( 1998, stress,    stvbios, stv,      stv, stv_state,       stv,        ROT0,   "Sega",                         "Stress Busters (J 981020 V1.000)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
31313278
3279GAME( 1996, nameclub,  stvbios, stv_5838, stv, stv_state,       decathlt,   ROT0,   "Sega",                         "Name Club (J 960315 V1.000)", MACHINE_NOT_WORKING ) // uses the same type of protection as decathlete!!
3280GAME( 1996, nclubv2,   stvbios, stv_5838, stv, stv_state,       decathlt,   ROT0,   "Sega",                         "Name Club Ver.2 (J 960315 V1.000)", MACHINE_NOT_WORKING ) // ^  (has the same datecode as nameclub, probably incorrect unless both were released today)
3281GAME( 1997, nclubv3,   stvbios, stv,      stv, stv_state,       nameclv3,   ROT0,   "Sega",                         "Name Club Ver.3 (J 970723 V1.000)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING ) // no protection
3282
3283
3284
31323285/* Doing something.. but not enough yet */
31333286GAME( 1995, vfremix,   stvbios, stv,      stv, stv_state,        vfremix,    ROT0,   "Sega",                         "Virtua Fighter Remix (JUETBKAL 950428 V1.000)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NOT_WORKING )
31343287GAME( 1996, decathlt,  stvbios, stv_5838, stv, stv_state,        decathlt,   ROT0,   "Sega",                         "Decathlete (JUET 960709 V1.001)", MACHINE_NO_SOUND | MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION )
trunk/src/mame/drivers/tispeak.cpp
r253153r253154
8080    - notes: this one has a dedicated voice actor
8181
8282    Speak & Spell (France) "La Dictee Magique", 1980
83    - MCU: CD2702*
83    - MCU: CD2702, labeled CD2702AN2L (die labeled TMC0270F 2702A)
8484    - TMS51xx: CD2801
8585    - VSM: 16KB CD2352
8686
r253153r253154
143143Speak & Math:
144144
145145    Speak & Math (US), 1980 (renamed to "Speak & Maths" in UK, but is the same product)
146    - MCU: CD2704*
146    - MCU: CD2704, labeled CD2704B-N2L (die labeled TMC0270F 2704B) - 2nd revision?(mid-1982)
147147    - TMS51xx: CD2801
148148    - VSM(1/2): 16KB CD2392
149149    - VSM(2/2): 16KB CD2393
r253153r253154
170170Speak & Read:
171171
172172    Speak & Read (US), 1980
173    - MCU: CD2705, labeled CD2705B-N2L (die labeled TMC0270E 2705B) - 2nd revision?
173    - MCU: CD2705, labeled CD2705B-N2L (die labeled TMC0270E 2705B) - 2nd revision?(late-1981)
174174    - TMS51xx: CD2801
175175    - VSM(1/2): 16KB CD2394(rev.A)
176176    - VSM(2/2): 16KB CD2395(rev.A)
r253153r253154
12421242   ROM_REGION( 2127, "maincpu:mpla", 0 )
12431243   ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) )
12441244   ROM_REGION( 1246, "maincpu:opla", 0 )
1245   ROM_LOAD( "tms0270_tmc0271_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) // using the one from 1978 version
1245   ROM_LOAD( "tms0270_tmc0271_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) ) // using the one from 1st version
12461246
12471247   ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // 8000-bfff = space reserved for cartridge
1248   ROM_LOAD( "tmc0351nl.vsm", 0x0000, 0x4000, CRC(beea3373) SHA1(8b0f7586d2f12c3d4a885fdb528cf23feffa1a3b) ) // using the one from 1978 version
1248   ROM_LOAD( "tmc0351nl.vsm", 0x0000, 0x4000, CRC(beea3373) SHA1(8b0f7586d2f12c3d4a885fdb528cf23feffa1a3b) ) // using the one from 1st version
12491249   ROM_LOAD( "tmc0352nl.vsm", 0x4000, 0x4000, CRC(d51f0587) SHA1(ddaa484be1bba5fef46b481cafae517e4acaa8ed) ) // "
12501250ROM_END
12511251
r253153r253154
12561256   ROM_REGION( 1246, "maincpu:ipla", 0 )
12571257   ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
12581258   ROM_REGION( 2127, "maincpu:mpla", 0 )
1259   ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, BAD_DUMP CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) // not verified
1259   ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) )
12601260   ROM_REGION( 1246, "maincpu:opla", 0 )
12611261   ROM_LOAD( "tms0270_tmc0271_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) )
12621262
r253153r253154
12871287   ROM_REGION( 1246, "maincpu:ipla", 0 )
12881288   ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
12891289   ROM_REGION( 2127, "maincpu:mpla", 0 )
1290   ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, BAD_DUMP CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) // not verified
1290   ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) )
12911291   ROM_REGION( 1246, "maincpu:opla", 0 )
12921292   ROM_LOAD( "tms0270_tmc0271_output.pla", 0, 1246, CRC(9ebe12ab) SHA1(acb4e07ba26f2daca5f1c234885ac0371c7ce87f) )
12931293
r253153r253154
13291329
13301330ROM_START( snspellfr )
13311331   ROM_REGION( 0x1000, "maincpu", 0 )
1332   ROM_LOAD( "tmc0271h-n2l", 0x0000, 0x1000, BAD_DUMP CRC(f83b5d2d) SHA1(10155b0b7f7f1583c7def8a693553cd35944ea6f) ) // placeholder, use the one we have
1332   ROM_LOAD( "cd2702an2l", 0x0000, 0x1000, CRC(895d6a4e) SHA1(a8bc118c83a84260033734191dcaa71a93dfa52b) )
13331333
13341334   ROM_REGION( 1246, "maincpu:ipla", 0 )
13351335   ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
13361336   ROM_REGION( 2127, "maincpu:mpla", 0 )
1337   ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, BAD_DUMP CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) // not verified
1337   ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) )
13381338   ROM_REGION( 1246, "maincpu:opla", 0 )
1339   ROM_LOAD( "tms0270_tmc0271h_output.pla", 0, 1246, BAD_DUMP CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) // placeholder, use the one we have
1339   ROM_LOAD( "tms0270_cd2702_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) )
13401340
13411341   ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge
13421342   ROM_LOAD( "cd2352.vsm", 0x0000, 0x4000, CRC(181a239e) SHA1(e16043766c385e152b7005c1c010be4c5fccdd9b) )
r253153r253154
13441344
13451345ROM_START( snspellit )
13461346   ROM_REGION( 0x1000, "maincpu", 0 )
1347   ROM_LOAD( "tmc0271h-n2l", 0x0000, 0x1000, BAD_DUMP CRC(f83b5d2d) SHA1(10155b0b7f7f1583c7def8a693553cd35944ea6f) ) // placeholder, use the one we have
1347   ROM_LOAD( "cd2702an2l", 0x0000, 0x1000, CRC(895d6a4e) SHA1(a8bc118c83a84260033734191dcaa71a93dfa52b) )
13481348
13491349   ROM_REGION( 1246, "maincpu:ipla", 0 )
13501350   ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
13511351   ROM_REGION( 2127, "maincpu:mpla", 0 )
1352   ROM_LOAD( "tms0270_common2_micro.pla", 0, 2127, BAD_DUMP CRC(86737ac1) SHA1(4aa0444f3ddf88738ea74aec404c684bf54eddba) ) // not verified
1352   ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) )
13531353   ROM_REGION( 1246, "maincpu:opla", 0 )
1354   ROM_LOAD( "tms0270_tmc0271h_output.pla", 0, 1246, BAD_DUMP CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) ) // placeholder, use the one we have
1354   ROM_LOAD( "tms0270_cd2702_output.pla", 0, 1246, CRC(2478c595) SHA1(9a8ac690902731e1e01533279a1c9223011e1537) )
13551355
13561356   ROM_REGION( 0x10000, "tms6100", ROMREGION_ERASEFF ) // uses only 1 rom, 8000-bfff = space reserved for cartridge
13571357   ROM_LOAD( "cd62190.vsm", 0x0000, 0x4000, CRC(63832002) SHA1(ea8124b2bf0f5908c5f1a56d60063f2468a10143) )
r253153r253154
14001400
14011401ROM_START( snmath )
14021402   ROM_REGION( 0x1000, "maincpu", 0 )
1403   ROM_LOAD( "cd2708n2l", 0x0000, 0x1000, CRC(35937360) SHA1(69c362c75bb459056c09c7fab37c91040485474b) )
1403   ROM_LOAD( "cd2704b-n2l", 0x0000, 0x1000, CRC(7e06c7c5) SHA1(d60a35a8163ab593c31afc840a0d8a9b3a762f29) )
14041404
14051405   ROM_REGION( 1246, "maincpu:ipla", 0 )
14061406   ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
14071407   ROM_REGION( 2127, "maincpu:mpla", 0 )
14081408   ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) )
14091409   ROM_REGION( 1246, "maincpu:opla", 0 )
1410   ROM_LOAD( "tms0270_cd2704_output.pla", 0, 1246, CRC(5a2eb949) SHA1(8bb161d4884f229af65f8d155e59b9d8966fe3d1) )
1411
1412   ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF )
1413   ROM_LOAD( "cd2392.vsm", 0x0000, 0x4000, CRC(4ed2e920) SHA1(8896f29e25126c1e4d9a47c9a325b35dddecc61f) )
1414   ROM_LOAD( "cd2393.vsm", 0x4000, 0x4000, CRC(571d5b5a) SHA1(83284755d9b77267d320b5b87fdc39f352433715) )
1415ROM_END
1416
1417ROM_START( snmatha )
1418   ROM_REGION( 0x1000, "maincpu", 0 )
1419   ROM_LOAD( "cd2708-n2l", 0x0000, 0x1000, CRC(35937360) SHA1(69c362c75bb459056c09c7fab37c91040485474b) )
1420
1421   ROM_REGION( 1246, "maincpu:ipla", 0 )
1422   ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
1423   ROM_REGION( 2127, "maincpu:mpla", 0 )
1424   ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) )
1425   ROM_REGION( 1246, "maincpu:opla", 0 )
14101426   ROM_LOAD( "tms0270_cd2708_output.pla", 0, 1246, CRC(1abad753) SHA1(53d20b519ed73ce248368047a056836afbe3cd46) )
14111427
14121428   ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF )
r253153r253154
14261442   ROM_REGION( 1246, "maincpu:ipla", 0 )
14271443   ROM_LOAD( "tms0980_common1_instr.pla", 0, 1246, CRC(42db9a38) SHA1(2d127d98028ec8ec6ea10c179c25e447b14ba4d0) )
14281444   ROM_REGION( 2127, "maincpu:mpla", 0 )
1429   ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, BAD_DUMP CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) ) // not verified
1445   ROM_LOAD( "tms0270_common1_micro.pla", 0, 2127, CRC(504b96bb) SHA1(67b691e7c0b97239410587e50e5182bf46475b43) )
14301446   ROM_REGION( 1246, "maincpu:opla", 0 )
1431   ROM_LOAD( "tms0270_cd2708_output.pla", 0, 1246, BAD_DUMP CRC(1abad753) SHA1(53d20b519ed73ce248368047a056836afbe3cd46) ) // taken from cd2708, need to verify if it's same as cd2704
1447   ROM_LOAD( "tms0270_cd2704_output.pla", 0, 1246, CRC(5a2eb949) SHA1(8bb161d4884f229af65f8d155e59b9d8966fe3d1) ) // using the one from 1st version
14321448
14331449   ROM_REGION( 0x8000, "tms6100", ROMREGION_ERASEFF )
1434   ROM_LOAD( "cd2392.vsm", 0x0000, 0x4000, CRC(4ed2e920) SHA1(8896f29e25126c1e4d9a47c9a325b35dddecc61f) )
1435   ROM_LOAD( "cd2393.vsm", 0x4000, 0x4000, CRC(571d5b5a) SHA1(83284755d9b77267d320b5b87fdc39f352433715) )
1450   ROM_LOAD( "cd2392.vsm", 0x0000, 0x4000, CRC(4ed2e920) SHA1(8896f29e25126c1e4d9a47c9a325b35dddecc61f) ) // using the one from 1st version
1451   ROM_LOAD( "cd2393.vsm", 0x4000, 0x4000, CRC(571d5b5a) SHA1(83284755d9b77267d320b5b87fdc39f352433715) ) // "
14361452ROM_END
14371453
14381454
r253153r253154
15371553
15381554
15391555/*    YEAR  NAME        PARENT COMPAT MACHINE      INPUT       INIT                     COMPANY, FULLNAME, FLAGS */
1540COMP( 1978, snspell,    0,        0, sns_tmc0281,  snspell,    tispeak_state, snspell,  "Texas Instruments", "Speak & Spell (US, 1979 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
1556COMP( 1979, snspell,    0,        0, sns_tmc0281,  snspell,    tispeak_state, snspell,  "Texas Instruments", "Speak & Spell (US, 1979 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
15411557COMP( 1978, snspellp,   snspell,  0, sns_tmc0281,  snspell,    tispeak_state, snspell,  "Texas Instruments", "Speak & Spell (US, patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
15421558COMP( 1980, snspellub,  snspell,  0, sns_tmc0281d, snspell,    tispeak_state, snspell,  "Texas Instruments", "Speak & Spell (US, 1980 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
1543COMP( 1979, snspellua,  snspell,  0, sns_tmc0281,  snspell,    tispeak_state, snspell,  "Texas Instruments", "Speak & Spell (US, 1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // incomplete dump, using 1979 MCU ROM instead
1544COMP( 1978, snspelluk,  snspell,  0, sns_tmc0281,  snspell,    tispeak_state, snspell,  "Texas Instruments", "Speak & Spell (UK, 1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // "
1559COMP( 1978, snspellua,  snspell,  0, sns_tmc0281,  snspell,    tispeak_state, snspell,  "Texas Instruments", "Speak & Spell (US, 1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) // incomplete dump, using 1979 MCU ROM instead
1560COMP( 1978, snspelluk,  snspell,  0, sns_tmc0281,  snspell,    tispeak_state, snspell,  "Texas Instruments", "Speak & Spell (UK, 1978 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND ) // "
15451561COMP( 1981, snspelluka, snspell,  0, sns_cd2801,   snspell,    tispeak_state, snspell,  "Texas Instruments", "Speak & Spell (UK, 1981 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
15461562COMP( 1979, snspelljp,  snspell,  0, sns_tmc0281,  snspell,    tispeak_state, snspell,  "Texas Instruments", "Speak & Spell (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
1547COMP( 1980, snspellfr,  snspell,  0, sns_cd2801,   snspellfr,  tispeak_state, snspell,  "Texas Instruments", "La Dictee Magique (France)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // doesn't work due to missing CD2702 MCU dump, German/Italian version has CD2702 too
1548COMP( 1982, snspellit,  snspell,  0, sns_cd2801_m, snspellit,  tispeak_state, snspell,  "Texas Instruments", "Grillo Parlante (Italy)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING ) // "
1563COMP( 1980, snspellfr,  snspell,  0, sns_cd2801,   snspellfr,  tispeak_state, snspell,  "Texas Instruments", "La Dictee Magique (France)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
1564COMP( 1982, snspellit,  snspell,  0, sns_cd2801_m, snspellit,  tispeak_state, snspell,  "Texas Instruments", "Grillo Parlante (Italy)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
15491565
15501566COMP( 1981, snspellc,   0,        0, snspellc,     snspellc,   tispeak_state, snspell,  "Texas Instruments", "Speak & Spell Compact (US, 1981 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
15511567COMP( 1982, snspellca,  snspellc, 0, snspellc,     snspellc,   tispeak_state, snspell,  "Texas Instruments", "Speak & Spell Compact (US, 1982 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
15521568COMP( 1982, snspellcuk, snspellc, 0, snspellcuk,   snspellcuk, tispeak_state, snspell,  "Texas Instruments", "Speak & Write (UK)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
15531569
1554COMP( 1986, snmath,     0,        0, snmath,       snmath,     driver_device, 0,        "Texas Instruments", "Speak & Math (US, 1986 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
1555COMP( 1980, snmathp,    snmath,   0, snmath,       snmath,     driver_device, 0,        "Texas Instruments", "Speak & Math (US, 1980 version/patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )
1570COMP( 1980, snmath,     0,        0, snmath,       snmath,     driver_device, 0,        "Texas Instruments", "Speak & Math (US, 1980 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
1571COMP( 1986, snmatha,    snmath,   0, snmath,       snmath,     driver_device, 0,        "Texas Instruments", "Speak & Math (US, 1986 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
1572COMP( 1980, snmathp,    snmath,   0, snmath,       snmath,     driver_device, 0,        "Texas Instruments", "Speak & Math (US, patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IS_INCOMPLETE )
15561573
15571574COMP( 1980, snread,     0,        0, snread,       snread,     tispeak_state, snspell,  "Texas Instruments", "Speak & Read (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
15581575
15591576COMP( 1979, lantutor,   0,        0, lantutor,     lantutor,   tispeak_state, lantutor, "Texas Instruments", "Language Tutor (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_NOT_WORKING )
15601577
1561COMP( 1981, tntell,     0,        0, tntell,       tntell,     tispeak_state, tntell,   "Texas Instruments", "Touch & Tell (US, 1981 version)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK ) // assume there is an older version too, with CD8010 MCU
1562COMP( 1980, tntellp,    tntell,   0, tntell,       tntell,     tispeak_state, tntell,   "Texas Instruments", "Touch & Tell (patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK | MACHINE_NOT_WORKING )
1578COMP( 1981, tntell,     0,        0, tntell,       tntell,     tispeak_state, tntell,   "Texas Instruments", "Touch & Tell (US)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK )
1579COMP( 1980, tntellp,    tntell,   0, tntell,       tntell,     tispeak_state, tntell,   "Texas Instruments", "Touch & Tell (US, patent)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK | MACHINE_NOT_WORKING )
15631580COMP( 1981, tntelluk,   tntell,   0, tntell,       tntell,     tispeak_state, tntell,   "Texas Instruments", "Touch & Tell (UK)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK )
15641581COMP( 1981, tntellfr,   tntell,   0, tntell,       tntell,     tispeak_state, tntell,   "Texas Instruments", "Le Livre Magique (France)", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_CLICKABLE_ARTWORK | MACHINE_REQUIRES_ARTWORK )
15651582
trunk/src/mame/drivers/vc4000.cpp
r253153r253154
722722CONS(1979, krvnjvtv, 0,         vc4000,   vc4000,    vc4000, driver_device,      0,        "SOE",              "OC Jeu Video TV Karvan", MACHINE_IMPERFECT_GRAPHICS )    /* France */
723723CONS(1979, oc2000,   krvnjvtv,  0,        vc4000,    vc4000, driver_device,      0,        "SOE",              "OC-2000",          MACHINE_IMPERFECT_GRAPHICS )          /* France */
724724CONS(1980, mpt05,    0,         vc4000,   vc4000,    vc4000, driver_device,      0,        "ITMC",             "MPT-05",           MACHINE_IMPERFECT_GRAPHICS )          /* France */
725CONS(1982, h21,      0,         0,        h21,       vc4000, driver_device,      0,        "TRQ",              "Video Computer H-21", MACHINE_IMPERFECT_GRAPHICS) // Spain
725CONS(1982, h21,      0,         vc4000,   h21,       vc4000, driver_device,      0,        "TRQ",              "Video Computer H-21", MACHINE_IMPERFECT_GRAPHICS) // Spain
726726CONS(1979, elektor,  0,         0,        elektor,   elektor, driver_device,     0,        "Elektor",          "Elektor TV Games Computer", MACHINE_IMPERFECT_GRAPHICS )
trunk/src/mame/drivers/vegas.cpp
r253153r253154
493493   UINT8 m_sio_led_state;
494494   UINT8 m_pending_analog_read;
495495   UINT8 m_cmos_unlocked;
496   device_t *m_voodoo;
496   voodoo_device *m_voodoo;
497497   UINT8 m_dcs_idma_cs;
498498   int m_count;
499499   int m_dynamic_count;
r253153r253154
567567
568568UINT32 vegas_state::screen_update_vegas(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
569569{
570   return voodoo_update(m_voodoo, bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
570   return m_voodoo->voodoo_update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
571571}
572572
573573
r253153r253154
579579
580580void vegas_state::machine_start()
581581{
582   m_voodoo = machine().device("voodoo");
582   m_voodoo = (voodoo_device*)machine().device("voodoo");
583583
584584   /* allocate timers for the NILE */
585585   m_timer[0] = machine().scheduler().timer_alloc(FUNC_NULL);
r253153r253154
797797
798798READ32_MEMBER( vegas_state::pci_3dfx_r )
799799{
800   int voodoo_type = voodoo_get_type(m_voodoo);
800   int voodoo_type = m_voodoo->voodoo_get_type();
801801   UINT32 result = m_pci_3dfx_regs[offset];
802802
803803   switch (offset)
r253153r253154
830830
831831WRITE32_MEMBER( vegas_state::pci_3dfx_w )
832832{
833   int voodoo_type = voodoo_get_type(m_voodoo);
833   int voodoo_type = m_voodoo->voodoo_get_type();
834834
835835   m_pci_3dfx_regs[offset] = data;
836836
r253153r253154
869869         break;
870870
871871      case 0x10:      /* initEnable register */
872         voodoo_set_init_enable(m_voodoo, data);
872         m_voodoo->voodoo_set_init_enable(data);
873873         break;
874874
875875   }
r253153r253154
15551555void vegas_state::remap_dynamic_addresses()
15561556{
15571557   dynamic_address *dynamic = m_dynamic;
1558   int voodoo_type = voodoo_get_type(m_voodoo);
1558   int voodoo_type = m_voodoo->voodoo_get_type();
15591559   offs_t base;
15601560   int addr;
15611561
trunk/src/mame/drivers/viper.cpp
r253153r253154
435435
436436UINT32 viper_state::screen_update_viper(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
437437{
438   device_t *device = machine().device("voodoo");
439   return voodoo_update(device, bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
438   voodoo_device *voodoo = (voodoo_device*)machine().device("voodoo");
439   return voodoo->voodoo_update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED;
440440}
441441
442442UINT32 m_mpc8240_regs[256/4];
trunk/src/mame/includes/arkanoid.h
r253153r253154
6262   UINT8    m_ddr_c;
6363   UINT8    m_tdr;
6464   UINT8    m_tcr;
65   emu_timer *m_68705_timer;
6566
66
6767   /* hexaa */
6868   UINT8 m_hexaa_from_main;
6969   UINT8 m_hexaa_from_sub;
trunk/src/mame/includes/chihiro.h
r253153r253154
346346      B8 = 9,
347347      G8B8 = 10
348348   };
349   enum class NV2A_GL_FRONT_FACE {
350      CW = 0x0900,
351      CCW = 0x0901
352   };
353   enum class NV2A_GL_CULL_FACE {
354      FRONT = 0x0404,
355      BACK = 0x0405,
356      FRONT_AND_BACK = 0x0408
357   };
349358
350359   nv2a_renderer(running_machine &machine) : poly_manager<float, nvidia_object_data, 13, 8192>(machine)
351360   {
r253153r253154
363372      indexesleft_count = 0;
364373      vertex_pipeline = 4;
365374      color_mask = 0xffffffff;
375      backface_culling_enabled = false;
376      backface_culling_winding = NV2A_GL_FRONT_FACE::CCW;
377      backface_culling_culled = NV2A_GL_CULL_FACE::BACK;
366378      alpha_test_enabled = false;
367379      alpha_reference = 0;
368380      alpha_func = NV2A_COMPARISON_OP::ALWAYS;
r253153r253154
464476   int read_vertices_0x1810(address_space & space, vertex_nv *destination, int offset, int limit);
465477   int read_vertices_0x1818(address_space & space, vertex_nv *destination, UINT32 address, int limit);
466478   void convert_vertices_poly(vertex_nv *source, vertex_t *destination, int count);
479   UINT32 render_triangle_culling(const rectangle &cliprect, render_delegate callback, int paramcount, const vertex_t &_v1, const vertex_t &_v2, const vertex_t &_v3);
467480   void clear_render_target(int what, UINT32 value);
468481   void clear_depth_buffer(int what, UINT32 value);
469482   inline UINT8 *direct_access_ptr(offs_t address);
r253153r253154
630643      std::mutex lock;
631644   } combiner;
632645   UINT32 color_mask;
646   bool backface_culling_enabled;
647   NV2A_GL_FRONT_FACE backface_culling_winding;
648   NV2A_GL_CULL_FACE backface_culling_culled;
633649   bool alpha_test_enabled;
634650   NV2A_COMPARISON_OP alpha_func;
635651   int alpha_reference;
trunk/src/mame/includes/overdriv.h
r253153r253154
5151   DECLARE_WRITE16_MEMBER(cpuB_ctrl_w);
5252   DECLARE_WRITE16_MEMBER(overdriv_soundirq_w);
5353   DECLARE_WRITE8_MEMBER(sound_ack_w);
54   DECLARE_WRITE16_MEMBER(overdriv_cpuB_irq_x_w);
55   DECLARE_WRITE16_MEMBER(overdriv_cpuB_irq_y_w);
54   DECLARE_WRITE16_MEMBER(slave_irq4_assert_w);
55   DECLARE_WRITE16_MEMBER(slave_irq5_assert_w);
56   DECLARE_WRITE16_MEMBER(objdma_w);
57   TIMER_CALLBACK_MEMBER(objdma_end_cb);
58
5659   virtual void machine_start() override;
5760   virtual void machine_reset() override;
5861   UINT32 screen_update_overdriv(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
59   INTERRUPT_GEN_MEMBER(cpuB_interrupt);
62   //INTERRUPT_GEN_MEMBER(cpuB_interrupt);
6063   TIMER_DEVICE_CALLBACK_MEMBER(overdriv_cpuA_scanline);
6164   int m_fake_timer;
6265   
trunk/src/mame/machine/315-5838_317-0229_comp.cpp
r253153r253154
44
55    315-5838 - Decathlete (ST-V)
66    317-0229 - Dead or Alive (Model 2A)
7   317-0229 - Name Club Ver 2 (ST-V) (tested as RCDD2 in the service menu!)
8   317-0231 - Print Club Love Love (ST-V)
79
10   Several Print Club (ST-V) carts have
11   an unpopulated space marked '317-0229' on the PCB
12
813    Package Type: TQFP100
914
10    This appears to be a dual channel compression chip, used in 1996, predating the 5881.
11    Decathlete uses it to compress ALL the game graphics, Dead or Alive uses it for a
12    dumb security check, decompressing a single string.
15    Decathlete accesses the chip at 2 different addresses, however, I don't think there
16   are 2 channels / sets of registers, instead the 2nd set of addresses are just a
17   mirror that allows access to a different set of source roms; the tables etc. are
18   re-uploaded before every transfer.
1319
14    Each channel appears to be connected to a different set of ROMs, however there is
15    defintiely only a single 315-5838 chip. (could the different channels actually just
16    be mirror addresses, with part of the address determining the ROMs to use?)
17
18    Dead of Alive only uses a single channel, and has the source data in RAM, not ROM.
20    Dead of Alive has the source data in RAM, not ROM.
1921    This is similar to how some 5881 games were set up, with the ST-V versions decrypting
2022    data directly from ROM and the Model 2 ones using a RAM source buffer.
2123
r253153r253154
4951
5052void sega_315_5838_comp_device::device_start()
5153{
54   m_decathlt_lastcount = 0;
55   m_decathlt_prot_uploadmode = 0;
56   m_decathlt_prot_uploadoffset = 0;
57
5258   for (auto & elem : m_channel)
5359   {
54      elem.m_decathlt_lastcount = 0;
55      elem.m_decathlt_prot_uploadmode = 0;
56      elem.m_decathlt_prot_uploadoffset = 0;
5760      elem.m_read_ch.bind_relative_to(*owner());
5861
5962   }
r253153r253154
6164
6265void sega_315_5838_comp_device::device_reset()
6366{
64   for (auto & elem : m_channel)
65   {
66      elem.m_srcoffset = 0;
67      elem.m_decathlt_lastcount = 0;
68      elem.m_decathlt_prot_uploadmode = 0;
69      elem.m_decathlt_prot_uploadoffset = 0;
70   }
71
67   m_srcoffset = 0;
68   m_decathlt_lastcount = 0;
69   m_decathlt_prot_uploadmode = 0;
70   m_decathlt_prot_uploadoffset = 0;
7271   m_protstate = 0;
7372}
7473
r253153r253154
10099//  UINT32 *fake0 = (UINT32*)memregion( ":fake0" )->base();
101100//  UINT32 retvalue = 0xffff;
102101
103   switch (m_channel[channel].m_srcoffset)
102   switch (m_srcoffset)
104103   {
105104      default:
106105
107      m_channel[channel].m_decathlt_lastcount++;
106      m_decathlt_lastcount++;
108107
109108      UINT32 tempdata = 0;
110      tempdata |= m_channel[channel].m_read_ch(m_channel[channel].m_srcoffset) << 0;
111      m_channel[channel].m_srcoffset++;
112      tempdata |= m_channel[channel].m_read_ch(m_channel[channel].m_srcoffset) << 16;
113      m_channel[channel].m_srcoffset++;
109      tempdata |= m_channel[channel].m_read_ch(m_srcoffset) << 0;
110      m_srcoffset++;
111      tempdata |= m_channel[channel].m_read_ch(m_srcoffset) << 16;
112      m_srcoffset++;
114113
115114
116115      #ifdef DEBUG_DATA_DUMP
117      //printf("read addr %08x, blah_r %08x - read count count %08x\n", m_channel[channel].m_srcoffset*2, tempdata,  m_channel[channel].m_decathlt_lastcount*4);
116      //printf("read addr %08x, blah_r %08x - read count count %08x\n", m_srcoffset*2, tempdata,  m_decathlt_lastcount*4);
118117      fwrite(&tempdata, 1, 4, tempfile);
119118      #else
120      logerror("read addr %08x, blah_r %08x - read count count %08x\n", m_channel[channel].m_srcoffset*2, tempdata,  m_channel[channel].m_decathlt_lastcount*4);
119      logerror("read addr %08x, blah_r %08x - read count count %08x\n", m_srcoffset*2, tempdata,  m_decathlt_lastcount*4);
121120      #endif
122121
123122      return tempdata;
124123#if 0
125124      case 0x03228e4:
126         if (fake0) retvalue = fake0[(((0x20080/4)+m_channel[channel].m_decathlt_lastcount))];
127         m_channel[channel].m_decathlt_lastcount++;
125         if (fake0) retvalue = fake0[(((0x20080/4)+m_decathlt_lastcount))];
126         m_decathlt_lastcount++;
128127         return retvalue;
129128
130129      case 0x00a9f3a:
131         if (fake0) retvalue = fake0[(((0x00000/4)+m_channel[channel].m_decathlt_lastcount))];
132         m_channel[channel].m_decathlt_lastcount++;
130         if (fake0) retvalue = fake0[(((0x00000/4)+m_decathlt_lastcount))];
131         m_decathlt_lastcount++;
133132         return retvalue;
134133
135134      case 0x0213ab4:
136         if (fake0) retvalue = fake0[(((0x40000/4)+m_channel[channel].m_decathlt_lastcount))];
137         m_channel[channel].m_decathlt_lastcount++;
135         if (fake0) retvalue = fake0[(((0x40000/4)+m_decathlt_lastcount))];
136         m_decathlt_lastcount++;
138137         return retvalue;
139138
140139      case 0x01efaf0:
141         if (fake0) retvalue = fake0[(((0x60000/4)+m_channel[channel].m_decathlt_lastcount))];
142         m_channel[channel].m_decathlt_lastcount++;
140         if (fake0) retvalue = fake0[(((0x60000/4)+m_decathlt_lastcount))];
141         m_decathlt_lastcount++;
143142         return retvalue;
144143
145144      case 0x033f16c:
r253153r253154
180179void sega_315_5838_comp_device::set_prot_addr(UINT32 data, UINT32 mem_mask, int channel)
181180{
182181//  printf("set_prot_addr\n");
183   COMBINE_DATA(&m_channel[channel].m_srcoffset);
182   COMBINE_DATA(&m_srcoffset);
184183
185   //if (m_decathlt_part==0) logerror("%d, last read count was %06x\n",channel, m_channel[channel].m_decathlt_lastcount*4);
186   m_channel[channel].m_decathlt_lastcount = 0;
184   //if (m_decathlt_part==0) logerror("%d, last read count was %06x\n",channel, m_decathlt_lastcount*4);
185   m_decathlt_lastcount = 0;
187186
188187   if (mem_mask == 0x0000ffff)
189188   {
190      printf("set source address to %08x (channel %d)\n", m_channel[channel].m_srcoffset, channel);
189      printf("set source address to %08x (channel %d)\n", m_srcoffset, channel);
191190   }
192191
193192
r253153r253154
198197         fclose(tempfile);
199198
200199      char filename[256];
201      sprintf(filename, "%d_compressed_%08x", channel, m_channel[channel].m_srcoffset * 2);
200      sprintf(filename, "%d_compressed_%08x", channel, m_srcoffset * 2);
202201      tempfile = fopen(filename, "w+b");
203202
204203      // the table and dictionary are uploaded repeatedly, usually before groups of data transfers but
205204      // it's always the same tables (one pair for each channel)
206205      {
207206         FILE* fp;
208         sprintf(filename, "%d_compressed_table1", channel);
207         sprintf(filename, "%d_compressed_table1_%08x", channel, m_srcoffset * 2);
209208         fp = fopen(filename, "w+b");
210         fwrite(&m_channel[channel].m_decathlt_prottable1, 24, 2, fp);
209         fwrite(&m_decathlt_prottable1, 24, 2, fp);
211210         fclose(fp);
212211      }
213212
214213      {
215214         FILE* fp;
216         sprintf(filename, "%d_compressed_dictionary", channel);
215         sprintf(filename, "%d_compressed_dictionary_%08x", channel, m_srcoffset * 2);
217216         fp = fopen(filename, "w+b");
218         fwrite(&m_channel[channel].m_decathlt_dictionary, 128, 2, fp);
217         fwrite(&m_decathlt_dictionaryy, 128, 2, fp);
219218         fclose(fp);
220219      }
221220   }
r253153r253154
228227   if ((data == 0x8000) || (data == 0x0000))
229228   {
230229   //  logerror("changed to upload mode 1\n");
231      m_channel[channel].m_decathlt_prot_uploadmode = 1;
232      m_channel[channel].m_decathlt_prot_uploadoffset = 0;
230      m_decathlt_prot_uploadmode = 1;
231      m_decathlt_prot_uploadoffset = 0;
233232   }
234233   else if ((data == 0x8080) || (data == 0x0080))
235234   {
236      m_channel[channel].m_decathlt_prot_uploadmode = 2;
237      m_channel[channel].m_decathlt_prot_uploadoffset = 0;
235      m_decathlt_prot_uploadmode = 2;
236      m_decathlt_prot_uploadoffset = 0;
238237   }
239238   else
240239   {
r253153r253154
244243
245244void sega_315_5838_comp_device::upload_table_data(UINT16 data, int channel)
246245{
247   if (m_channel[channel].m_decathlt_prot_uploadmode == 1)
246   if (m_decathlt_prot_uploadmode == 1)
248247   {
249      if (m_channel[channel].m_decathlt_prot_uploadoffset >= 24)
248      if (m_decathlt_prot_uploadoffset >= 24)
250249      {
251250         fatalerror("upload mode 1 error, too big\n");
252251         return;
253252      }
254253
255      //logerror("uploading table 1 %04x %04x\n",m_channel[channel].m_decathlt_prot_uploadoffset, data&0xffff);
256      m_channel[channel].m_decathlt_prottable1[m_channel[channel].m_decathlt_prot_uploadoffset] = data & 0xffff;
257      m_channel[channel].m_decathlt_prot_uploadoffset++;
254      //logerror("uploading table 1 %04x %04x\n",m_decathlt_prot_uploadoffset, data&0xffff);
255      m_decathlt_prottable1[m_decathlt_prot_uploadoffset] = data & 0xffff;
256      m_decathlt_prot_uploadoffset++;
258257      printf("unk table 1 %04x (channel %d)\n", data & 0xffff, channel);
259258   }
260   else if (m_channel[channel].m_decathlt_prot_uploadmode == 2)
259   else if (m_decathlt_prot_uploadmode == 2)
261260   {
262      if (m_channel[channel].m_decathlt_prot_uploadoffset >= 128)
261      if (m_decathlt_prot_uploadoffset >= 128)
263262      {
264263         fatalerror("upload mode 2 error, too big\n");
265264         return;
266265      }
267266
268      //logerror("uploading table 2 %04x %04x\n",m_channel[channel].m_decathlt_prot_uploadoffset, data&0xffff);
269      m_channel[channel].m_decathlt_dictionary[m_channel[channel].m_decathlt_prot_uploadoffset] = data & 0xffff;
270      m_channel[channel].m_decathlt_prot_uploadoffset++;
267      //logerror("uploading table 2 %04x %04x\n",m_decathlt_prot_uploadoffset, data&0xffff);
268      m_decathlt_dictionaryy[m_decathlt_prot_uploadoffset] = data & 0xffff;
269      m_decathlt_prot_uploadoffset++;
271270      printf("dictionary %04x (channel %d)\n", data & 0xffff, channel);
272271   }
273272}
trunk/src/mame/machine/315-5838_317-0229_comp.h
r253153r253154
6565   virtual void device_reset() override;
6666
6767private:
68   UINT16 m_decathlt_prottable1[24];
69   UINT16 m_decathlt_dictionaryy[128];
6870
71   UINT32 m_srcoffset;
72
73   UINT32 m_decathlt_lastcount;
74   UINT32 m_decathlt_prot_uploadmode;
75   UINT32 m_decathlt_prot_uploadoffset;
76
77
6978   // Decathlete specific variables and functions (see machine/decathlt.c)
7079   struct channel_type
7180   {
72      UINT32 m_srcoffset;
73      UINT16 m_decathlt_prottable1[24];
74      UINT16 m_decathlt_dictionary[128];
75
76      UINT32 m_decathlt_lastcount;
77      UINT32 m_decathlt_prot_uploadmode;
78      UINT32 m_decathlt_prot_uploadoffset;
7981      sega_dec_read_delegate m_read_ch;
8082
8183   };
trunk/src/mame/machine/arkanoid.cpp
r253153r253154
8282   if ((m_tcr^data)&0x20)// check if TIN state changed
8383   {
8484      /* logerror("timer enable state changed!\n"); */
85      if (data&0x20) timer_set(attotime::never, TIMER_68705_PRESCALER_EXPIRED);
86      else timer_set(attotime::from_hz(((XTAL_12MHz/4)/4)/(1<<(data&0x7))), TIMER_68705_PRESCALER_EXPIRED);
85      if (data&0x20) m_68705_timer->adjust(attotime::never, TIMER_68705_PRESCALER_EXPIRED);
86      else m_68705_timer->adjust(attotime::from_hz(((XTAL_12MHz/4)/4)/(1<<(data&0x7))), TIMER_68705_PRESCALER_EXPIRED);
8787   }
8888   // prescaler check: if timer prescaler has changed, or the PSC bit is set, adjust the timer length for the prescaler expired timer, but only if the timer would be running
8989   if ( (((m_tcr&0x07)!=(data&0x07))||(data&0x08)) && ((data&0x20)==0) )
9090   {
9191      /* logerror("timer reset due to PSC or prescaler change!\n"); */
92      timer_set(attotime::from_hz(((XTAL_12MHz/4)/4)/(1<<(data&0x7))), TIMER_68705_PRESCALER_EXPIRED);
92      m_68705_timer->adjust(attotime::from_hz(((XTAL_12MHz/4)/4)/(1<<(data&0x7))), TIMER_68705_PRESCALER_EXPIRED);
9393   }
9494   m_tcr = data;
9595   // if int state is set, and TIM is unmasked, assert an interrupt. otherwise clear it.
r253153r253154
120120      m_mcu->set_input_line(M68705_INT_TIMER, ASSERT_LINE);
121121   else
122122      m_mcu->set_input_line(M68705_INT_TIMER, CLEAR_LINE);
123   timer_set(attotime::from_hz(((XTAL_12MHz/4)/4)/(1<<(m_tcr&0x7))), TIMER_68705_PRESCALER_EXPIRED);
123   m_68705_timer->adjust(attotime::from_hz(((XTAL_12MHz/4)/4)/(1<<(m_tcr&0x7))), TIMER_68705_PRESCALER_EXPIRED);
124124}
125125
126126READ8_MEMBER(arkanoid_state::arkanoid_68705_port_c_r)
trunk/src/mame/machine/pc9801_cd.cpp
r0r253154
1// license:BSD-3-Clause
2// copyright-holders:smf
3#include "pc9801_cd.h"
4
5// device type definition
6const device_type PC9801_CD = &device_creator<pc9801_cd_device>;
7
8pc9801_cd_device::pc9801_cd_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
9   atapi_cdrom_device(mconfig, PC9801_CD, "PC9801 CD-ROM Drive", tag, owner, clock, "pc9801_cd", __FILE__)
10{
11}
12
13void pc9801_cd_device::fill_buffer()
14{
15   atapi_hle_device::fill_buffer();
16   m_status |= IDE_STATUS_DRDY | IDE_STATUS_SERV;
17}
18
19void pc9801_cd_device::process_buffer()
20{
21   atapi_hle_device::process_buffer();
22   m_status |= IDE_STATUS_DRDY | IDE_STATUS_SERV;
23}
24
25void pc9801_cd_device::process_command()
26{
27   atapi_hle_device::process_command();
28   switch(m_command)
29   {
30      case IDE_COMMAND_CHECK_POWER_MODE:
31         m_status = IDE_STATUS_DRDY | IDE_STATUS_SERV;
32         break;
33   }
34}
trunk/src/mame/machine/pc9801_cd.h
r0r253154
1// license:BSD-3-Clause
2// copyright-holders:smf
3
4#ifndef __PC9801_CD_H__
5#define __PC9801_CD_H__
6
7#include "machine/atapicdr.h"
8
9class pc9801_cd_device : public atapi_cdrom_device
10{
11public:
12   pc9801_cd_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
13
14protected:
15   virtual void fill_buffer() override;
16   virtual void process_command() override;
17   virtual void process_buffer() override;
18};
19
20// device type definition
21extern const device_type PC9801_CD;
22
23#endif
trunk/src/mame/machine/pc9801_kbd.cpp
r253153r253154
257257
258258   m_keyb_tx = 0xff;
259259   m_keyb_rx = 0;
260   m_key_avail = false;
260261}
261262
262263//-------------------------------------------------
r253153r253154
276277         {
277278            m_keyb_tx = i | 0x80;
278279            m_write_irq(ASSERT_LINE);
280            m_key_avail = true;
279281            m_rx_buf[i] = 0;
280282            return;
281283         }
r253153r253154
288290         {
289291            m_keyb_tx = i;
290292            m_write_irq(ASSERT_LINE);
293            m_key_avail = true;
291294            m_rx_buf[i] = 0;
292295            return;
293296         }
r253153r253154
303306{
304307   m_write_irq(CLEAR_LINE);
305308   if(!offset)
309   {
310      m_key_avail = false;
306311      return m_keyb_tx;
307   return 1 | 4 | 2;
312   }
313   return 1 | 4 | (m_key_avail ? 2 : 0);
308314}
309315
310316WRITE8_MEMBER( pc9801_kbd_device::tx_w )
trunk/src/mame/machine/pc9801_kbd.h
r253153r253154
5555   UINT8               m_rx_buf[0x80];
5656   UINT8               m_keyb_tx;
5757   UINT8               m_keyb_rx;
58   bool            m_key_avail;
5859};
5960
6061
trunk/src/mame/mess.lst
r253153r253154
21422142
21432143// Fidelity
21442144cc10
2145cc7
21452146vcc      // VCC: Voice Chess Challenger (English)
21462147vccg     // * Spanish
21472148vccfr    // * German
r253153r253154
23442345snspellca
23452346snspellcuk
23462347snmath
2348snmatha
23472349snmathp
23482350snread
23492351lantutor
trunk/src/mame/video/chihiro.cpp
r253153r253154
25492549   }
25502550}
25512551
2552UINT32 nv2a_renderer::render_triangle_culling(const rectangle &cliprect, render_delegate callback, int paramcount, const vertex_t &_v1, const vertex_t &_v2, const vertex_t &_v3)
2553{
2554   float areax2;
2555
2556   if (backface_culling_enabled == false)
2557      return render_triangle(cliprect, callback, paramcount, _v1, _v2, _v3);
2558   if (backface_culling_culled == NV2A_GL_CULL_FACE::FRONT_AND_BACK)
2559      return 0;
2560   areax2 = _v1.x*(_v2.y - _v3.y) + _v2.x*(_v3.y - _v1.y) + _v3.x*(_v1.y - _v2.y);
2561   if (backface_culling_winding == NV2A_GL_FRONT_FACE::CCW)
2562      areax2 = -areax2;
2563   // if areax2 >= 0 then front faced else back faced
2564   if ((backface_culling_culled == NV2A_GL_CULL_FACE::FRONT) && (areax2 >= 0))
2565      return 0;
2566   if ((backface_culling_culled == NV2A_GL_CULL_FACE::BACK) && (areax2 < 0))
2567      return 0;
2568   return render_triangle(cliprect, callback, paramcount, _v1, _v2, _v3);
2569}
2570
25522571int nv2a_renderer::geforce_exec_method(address_space & space, UINT32 chanel, UINT32 subchannel, UINT32 method, UINT32 address, int &countlen)
25532572{
25542573   UINT32 maddress;
r253153r253154
25922611         for (n = 0; n <= count; n += 4) {
25932612            read_vertices_0x1810(space, vertex_software + vertex_first, n + offset, 4);
25942613            convert_vertices_poly(vertex_software + vertex_first, vertex_xy + vertex_first, 4);
2595            render_polygon<4>(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy + vertex_first); // 4 rgba, 4 texture units 2 uv
2614            //render_polygon<4>(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy + vertex_first); // 4 rgba, 4 texture units 2 uv
2615            render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[vertex_first], vertex_xy[vertex_first + 1], vertex_xy[vertex_first + 2]);
2616            render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[vertex_first], vertex_xy[vertex_first + 2], vertex_xy[vertex_first + 3]);
25962617            vertex_first = (vertex_first + 4) & 1023;
25972618            vertex_count = vertex_count + 4;
25982619            wait();
r253153r253154
26022623         for (n = 0; n <= count; n += 3) {
26032624            read_vertices_0x1810(space, vertex_software + vertex_first, n + offset, 3);
26042625            convert_vertices_poly(vertex_software + vertex_first, vertex_xy + vertex_first, 3);
2605            render_triangle(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[vertex_first], vertex_xy[(vertex_first + 1) & 1023], vertex_xy[(vertex_first + 2) & 1023]); // 4 rgba, 4 texture units 2 uv
2626            render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[vertex_first], vertex_xy[(vertex_first + 1) & 1023], vertex_xy[(vertex_first + 2) & 1023]); // 4 rgba, 4 texture units 2 uv
26062627            vertex_first = (vertex_first + 3) & 1023;
26072628            vertex_count = vertex_count + 3;
26082629            wait();
r253153r253154
26242645         for (n = 0; n <= count; n++) {
26252646            read_vertices_0x1810(space, vertex_software + vertex_first, offset + n, 1);
26262647            convert_vertices_poly(vertex_software + vertex_first, vertex_xy + vertex_first, 1);
2627            render_triangle(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[1024], vertex_xy[(vertex_first - 1) & 1023], vertex_xy[vertex_first]);
2648            render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[1024], vertex_xy[(vertex_first - 1) & 1023], vertex_xy[vertex_first]);
26282649            vertex_first = (vertex_first + 1) & 1023;
26292650            vertex_count = vertex_count + 1;
26302651            wait();
r253153r253154
26452666            read_vertices_0x1810(space, vertex_software + vertex_first, offset + n, 1);
26462667            convert_vertices_poly(vertex_software + vertex_first, vertex_xy + vertex_first, 1);
26472668            if ((vertex_count & 1) == 0)
2648               render_triangle(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[(vertex_first - 2) & 1023], vertex_xy[(vertex_first - 1) & 1023], vertex_xy[vertex_first]);
2669               render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[(vertex_first - 2) & 1023], vertex_xy[(vertex_first - 1) & 1023], vertex_xy[vertex_first]);
26492670            else
2650               render_triangle(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[(vertex_first - 2) & 1023], vertex_xy[vertex_first], vertex_xy[(vertex_first - 1) & 1023]);
2671               render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[(vertex_first - 2) & 1023], vertex_xy[vertex_first], vertex_xy[(vertex_first - 1) & 1023]);
26512672            vertex_first = (vertex_first + 1) & 1023;
26522673            vertex_count = vertex_count + 1;
26532674            wait();
r253153r253154
26912712            address = address + c * 4;
26922713            countlen = countlen - c;
26932714            convert_vertices_poly(vertex_software + vertex_first, vertex_xy + vertex_first, 4);
2694            render_polygon<4>(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy + vertex_first); // 4 rgba, 4 texture units 2 uv
2715            //render_polygon<4>(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy + vertex_first); // 4 rgba, 4 texture units 2 uv
2716            render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[vertex_first], vertex_xy[vertex_first + 1], vertex_xy[vertex_first + 2]);
2717            render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[vertex_first], vertex_xy[vertex_first + 2], vertex_xy[vertex_first + 3]);
26952718            vertex_first = (vertex_first + 4) & 1023;
26962719            vertex_count = vertex_count + 4;
26972720            wait();
r253153r253154
27332756               convert_vertices_poly(vertex_software + vertex_first, vertex_xy + vertex_first, 1);
27342757               address = address + c * 4;
27352758               countlen = countlen - c;
2736               render_triangle(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[1024], vertex_xy[(vertex_first - 1) & 1023], vertex_xy[vertex_first]);
2759               render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[1024], vertex_xy[(vertex_first - 1) & 1023], vertex_xy[vertex_first]);
27372760               vertex_first = (vertex_first + 1) & 1023;
27382761               vertex_count = vertex_count + 1;
27392762               wait();
r253153r253154
27532776            address = address + c * 4;
27542777            countlen = countlen - c;
27552778            convert_vertices_poly(vertex_software + vertex_first, vertex_xy + vertex_first, 3);
2756            render_triangle(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[vertex_first], vertex_xy[(vertex_first + 1) & 1023], vertex_xy[(vertex_first + 2) & 1023]); // 4 rgba, 4 texture units 2 uv
2779            render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[vertex_first], vertex_xy[(vertex_first + 1) & 1023], vertex_xy[(vertex_first + 2) & 1023]); // 4 rgba, 4 texture units 2 uv
27572780            vertex_first = (vertex_first + 3) & 1023;
27582781            vertex_count = vertex_count + 3;
27592782            wait();
r253153r253154
27892812               countlen = countlen - c;
27902813               convert_vertices_poly(vertex_software + vertex_first, vertex_xy + vertex_first, 1);
27912814               if ((vertex_count & 1) == 0)
2792                  render_triangle(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[(vertex_first - 2) & 1023], vertex_xy[(vertex_first - 1) & 1023], vertex_xy[vertex_first]);
2815                  render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[(vertex_first - 2) & 1023], vertex_xy[(vertex_first - 1) & 1023], vertex_xy[vertex_first]);
27932816               else
2794                  render_triangle(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[(vertex_first - 2) & 1023], vertex_xy[vertex_first], vertex_xy[(vertex_first - 1) & 1023]);
2817                  render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[(vertex_first - 2) & 1023], vertex_xy[vertex_first], vertex_xy[(vertex_first - 1) & 1023]);
27952818               vertex_first = (vertex_first + 1) & 1023;
27962819               vertex_count = vertex_count + 1;
27972820               wait();
r253153r253154
28492872               break;
28502873            }
28512874            address = address + c * 4;
2852            render_polygon<4>(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy); // 4 rgba, 4 texture units 2 uv
2875            //render_polygon<4>(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy); // 4 rgba, 4 texture units 2 uv
2876            render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[vertex_first], vertex_xy[vertex_first + 1], vertex_xy[vertex_first + 2]);
2877            render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[vertex_first], vertex_xy[vertex_first + 2], vertex_xy[vertex_first + 3]);
28532878            vertex_first = (vertex_first + 4) & 1023;
28542879            vertex_count = vertex_count + 4;
28552880            wait();
r253153r253154
28772902               return 0;
28782903            }
28792904            address = address + c * 4;
2880            render_triangle(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[n & 3], vertex_xy[(n + 1) & 3], vertex_xy[(n + 2) & 3]);
2881            render_triangle(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[(n + 2) & 3], vertex_xy[(n + 1) & 3], vertex_xy[(n + 3) & 3]);
2905            render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[n & 3], vertex_xy[(n + 1) & 3], vertex_xy[(n + 2) & 3]);
2906            render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[(n + 2) & 3], vertex_xy[(n + 1) & 3], vertex_xy[(n + 3) & 3]);
28822907            wait();
28832908         }
28842909      }
r253153r253154
29142939            }
29152940            address = address + c * 4;
29162941            convert_vertices_poly(vertex_software + vertex_first, vertex_xy + vertex_first, 1);
2917            render_triangle(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[1024], vertex_xy[(vertex_first - 1) & 1023], vertex_xy[vertex_first]);
2942            render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[1024], vertex_xy[(vertex_first - 1) & 1023], vertex_xy[vertex_first]);
29182943            vertex_first = (vertex_first + 1) & 1023;
29192944            vertex_count = vertex_count + 1;
29202945            wait();
r253153r253154
29332958               break;
29342959            }
29352960            address = address + c * 4;
2936            render_triangle(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[vertex_first], vertex_xy[(vertex_first + 1) & 1023], vertex_xy[(vertex_first + 2) & 1023]); // 4 rgba, 4 texture units 2 uv
2961            render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[vertex_first], vertex_xy[(vertex_first + 1) & 1023], vertex_xy[(vertex_first + 2) & 1023]); // 4 rgba, 4 texture units 2 uv
29372962            vertex_first = (vertex_first + 3) & 1023;
29382963            vertex_count = vertex_count + 3;
29392964            wait();
r253153r253154
29682993            }
29692994            address = address + c * 4;
29702995            if ((vertex_count & 1) == 0)
2971               render_triangle(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[(vertex_first - 2) & 1023], vertex_xy[(vertex_first - 1) & 1023], vertex_xy[vertex_first]);
2996               render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[(vertex_first - 2) & 1023], vertex_xy[(vertex_first - 1) & 1023], vertex_xy[vertex_first]);
29722997            else
2973               render_triangle(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[(vertex_first - 2) & 1023], vertex_xy[vertex_first], vertex_xy[(vertex_first - 1) & 1023]);
2998               render_triangle_culling(limits_rendertarget, renderspans, 4 + 4 * 2, vertex_xy[(vertex_first - 2) & 1023], vertex_xy[vertex_first], vertex_xy[(vertex_first - 1) & 1023]);
29742999            vertex_first = (vertex_first + 1) & 1023;
29753000            vertex_count = vertex_count + 1;
29763001            wait();
r253153r253154
30283053   }
30293054   if ((maddress == 0x1d6c) || (maddress == 0x1d70) || (maddress == 0x1a4))
30303055      countlen--;
3056   if (maddress == 0x0308) {
3057      backface_culling_enabled = data != 0 ? true : false;
3058   }
3059   if (maddress == 0x03a0) {
3060      backface_culling_winding = (NV2A_GL_FRONT_FACE)data;
3061   }
3062   if (maddress == 0x039c) {
3063      backface_culling_culled = (NV2A_GL_CULL_FACE)data;
3064   }
30313065   if (maddress == 0x019c) {
30323066      geforce_read_dma_object(data, dma_offset[0], dma_size[0]);
30333067   }


Previous 199869 Revisions Next


© 1997-2024 The MAME Team