trunk/src/mess/drivers/sapi1.c
| r25491 | r25492 | |
| 2 | 2 | |
| 3 | 3 | SAPI-1 driver by Miodrag Milanovic |
| 4 | 4 | |
| 5 | | 09/09/2008 Preliminary driver. |
| 5 | 2008-09-09 Preliminary driver. |
| 6 | 6 | |
| 7 | | 07/12/2010 Added some code to allow sapizps3 to read its rom. |
| 7 | 2010-12-07 Added some code to allow sapizps3 to read its rom. |
| 8 | 8 | With no available docs, the i/o ports are a guess. The ram |
| 9 | 9 | allocation is based on the actions of the various bios roms. |
| 10 | 10 | Port 25 is used as a jump vector. in a,(25); ld l,a; jp(hl). |
| 11 | 11 | According to wikipedia, e800+ is the videoram area, and the |
| 12 | 12 | number of columns is 64. |
| 13 | 13 | |
| 14 | | 19/04/2012 Connected sapizps3 to a terminal. It is trying to |
| 14 | 2012-04-19 Connected sapizps3 to a terminal. It is trying to |
| 15 | 15 | load a 128-byte boot sector from a floppy disk. |
| 16 | 16 | Modernised driver. |
| 17 | 17 | Connected sapizps2 to ascii keyboard. System is now usable. |
| r25491 | r25492 | |
| 21 | 21 | ****************************************************************************/ |
| 22 | 22 | |
| 23 | 23 | |
| 24 | | #include "includes/sapi1.h" |
| 24 | #include "emu.h" |
| 25 | #include "cpu/i8085/i8085.h" |
| 26 | #include "cpu/z80/z80.h" |
| 27 | #include "video/mc6845.h" |
| 28 | #include "machine/ram.h" |
| 29 | #include "machine/keyboard.h" |
| 30 | #include "machine/terminal.h" |
| 25 | 31 | |
| 26 | 32 | |
| 27 | | /* switch out the rom shadow */ |
| 28 | | WRITE8_MEMBER( sapi1_state::sapi3_00_w ) |
| 33 | class sapi1_state : public driver_device |
| 29 | 34 | { |
| 30 | | m_bank1->set_entry(0); |
| 31 | | } |
| 35 | public: |
| 36 | sapi1_state(const machine_config &mconfig, device_type type, const char *tag) |
| 37 | : driver_device(mconfig, type, tag) |
| 38 | , m_p_videoram(*this, "videoram") |
| 39 | , m_bank1(*this, "bank1") |
| 40 | , m_line0(*this, "LINE0") |
| 41 | , m_line1(*this, "LINE1") |
| 42 | , m_line2(*this, "LINE2") |
| 43 | , m_line3(*this, "LINE3") |
| 44 | , m_line4(*this, "LINE4") |
| 45 | , m_maincpu(*this, "maincpu") |
| 46 | { } |
| 32 | 47 | |
| 33 | | READ8_MEMBER( sapi1_state::sapi2_keyboard_status_r) |
| 34 | | { |
| 35 | | return (m_term_data) ? 0 : 1; |
| 36 | | } |
| 48 | optional_shared_ptr<UINT8> m_p_videoram; |
| 49 | DECLARE_READ8_MEMBER(sapi1_keyboard_r); |
| 50 | DECLARE_WRITE8_MEMBER(sapi1_keyboard_w); |
| 51 | DECLARE_READ8_MEMBER(sapi2_keyboard_status_r); |
| 52 | DECLARE_READ8_MEMBER(sapi2_keyboard_data_r); |
| 53 | DECLARE_WRITE8_MEMBER(sapi3_00_w); |
| 54 | DECLARE_READ8_MEMBER(sapi3_25_r); |
| 55 | DECLARE_WRITE8_MEMBER(sapi3_25_w); |
| 56 | DECLARE_WRITE8_MEMBER(kbd_put); |
| 57 | DECLARE_DRIVER_INIT(sapizps3); |
| 58 | DECLARE_DRIVER_INIT(sapizps3a); |
| 59 | DECLARE_DRIVER_INIT(sapizps3b); |
| 60 | DECLARE_MACHINE_RESET(sapi1); |
| 61 | DECLARE_MACHINE_RESET(sapizps3); |
| 62 | UINT32 screen_update_sapi1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 63 | private: |
| 64 | UINT8 m_term_data; |
| 65 | UINT8 m_keyboard_mask; |
| 66 | UINT8 m_refresh_counter; |
| 67 | UINT8 m_zps3_25; |
| 68 | optional_memory_bank m_bank1; // Only for sapi3 |
| 69 | required_ioport m_line0; |
| 70 | required_ioport m_line1; |
| 71 | required_ioport m_line2; |
| 72 | required_ioport m_line3; |
| 73 | required_ioport m_line4; |
| 74 | required_device<cpu_device> m_maincpu; |
| 75 | }; |
| 37 | 76 | |
| 38 | | READ8_MEMBER( sapi1_state::sapi2_keyboard_data_r) |
| 39 | | { |
| 40 | | UINT8 ret = ~m_term_data; |
| 41 | | m_term_data = 0; |
| 42 | | return ret; |
| 43 | | } |
| 77 | static const UINT8 MHB2501[] = { |
| 78 | 0x0c,0x11,0x13,0x15,0x17,0x10,0x0e,0x00, // @ |
| 79 | 0x04,0x0a,0x11,0x11,0x1f,0x11,0x11,0x00, // A |
| 80 | 0x1e,0x11,0x11,0x1e,0x11,0x11,0x1e,0x00, // B |
| 81 | 0x0e,0x11,0x10,0x10,0x10,0x11,0x0e,0x00, // C |
| 82 | 0x1e,0x09,0x09,0x09,0x09,0x09,0x1e,0x00, // D |
| 83 | 0x1f,0x10,0x10,0x1e,0x10,0x10,0x1f,0x00, // E |
| 84 | 0x1f,0x10,0x10,0x1e,0x10,0x10,0x10,0x00, // F |
| 85 | 0x0e,0x11,0x10,0x10,0x13,0x11,0x0f,0x00, // G |
| 44 | 86 | |
| 45 | | /* to stop execution in random ram */ |
| 46 | | READ8_MEMBER( sapi1_state::sapi3_25_r ) |
| 47 | | { |
| 48 | | return m_zps3_25; |
| 49 | | } |
| 87 | 0x11,0x11,0x11,0x1f,0x11,0x11,0x11,0x00, // H |
| 88 | 0x0e,0x04,0x04,0x04,0x04,0x04,0x0e,0x00, // I |
| 89 | 0x01,0x01,0x01,0x01,0x11,0x11,0x0e,0x00, // J |
| 90 | 0x11,0x12,0x14,0x18,0x14,0x12,0x11,0x00, // K |
| 91 | 0x10,0x10,0x10,0x10,0x10,0x10,0x1f,0x00, // L |
| 92 | 0x11,0x1b,0x15,0x15,0x11,0x11,0x11,0x00, // M |
| 93 | 0x11,0x11,0x19,0x15,0x13,0x11,0x11,0x00, // N |
| 94 | 0x0e,0x11,0x11,0x11,0x11,0x11,0x0e,0x00, // O |
| 50 | 95 | |
| 51 | | WRITE8_MEMBER( sapi1_state::sapi3_25_w ) |
| 52 | | { |
| 53 | | m_zps3_25 = data & 0xfc; //?? |
| 54 | | } |
| 96 | 0x1e,0x11,0x11,0x1e,0x10,0x10,0x10,0x00, // P |
| 97 | 0x0e,0x11,0x11,0x11,0x15,0x12,0x0d,0x00, // Q |
| 98 | 0x1e,0x11,0x11,0x1e,0x14,0x12,0x11,0x00, // R |
| 99 | 0x0e,0x11,0x10,0x0e,0x01,0x11,0x0e,0x00, // S |
| 100 | 0x1f,0x04,0x04,0x04,0x04,0x04,0x04,0x00, // T |
| 101 | 0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x00, // U |
| 102 | 0x11,0x11,0x11,0x0a,0x0a,0x04,0x04,0x00, // V |
| 103 | 0x11,0x11,0x11,0x15,0x15,0x15,0x0a,0x00, // W |
| 55 | 104 | |
| 105 | 0x11,0x11,0x0a,0x04,0x0a,0x11,0x11,0x00, // X |
| 106 | 0x11,0x11,0x0a,0x04,0x04,0x04,0x04,0x00, // Y |
| 107 | 0x1f,0x01,0x02,0x04,0x08,0x10,0x1f,0x00, // Z |
| 108 | 0x1c,0x10,0x10,0x10,0x10,0x10,0x1c,0x00, // [ |
| 109 | 0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00, // backslash |
| 110 | 0x07,0x01,0x01,0x01,0x01,0x01,0x07,0x00, // ] |
| 111 | 0x0e,0x11,0x00,0x00,0x00,0x00,0x00,0x00, // ^ |
| 112 | 0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00, // _ |
| 56 | 113 | |
| 114 | 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // |
| 115 | 0x04,0x04,0x04,0x04,0x04,0x00,0x04,0x00, // ! |
| 116 | 0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00, // " |
| 117 | 0x0a,0x0a,0x1f,0x0a,0x1f,0x0a,0x0a,0x00, // # |
| 118 | 0x00,0x11,0x0e,0x0a,0x0e,0x11,0x00,0x00, // |
| 119 | 0x18,0x19,0x02,0x04,0x08,0x13,0x03,0x00, // % |
| 120 | 0x04,0x0a,0x0a,0x0c,0x15,0x12,0x0d,0x00, // & |
| 121 | 0x04,0x04,0x08,0x00,0x00,0x00,0x00,0x00, // ' |
| 57 | 122 | |
| 123 | 0x02,0x04,0x08,0x08,0x08,0x04,0x02,0x00, // ( |
| 124 | 0x08,0x04,0x02,0x02,0x02,0x04,0x08,0x00, // ) |
| 125 | 0x00,0x04,0x15,0x0e,0x15,0x04,0x00,0x00, // * |
| 126 | 0x00,0x04,0x04,0x1f,0x04,0x04,0x00,0x00, // + |
| 127 | 0x00,0x00,0x00,0x00,0x08,0x08,0x10,0x00, // , |
| 128 | 0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00, // - |
| 129 | 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00, // . |
| 130 | 0x00,0x01,0x02,0x04,0x08,0x10,0x00,0x00, // / |
| 131 | |
| 132 | 0x0e,0x11,0x13,0x15,0x19,0x11,0x0e,0x00, // 0 |
| 133 | 0x04,0x0c,0x04,0x04,0x04,0x04,0x0e,0x00, // 1 |
| 134 | 0x0e,0x11,0x01,0x06,0x08,0x10,0x1f,0x00, // 2 |
| 135 | 0x1f,0x01,0x02,0x06,0x01,0x11,0x0e,0x00, // 3 |
| 136 | 0x02,0x06,0x0a,0x12,0x1f,0x02,0x02,0x00, // 4 |
| 137 | 0x1f,0x10,0x1e,0x01,0x01,0x11,0x0e,0x00, // 5 |
| 138 | 0x07,0x08,0x10,0x1e,0x11,0x11,0x0e,0x00, // 6 |
| 139 | 0x1f,0x01,0x02,0x04,0x08,0x08,0x08,0x00, // 7 |
| 140 | |
| 141 | 0x0e,0x11,0x11,0x0e,0x11,0x11,0x0e,0x00, // 8 |
| 142 | 0x0e,0x11,0x11,0x0f,0x01,0x02,0x1c,0x00, // 9 |
| 143 | 0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00, // : |
| 144 | 0x00,0x00,0x04,0x00,0x04,0x04,0x08,0x00, // ; |
| 145 | 0x02,0x04,0x08,0x10,0x08,0x04,0x02,0x00, // < |
| 146 | 0x00,0x00,0x1f,0x00,0x1f,0x00,0x00,0x00, // = |
| 147 | 0x08,0x04,0x02,0x01,0x02,0x04,0x08,0x00, // > |
| 148 | 0x0e,0x11,0x01,0x02,0x04,0x00,0x04,0x00 // ? |
| 149 | }; |
| 150 | |
| 151 | |
| 58 | 152 | /* Address maps */ |
| 59 | 153 | static ADDRESS_MAP_START(sapi1_mem, AS_PROGRAM, 8, sapi1_state ) |
| 60 | 154 | ADDRESS_MAP_UNMAP_HIGH |
| r25491 | r25492 | |
| 65 | 159 | //AM_RANGE(0x2800, 0x2bff) AM_NOP // PORT 1 |
| 66 | 160 | //AM_RANGE(0x2c00, 0x2fff) AM_NOP // PORT 2 |
| 67 | 161 | //AM_RANGE(0x3000, 0x33ff) AM_NOP // 3214 |
| 68 | | AM_RANGE(0x3800, 0x3fff) AM_RAM AM_SHARE("sapi_video_ram") // AND-1 (video RAM) |
| 162 | AM_RANGE(0x3800, 0x3fff) AM_RAM AM_SHARE("videoram") // AND-1 (video RAM) |
| 69 | 163 | AM_RANGE(0x4000, 0x7fff) AM_RAM // REM-1 |
| 70 | 164 | ADDRESS_MAP_END |
| 71 | 165 | |
| 72 | | static ADDRESS_MAP_START( sapi1_io, AS_IO, 8, sapi1_state ) |
| 73 | | ADDRESS_MAP_UNMAP_HIGH |
| 74 | | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 75 | | ADDRESS_MAP_END |
| 76 | | |
| 77 | 166 | static ADDRESS_MAP_START(sapi2_mem, AS_PROGRAM, 8, sapi1_state ) |
| 78 | 167 | ADDRESS_MAP_UNMAP_HIGH |
| 79 | 168 | AM_RANGE(0x0000, 0x0fff) AM_ROM |
| 80 | 169 | AM_RANGE(0x1000, 0x1fff) AM_ROM // Extension ROM |
| 81 | 170 | AM_RANGE(0x2000, 0x23ff) AM_RAM |
| 82 | | AM_RANGE(0x2700, 0x27ff) AM_READ(sapi2_keyboard_status_r) |
| 171 | AM_RANGE(0x2400, 0x27ff) AM_READ(sapi2_keyboard_status_r) |
| 83 | 172 | AM_RANGE(0x2800, 0x28ff) AM_READ(sapi2_keyboard_data_r) |
| 84 | | AM_RANGE(0x3800, 0x3fff) AM_RAM AM_SHARE("sapi_video_ram") // AND-1 (video RAM) |
| 173 | AM_RANGE(0x3800, 0x3fff) AM_RAM AM_SHARE("videoram") // AND-1 (video RAM) |
| 85 | 174 | AM_RANGE(0x4000, 0x7fff) AM_RAM // REM-1 |
| 86 | 175 | ADDRESS_MAP_END |
| 87 | 176 | |
| 88 | 177 | static ADDRESS_MAP_START(sapi3_mem, AS_PROGRAM, 8, sapi1_state ) |
| 89 | 178 | ADDRESS_MAP_UNMAP_HIGH |
| 90 | 179 | AM_RANGE(0x0000, 0x07ff) AM_RAM AM_RAMBANK("bank1") |
| 91 | | AM_RANGE(0x0800, 0xe7ff) AM_RAM |
| 92 | | AM_RANGE(0xe800, 0xefff) AM_RAM AM_SHARE("sapi_video_ram") |
| 93 | | AM_RANGE(0xf000, 0xf7ff) AM_RAM |
| 180 | AM_RANGE(0x0800, 0xf7ff) AM_RAM |
| 181 | AM_RANGE(0xf800, 0xffff) AM_RAM AM_SHARE("videoram") |
| 182 | ADDRESS_MAP_END |
| 183 | |
| 184 | static ADDRESS_MAP_START(sapi3a_mem, AS_PROGRAM, 8, sapi1_state ) |
| 185 | ADDRESS_MAP_UNMAP_HIGH |
| 186 | AM_RANGE(0x0000, 0x07ff) AM_RAM AM_RAMBANK("bank1") |
| 187 | AM_RANGE(0x0800, 0xf7ff) AM_RAM |
| 94 | 188 | AM_RANGE(0xf800, 0xfdff) AM_ROM |
| 95 | 189 | AM_RANGE(0xfe00, 0xffff) AM_RAM |
| 96 | 190 | ADDRESS_MAP_END |
| 97 | 191 | |
| 192 | static ADDRESS_MAP_START(sapi3b_mem, AS_PROGRAM, 8, sapi1_state ) |
| 193 | ADDRESS_MAP_UNMAP_HIGH |
| 194 | AM_RANGE(0x0000, 0x07ff) AM_RAM AM_RAMBANK("bank1") |
| 195 | AM_RANGE(0x0800, 0xf7ff) AM_RAM |
| 196 | AM_RANGE(0xf800, 0xffff) AM_RAM AM_SHARE("videoram") |
| 197 | ADDRESS_MAP_END |
| 198 | |
| 98 | 199 | static ADDRESS_MAP_START( sapi3_io, AS_IO, 8, sapi1_state ) |
| 99 | 200 | ADDRESS_MAP_UNMAP_HIGH |
| 100 | 201 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 101 | 202 | AM_RANGE(0x00, 0x00) AM_WRITE(sapi3_00_w) |
| 203 | AM_RANGE(0x25, 0x25) AM_READWRITE(sapi3_25_r,sapi3_25_w) |
| 204 | ADDRESS_MAP_END |
| 205 | |
| 206 | static ADDRESS_MAP_START( sapi3a_io, AS_IO, 8, sapi1_state ) |
| 207 | ADDRESS_MAP_UNMAP_HIGH |
| 208 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 209 | AM_RANGE(0x00, 0x00) AM_WRITE(sapi3_00_w) |
| 102 | 210 | AM_RANGE(0x12, 0x12) AM_READ(sapi2_keyboard_data_r) AM_DEVWRITE(TERMINAL_TAG, generic_terminal_device, write) |
| 103 | 211 | AM_RANGE(0x25, 0x25) AM_READWRITE(sapi3_25_r,sapi3_25_w) |
| 104 | 212 | ADDRESS_MAP_END |
| 105 | 213 | |
| 214 | static ADDRESS_MAP_START( sapi3b_io, AS_IO, 8, sapi1_state ) |
| 215 | ADDRESS_MAP_UNMAP_HIGH |
| 216 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 217 | AM_RANGE(0x00, 0x00) AM_WRITE(sapi3_00_w) |
| 218 | AM_RANGE(0x25, 0x25) AM_READWRITE(sapi3_25_r,sapi3_25_w) |
| 219 | AM_RANGE(0xe0, 0xe0) AM_DEVREADWRITE("crtc", mc6845_device, status_r, address_w) |
| 220 | AM_RANGE(0xe1, 0xe1) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w) |
| 221 | ADDRESS_MAP_END |
| 222 | |
| 106 | 223 | /* Input ports */ |
| 107 | 224 | static INPUT_PORTS_START( sapi1 ) |
| 108 | 225 | PORT_START("LINE0") |
| r25491 | r25492 | |
| 156 | 273 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') |
| 157 | 274 | INPUT_PORTS_END |
| 158 | 275 | |
| 276 | |
| 277 | |
| 278 | /************************************** |
| 279 | |
| 280 | Video |
| 281 | |
| 282 | **************************************/ |
| 283 | |
| 284 | UINT32 sapi1_state::screen_update_sapi1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) |
| 285 | { |
| 286 | int x,y,j,b; |
| 287 | bool val; |
| 288 | UINT16 addr; |
| 289 | int xpos; |
| 290 | |
| 291 | for(y = 0; y < 24; y++ ) |
| 292 | { |
| 293 | addr = y*64; |
| 294 | xpos = 0; |
| 295 | for(x = 0; x < 40; x++ ) |
| 296 | { |
| 297 | UINT8 code = m_p_videoram[addr + x]; |
| 298 | UINT8 attr = (code >> 6) & 3; |
| 299 | code &= 0x3f; |
| 300 | for(j = 0; j < 9; j++ ) |
| 301 | { |
| 302 | for(b = 0; b < 6; b++ ) |
| 303 | { |
| 304 | val = 0; |
| 305 | |
| 306 | if (j==8) |
| 307 | { |
| 308 | if (attr==2) |
| 309 | val = BIT(m_refresh_counter, 5); |
| 310 | } |
| 311 | else |
| 312 | { |
| 313 | val = BIT(MHB2501[code*8 + j], 5-b); |
| 314 | if (attr==1) |
| 315 | val = BIT(m_refresh_counter, 5) ? val : 0; |
| 316 | } |
| 317 | |
| 318 | if(attr==3) |
| 319 | { |
| 320 | bitmap.pix16(y*9+j, xpos+2*b ) = val; |
| 321 | bitmap.pix16(y*9+j, xpos+2*b+1 ) = val; |
| 322 | } |
| 323 | else |
| 324 | { |
| 325 | bitmap.pix16(y*9+j, xpos+b ) = val; |
| 326 | } |
| 327 | } |
| 328 | } |
| 329 | xpos+= (attr==3) ? 12 : 6; |
| 330 | if (xpos>=6*40) break; |
| 331 | } |
| 332 | } |
| 333 | m_refresh_counter++; |
| 334 | return 0; |
| 335 | } |
| 336 | |
| 337 | static MC6845_UPDATE_ROW( update_row ) |
| 338 | { |
| 339 | } |
| 340 | |
| 341 | static MC6845_INTERFACE( mc6845_intf ) |
| 342 | { |
| 343 | false, /* show border area */ |
| 344 | 6, /* number of pixels per video memory address */ |
| 345 | NULL, /* before pixel update callback */ |
| 346 | update_row, /* row update callback */ |
| 347 | NULL, /* after pixel update callback */ |
| 348 | DEVCB_NULL, /* callback for display state changes */ |
| 349 | DEVCB_NULL, /* callback for cursor state changes */ |
| 350 | DEVCB_NULL, /* HSYNC callback */ |
| 351 | DEVCB_NULL, /* VSYNC callback */ |
| 352 | NULL /* update address callback */ |
| 353 | }; |
| 354 | |
| 355 | |
| 356 | |
| 357 | /************************************** |
| 358 | |
| 359 | Keyboard |
| 360 | |
| 361 | **************************************/ |
| 362 | |
| 363 | READ8_MEMBER( sapi1_state::sapi1_keyboard_r ) |
| 364 | { |
| 365 | UINT8 key = 0xff; |
| 366 | if (BIT(m_keyboard_mask, 0)) { key &= m_line0->read(); } |
| 367 | if (BIT(m_keyboard_mask, 1)) { key &= m_line1->read(); } |
| 368 | if (BIT(m_keyboard_mask, 2)) { key &= m_line2->read(); } |
| 369 | if (BIT(m_keyboard_mask, 3)) { key &= m_line3->read(); } |
| 370 | if (BIT(m_keyboard_mask, 4)) { key &= m_line4->read(); } |
| 371 | return key; |
| 372 | } |
| 373 | |
| 374 | WRITE8_MEMBER( sapi1_state::sapi1_keyboard_w ) |
| 375 | { |
| 376 | m_keyboard_mask = (data ^ 0xff ) & 0x1f; |
| 377 | } |
| 378 | |
| 379 | READ8_MEMBER( sapi1_state::sapi2_keyboard_status_r) |
| 380 | { |
| 381 | return (m_term_data) ? 0 : 1; |
| 382 | } |
| 383 | |
| 384 | READ8_MEMBER( sapi1_state::sapi2_keyboard_data_r) |
| 385 | { |
| 386 | UINT8 ret = ~m_term_data; |
| 387 | m_term_data = 0; |
| 388 | return ret; |
| 389 | } |
| 390 | |
| 159 | 391 | WRITE8_MEMBER( sapi1_state::kbd_put ) |
| 160 | 392 | { |
| 161 | 393 | m_term_data = data; |
| r25491 | r25492 | |
| 167 | 399 | }; |
| 168 | 400 | |
| 169 | 401 | |
| 402 | |
| 403 | /************************************** |
| 404 | |
| 405 | Machine |
| 406 | |
| 407 | **************************************/ |
| 408 | |
| 409 | /* switch out the rom shadow */ |
| 410 | WRITE8_MEMBER( sapi1_state::sapi3_00_w ) |
| 411 | { |
| 412 | m_bank1->set_entry(0); |
| 413 | } |
| 414 | |
| 415 | /* to stop execution in random ram */ |
| 416 | READ8_MEMBER( sapi1_state::sapi3_25_r ) |
| 417 | { |
| 418 | return m_zps3_25; |
| 419 | } |
| 420 | |
| 421 | WRITE8_MEMBER( sapi1_state::sapi3_25_w ) |
| 422 | { |
| 423 | m_zps3_25 = data & 0xfc; //?? |
| 424 | } |
| 425 | |
| 426 | MACHINE_RESET_MEMBER( sapi1_state, sapi1 ) |
| 427 | { |
| 428 | m_keyboard_mask = 0; |
| 429 | m_refresh_counter = 0x20; |
| 430 | } |
| 431 | |
| 432 | MACHINE_RESET_MEMBER( sapi1_state, sapizps3 ) |
| 433 | { |
| 434 | m_keyboard_mask = 0; |
| 435 | m_bank1->set_entry(1); |
| 436 | } |
| 437 | |
| 438 | DRIVER_INIT_MEMBER( sapi1_state, sapizps3 ) |
| 439 | { |
| 440 | UINT8 *RAM = memregion("maincpu")->base(); |
| 441 | m_bank1->configure_entries(0, 2, &RAM[0x0000], 0x10000); |
| 442 | } |
| 443 | |
| 444 | DRIVER_INIT_MEMBER( sapi1_state, sapizps3a ) |
| 445 | { |
| 446 | UINT8 *RAM = memregion("maincpu")->base(); |
| 447 | m_bank1->configure_entries(0, 2, &RAM[0x0000], 0xf800); |
| 448 | } |
| 449 | |
| 450 | DRIVER_INIT_MEMBER( sapi1_state, sapizps3b ) |
| 451 | { |
| 452 | UINT8 *RAM = memregion("maincpu")->base(); |
| 453 | m_bank1->configure_entries(0, 2, &RAM[0x0000], 0x10000); |
| 454 | } |
| 455 | |
| 456 | |
| 170 | 457 | /* Machine driver */ |
| 171 | 458 | static MACHINE_CONFIG_START( sapi1, sapi1_state ) |
| 172 | 459 | /* basic machine hardware */ |
| 173 | 460 | MCFG_CPU_ADD("maincpu", I8080, 2000000) |
| 174 | 461 | MCFG_CPU_PROGRAM_MAP(sapi1_mem) |
| 175 | | MCFG_CPU_IO_MAP(sapi1_io) |
| 462 | MCFG_MACHINE_RESET_OVERRIDE(sapi1_state, sapi1) |
| 176 | 463 | |
| 177 | | MCFG_MACHINE_START_OVERRIDE(sapi1_state, sapi1 ) |
| 178 | | MCFG_MACHINE_RESET_OVERRIDE(sapi1_state, sapi1 ) |
| 179 | | |
| 180 | 464 | /* video hardware */ |
| 181 | 465 | MCFG_SCREEN_ADD("screen", RASTER) |
| 182 | 466 | MCFG_SCREEN_REFRESH_RATE(50) |
| r25491 | r25492 | |
| 184 | 468 | MCFG_SCREEN_SIZE(40*6, 24*9) |
| 185 | 469 | MCFG_SCREEN_VISIBLE_AREA(0, 40*6-1, 0, 24*9-1) |
| 186 | 470 | MCFG_SCREEN_UPDATE_DRIVER(sapi1_state, screen_update_sapi1) |
| 187 | | |
| 188 | 471 | MCFG_PALETTE_LENGTH(2) |
| 189 | 472 | MCFG_PALETTE_INIT_OVERRIDE(driver_device, black_and_white) |
| 190 | 473 | |
| 191 | | MCFG_VIDEO_START_OVERRIDE(sapi1_state,sapi1) |
| 192 | | |
| 193 | 474 | /* internal ram */ |
| 194 | 475 | MCFG_RAM_ADD(RAM_TAG) |
| 195 | 476 | MCFG_RAM_DEFAULT_SIZE("64K") |
| r25491 | r25492 | |
| 202 | 483 | MCFG_ASCII_KEYBOARD_ADD(KEYBOARD_TAG, terminal_intf) |
| 203 | 484 | MACHINE_CONFIG_END |
| 204 | 485 | |
| 205 | | static MACHINE_CONFIG_START( sapi3, sapi1_state ) |
| 486 | static MACHINE_CONFIG_DERIVED( sapi3, sapi2 ) |
| 206 | 487 | /* basic machine hardware */ |
| 207 | | MCFG_CPU_ADD("maincpu", Z80, 2000000) |
| 488 | MCFG_CPU_MODIFY("maincpu") |
| 208 | 489 | MCFG_CPU_PROGRAM_MAP(sapi3_mem) |
| 209 | 490 | MCFG_CPU_IO_MAP(sapi3_io) |
| 491 | MCFG_MACHINE_RESET_OVERRIDE(sapi1_state, sapizps3 ) |
| 492 | MACHINE_CONFIG_END |
| 210 | 493 | |
| 211 | | MCFG_MACHINE_START_OVERRIDE(sapi1_state, sapi1 ) |
| 494 | static MACHINE_CONFIG_DERIVED( sapi3b, sapi3 ) |
| 495 | /* basic machine hardware */ |
| 496 | MCFG_CPU_MODIFY("maincpu") |
| 497 | MCFG_CPU_PROGRAM_MAP(sapi3b_mem) |
| 498 | MCFG_CPU_IO_MAP(sapi3b_io) |
| 499 | MCFG_MC6845_ADD("crtc", MC6845, "screen", 1008000, mc6845_intf) // guess |
| 500 | MCFG_SCREEN_MODIFY("screen") |
| 501 | MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update) |
| 502 | MACHINE_CONFIG_END |
| 503 | |
| 504 | static MACHINE_CONFIG_START( sapi3a, sapi1_state ) |
| 505 | /* basic machine hardware */ |
| 506 | MCFG_CPU_ADD("maincpu", Z80, 2000000) |
| 507 | MCFG_CPU_PROGRAM_MAP(sapi3a_mem) |
| 508 | MCFG_CPU_IO_MAP(sapi3a_io) |
| 212 | 509 | MCFG_MACHINE_RESET_OVERRIDE(sapi1_state, sapizps3 ) |
| 213 | 510 | |
| 214 | 511 | /* video hardware */ |
| 215 | | //MCFG_SCREEN_ADD("screen", RASTER) |
| 216 | | //MCFG_SCREEN_REFRESH_RATE(50) |
| 217 | | //MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ |
| 218 | | //MCFG_SCREEN_SIZE(80*6, 24*9) |
| 219 | | //MCFG_SCREEN_VISIBLE_AREA(0, 80*6-1, 0, 24*9-1) |
| 220 | | //MCFG_VIDEO_START_OVERRIDE(sapi1_state,sapizps3) |
| 221 | | //MCFG_SCREEN_UPDATE_DRIVER(sapi1_state, screen_update_sapizps3) |
| 222 | | //MCFG_PALETTE_LENGTH(2) |
| 223 | | //MCFG_PALETTE_INIT_OVERRIDE(driver_device, black_and_white) |
| 224 | | |
| 225 | | /* video hardware */ |
| 226 | 512 | MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, terminal_intf) |
| 227 | 513 | |
| 228 | 514 | /* internal ram */ |
| r25491 | r25492 | |
| 230 | 516 | MCFG_RAM_DEFAULT_SIZE("64K") |
| 231 | 517 | MACHINE_CONFIG_END |
| 232 | 518 | |
| 233 | | /* ROM definition */ |
| 234 | 519 | |
| 520 | |
| 521 | |
| 522 | /************************************** |
| 523 | |
| 524 | Roms |
| 525 | |
| 526 | **************************************/ |
| 527 | |
| 235 | 528 | ROM_START( sapi1 ) |
| 236 | | ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) |
| 529 | ROM_REGION( 0x10000, "maincpu", 0 ) |
| 237 | 530 | ROM_SYSTEM_BIOS( 0, "mb1", "MB1" ) |
| 238 | 531 | ROMX_LOAD( "sapi1.rom", 0x0000, 0x1000, CRC(c6e85b01) SHA1(2a26668249c6161aef7215a1e2b92bfdf6fe3671), ROM_BIOS(1)) |
| 239 | 532 | ROM_SYSTEM_BIOS( 1, "mb2", "MB2 (ANK-1)" ) |
| 240 | 533 | ROMX_LOAD( "mb2_4.bin", 0x0000, 0x1000, CRC(a040b3e0) SHA1(586990a07a96323741679a11ff54ad0023da87bc), ROM_BIOS(2)) |
| 241 | | ROM_SYSTEM_BIOS( 2, "mb3", "MB3 (Consul)" ) |
| 242 | | ROMX_LOAD( "mb3_1.bin", 0x0000, 0x1000, CRC(be895f88) SHA1(7fc2a92f41d978a9f0ccd0e235ea3c6146adfb6f), ROM_BIOS(3)) |
| 243 | 534 | ROM_END |
| 244 | 535 | |
| 245 | 536 | ROM_START( sapizps2 ) |
| 246 | | ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) |
| 537 | ROM_REGION( 0x10000, "maincpu", 0 ) |
| 247 | 538 | ROM_SYSTEM_BIOS( 0, "v4", "MIKOS 4" ) |
| 248 | 539 | ROMX_LOAD( "36.bin", 0x0000, 0x0800, CRC(a27f340a) SHA1(d07d208fcbe428897336c17197d3e8fb52181f38), ROM_BIOS(1)) |
| 249 | 540 | ROMX_LOAD( "37.bin", 0x0800, 0x0800, CRC(30daa708) SHA1(66e990c40788ee25cf6cabd4842a78daf4fcdddd), ROM_BIOS(1)) |
| r25491 | r25492 | |
| 252 | 543 | ROMX_LOAD( "mikos5_2.bin", 0x0800, 0x0800, CRC(c4458a04) SHA1(0cc909323f0e6507d95e57ea39e1deb8bd57bf89), ROM_BIOS(2)) |
| 253 | 544 | ROMX_LOAD( "mikos5_3.bin", 0x1000, 0x0800, CRC(efb499f3) SHA1(78f0ca3ff10d7af4ae94ab820723296beb035f8f), ROM_BIOS(2)) |
| 254 | 545 | ROMX_LOAD( "mikos5_4.bin", 0x1800, 0x0800, CRC(4d90e9be) SHA1(8ec554198697550a49432e8210d43700ef1d6a32), ROM_BIOS(2)) |
| 546 | ROM_SYSTEM_BIOS( 2, "mb3", "MB3 (Consul)" ) |
| 547 | ROMX_LOAD( "mb3_1.bin", 0x0000, 0x1000, CRC(be895f88) SHA1(7fc2a92f41d978a9f0ccd0e235ea3c6146adfb6f), ROM_BIOS(3)) |
| 255 | 548 | ROM_END |
| 256 | 549 | |
| 257 | 550 | ROM_START( sapizps3 ) |
| 258 | | ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) |
| 259 | | ROM_SYSTEM_BIOS( 0, "default", "JPR-1A" ) |
| 260 | | ROMX_LOAD( "jpr1a.bin", 0xf800, 0x0800, CRC(3ed89786) SHA1(dcc8657b4884bfe58d114c539b733b73d038ee30), ROM_BIOS(1)) |
| 261 | | ROM_SYSTEM_BIOS( 1, "per", "Perina" ) |
| 262 | | ROMX_LOAD( "perina_1988.bin",0xf800, 0x0800, CRC(d71e8d3a) SHA1(9b3a26ea7c2f2c8a1fb10b51c1c880acc9fd806d), ROM_BIOS(2)) |
| 263 | | ROM_SYSTEM_BIOS( 2, "pkt1", "PKT 1" ) |
| 264 | | ROMX_LOAD( "pkt1.bin", 0xf800, 0x0800, CRC(ed5a2725) SHA1(3383c15f87f976400b8d0f31829e2a95236c4b6c), ROM_BIOS(3)) |
| 265 | | ROM_SYSTEM_BIOS( 3, "1zmod", "JPR-1Zmod" ) |
| 266 | | ROMX_LOAD( "jpr1zmod.bin", 0xf800, 0x0800, CRC(69a29b07) SHA1(1cd31032954fcd7d10b1586be62db6f7597eb4f2), ROM_BIOS(4)) |
| 551 | ROM_REGION( 0x10800, "maincpu", 0 ) |
| 552 | // These 2 bioses use videoram at F800 |
| 553 | ROM_SYSTEM_BIOS( 0, "per", "Perina" ) |
| 554 | ROMX_LOAD( "perina_1988.bin",0x10000, 0x0800, CRC(d71e8d3a) SHA1(9b3a26ea7c2f2c8a1fb10b51c1c880acc9fd806d), ROM_BIOS(1)) |
| 555 | ROM_SYSTEM_BIOS( 1, "1zmod", "JPR-1Zmod" ) |
| 556 | ROMX_LOAD( "jpr1zmod.bin", 0x10000, 0x0800, CRC(69a29b07) SHA1(1cd31032954fcd7d10b1586be62db6f7597eb4f2), ROM_BIOS(2)) |
| 267 | 557 | ROM_END |
| 558 | |
| 559 | ROM_START( sapizps3a ) |
| 560 | ROM_REGION( 0x10000, "maincpu", 0 ) |
| 561 | // This bios uses a terminal |
| 562 | ROM_LOAD( "jpr1a.bin", 0xf800, 0x0800, CRC(3ed89786) SHA1(dcc8657b4884bfe58d114c539b733b73d038ee30)) |
| 563 | ROM_END |
| 564 | |
| 565 | ROM_START( sapizps3b ) |
| 566 | ROM_REGION( 0x10800, "maincpu", 0 ) |
| 567 | // This bios uses a 6845 and unknown videoram |
| 568 | ROM_LOAD( "pkt1.bin", 0x10000, 0x0800, CRC(ed5a2725) SHA1(3383c15f87f976400b8d0f31829e2a95236c4b6c)) |
| 569 | ROM_END |
| 570 | |
| 571 | |
| 268 | 572 | /* Driver */ |
| 269 | 573 | |
| 270 | | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ |
| 271 | | COMP( 1985, sapi1, 0, 0, sapi1, sapi1, sapi1_state, sapi1, "Tesla", "SAPI-1 ZPS 1", GAME_NO_SOUND_HW) |
| 272 | | COMP( 1985, sapizps2, sapi1, 0, sapi2, sapi1, sapi1_state, sapi1, "Tesla", "SAPI-1 ZPS 2", GAME_NO_SOUND_HW) |
| 273 | | COMP( 1985, sapizps3, sapi1, 0, sapi3, sapi1, sapi1_state, sapizps3, "Tesla", "SAPI-1 ZPS 3", GAME_NOT_WORKING | GAME_NO_SOUND_HW) |
| 574 | /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ |
| 575 | COMP( 1985, sapi1, 0, 0, sapi1, sapi1, driver_device, 0, "Tesla", "SAPI-1 ZPS 1", GAME_NO_SOUND_HW) |
| 576 | COMP( 1985, sapizps2, sapi1, 0, sapi2, sapi1, driver_device, 0, "Tesla", "SAPI-1 ZPS 2", GAME_NO_SOUND_HW) |
| 577 | COMP( 1985, sapizps3, sapi1, 0, sapi3, sapi1, sapi1_state, sapizps3, "Tesla", "SAPI-1 ZPS 3", GAME_NOT_WORKING | GAME_NO_SOUND_HW) |
| 578 | COMP( 1985, sapizps3a,sapi1, 0, sapi3a, sapi1, sapi1_state, sapizps3a, "Tesla", "SAPI-1 ZPS 3 (terminal)", GAME_NOT_WORKING | GAME_NO_SOUND_HW) |
| 579 | COMP( 1985, sapizps3b,sapi1, 0, sapi3b, sapi1, sapi1_state, sapizps3b, "Tesla", "SAPI-1 ZPS 3 (6845)", GAME_NOT_WORKING | GAME_NO_SOUND_HW) |