UINT8 mboard_state::read_board() { UINT8 i_18, i_AH; UINT8 data; data = 0xff; /* Example board scan: Starting postion and pawn on E2 is lifted mask: 7f 0111 1111 Line 8 data: 0 0000 0000 all fields occupied mask: bf 1011 1111 Line 7 data: 0 0000 0000 all fields occupied mask: df 1101 1111 Line 6 data: ff 1111 1111 all fields empty mask: ef 1110 1111 Line 5 data: ff 1111 1111 all fields empty mask: f7 1111 0111 Line 4 data: ff 1111 1111 all fields empty mask: fb 1111 1011 Line 3 data: ff 1111 1111 all fields empty mask: fd 1111 1101 Line 2 data: 10 0001 0000 E2 is empty rest is occupied mask: fe 1111 1110 Line 1 data: 0 0000 0000 all fields occupied */ /* looking for cleared bit in mask Line18_REED => current line */ if (data && Line18_REED) { i_18 = get_first_cleared_bit(Line18_REED); if (i_18 == NOT_VALID) printf("No cleared bit in mask Line18_REED!\n"); else { /* looking for a piece in this line and clear bit in data if found */ for (i_AH = 0; i_AH < 8; i_AH = i_AH + 1) if (IsPiece(64 - (i_18 * 8 + 8 - i_AH))) data &= ~(1 << i_AH); // clear bit read_board_flag = TRUE; } } return data; }
static READ8_HANDLER( supercon_port4_r ) { supercon_state *state = space->machine().driver_data<supercon_state>(); int i_18, i_AH; UINT8 key_data = 0x00;; static const char *const board_lines[8] = { "BOARD_1", "BOARD_2", "BOARD_3", "BOARD_4", "BOARD_5", "BOARD_6", "BOARD_7", "BOARD_8" }; LOG(("Read from %04x \n",0x1F00)); /* Board buttons */ i_18=get_first_bit(state->m_data_1E00); if (i_18==NOT_VALID) return 0xff; /* if a button was pressed wait til timer -timer_mouse_click- is fired */ if (state->m_selecting) return state->m_save_key_data; else { set_pieces(state); output_set_value("MOVING",state->m_moving_piece); } key_data=input_port_read(space->machine(), board_lines[i_18]); if (key_data != 0xff) { LOG(("%s key_data: %02x \n",board_lines[i_18],key_data)); /* Only if valid data and mouse button is pressed */ if (key_data && input_port_read(space->machine(), "BUTTON_L")) { /* Set or remove pieces */ i_AH=7-get_first_cleared_bit(key_data); LOG(("Press -> AH: %d 18: %d Piece: %d\n",i_AH,i_18,state->m_board[i_18*8 + i_AH]););