void SourceCodeView::setSourceContext(const QString &fileName, const int lineNum) { m_fileToLoad.clear(); setToolTip(fileName); if (fileName.isEmpty()) { clear(); m_currentFileName.clear(); appendHtml(tr("<i>Source code not available</i>")); return; } if (m_isActive) { showSourceCode(fileName, lineNum); } else { m_fileToLoad = fileName; m_lineNumToLoad = lineNum; } }
void main(int argc, char* argv[]) { bool singleClock = false; genAGCStates(); MON::displayAGC(); while(1) { // NOTE: assumes that the display is always pointing to the start of // a new line at the top of this loop! // Clock the AGC, but between clocks, poll the keyboard // for front-panel input by the user. This uses a Microsoft function; // substitute some other non-blocking function to access the keyboard // if you're porting this to a different platform. cout << "> "; cout.flush(); // display prompt while( !_kbhit() ) { if(MON::FCLK || singleClock) { // This is a performance enhancement. If the AGC is running, // don't check the keyboard or simulator display every simulation // cycle, because that slows the simulator down too much. int genStateCntr = 100; do { CLK::clkAGC(); singleClock = false; genAGCStates(); genStateCntr--; // This needs more work. It doesn't always stop at the // right location and sometimes stops at the instruction // afterwards, too. if(breakpointEnab && breakpoint == MBF::getEffectiveAddress()) { MON::RUN = 0; } // Halt right after the instruction that changes a watched // memory location. if(watchEnab) { unsigned newWatchValue = MBF::readMemory(watchAddr); if(newWatchValue != oldWatchValue) { MON::RUN = 0; } oldWatchValue = newWatchValue; } } while (MON::FCLK && MON::RUN && genStateCntr > 0); updateAGCDisplay(); } // for convenience, clear the single step switch on TP1; in the // hardware AGC, this happens when the switch is released if(MON::STEP && TPG::register_SG.read() == TP1) MON::STEP = 0; } char key = _getch(); // Keyboard controls for front-panel: switch(key) { // AGC controls // simulator controls case 'q': cout << "QUIT..." << endl; exit(0); case 'm': showMenu(); break; case 'd': genAGCStates(); MON::displayAGC(); break; // update display case 'l': loadMemory(); break; case 'e': examineMemory(); break; case 'f': showSourceCode(); break; case ']': incrCntr(); //genAGCStates(); //displayAGC(EVERY_CYCLE); break; case '[': decrCntr(); //genAGCStates(); //displayAGC(EVERY_CYCLE); break; case 'i': interrupt(); //genAGCStates(); //displayAGC(EVERY_CYCLE); break; case 'z': //SCL::F17 = (SCL::F17 + 1) % 2; genAGCStates(); MON::displayAGC(); break; case 'x': //SCL::F13 = (SCL::F13 + 1) % 2; genAGCStates(); MON::displayAGC(); break; case 'r': MON::RUN = (MON::RUN + 1) % 2; genAGCStates(); if(!MON::FCLK) MON::displayAGC(); break; case 's': MON::STEP = (MON::STEP + 1) % 2; genAGCStates(); if(!MON::FCLK) MON::displayAGC(); break; case 'a': MON::SA = (MON::SA + 1) % 2; genAGCStates(); MON::displayAGC(); break; case 'n': MON::INST = (MON::INST + 1) % 2; genAGCStates(); MON::displayAGC(); break; case 'p': MON::PURST = (MON::PURST + 1) % 2; genAGCStates(); MON::displayAGC(); break; case 'b': toggleBreakpoint(); break; case 'y': toggleWatch(); break; // DSKY: case '0': KBD::keypress(KEYIN_0); break; case '1': KBD::keypress(KEYIN_1); break; case '2': KBD::keypress(KEYIN_2); break; case '3': KBD::keypress(KEYIN_3); break; case '4': KBD::keypress(KEYIN_4); break; case '5': KBD::keypress(KEYIN_5); break; case '6': KBD::keypress(KEYIN_6); break; case '7': KBD::keypress(KEYIN_7); break; case '8': KBD::keypress(KEYIN_8); break; case '9': KBD::keypress(KEYIN_9); break; case '+': KBD::keypress(KEYIN_PLUS); break; case '-': KBD::keypress(KEYIN_MINUS); break; case '.': KBD::keypress(KEYIN_CLEAR); break; case '/': KBD::keypress(KEYIN_VERB); break; case '*': KBD::keypress(KEYIN_NOUN); break; case 'g': KBD::keypress(KEYIN_KEY_RELEASE); break; case 'h': KBD::keypress(KEYIN_ERROR_RESET); break; case 'j': KBD::keypress(KEYIN_ENTER); break; case '\0': // must be a function key key = _getch(); switch(key) { case 0x3b: // F1: single clock pulse (when system clock off) singleClock = true; break; case 0x3c: // F2: manual clock (FCLK=0) MON::FCLK = 0; genAGCStates(); MON::displayAGC(); break; case 0x3e: // F4: fast clock (FCLK=1) MON::FCLK = 1; genAGCStates(); MON::displayAGC(); break; default: cout << "function key: " << key << "=" << hex << (int) key << dec << endl; } break; //default: cout << "??" << endl; default: cout << key << "=" << hex << (int) key << dec << endl; } } }