[Back to ISR SWAG index]  [Back to Main SWAG index]  [Original]

{
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.


[Back to ISR SWAG index]  [Back to Main SWAG index]  [Original]