home *** CD-ROM | disk | FTP | other *** search
- {
- It can make sense to Write Method-ISR's. Two examples:
-
- 1. Implementation of a timer-IRQ-triggered eventQueue (a body of such an
- Object I append to this mail).
-
- 2. Objects For serial-IO. You can have up to 8 or 16 serial channels (with
- special hardware). The priciples of encapsulation and instances suggests
- an OOPS-solution! Why not including the ISR-Routine into the Object?
- I'm not happy about the intentional misunderstandings to your request
- in this area :-|
-
- However, the next 2K are my act of revenge to your repliers: :-D
- (Gentlemen: No flames please, I know that the demo itself makes no sense
- and procedural Programming For such a simple output would be easier
- and shorter!!! All I want to show, is a toRSO of an OOPS-solution For ISR's.)
- }
-
- Program isrDemo;
- {$F+,S-}
- Uses
- Crt,Dos;
- Type
- timerObj = Object
- saveInt,
- myjob : Pointer;
- stopped : Boolean;
- Constructor Init(job:Pointer);
- Destructor DeInit;
- PRIVATE
- Procedure timerInt;
- end;
- Const
- timerSelf : Pointer = NIL;
-
- Constructor timerObj.Init(job:Pointer);
- begin
- if timerSelf<>NIL then FAIL; { only one instance in this demo }
- timerSelf:=@self;
- myjob:=job;
- stopped:=False;
- getintvec($1C,saveInt);
- setintvec($1C,@timerObj.timerInt);
- end;
-
- Destructor timerObj.DeInit;
- begin
- setintvec($1C,saveint); timerSelf:=NIL;
- end;
-
- Procedure timerObj.timerInt; Assembler;
- Label
- _10;
- Asm
- pop bp { Compiler inserts PUSH BP - restore it }
- push ax
- push bx
- push cx
- push dx
- push si
- push di
- push ds
- push es
- push bp
- mov al,20h { send EOI }
- out 20h,al
- sti
-
- mov bp,sp
- mov ax,SEG @DATA
- mov ds,ax
- les di,[offset timerSelf] { only one instance in this demo! }
- cmp es:[di+stopped],0 { prevents IRQ-overruns }
- jne _10
- inc es:[di+stopped]
- call dWord ptr es:[di+offset myjob]; { no test of NIL implemented }
- les di,[offset timerSelf]
- dec es:[di+stopped]
-
- _10:
- call dWord ptr es:[di+saveInt] { call original inT-Proc }
- mov sp,bp
- pop bp
- pop es
- pop ds
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- iret
- end;
- (*********************** DemoShell **************************)
- Var
- timer : timerObj;
-
- Procedure helloHerb;
- begin
- Write('.');
- end;
-
- begin
- if timer.Init(@helloHerb) then
- begin
- Delay(5000);
- timer.DeInit;
- end;
- end.
-