src/mess/drivers/bml3.c
| r8645 | r8646 | |
| 32 | 32 | { |
| 33 | 33 | int tile = vram[count+0x0000]; |
| 34 | 34 | int color = vram[count+0x4000] & 7; |
| 35 | int reverse = vram[count+0x4000] & 8; |
| 35 | 36 | //attr & 0x10 is used ... bitmap mode? (apparently bits 4 and 7 are used for that) |
| 36 | 37 | |
| 37 | 38 | for(yi=0;yi<8;yi++) |
| r8645 | r8646 | |
| 40 | 41 | { |
| 41 | 42 | int pen; |
| 42 | 43 | |
| 43 | | pen = (gfx_rom[tile*8+yi] >> (7-xi) & 1) ? color : 0; |
| 44 | if(reverse) |
| 45 | pen = (gfx_rom[tile*8+yi] >> (7-xi) & 1) ? 0 : color; |
| 46 | else |
| 47 | pen = (gfx_rom[tile*8+yi] >> (7-xi) & 1) ? color : 0; |
| 44 | 48 | |
| 45 | 49 | *BITMAP_ADDR16(bitmap, y*8+yi, x*8+xi) = screen->machine->pens[pen]; |
| 46 | 50 | } |
| r8645 | r8646 | |
| 100 | 104 | } |
| 101 | 105 | } |
| 102 | 106 | |
| 103 | | /* |
| 104 | | Keyboard scancode table (notice that we're using Sharp X1 char, so some bits might be different): |
| 105 | | 0x00: right or space |
| 106 | | 0x01: up |
| 107 | | 0x02: ? |
| 108 | | 0x03: left |
| 109 | | 0x04: down |
| 110 | | 0x05: right or space |
| 111 | | 0x06 |
| 112 | | 0x07: (changes the items at the bottom, caps lock?) |
| 113 | | 0x08 |
| 114 | | 0x09 |
| 115 | | 0x0a |
| 116 | | 0x0b |
| 117 | | 0x0c |
| 118 | | 0x0d: 8 |
| 119 | | 0x0e: 9 |
| 120 | | 0x0f: * |
| 121 | | 0x10: 7 |
| 122 | | 0x11: 4 |
| 123 | | 0x12: 6 |
| 124 | | 0x13: 8 |
| 125 | | 0x14: 0 |
| 126 | | 0x15: ^ |
| 127 | | 0x16: - |
| 128 | | 0x17: 3 |
| 129 | | 0x18: backspace |
| 130 | | 0x19: 5 |
| 131 | | 0x1a: 1 |
| 132 | | 0x1b: 2 |
| 133 | | 0x1c: 9 |
| 134 | | 0x1d: 7 |
| 135 | | 0x1e: backspace |
| 136 | | 0x1f: Yen symbol? |
| 137 | | 0x20: U |
| 138 | | 0x21: R |
| 139 | | 0x22: Y |
| 140 | | 0x23: I |
| 141 | | 0x24: P |
| 142 | | 0x25: [ |
| 143 | | 0x26: @ |
| 144 | | 0x27: 0 |
| 145 | | 0x28: Q |
| 146 | | 0x29: T |
| 147 | | 0x2a: W |
| 148 | | 0x2b: E |
| 149 | | 0x2c: O |
| 150 | | 0x2d: . |
| 151 | | 0x2e: HOME |
| 152 | | 0x2f: ENTER |
| 153 | | 0x30: J |
| 154 | | 0x31: F |
| 155 | | 0x32: H |
| 156 | | 0x33: K |
| 157 | | 0x34: ; |
| 158 | | 0x35: ] |
| 159 | | 0x36: : |
| 160 | | 0x37: 4 |
| 161 | | 0x38: A |
| 162 | | 0x39: G |
| 163 | | 0x3a: S |
| 164 | | 0x3b: D |
| 165 | | 0x3c: L |
| 166 | | 0x3d: 5 |
| 167 | | 0x3e: 6 |
| 168 | | 0x3f: - |
| 169 | | 0x40: M |
| 170 | | 0x41: V |
| 171 | | 0x42: N |
| 172 | | 0x43: , |
| 173 | | 0x44: / |
| 174 | | 0x45: / |
| 175 | | 0x46: _ |
| 176 | | 0x47: 1 |
| 177 | | 0x48: Z |
| 178 | | 0x49: B |
| 179 | | 0x4a: X |
| 180 | | 0x4b: C |
| 181 | | 0x4c: . |
| 182 | | 0x4d: 2 |
| 183 | | 0x4e: 3 |
| 184 | | 0x4f: + |
| 185 | | 0x50: PF1 |
| 186 | | 0x51: PF2 |
| 187 | | 0x52: PF3 |
| 188 | | 0x53: PF4 |
| 189 | | 0x54: PF5 |
| 190 | | 0x55-0x7f: unused |
| 191 | | */ |
| 192 | | |
| 193 | 107 | static READ8_HANDLER( bml3_keyboard_r ) |
| 194 | 108 | { |
| 195 | | static int scancode; |
| 109 | const char* portnames[3] = { "key1","key2","key3" }; |
| 110 | int i,port_i,scancode; |
| 111 | scancode = 0; |
| 196 | 112 | |
| 197 | | if(input_code_pressed_once(space->machine, KEYCODE_Z)) |
| 198 | | scancode++; |
| 113 | for(port_i=0;port_i<3;port_i++) |
| 114 | { |
| 115 | for(i=0;i<32;i++) |
| 116 | { |
| 117 | if((input_port_read(space->machine,portnames[port_i])>>i) & 1) |
| 118 | return scancode | 0x80; |
| 199 | 119 | |
| 200 | | if(input_code_pressed_once(space->machine, KEYCODE_X)) |
| 201 | | scancode--; |
| 120 | scancode++; |
| 121 | } |
| 122 | } |
| 202 | 123 | |
| 203 | | popmessage("%02x",scancode); |
| 204 | | |
| 205 | | return scancode | 0x80; |
| 124 | return 0; |
| 206 | 125 | } |
| 207 | 126 | |
| 208 | 127 | /* Note: this custom code is there just for simplicity, it'll be nuked in the end */ |
| r8645 | r8646 | |
| 210 | 129 | { |
| 211 | 130 | static UINT8 *rom = memory_region(space->machine, "maincpu"); |
| 212 | 131 | |
| 213 | | if(offset == 0xc8) //??? |
| 214 | | return 0; |
| 215 | | |
| 216 | | if(offset == 0xc9) |
| 217 | | return 0x11; //put 320 x 200 mode |
| 218 | | |
| 132 | // if(offset == 0xc4) return bml3_cmt_r(space,0); //maybe 0xc4 is the status and 0xc5 the data? d7 and ea seems to be related too |
| 133 | if(offset == 0xc8) return 0; //??? checks bit 7, scrolls vertically if active high |
| 134 | if(offset == 0xc9) return 0x11; //0x01 put 320 x 200 mode, 0x07 = 640 x 375 |
| 135 | if(offset == 0xd8) return attr_latch; |
| 219 | 136 | if(offset == 0xe0) return bml3_keyboard_r(space,0); |
| 220 | 137 | |
| 221 | | // if(offset == 0xcb || offset == 0xc4) |
| 138 | // if(offset == 0xcb) |
| 222 | 139 | |
| 223 | 140 | // if(offset == 0x40 || offset == 0x42 || offset == 0x44 || offset == 0x46) |
| 224 | 141 | |
| r8645 | r8646 | |
| 247 | 164 | { |
| 248 | 165 | static UINT8 *vram = memory_region(space->machine, "vram"); |
| 249 | 166 | |
| 250 | | /* TODO: this presumably also triggers an attr latch read */ |
| 167 | /* TODO: this presumably also triggers an attr latch read, unsure yet */ |
| 168 | attr_latch = vram[offset+0x4000]; |
| 251 | 169 | |
| 252 | 170 | return vram[offset]; |
| 253 | 171 | } |
| r8645 | r8646 | |
| 271 | 189 | |
| 272 | 190 | |
| 273 | 191 | /* Input ports */ |
| 192 | |
| 274 | 193 | static INPUT_PORTS_START( bml3 ) |
| 194 | PORT_START("key1") //0x00-0x1f |
| 195 | PORT_BIT(0x00000001,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') |
| 196 | PORT_BIT(0x00000002,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Up") PORT_CODE(KEYCODE_UP) |
| 197 | PORT_BIT(0x00000004,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("?") |
| 198 | PORT_BIT(0x00000008,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT) |
| 199 | PORT_BIT(0x00000010,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN) |
| 200 | PORT_BIT(0x00000020,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT) |
| 201 | PORT_BIT(0x00000040,IP_ACTIVE_HIGH,IPT_UNKNOWN) |
| 202 | PORT_BIT(0x00000080,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Caps Lock?")// (changes the items at the bottom, caps lock?) |
| 203 | PORT_BIT(0x00000100,IP_ACTIVE_HIGH,IPT_UNKNOWN) |
| 204 | PORT_BIT(0x00000200,IP_ACTIVE_HIGH,IPT_UNKNOWN) |
| 205 | PORT_BIT(0x00000400,IP_ACTIVE_HIGH,IPT_UNKNOWN) |
| 206 | PORT_BIT(0x00000800,IP_ACTIVE_HIGH,IPT_UNKNOWN) |
| 207 | PORT_BIT(0x00001000,IP_ACTIVE_HIGH,IPT_UNKNOWN) |
| 208 | PORT_BIT(0x00002000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CHAR('8') |
| 209 | PORT_BIT(0x00004000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CHAR('9') |
| 210 | PORT_BIT(0x00008000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("*") |
| 211 | PORT_BIT(0x00010000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CHAR('7') |
| 212 | PORT_BIT(0x00020000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CHAR('4') |
| 213 | PORT_BIT(0x00040000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CHAR('6') |
| 214 | PORT_BIT(0x00080000,IP_ACTIVE_HIGH,IPT_UNKNOWN) //8 |
| 215 | PORT_BIT(0x00100000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0') |
| 216 | PORT_BIT(0x00200000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("^") |
| 217 | PORT_BIT(0x00400000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') |
| 218 | PORT_BIT(0x00800000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CHAR('3') |
| 219 | PORT_BIT(0x01000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Backspace") PORT_CODE(KEYCODE_BACKSPACE) |
| 220 | PORT_BIT(0x02000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CHAR('5') |
| 221 | PORT_BIT(0x04000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1') |
| 222 | PORT_BIT(0x08000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHAR('2') |
| 223 | PORT_BIT(0x10000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CHAR('9') |
| 224 | PORT_BIT(0x20000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CHAR('7') |
| 225 | PORT_BIT(0x40000000,IP_ACTIVE_HIGH,IPT_UNKNOWN) //backspace |
| 226 | PORT_BIT(0x80000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("\xC2\xA5") //PORT_NAME("¥") |
| 227 | |
| 228 | PORT_START("key2") //0x20-0x3f |
| 229 | PORT_BIT(0x00000001,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) |
| 230 | PORT_BIT(0x00000002,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) |
| 231 | PORT_BIT(0x00000004,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) |
| 232 | PORT_BIT(0x00000008,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) |
| 233 | PORT_BIT(0x00000010,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) |
| 234 | PORT_BIT(0x00000020,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("[") |
| 235 | PORT_BIT(0x00000040,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("@") |
| 236 | PORT_BIT(0x00000080,IP_ACTIVE_HIGH,IPT_UNKNOWN) //0 |
| 237 | PORT_BIT(0x00000100,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) |
| 238 | PORT_BIT(0x00000200,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) |
| 239 | PORT_BIT(0x00000400,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) |
| 240 | PORT_BIT(0x00000800,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) |
| 241 | PORT_BIT(0x00001000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) |
| 242 | PORT_BIT(0x00002000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(".") |
| 243 | PORT_BIT(0x00004000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("HOME") PORT_CODE(KEYCODE_HOME) //or cls? |
| 244 | PORT_BIT(0x00008000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) |
| 245 | PORT_BIT(0x00010000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) |
| 246 | PORT_BIT(0x00020000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) |
| 247 | PORT_BIT(0x00040000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) |
| 248 | PORT_BIT(0x00080000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) |
| 249 | PORT_BIT(0x00100000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(";") |
| 250 | PORT_BIT(0x00200000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("]") |
| 251 | PORT_BIT(0x00400000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(":") |
| 252 | PORT_BIT(0x00800000,IP_ACTIVE_HIGH,IPT_UNKNOWN) //4 |
| 253 | PORT_BIT(0x01000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) |
| 254 | PORT_BIT(0x02000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) |
| 255 | PORT_BIT(0x04000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) |
| 256 | PORT_BIT(0x08000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) |
| 257 | PORT_BIT(0x10000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) |
| 258 | PORT_BIT(0x20000000,IP_ACTIVE_HIGH,IPT_UNKNOWN) //5 |
| 259 | PORT_BIT(0x40000000,IP_ACTIVE_HIGH,IPT_UNKNOWN) //6 |
| 260 | PORT_BIT(0x80000000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS) |
| 261 | |
| 262 | PORT_START("key3") //0x40-0x5f |
| 263 | PORT_BIT(0x00000001,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) |
| 264 | PORT_BIT(0x00000002,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) |
| 265 | PORT_BIT(0x00000004,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) |
| 266 | PORT_BIT(0x00000008,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(",") PORT_CODE(KEYCODE_COMMA) |
| 267 | PORT_BIT(0x00000010,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("/") PORT_CODE(KEYCODE_BACKSLASH) |
| 268 | PORT_BIT(0x00000020,IP_ACTIVE_HIGH,IPT_UNKNOWN) // / |
| 269 | PORT_BIT(0x00000040,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("_") |
| 270 | PORT_BIT(0x00000080,IP_ACTIVE_HIGH,IPT_UNKNOWN) //1 |
| 271 | PORT_BIT(0x00000100,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) |
| 272 | PORT_BIT(0x00000200,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) |
| 273 | PORT_BIT(0x00000400,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) |
| 274 | PORT_BIT(0x00000800,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) |
| 275 | PORT_BIT(0x00001000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME(".") PORT_CODE(KEYCODE_STOP) |
| 276 | PORT_BIT(0x00002000,IP_ACTIVE_HIGH,IPT_UNKNOWN) |
| 277 | PORT_BIT(0x00004000,IP_ACTIVE_HIGH,IPT_UNKNOWN) |
| 278 | PORT_BIT(0x00008000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("+") PORT_CODE(KEYCODE_PLUS_PAD) |
| 279 | PORT_BIT(0x00010000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF1") PORT_CODE(KEYCODE_F1) |
| 280 | PORT_BIT(0x00020000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF2") PORT_CODE(KEYCODE_F2) |
| 281 | PORT_BIT(0x00040000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF3") PORT_CODE(KEYCODE_F3) |
| 282 | PORT_BIT(0x00080000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF4") PORT_CODE(KEYCODE_F4) |
| 283 | PORT_BIT(0x00100000,IP_ACTIVE_HIGH,IPT_KEYBOARD) PORT_NAME("PF5") PORT_CODE(KEYCODE_F5) |
| 284 | PORT_BIT(0xffe00000,IP_ACTIVE_HIGH,IPT_UNKNOWN) |
| 275 | 285 | INPUT_PORTS_END |
| 276 | 286 | |
| 277 | 287 | |