int Game::collapse() { int c = (int)clearBarPos; if (c == lastClearedRow) return 0; int numClearedThisPass = 0; for (int r = board_height_ + 2; r>= 0; --r) { if ((get(r, c) == XCLEARBLOCKCOL || get(r, c) == OCLEARBLOCKCOL ) && r != py_) { // Collapse ClearedBlock clr; clr.r = r; clr.c = c; clr.col = get(r, c); //viewer->addParticleBox(c, r, get(r,c)); blocksJustCleared.push_back(clr); get(r, c) = -1; pullDown(r, c); lastClearedRow = c; numBlocksCleared++; score_ += (linesCleared_+10) / 10; linesCleared_++; numClearedThisPass++; } } // Pull pieces down return numClearedThisPass; }
static void Write(uint8_t data) { pullUp(); DELAY_US(5); for (int i = 0; i < 8; i ++) { DELAY_US(10); pullDown(); if (data & 0x01) { DELAY_US(5); pullUp(); DELAY_US(55); } else { DELAY_US(60); pullUp(); } data >>= 1; } }
static uint8_t Read() { uint8_t data = 0; uint8_t bit = 1; for (int i = 0; i < 8; i ++) { DELAY_US(10); pullDown(); DELAY_US(1); pullUp(); DELAY_US(5); if (isBusHigh()) { data |= bit; } bit <<= 1; DELAY_US(60); } return data; }
static bool Reset() { pullUp(); DELAY_US(10); pullDown(); DELAY_US(480); pullUp(); DELAY_US(60); if (isBusHigh()) { return false; } DELAY_US(300); return isBusHigh(); }