src/mess/drivers/multi8.c
| r8620 | r8621 | |
| 10 | 10 | #include "cpu/z80/z80.h" |
| 11 | 11 | #include "sound/2203intf.h" |
| 12 | 12 | #include "video/mc6845.h" |
| 13 | #include "machine/i8255a.h" |
| 13 | 14 | |
| 15 | static UINT8 *vram; |
| 16 | static UINT8 mcu_init; |
| 17 | static UINT8 keyb_press,keyb_press_flag; |
| 18 | static UINT16 cursor_addr,cursor_raster; |
| 19 | |
| 14 | 20 | static VIDEO_START( multi8 ) |
| 15 | 21 | { |
| 16 | 22 | } |
| 17 | 23 | |
| 18 | 24 | static VIDEO_UPDATE( multi8 ) |
| 19 | 25 | { |
| 26 | int x,y,count; |
| 27 | count = 0x0000; |
| 28 | |
| 29 | for(y=0;y<25;y++) |
| 30 | { |
| 31 | for(x=0;x<40;x++) |
| 32 | { |
| 33 | int tile = vram[count]; |
| 34 | int color = vram[count+0x800] & 0x20; |
| 35 | |
| 36 | drawgfx_opaque(bitmap, cliprect, screen->machine->gfx[0], tile,color >> 5, 0, 0, x*8, y*8); |
| 37 | |
| 38 | // draw cursor |
| 39 | if(cursor_addr == count) |
| 40 | { |
| 41 | int xc,yc,cursor_on; |
| 42 | |
| 43 | cursor_on = 0; |
| 44 | switch(cursor_raster & 0x60) |
| 45 | { |
| 46 | case 0x00: cursor_on = 1; break; //always on |
| 47 | case 0x20: cursor_on = 0; break; //always off |
| 48 | case 0x40: if(screen->machine->primary_screen->frame_number() & 0x10) { cursor_on = 1; } break; //fast blink |
| 49 | case 0x60: if(screen->machine->primary_screen->frame_number() & 0x20) { cursor_on = 1; } break; //slow blink |
| 50 | } |
| 51 | |
| 52 | if(cursor_on) |
| 53 | { |
| 54 | for(yc=0;yc<(8-(cursor_raster & 7));yc++) |
| 55 | { |
| 56 | for(xc=0;xc<8;xc++) |
| 57 | { |
| 58 | *BITMAP_ADDR16(bitmap, y*8+yc+7, x*8+xc) = screen->machine->pens[0x1]; |
| 59 | } |
| 60 | } |
| 61 | } |
| 62 | } |
| 63 | count+=2; |
| 64 | } |
| 65 | } |
| 20 | 66 | return 0; |
| 21 | 67 | } |
| 22 | 68 | |
| r8620 | r8621 | |
| 27 | 73 | if(offset == 0) |
| 28 | 74 | { |
| 29 | 75 | addr_latch = data; |
| 30 | | mc6845_address_w(space->machine->device("crtc"), 0,data); |
| 76 | //mc6845_address_w(space->machine->device("crtc"), 0,data); |
| 31 | 77 | } |
| 32 | 78 | else |
| 33 | 79 | { |
| 34 | | mc6845_register_w(space->machine->device("crtc"), 0,data); |
| 80 | if(addr_latch == 0x0a) |
| 81 | cursor_raster = data; |
| 82 | if(addr_latch == 0x0e) |
| 83 | cursor_addr = ((data<<8) & 0x3f00) | (cursor_addr & 0xff); |
| 84 | else if(addr_latch == 0x0f) |
| 85 | cursor_addr = (cursor_addr & 0x3f00) | (data & 0xff); |
| 86 | |
| 87 | //mc6845_register_w(space->machine->device("crtc"), 0,data); |
| 35 | 88 | } |
| 36 | 89 | } |
| 37 | 90 | |
| 91 | static READ8_HANDLER( key_input_r ) |
| 92 | { |
| 93 | if(mcu_init == 0){ mcu_init++; return 3; } |
| 38 | 94 | |
| 95 | keyb_press_flag &= 0xfe; |
| 96 | |
| 97 | return keyb_press; |
| 98 | } |
| 99 | |
| 100 | static READ8_HANDLER( key_status_r ) |
| 101 | { |
| 102 | if(mcu_init == 0){ return 1; } |
| 103 | if(mcu_init == 1){ mcu_init++; return 1; } |
| 104 | if(mcu_init == 2){ mcu_init++; return 0; } |
| 105 | |
| 106 | return keyb_press_flag; |
| 107 | } |
| 108 | |
| 39 | 109 | static ADDRESS_MAP_START(multi8_mem, ADDRESS_SPACE_PROGRAM, 8) |
| 40 | 110 | ADDRESS_MAP_UNMAP_HIGH |
| 41 | | AM_RANGE(0x0000, 0x7FFF) AM_ROM |
| 42 | | AM_RANGE(0x8000, 0xFFFF) AM_RAM |
| 111 | AM_RANGE(0x0000, 0x7fff) AM_ROM |
| 112 | AM_RANGE(0x8000, 0x8fff) AM_RAM AM_BASE(&vram) |
| 113 | AM_RANGE(0x9000, 0xffff) AM_RAM |
| 43 | 114 | ADDRESS_MAP_END |
| 44 | 115 | |
| 45 | 116 | static ADDRESS_MAP_START( multi8_io , ADDRESS_SPACE_IO, 8) |
| 46 | 117 | ADDRESS_MAP_UNMAP_HIGH |
| 47 | 118 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 48 | | |
| 49 | | // AM_RANGE(0x00, 0x01) //keyboard line |
| 119 | AM_RANGE(0x00, 0x00) AM_READ(key_input_r) AM_WRITENOP//keyboard |
| 120 | AM_RANGE(0x01, 0x01) AM_READ(key_status_r) AM_WRITENOP//keyboard |
| 50 | 121 | AM_RANGE(0x18, 0x19) AM_DEVWRITE("ymsnd", ym2203_w) |
| 51 | 122 | // AM_RANGE(0x18, 0x18) //opn read 0 |
| 52 | 123 | // AM_RANGE(0x1a, 0x1a) //opn read 1 |
| 53 | 124 | AM_RANGE(0x1c, 0x1d) AM_WRITE(multi8_6845_w) |
| 54 | 125 | // AM_RANGE(0x20, 0x21) //sio, cmt |
| 55 | 126 | // AM_RANGE(0x24, 0x27) //pit |
| 56 | | // AM_RANGE(0x28, 0x2b) //i8255 0 |
| 127 | AM_RANGE(0x28, 0x2b) AM_DEVREADWRITE("ppi8255_0", i8255a_r, i8255a_w) |
| 57 | 128 | // AM_RANGE(0x2c, 0x2d) //i8259 |
| 58 | 129 | // AM_RANGE(0x30, 0x37) //vdp regs |
| 59 | 130 | // AM_RANGE(0x40, 0x41) //kanji regs |
| 60 | 131 | // AM_RANGE(0x70, 0x74) //upd765a fdc |
| 132 | // AM_RANGE(0x78, 0x78) //memory banking |
| 61 | 133 | ADDRESS_MAP_END |
| 62 | 134 | |
| 63 | 135 | /* Input ports */ |
| 64 | 136 | static INPUT_PORTS_START( multi8 ) |
| 137 | PORT_START("VBLANK") |
| 138 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_VBLANK) |
| 139 | |
| 140 | PORT_START("key1") //0x00-0x1f |
| 141 | PORT_BIT(0x00000001,IP_ACTIVE_HIGH,IPT_UNUSED) //0x00 null |
| 142 | PORT_BIT(0x00000002,IP_ACTIVE_HIGH,IPT_UNUSED) //0x01 soh |
| 143 | PORT_BIT(0x00000004,IP_ACTIVE_HIGH,IPT_UNUSED) //0x02 stx |
| 144 | PORT_BIT(0x00000008,IP_ACTIVE_HIGH,IPT_UNUSED) //0x03 etx |
| 145 | PORT_BIT(0x00000010,IP_ACTIVE_HIGH,IPT_UNUSED) //0x04 etx |
| 146 | PORT_BIT(0x00000020,IP_ACTIVE_HIGH,IPT_UNUSED) //0x05 eot |
| 147 | PORT_BIT(0x00000040,IP_ACTIVE_HIGH,IPT_UNUSED) //0x06 enq |
| 148 | PORT_BIT(0x00000080,IP_ACTIVE_HIGH,IPT_UNUSED) //0x07 ack |
| 149 | PORT_BIT(0x00000100,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Backspace") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) |
| 150 | PORT_BIT(0x00000200,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) PORT_CHAR(9) |
| 151 | PORT_BIT(0x00000400,IP_ACTIVE_HIGH,IPT_UNUSED) //0x0a |
| 152 | PORT_BIT(0x00000800,IP_ACTIVE_HIGH,IPT_UNUSED) //0x0b lf |
| 153 | PORT_BIT(0x00001000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x0c vt |
| 154 | PORT_BIT(0x00002000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(27) |
| 155 | PORT_BIT(0x00004000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x0e cr |
| 156 | PORT_BIT(0x00008000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x0f so |
| 157 | |
| 158 | PORT_BIT(0x00010000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x10 si |
| 159 | PORT_BIT(0x00020000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x11 dle |
| 160 | PORT_BIT(0x00040000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x12 dc1 |
| 161 | PORT_BIT(0x00080000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x13 dc2 |
| 162 | PORT_BIT(0x00100000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("HOME") PORT_CODE(KEYCODE_HOME) |
| 163 | PORT_BIT(0x00200000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x15 dc4 |
| 164 | PORT_BIT(0x00400000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT) |
| 165 | PORT_BIT(0x00800000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x17 syn |
| 166 | PORT_BIT(0x01000000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x18 etb |
| 167 | PORT_BIT(0x02000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT) |
| 168 | PORT_BIT(0x04000000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x1a em |
| 169 | PORT_BIT(0x08000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("ESC") PORT_CHAR(27) |
| 170 | PORT_BIT(0x10000000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x1c ??? |
| 171 | PORT_BIT(0x20000000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x1d fs |
| 172 | PORT_BIT(0x40000000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x1e gs |
| 173 | PORT_BIT(0x80000000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x1f us |
| 174 | |
| 175 | PORT_START("key2") //0x20-0x3f |
| 176 | PORT_BIT(0x00000001,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') |
| 177 | PORT_BIT(0x00000002,IP_ACTIVE_HIGH,IPT_UNUSED) //0x21 ! |
| 178 | PORT_BIT(0x00000004,IP_ACTIVE_HIGH,IPT_UNUSED) //0x22 " |
| 179 | PORT_BIT(0x00000008,IP_ACTIVE_HIGH,IPT_UNUSED) //0x23 # |
| 180 | PORT_BIT(0x00000010,IP_ACTIVE_HIGH,IPT_UNUSED) //0x24 $ |
| 181 | PORT_BIT(0x00000020,IP_ACTIVE_HIGH,IPT_UNUSED) //0x25 % |
| 182 | PORT_BIT(0x00000040,IP_ACTIVE_HIGH,IPT_UNUSED) //0x26 & |
| 183 | PORT_BIT(0x00000080,IP_ACTIVE_HIGH,IPT_UNUSED) //0x27 ' |
| 184 | PORT_BIT(0x00000100,IP_ACTIVE_HIGH,IPT_UNUSED) //0x28 ( |
| 185 | PORT_BIT(0x00000200,IP_ACTIVE_HIGH,IPT_UNUSED) //0x29 ) |
| 186 | PORT_BIT(0x00000400,IP_ACTIVE_HIGH,IPT_UNUSED) //0x2a * |
| 187 | PORT_BIT(0x00000800,IP_ACTIVE_HIGH,IPT_UNUSED) //0x2b + |
| 188 | PORT_BIT(0x00001000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x2c , |
| 189 | PORT_BIT(0x00002000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') |
| 190 | PORT_BIT(0x00004000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x2e . |
| 191 | PORT_BIT(0x00008000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x2f / |
| 192 | |
| 193 | PORT_BIT(0x00010000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0') |
| 194 | PORT_BIT(0x00020000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1') |
| 195 | PORT_BIT(0x00040000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHAR('2') |
| 196 | PORT_BIT(0x00080000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CHAR('3') |
| 197 | PORT_BIT(0x00100000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CHAR('4') |
| 198 | PORT_BIT(0x00200000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CHAR('5') |
| 199 | PORT_BIT(0x00400000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CHAR('6') |
| 200 | PORT_BIT(0x00800000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CHAR('7') |
| 201 | PORT_BIT(0x01000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CHAR('8') |
| 202 | PORT_BIT(0x02000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CHAR('9') |
| 203 | PORT_BIT(0x04000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(":") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') |
| 204 | PORT_BIT(0x08000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(";") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') |
| 205 | PORT_BIT(0x10000000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x3c < |
| 206 | PORT_BIT(0x20000000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x3d = |
| 207 | PORT_BIT(0x40000000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x3e > |
| 208 | PORT_BIT(0x80000000,IP_ACTIVE_HIGH,IPT_UNUSED) //0x3f ? |
| 209 | |
| 210 | PORT_START("key3") //0x40-0x5f |
| 211 | PORT_BIT(0x00000001,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("@") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@') |
| 212 | PORT_BIT(0x00000002,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('A') |
| 213 | PORT_BIT(0x00000004,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('B') |
| 214 | PORT_BIT(0x00000008,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('C') |
| 215 | PORT_BIT(0x00000010,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('D') |
| 216 | PORT_BIT(0x00000020,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('E') |
| 217 | PORT_BIT(0x00000040,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('F') |
| 218 | PORT_BIT(0x00000080,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) PORT_CHAR('G') |
| 219 | PORT_BIT(0x00000100,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) PORT_CHAR('H') |
| 220 | PORT_BIT(0x00000200,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('I') |
| 221 | PORT_BIT(0x00000400,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) PORT_CHAR('J') |
| 222 | PORT_BIT(0x00000800,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) PORT_CHAR('K') |
| 223 | PORT_BIT(0x00001000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) PORT_CHAR('L') |
| 224 | PORT_BIT(0x00002000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('M') |
| 225 | PORT_BIT(0x00004000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('N') |
| 226 | PORT_BIT(0x00008000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) PORT_CHAR('O') |
| 227 | PORT_BIT(0x00010000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHAR('P') |
| 228 | PORT_BIT(0x00020000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q') |
| 229 | PORT_BIT(0x00040000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('R') |
| 230 | PORT_BIT(0x00080000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) PORT_CHAR('S') |
| 231 | PORT_BIT(0x00100000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) PORT_CHAR('T') |
| 232 | PORT_BIT(0x00200000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) PORT_CHAR('U') |
| 233 | PORT_BIT(0x00400000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('V') |
| 234 | PORT_BIT(0x00800000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('W') |
| 235 | PORT_BIT(0x01000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('X') |
| 236 | PORT_BIT(0x02000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y') |
| 237 | PORT_BIT(0x04000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z') |
| 238 | PORT_BIT(0x08000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("[") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('[') |
| 239 | PORT_BIT(0x10000000,IP_ACTIVE_HIGH,IPT_UNUSED) |
| 240 | PORT_BIT(0x20000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("]") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(']') |
| 241 | PORT_BIT(0x40000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("^") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('^') |
| 242 | PORT_BIT(0x80000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("_") |
| 243 | |
| 244 | PORT_START("key_modifiers") |
| 245 | PORT_BIT(0x00000001,IP_ACTIVE_LOW,IPT_KEYBOARD) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) |
| 246 | PORT_BIT(0x00000002,IP_ACTIVE_LOW,IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) |
| 247 | PORT_BIT(0x00000004,IP_ACTIVE_LOW,IPT_KEYBOARD) PORT_NAME("KANA") PORT_CODE(KEYCODE_RCONTROL) |
| 248 | PORT_BIT(0x00000008,IP_ACTIVE_LOW,IPT_KEYBOARD) PORT_NAME("CAPS") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE |
| 249 | PORT_BIT(0x00000010,IP_ACTIVE_LOW,IPT_KEYBOARD) PORT_NAME("GRPH") PORT_CODE(KEYCODE_LALT) |
| 65 | 250 | INPUT_PORTS_END |
| 66 | 251 | |
| 252 | static TIMER_CALLBACK( keyboard_callback ) |
| 253 | { |
| 254 | const char* portnames[3] = { "key1","key2","key3" }; |
| 255 | int i,port_i,scancode; |
| 256 | UINT8 keymod = input_port_read(machine,"key_modifiers") & 0x1f; |
| 257 | scancode = 0; |
| 67 | 258 | |
| 259 | for(port_i=0;port_i<3;port_i++) |
| 260 | { |
| 261 | for(i=0;i<32;i++) |
| 262 | { |
| 263 | if((input_port_read(machine,portnames[port_i])>>i) & 1) |
| 264 | { |
| 265 | //key_flag = 1; |
| 266 | if(keymod & 0x02) // shift not pressed |
| 267 | { |
| 268 | if(scancode >= 0x41 && scancode < 0x5a) |
| 269 | scancode += 0x20; // lowercase |
| 270 | } |
| 271 | else |
| 272 | { |
| 273 | if(scancode >= 0x31 && scancode < 0x3a) |
| 274 | scancode -= 0x10; |
| 275 | if(scancode == 0x30) |
| 276 | { |
| 277 | scancode = 0x3d; |
| 278 | } |
| 279 | } |
| 280 | keyb_press = scancode; |
| 281 | keyb_press_flag = 1; |
| 282 | return; |
| 283 | } |
| 284 | scancode++; |
| 285 | } |
| 286 | } |
| 287 | } |
| 288 | |
| 289 | static MACHINE_START(multi8) |
| 290 | { |
| 291 | timer_pulse(machine, ATTOTIME_IN_HZ(240/32), NULL, 0, keyboard_callback); |
| 292 | } |
| 293 | |
| 68 | 294 | static MACHINE_RESET(multi8) |
| 69 | 295 | { |
| 296 | mcu_init = 0; |
| 70 | 297 | } |
| 71 | 298 | |
| 72 | 299 | /* F4 Character Displayer */ |
| r8620 | r8621 | |
| 84 | 311 | }; |
| 85 | 312 | |
| 86 | 313 | static GFXDECODE_START( multi8 ) |
| 87 | | GFXDECODE_ENTRY( "chargen", 0x0000, multi8_charlayout, 0, 1 ) |
| 314 | GFXDECODE_ENTRY( "chargen", 0x0000, multi8_charlayout, 0, 2 ) |
| 88 | 315 | GFXDECODE_END |
| 89 | 316 | |
| 90 | 317 | static const mc6845_interface mc6845_intf = |
| r8620 | r8621 | |
| 101 | 328 | NULL /* update address callback */ |
| 102 | 329 | }; |
| 103 | 330 | |
| 331 | static PALETTE_INIT( multi8 ) |
| 332 | { |
| 333 | palette_set_color_rgb(machine, 0, 0x00,0x00,0x00); |
| 334 | palette_set_color_rgb(machine, 1, 0xff,0xff,0xff); |
| 335 | palette_set_color_rgb(machine, 2, 0xff,0xff,0xff); |
| 336 | palette_set_color_rgb(machine, 3, 0x00,0x00,0x00); |
| 104 | 337 | |
| 338 | } |
| 339 | |
| 340 | static READ8_DEVICE_HANDLER( porta_r ) |
| 341 | { |
| 342 | int vsync = (input_port_read(device->machine, "VBLANK") & 0x1) << 5; |
| 343 | |
| 344 | return 0xdf | vsync; |
| 345 | } |
| 346 | |
| 347 | static READ8_DEVICE_HANDLER( portb_r ) |
| 348 | { |
| 349 | // printf("Port B r\n"); |
| 350 | |
| 351 | return 0xff; |
| 352 | } |
| 353 | |
| 354 | static READ8_DEVICE_HANDLER( portc_r ) |
| 355 | { |
| 356 | // printf("Port C r\n"); |
| 357 | |
| 358 | return 0xff; |
| 359 | } |
| 360 | |
| 361 | static WRITE8_DEVICE_HANDLER( porta_w ) |
| 362 | { |
| 363 | // printf("Port A w = %02x\n",data); |
| 364 | } |
| 365 | |
| 366 | static WRITE8_DEVICE_HANDLER( portb_w ) |
| 367 | { |
| 368 | // printf("Port B w = %02x\n",data); |
| 369 | } |
| 370 | |
| 371 | static WRITE8_DEVICE_HANDLER( portc_w ) |
| 372 | { |
| 373 | // printf("Port C w = %02x\n",data); |
| 374 | } |
| 375 | |
| 376 | |
| 377 | static I8255A_INTERFACE( ppi8255_intf_0 ) |
| 378 | { |
| 379 | DEVCB_HANDLER(porta_r), /* Port A read */ |
| 380 | DEVCB_HANDLER(portb_r), /* Port B read */ |
| 381 | DEVCB_HANDLER(portc_r), /* Port C read */ |
| 382 | DEVCB_HANDLER(porta_w), /* Port A write */ |
| 383 | DEVCB_HANDLER(portb_w), /* Port B write */ |
| 384 | DEVCB_HANDLER(portc_w) /* Port C write */ |
| 385 | }; |
| 386 | |
| 105 | 387 | static MACHINE_DRIVER_START( multi8 ) |
| 106 | 388 | /* basic machine hardware */ |
| 107 | 389 | MDRV_CPU_ADD("maincpu",Z80, XTAL_4MHz) |
| 108 | 390 | MDRV_CPU_PROGRAM_MAP(multi8_mem) |
| 109 | 391 | MDRV_CPU_IO_MAP(multi8_io) |
| 110 | 392 | |
| 393 | MDRV_MACHINE_START(multi8) |
| 111 | 394 | MDRV_MACHINE_RESET(multi8) |
| 112 | 395 | |
| 396 | MDRV_I8255A_ADD( "ppi8255_0", ppi8255_intf_0 ) |
| 397 | |
| 113 | 398 | /* video hardware */ |
| 114 | 399 | MDRV_SCREEN_ADD("screen", RASTER) |
| 115 | | MDRV_SCREEN_REFRESH_RATE(50) |
| 400 | MDRV_SCREEN_REFRESH_RATE(60) |
| 116 | 401 | MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ |
| 117 | 402 | MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) |
| 118 | 403 | MDRV_SCREEN_SIZE(640, 200) |
| 119 | | MDRV_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1) |
| 120 | | MDRV_PALETTE_LENGTH(2) |
| 121 | | MDRV_PALETTE_INIT(black_and_white) |
| 404 | MDRV_SCREEN_VISIBLE_AREA(0, 320-1, 0, 200-1) |
| 405 | MDRV_PALETTE_LENGTH(4) |
| 406 | MDRV_PALETTE_INIT(multi8) |
| 122 | 407 | MDRV_GFXDECODE(multi8) |
| 123 | 408 | |
| 124 | 409 | MDRV_MC6845_ADD("crtc", H46505, XTAL_3_579545MHz/2, mc6845_intf) /* unknown clock, hand tuned to get ~60 fps */ |