// v2_zad2.cpp // prevodjenje iz komandne linije: bcc -mh -Ic:\bc31\include -Lc:\bc31\lib v2_zad2.cpp #include #include // zabranjuje prekide #define lock asm cli // dozvoljava prekide #define unlock asm sti // potpis interrupt rutine za rad sa setvect() i getvect() typedef void interrupt (*pInterrupt)(...); // stara prekidna rutina pInterrupt oldISR; // 5s X 18.2tic/s =~ 100tic volatile int cntr = 100; // prekidna rutina void interrupt timer() { if (--cntr == 0) { cntr = 100; cout << "...." << endl; } } // stara prekidna rutina unsigned oldTimerOFF, oldTimerSEG; // postavlja novu prekidnu rutinu // u Interrupt vektor tabeli void inic(){ asm{ cli // zabranjuju se prekidi push es push ax mov ax,0 // inicijalizuje rutinu za tajmer mov es,ax // es = 0 // pamti staru rutinu // oldTimerSEG = [00072h]; - 1Ch*4h+2h=72h mov ax, word ptr es:0072h mov word ptr oldTimerSEG, ax // oldTimerOFF = [00072h]; - 1Ch*4h=70h mov ax, word ptr es:0070h mov word ptr oldTimerOFF, ax // postavlja novu rutinu mov word ptr es:0072h, seg timer mov word ptr es:0070h, offset timer pop ax pop es sti // dozvoljavaju se prekidi } } // restauira staru prekidnu rutinu // u Interrupt vektor tabeli void restore(){ asm { cli push es push ax mov ax,0 mov es,ax // vraca originalnu rutinu mov ax, word ptr oldTimerSEG mov word ptr es:0072h, ax mov ax, word ptr oldTimerOFF mov word ptr es:0070h, ax pop ax pop es sti } } void doSomething() { for (int i = 0; i < 30; ++i) { // ispis ne sme da se prekida!!! // konzola je deljeni resurs lock cout << i << endl; unlock for (int j = 0; j< 30000; ++j) for (int k = 0; k < 30000; ++k); } } int main(){ inic(); doSomething(); restore(); return 0; }