trunk/src/mess/includes/rmnimbus.h
| r31223 | r31224 | |
| 19 | 19 | |
| 20 | 20 | #define MAINCPU_TAG "maincpu" |
| 21 | 21 | #define IOCPU_TAG "iocpu" |
| 22 | #define Z80SIO_TAG "z80sio" |
| 23 | #define FDC_TAG "wd2793" |
| 24 | #define SCSIBUS_TAG "scsibus" |
| 25 | #define ER59256_TAG "er59256" |
| 26 | #define AY8910_TAG "ay8910" |
| 27 | #define MONO_TAG "mono" |
| 28 | #define MSM5205_TAG "msm5205" |
| 29 | #define VIA_TAG "via6522" |
| 30 | #define CENTRONICS_TAG "centronics" |
| 22 | 31 | |
| 23 | | /* Nimbus specific */ |
| 32 | /* Mouse / Joystick */ |
| 24 | 33 | |
| 25 | | /* External int vectors for chained interupts */ |
| 26 | | #define EXTERNAL_INT_DISK 0x80 |
| 27 | | #define EXTERNAL_INT_MSM5205 0x84 |
| 28 | | #define EXTERNAL_INT_MOUSE_YU 0x88 |
| 29 | | #define EXTERNAL_INT_MOUSE_YD 0x89 |
| 30 | | #define EXTERNAL_INT_MOUSE_XL 0x8A |
| 31 | | #define EXTERNAL_INT_MOUSE_XR 0x8B |
| 32 | | #define EXTERNAL_INT_PC8031_8C 0x8c |
| 33 | | #define EXTERNAL_INT_PC8031_8E 0x8E |
| 34 | | #define EXTERNAL_INT_PC8031_8F 0x8F |
| 34 | #define JOYSTICK0_TAG "joystick0" |
| 35 | #define MOUSE_BUTTON_TAG "mousebtn" |
| 36 | #define MOUSEX_TAG "mousex" |
| 37 | #define MOUSEY_TAG "mousey" |
| 35 | 38 | |
| 36 | | |
| 37 | | /* Memory controler */ |
| 39 | /* Memory controller */ |
| 38 | 40 | #define RAM_BANK00_TAG "bank0" |
| 39 | 41 | #define RAM_BANK01_TAG "bank1" |
| 40 | 42 | #define RAM_BANK02_TAG "bank2" |
| r31223 | r31224 | |
| 44 | 46 | #define RAM_BANK06_TAG "bank6" |
| 45 | 47 | #define RAM_BANK07_TAG "bank7" |
| 46 | 48 | |
| 47 | | #define HIBLOCK_BASE_MASK 0x08 |
| 48 | | #define HIBLOCK_SELECT_MASK 0x10 |
| 49 | | |
| 50 | | /* Z80 SIO for keyboard */ |
| 51 | | |
| 52 | | #define Z80SIO_TAG "z80sio" |
| 53 | | |
| 54 | | /* Floppy/Fixed drive interface */ |
| 55 | | |
| 56 | | #define FDC_TAG "wd2793" |
| 57 | | |
| 58 | | #define NO_DRIVE_SELECTED 0xFF |
| 59 | | |
| 60 | | /* SASI harddisk interface */ |
| 61 | | #define SCSIBUS_TAG "scsibus" |
| 62 | | |
| 63 | | /* Masks for writes to port 0x400 */ |
| 64 | | #define FDC_DRIVE0_MASK 0x01 |
| 65 | | #define FDC_DRIVE1_MASK 0x02 |
| 66 | | #define FDC_DRIVE2_MASK 0x04 |
| 67 | | #define FDC_DRIVE3_MASK 0x08 |
| 68 | | #define FDC_SIDE_MASK 0x10 |
| 69 | | #define FDC_MOTOR_MASKO 0x20 |
| 70 | | #define HDC_DRQ_MASK 0x40 |
| 71 | | #define FDC_DRQ_MASK 0x80 |
| 72 | | #define FDC_DRIVE_MASK (FDC_DRIVE0_MASK | FDC_DRIVE1_MASK | FDC_DRIVE2_MASK | FDC_DRIVE3_MASK) |
| 73 | | |
| 74 | | #define FDC_SIDE() ((m_nimbus_drives.reg400 & FDC_SIDE_MASK) >> 4) |
| 75 | | #define FDC_MOTOR() ((m_nimbus_drives.reg400 & FDC_MOTOR_MASKO) >> 5) |
| 76 | | #define FDC_DRIVE() (fdc_driveno(m_nimbus_drives.reg400 & FDC_DRIVE_MASK)) |
| 77 | | #define HDC_DRQ_ENABLED() ((m_nimbus_drives.reg400 & HDC_DRQ_MASK) ? 1 : 0) |
| 78 | | #define FDC_DRQ_ENABLED() ((m_nimbus_drives.reg400 & FDC_DRQ_MASK) ? 1 : 0) |
| 79 | | |
| 80 | | |
| 81 | | /* 8031/8051 Peripheral controler */ |
| 82 | | |
| 83 | | #define IPC_OUT_ADDR 0X01 |
| 84 | | #define IPC_OUT_READ_PEND 0X02 |
| 85 | | #define IPC_OUT_BYTE_AVAIL 0X04 |
| 86 | | |
| 87 | | #define IPC_IN_ADDR 0X01 |
| 88 | | #define IPC_IN_BYTE_AVAIL 0X02 |
| 89 | | #define IPC_IN_READ_PEND 0X04 |
| 90 | | |
| 91 | | |
| 92 | | |
| 93 | | |
| 94 | | #define ER59256_TAG "er59256" |
| 95 | | |
| 96 | | /* IO unit */ |
| 97 | | |
| 98 | | #define DISK_INT_ENABLE 0x01 |
| 99 | | #define MSM5205_INT_ENABLE 0x04 |
| 100 | | #define MOUSE_INT_ENABLE 0x08 |
| 101 | | #define PC8031_INT_ENABLE 0x10 |
| 102 | | |
| 103 | | |
| 104 | | /* Sound hardware */ |
| 105 | | |
| 106 | | #define AY8910_TAG "ay8910" |
| 107 | | #define MONO_TAG "mono" |
| 108 | | |
| 109 | | |
| 110 | | |
| 111 | | |
| 112 | | #define MSM5205_TAG "msm5205" |
| 113 | | |
| 114 | | /* Mouse / Joystick */ |
| 115 | | |
| 116 | | #define JOYSTICK0_TAG "joystick0" |
| 117 | | #define MOUSE_BUTTON_TAG "mousebtn" |
| 118 | | #define MOUSEX_TAG "mousex" |
| 119 | | #define MOUSEY_TAG "mousey" |
| 120 | | |
| 121 | | enum |
| 122 | | { |
| 123 | | MOUSE_PHASE_STATIC = 0, |
| 124 | | MOUSE_PHASE_POSITIVE, |
| 125 | | MOUSE_PHASE_NEGATIVE |
| 126 | | }; |
| 127 | | |
| 128 | | |
| 129 | | #define MOUSE_INT_ENABLED(state) (((state)->m_iou_reg092 & MOUSE_INT_ENABLE) ? 1 : 0) |
| 130 | | |
| 131 | | /* Paralell / User port BBC compatible ! */ |
| 132 | | |
| 133 | | #define VIA_TAG "via6522" |
| 134 | | #define CENTRONICS_TAG "centronics" |
| 135 | | |
| 136 | | #define VIA_INT 0x03 |
| 137 | | |
| 138 | | #define LINEAR_ADDR(seg,ofs) ((seg<<4)+ofs) |
| 139 | | |
| 140 | | #define OUTPUT_SEGOFS(mess,seg,ofs) logerror("%s=%04X:%04X [%08X]\n",mess,seg,ofs,((seg<<4)+ofs)) |
| 141 | | |
| 142 | 49 | class rmnimbus_state : public driver_device |
| 143 | 50 | { |
| 144 | 51 | public: |
| r31223 | r31224 | |
| 184 | 91 | UINT8 m_last_playmode; |
| 185 | 92 | UINT8 m_ay8910_a; |
| 186 | 93 | UINT8 m_sio_int_state; |
| 187 | | UINT16 m_vidregs[24]; |
| 188 | | UINT16 m_x, m_y; |
| 94 | UINT16 m_x, m_y, m_yline; |
| 95 | UINT8 m_colours, m_mode, m_op; |
| 189 | 96 | UINT32 m_debug_video; |
| 190 | 97 | UINT8 m_vector; |
| 191 | 98 | UINT8 m_eeprom_bits; |
| r31223 | r31224 | |
| 236 | 143 | void write_pixel_line(UINT16 x, UINT16 y, UINT16, UINT8 pixels, UINT8 bpp); |
| 237 | 144 | void move_pixel_line(UINT16 x, UINT16 y, UINT8 width); |
| 238 | 145 | void write_pixel_data(UINT16 x, UINT16 y, UINT16 data); |
| 239 | | void write_reg_004(); |
| 240 | | void write_reg_006(); |
| 241 | | void write_reg_00A(); |
| 242 | | void write_reg_00E(); |
| 243 | | void write_reg_010(); |
| 244 | | void write_reg_012(); |
| 245 | | void write_reg_014(); |
| 246 | | void write_reg_016(); |
| 247 | | void write_reg_01A(); |
| 248 | | void write_reg_01C(); |
| 249 | | void write_reg_01E(); |
| 250 | | void write_reg_026(); |
| 251 | 146 | void change_palette(UINT8 bank, UINT16 colours); |
| 252 | 147 | void external_int(UINT16 intno, UINT8 vector); |
| 253 | 148 | DECLARE_READ8_MEMBER(cascade_callback); |
trunk/src/mess/video/rmnimbus.c
| r31223 | r31224 | |
| 29 | 29 | |
| 30 | 30 | #define WIDTH_MASK 0x07 |
| 31 | 31 | |
| 32 | | // Offsets of nimbus video registers within register array |
| 33 | | |
| 34 | | #define reg000 0x00 |
| 35 | | #define reg002 0x01 |
| 36 | | #define reg004 0x02 |
| 37 | | #define reg006 0x03 |
| 38 | | #define reg008 0x04 |
| 39 | | #define reg00A 0x05 |
| 40 | | #define reg00C 0x06 |
| 41 | | #define reg00E 0x07 |
| 42 | | #define reg010 0x08 |
| 43 | | #define reg012 0x09 |
| 44 | | #define reg014 0x0A |
| 45 | | #define reg016 0x0B |
| 46 | | #define reg018 0x0C |
| 47 | | #define reg01A 0x0D |
| 48 | | #define reg01C 0x0E |
| 49 | | #define reg01E 0x0F |
| 50 | | #define reg020 0x10 |
| 51 | | #define reg022 0x11 |
| 52 | | #define reg024 0x12 |
| 53 | | #define reg026 0x13 |
| 54 | | #define reg028 0x14 |
| 55 | | #define reg02A 0x15 |
| 56 | | #define reg02C 0x16 |
| 57 | | #define reg02E 0x17 |
| 58 | | |
| 59 | | #define FG_COLOUR (m_vidregs[reg024]&0x0F) |
| 60 | | #define BG_COLOUR ((m_vidregs[reg024]&0xF0)>>4) |
| 32 | #define FG_COLOUR (m_colours&0x0F) |
| 33 | #define BG_COLOUR ((m_colours&0xF0)>>4) |
| 61 | 34 | #define SELECT_COL(x,c) (IS_80COL ? ((((x) & 1) ? ((c) << 2) : (c)) & 0xC) : (c)) |
| 62 | 35 | #define FILL_WORD(c) (((c) << 12) | ((c) << 8) | ((c) << 4) | (c)) |
| 63 | 36 | |
| 64 | | #define IS_80COL (m_vidregs[reg026]&0x10) |
| 65 | | #define IS_XOR (m_vidregs[reg022]&8) |
| 37 | #define IS_80COL (m_mode&0x10) |
| 38 | #define IS_XOR (m_op&8) |
| 66 | 39 | |
| 67 | 40 | #define DEBUG_TEXT 0x01 |
| 68 | 41 | #define DEBUG_DB 0x02 |
| r31223 | r31224 | |
| 72 | 45 | |
| 73 | 46 | static void video_debug(running_machine &machine, int ref, int params, const char *param[]); |
| 74 | 47 | |
| 75 | | /* |
| 76 | | I'm not sure which of thes return values on a real machine, so for the time being I'm going |
| 77 | | to return the values for all of them, it doesn't seem to hurt ! |
| 78 | | */ |
| 79 | | |
| 80 | 48 | READ16_MEMBER(rmnimbus_state::nimbus_video_io_r) |
| 81 | 49 | { |
| 82 | | int pc=space.device().safe_pc(); |
| 83 | | UINT16 result; |
| 50 | UINT16 result = 0; |
| 84 | 51 | |
| 85 | 52 | switch (offset) |
| 86 | 53 | { |
| 87 | | case reg000 : result=read_pixel_data(m_vidregs[reg002],m_vidregs[reg00C]); break; |
| 88 | | case reg002 : result=m_vidregs[reg002]; break; |
| 89 | | case reg004 : result=read_pixel_data(m_vidregs[reg002],++m_vidregs[reg00C]); break; |
| 90 | | case reg006 : result=m_vidregs[reg006]; break; |
| 91 | | case reg008 : result=m_vidregs[reg008]; break; |
| 92 | | case reg00A : result=read_pixel_data(++m_vidregs[reg002],m_vidregs[reg00C]); break; |
| 93 | | case reg00C : result=m_vidregs[reg00C]; break; |
| 94 | | case reg00E : result=m_vidregs[reg00E]; break; |
| 54 | case 0x00: |
| 55 | case 0x08: |
| 56 | result = read_pixel_data(m_x, m_y); |
| 57 | break; |
| 58 | case 0x02: |
| 59 | case 0x0A: |
| 60 | result = read_pixel_data(m_x, ++m_y); |
| 61 | break; |
| 62 | case 0x05: |
| 63 | case 0x0D: |
| 64 | result = read_pixel_data(++m_x, m_y); |
| 65 | break; |
| 95 | 66 | |
| 96 | | case reg010 : result=read_pixel_data(m_vidregs[reg002],m_vidregs[reg00C]); break; |
| 97 | | case reg012 : result=m_vidregs[reg012]; break; |
| 98 | | case reg014 : result=m_vidregs[reg014]; break; |
| 99 | | case reg016 : result=m_vidregs[reg016]; break; |
| 100 | | case reg018 : result=m_vidregs[reg018]; break; |
| 101 | | case reg01A : result=read_pixel_data(++m_vidregs[reg002],m_vidregs[reg00C]); break; |
| 102 | | case reg01C : result=m_vidregs[reg01C]; break; |
| 103 | | case reg01E : result=m_vidregs[reg01E]; break; |
| 104 | | |
| 105 | | case reg020 : result=m_vidregs[reg020]; break; |
| 106 | | case reg022 : result=m_vidregs[reg022]; break; |
| 107 | | case reg024 : result=m_vidregs[reg024]; break; |
| 108 | | case reg026 : result=m_vidregs[reg026]; break; |
| 109 | | case reg028 : result=m_screen->vpos() % 0xb; break; //result=m_vidregs[reg028]; break; |
| 110 | | case reg02A : result=m_vidregs[reg002]; break; |
| 111 | | case reg02C : result=m_vidregs[reg00C]; break; |
| 112 | | case reg02E : result=m_vidregs[reg02E]; break; |
| 113 | | default : result=0; break; |
| 67 | case 0x10: |
| 68 | result = m_yline; |
| 69 | break; |
| 70 | case 0x11: |
| 71 | result = m_op; |
| 72 | break; |
| 73 | case 0x12: |
| 74 | result = m_colours; |
| 75 | break; |
| 76 | case 0x13: |
| 77 | result = m_mode; |
| 78 | break; |
| 79 | case 0x14: |
| 80 | result = m_screen->vpos() % 0xb; // TODO: verify |
| 81 | break; |
| 82 | case 0x15: |
| 83 | result = m_x; |
| 84 | break; |
| 85 | case 0x16: |
| 86 | result = m_y; |
| 87 | break; |
| 88 | default: |
| 89 | logerror("nimbus: unknown video reg read %02x\n", offset); |
| 90 | break; |
| 114 | 91 | } |
| 115 | 92 | |
| 116 | 93 | if(DEBUG_SET(DEBUG_TEXT)) |
| 117 | | logerror("Nimbus video IOR at %05X from %04X mask=%04X, data=%04X\n",pc,(offset*2),mem_mask,result); |
| 94 | logerror("Nimbus video IOR at %05X from %04X mask=%04X, data=%04X\n",space.device().safe_pc(),(offset*2),mem_mask,result); |
| 118 | 95 | |
| 119 | 96 | return result; |
| 120 | 97 | } |
| r31223 | r31224 | |
| 160 | 137 | UINT16 result=0; |
| 161 | 138 | |
| 162 | 139 | if(DEBUG_SET(DEBUG_TEXT | DEBUG_PIXEL)) |
| 163 | | logerror("read_pixel_data(x=%d, y=%d), reg022=%04X\n",x,y,m_vidregs[reg022]); |
| 140 | logerror("read_pixel_data(x=%d, y=%d), reg022=%04X\n",x,y,m_op); |
| 164 | 141 | |
| 165 | 142 | if(IS_80COL) |
| 166 | 143 | { |
| 167 | | switch (m_vidregs[reg022] & WIDTH_MASK) |
| 144 | switch (m_op & WIDTH_MASK) |
| 168 | 145 | { |
| 169 | 146 | case 0x00 : break; |
| 170 | 147 | |
| r31223 | r31224 | |
| 189 | 166 | } |
| 190 | 167 | else /* 40 Col */ |
| 191 | 168 | { |
| 192 | | switch (m_vidregs[reg022] & WIDTH_MASK) |
| 169 | switch (m_op & WIDTH_MASK) |
| 193 | 170 | { |
| 194 | 171 | case 0x00 : break; |
| 195 | 172 | |
| r31223 | r31224 | |
| 215 | 192 | } |
| 216 | 193 | |
| 217 | 194 | /* |
| 218 | | Write to the video registers, the default action is to write to the array of registers. |
| 219 | | If a register also needs some special action call the action function for that register. |
| 195 | Write to the video registers. |
| 220 | 196 | |
| 221 | 197 | Incase anyone wonders about the DEBUG_DB statement, this allows me to log which registers |
| 222 | 198 | are being written to and then play them back at the real machine, this has helped greatly |
| r31223 | r31224 | |
| 226 | 202 | |
| 227 | 203 | WRITE16_MEMBER(rmnimbus_state::nimbus_video_io_w) |
| 228 | 204 | { |
| 229 | | int pc=space.device().safe_pc(); |
| 230 | | |
| 231 | | if(offset<reg028) |
| 205 | UINT16 colours = data; |
| 206 | if(offset < 0x14) |
| 232 | 207 | { |
| 233 | 208 | if(DEBUG_SET(DEBUG_TEXT)) |
| 234 | | logerror("Nimbus video IOW at %05X write of %04X to %04X mask=%04X\n",pc,data,(offset*2),mem_mask); |
| 209 | logerror("Nimbus video IOW at %05X write of %04X to %04X mask=%04X\n",space.device().safe_pc(),data,(offset*2),mem_mask); |
| 235 | 210 | |
| 236 | 211 | if(DEBUG_SET(DEBUG_DB)) |
| 237 | 212 | logerror("dw %05X,%05X\n",(offset*2),data); |
| r31223 | r31224 | |
| 239 | 214 | |
| 240 | 215 | switch (offset) |
| 241 | 216 | { |
| 242 | | case reg000 : m_vidregs[reg000]=data; break; |
| 243 | | case reg002 : m_vidregs[reg002]=data; break; |
| 244 | | case reg004 : m_vidregs[reg004]=data; write_reg_004(); break; |
| 245 | | case reg006 : m_vidregs[reg006]=data; write_reg_006(); break; |
| 246 | | case reg008 : m_vidregs[reg008]=data; break; |
| 247 | | case reg00A : m_vidregs[reg00A]=data; write_reg_00A(); break; |
| 248 | | case reg00C : m_vidregs[reg00C]=data; break; |
| 249 | | case reg00E : m_vidregs[reg00E]=data; write_reg_00E(); break; |
| 217 | case 0x00: |
| 218 | case 0x08: |
| 219 | break; |
| 250 | 220 | |
| 251 | | case reg010 : m_vidregs[reg010]=data; write_reg_010(); break; |
| 252 | | case reg012 : m_vidregs[reg012]=data; write_reg_012(); break; |
| 253 | | case reg014 : m_vidregs[reg014]=data; write_reg_014(); break; |
| 254 | | case reg016 : m_vidregs[reg016]=data; write_reg_016(); break; |
| 255 | | case reg018 : m_vidregs[reg018]=data; break; |
| 256 | | case reg01A : m_vidregs[reg01A]=data; write_reg_01A(); break; |
| 257 | | case reg01C : m_vidregs[reg01C]=data; write_reg_01C();break; |
| 258 | | case reg01E : m_vidregs[reg01E]=data; write_reg_01E();break; |
| 221 | case 0x09: |
| 222 | colours = FILL_WORD(FG_COLOUR); |
| 223 | case 0x01: |
| 224 | m_x = data; |
| 225 | break; |
| 259 | 226 | |
| 260 | | case reg020 : m_vidregs[reg020]=data; break; |
| 261 | | case reg022 : m_vidregs[reg022]=data; break; |
| 262 | | case reg024 : m_vidregs[reg024]=data; break; |
| 263 | | case reg026 : m_vidregs[reg026]=data; write_reg_026(); break; |
| 264 | | case reg028 : change_palette(0,data); break; |
| 265 | | case reg02A : change_palette(1,data); break; |
| 266 | | case reg02C : change_palette(2,data); break; |
| 267 | | case reg02E : change_palette(3,data); break; |
| 227 | case 0x02: |
| 228 | case 0x0A: |
| 229 | m_y++; |
| 230 | break; |
| 268 | 231 | |
| 269 | | default : break; |
| 232 | case 0x0B: |
| 233 | colours = FILL_WORD(FG_COLOUR); |
| 234 | case 0x03: |
| 235 | m_x = data; |
| 236 | m_y++; |
| 237 | break; |
| 238 | |
| 239 | case 0x05: |
| 240 | case 0x0D: |
| 241 | m_x++; |
| 242 | break; |
| 243 | |
| 244 | case 0x0E: |
| 245 | colours = FILL_WORD(FG_COLOUR); |
| 246 | case 0x06: |
| 247 | m_y = data; |
| 248 | break; |
| 249 | |
| 250 | case 0x0F: |
| 251 | colours = FILL_WORD(FG_COLOUR); |
| 252 | case 0x07: |
| 253 | m_y = data; |
| 254 | m_x++; |
| 255 | break; |
| 256 | |
| 257 | case 0x10: |
| 258 | m_yline = data; |
| 259 | return; |
| 260 | case 0x11: |
| 261 | m_op = data; |
| 262 | return; |
| 263 | case 0x12: |
| 264 | m_colours = data; |
| 265 | return; |
| 266 | case 0x13: |
| 267 | /* |
| 268 | bits 0..3 of reg026 contain the border colour. |
| 269 | bit 5 contains the 40/80 column (320/640 pixel) flag. |
| 270 | */ |
| 271 | m_mode = data; |
| 272 | return; |
| 273 | case 0x14: |
| 274 | case 0x15: |
| 275 | case 0x16: |
| 276 | case 0x17: |
| 277 | change_palette(offset - 0x14, data); |
| 278 | return; |
| 279 | |
| 280 | default: |
| 281 | logerror("nimbus: unknown video reg write %02x %04x\n", offset, data); |
| 282 | return; |
| 270 | 283 | } |
| 284 | if(offset & 0x08) |
| 285 | write_pixel_data(m_x, m_y, colours); |
| 271 | 286 | } |
| 272 | 287 | |
| 273 | 288 | void rmnimbus_state::set_pixel(UINT16 x, UINT16 y, UINT8 colour) |
| r31223 | r31224 | |
| 327 | 342 | { |
| 328 | 343 | if(DEBUG_SET(DEBUG_TEXT | DEBUG_PIXEL)) |
| 329 | 344 | logerror("x=%d\n",x + i); |
| 330 | | m_video_mem.pix16(m_vidregs[reg020], x + i) = m_video_mem.pix16(y, x + i); |
| 345 | m_video_mem.pix16(m_yline, x + i) = m_video_mem.pix16(y, x + i); |
| 331 | 346 | } |
| 332 | 347 | } |
| 333 | 348 | |
| r31223 | r31224 | |
| 361 | 376 | void rmnimbus_state::write_pixel_data(UINT16 x, UINT16 y, UINT16 data) |
| 362 | 377 | { |
| 363 | 378 | if(DEBUG_SET(DEBUG_TEXT | DEBUG_PIXEL)) |
| 364 | | logerror("write_pixel_data(x=%d, y=%d, data=%04X), reg022=%04X\n",x,y,data,m_vidregs[reg022]); |
| 379 | logerror("write_pixel_data(x=%d, y=%d, data=%04X), reg022=%04X\n",x,y,data,m_op); |
| 365 | 380 | |
| 366 | 381 | if(IS_80COL) |
| 367 | 382 | { |
| 368 | | switch (m_vidregs[reg022] & WIDTH_MASK) |
| 383 | switch (m_op & WIDTH_MASK) |
| 369 | 384 | { |
| 370 | 385 | case 0x00: |
| 371 | 386 | write_pixel_line(x,y,data,16,1); |
| r31223 | r31224 | |
| 402 | 417 | } |
| 403 | 418 | else /* 40 Col */ |
| 404 | 419 | { |
| 405 | | switch (m_vidregs[reg022] & WIDTH_MASK) |
| 420 | switch (m_op & WIDTH_MASK) |
| 406 | 421 | { |
| 407 | 422 | case 0x00: |
| 408 | 423 | write_pixel_line(x,y,data,8,1); |
| r31223 | r31224 | |
| 439 | 454 | } |
| 440 | 455 | } |
| 441 | 456 | |
| 442 | | void rmnimbus_state::write_reg_004() |
| 443 | | { |
| 444 | | //m_vidregs[reg002]=0; |
| 445 | | m_vidregs[reg00C]++; |
| 446 | | } |
| 447 | | |
| 448 | | void rmnimbus_state::write_reg_006() |
| 449 | | { |
| 450 | | m_vidregs[reg00C]++; |
| 451 | | m_vidregs[reg002]=m_vidregs[reg006]; |
| 452 | | } |
| 453 | | |
| 454 | | void rmnimbus_state::write_reg_00A() |
| 455 | | { |
| 456 | | m_vidregs[reg002]++; |
| 457 | | } |
| 458 | | |
| 459 | | void rmnimbus_state::write_reg_00E() |
| 460 | | { |
| 461 | | m_vidregs[reg002]++; |
| 462 | | m_vidregs[reg00C]=m_vidregs[reg00E]; |
| 463 | | } |
| 464 | | |
| 465 | | void rmnimbus_state::write_reg_010() |
| 466 | | { |
| 467 | | write_pixel_data(m_vidregs[reg002],m_vidregs[reg00C],m_vidregs[reg010]); |
| 468 | | } |
| 469 | | |
| 470 | | void rmnimbus_state::write_reg_012() |
| 471 | | { |
| 472 | | // I dunno if this is actually what is happening as the regs seem to be write only.... |
| 473 | | // doing this however does seem to make some programs (worms from the welcom disk) |
| 474 | | // work correctly. |
| 475 | | m_vidregs[reg002]=m_vidregs[reg012]; |
| 476 | | |
| 477 | | write_pixel_data(m_vidregs[reg012],m_vidregs[reg00C],FILL_WORD(FG_COLOUR)); |
| 478 | | } |
| 479 | | |
| 480 | | void rmnimbus_state::write_reg_014() |
| 481 | | { |
| 482 | | write_pixel_data(m_vidregs[reg002],++m_vidregs[reg00C],m_vidregs[reg014]); |
| 483 | | } |
| 484 | | |
| 485 | | void rmnimbus_state::write_reg_016() |
| 486 | | { |
| 487 | | m_vidregs[reg002]=m_vidregs[reg016]; |
| 488 | | |
| 489 | | write_pixel_data(m_vidregs[reg002],++m_vidregs[reg00C],FILL_WORD(FG_COLOUR)); |
| 490 | | } |
| 491 | | |
| 492 | | |
| 493 | | void rmnimbus_state::write_reg_01A() |
| 494 | | { |
| 495 | | write_pixel_data(++m_vidregs[reg002],m_vidregs[reg00C],m_vidregs[reg01A]); |
| 496 | | } |
| 497 | | |
| 498 | | void rmnimbus_state::write_reg_01C() |
| 499 | | { |
| 500 | | // I dunno if this is actually what is happening as the regs seem to be write only.... |
| 501 | | // doing this however does seem to make some programs (welcome from the welcom disk, |
| 502 | | // and others using the standard RM box menus) work correctly. |
| 503 | | m_vidregs[reg00C]=m_vidregs[reg01C]; |
| 504 | | |
| 505 | | write_pixel_data(m_vidregs[reg002],m_vidregs[reg01C],FILL_WORD(FG_COLOUR)); |
| 506 | | } |
| 507 | | |
| 508 | | void rmnimbus_state::write_reg_01E() |
| 509 | | { |
| 510 | | m_vidregs[reg00C]=m_vidregs[reg01E]; |
| 511 | | |
| 512 | | write_pixel_data(++m_vidregs[reg002],m_vidregs[reg00C],FILL_WORD(FG_COLOUR)); |
| 513 | | } |
| 514 | | |
| 515 | | /* |
| 516 | | bits 0..3 of reg026 contain the border colour. |
| 517 | | bit 5 contains the 40/80 column (320/640 pixel) flag. |
| 518 | | */ |
| 519 | | |
| 520 | | void rmnimbus_state::write_reg_026() |
| 521 | | { |
| 522 | | if(DEBUG_SET(DEBUG_TEXT)) |
| 523 | | logerror("reg 026 write, border_colour=%02X\n",m_vidregs[reg026] & 0x0F); |
| 524 | | } |
| 525 | | |
| 526 | 457 | void rmnimbus_state::change_palette(UINT8 bank, UINT16 colours) |
| 527 | 458 | { |
| 528 | 459 | // loop over changing colours |
| r31223 | r31224 | |
| 532 | 463 | m_palette->set_pen_color(colourno, pal2bit((colours & 2) | i), pal2bit(((colours & 4) >> 1) | i), pal2bit(((colours & 1) << 1) | i)); |
| 533 | 464 | |
| 534 | 465 | if(DEBUG_SET(DEBUG_TEXT)) |
| 535 | | logerror("set colourno[%02X], colour=%02X\n",colourno, colours); |
| 466 | logerror("set colourno[%02X], colour=%02X\n",colourno, colours & 0xf); |
| 536 | 467 | colours >>= 4; |
| 537 | 468 | } |
| 538 | 469 | } |
| r31223 | r31224 | |
| 557 | 488 | |
| 558 | 489 | m_screen->register_screen_bitmap(m_video_mem); |
| 559 | 490 | |
| 560 | | save_item(NAME(m_vidregs)); |
| 561 | | |
| 562 | 491 | if (machine().debug_flags & DEBUG_FLAG_ENABLED) |
| 563 | 492 | { |
| 564 | 493 | debug_console_register_command(machine(), "nimbus_vid_debug", CMDFLAG_NONE, 0, 0, 1, video_debug); |
| r31223 | r31224 | |
| 567 | 496 | |
| 568 | 497 | void rmnimbus_state::video_reset() |
| 569 | 498 | { |
| 570 | | // When we reset clear the video registers and video memory. |
| 571 | | memset(&m_vidregs,0x00,sizeof(m_vidregs)); |
| 499 | m_mode = 0; |
| 500 | m_x = 0; |
| 501 | m_y = 0; |
| 502 | m_op = 0; |
| 503 | m_yline = 0; |
| 572 | 504 | } |
| 573 | 505 | |
| 574 | 506 | UINT32 rmnimbus_state::screen_update_nimbus(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |