pmk@cip-s01.informatik.rwth-aachen.de (Michael Keukert) (10/23/89)
And here comes another part in the famous series "Turbo-Pascal extreme". Today: Interrupt programming in Turbo-Pascal 5.0 Only few people now, that TP provides full interrupt programming. I admit, that I haven't knew it myself for a long time. One reason is, that the TP manuals aren't very informative on that theme and, honestly, who reads a manual from the beginning to the end? This is, I think, a pity because interrupt programming in TP isn't mystic nor tricky nor very hard to do. No, it's quite a simple thing to do: The following program displays the current time in the leftmost/topmost corner of the screen while a little junk-program is running: program interrupt_test; uses dos,crt; var a:integer; adr:pointer; s:string; {The following procedure is going to be put into an interrupt} {$F+} {Far-Compiling is needed for direct adressing} procedure test(flags,cs,ip,ax,bx,cx,dx,si,di,ds,es,bp:word); interrupt; { This procedure displays the current time in the leftmost/topmost corner of the screen } var hour,minute,second,sec100:word; x_pos,y_pos:byte; { current cursor-position } begin gettime(hour,minute,second,sec100); { get current time } x_pos:=wherex; { get cursor position } y_pos:=wherey; gotoxy(1,1); { goto top position } write(hour:2,':',minute:2,':',second:2,'.',sec100); gotoxy(x_pos,y_pos); { restore cursor position } end; {$F-} {main} begin clrscr; writeln; writeln; writeln('Please enter a word'); getintvec(28,adr); { Get's the original interrupt value } setintvec(28,@test); { Enter's the new adress } repeat { A "junk" program to demonstrate } readln(s); { that the program continous } for a:=length(s) downto 1 do { running... } write(s[a]); writeln; until s=''; setintvec(28,adr); { Restores the original value } end. Pay attention to: The head of the interrupt-procedure MUST contain all the DOS-Registers, even when they're not used in the procedure. The key-word INTERRUPT must follow the head immediatly! Note, that the procedure isn't called in the main-program by name. It starts with the line SetIntVec(28,@test). The @ indicates the physical address of the procedure. Summary: Program name; . . procedure to_be_interrupted (flags,,cs,ip,ax,bx,cx,dx,si,di,ds,es,bp:word); interrupt; begin . . end; . . begin {main} . . SetIntVec(IntNo:byte; vector:pointer); . . end. PMK@CIP-S01.INFORMATIK.RWTH-AACHEN.DE ! Warning! UNIX-Newcomer! Michael Keukert of 2:242/2 (Fido-Net) ! No flames please .... PMK@EIKO.ZER (Zerberus-Net) ! ... I'm still learning.