home *** CD-ROM | disk | FTP | other *** search
- OPT MODULE
- OPT EXPORT
-
- MODULE 'dos/dos',
- 'hardware/intbits',
- 'exec/interrupts','exec/memory','exec/nodes'
-
- ENUM ERR_ECODE,ERR_SIG
-
- OBJECT vbsig
- intdata[4]:ARRAY OF LONG,
- vbint,
- mainsignum,
- mainsig
- ENDOBJECT
-
- PROC vbsig(countto,pri) OF vbsig HANDLE
- DEF vbint:PTR TO is,
- maintask=NIL,mainsignum=-1,mainsig
-
- vbint:=NewM(SIZEOF is,MEMF_PUBLIC OR MEMF_CLEAR)
- vbint.ln.type:=NT_INTERRUPT
- vbint.ln.pri:=pri -> -60
- vbint.ln.name:='vbsig'
- vbint.data:=self.intdata
- vbint.code:={vbsigserver}
- IF vbint.code=NIL THEN Raise(ERR_ECODE)
-
- maintask:=FindTask(NIL)
- IF (mainsignum:=AllocSignal(-1))=-1 THEN Raise(ERR_SIG)
- mainsig:=Shl(1,mainsignum)
-
- self.intdata[0]:=0
- self.intdata[1]:=countto
- self.intdata[2]:=maintask
- self.intdata[3]:=mainsig
-
- self.vbint:=vbint
- self.mainsignum:=mainsignum
- self.mainsig:=mainsig
-
- AddIntServer(INTB_VERTB,vbint)
-
- RETURN
-
- vbsigserver:
- MOVE.L A1,A5 -> save is_Data pointer to scratch
- MOVE.L (A1),D0
- CMP.L 4(A1),D0 -> beyond countto amount?
- BGT.S then -> then clause
- ADDQ.L #1,(A1) -> else increment countto
- BRA.S exit
- then:
- CLR.L (A1) -> reset counter
- MOVE.L $4.W,A6 -> execbase
- MOVE.L 12(A1),D0 -> signals
- MOVE.L 8(A1),A1 -> task to signal
- JSR -324(A6) -> Signal()
- exit:
- MOVE.L A5,A1 -> restore is_Data
- MOVE.L #$DFF000,A0 -> vb int bug in AmigaOS
- MOVEQ #0,D0 -> set zero flag (= continue server chain)
- RTS
- EXCEPT DO
- IF vbint THEN Dispose(vbint)
- IF mainsignum<>-1 THEN FreeSignal(mainsignum)
- SELECT exception
- CASE ERR_ECODE; PrintF('vbsig() - Out of memory in eCodeIntServer().\n')
- CASE ERR_SIG; PrintF('vbsig() - No signals available.\n')
- CASE "MEM"; PrintF('vbsig() - Out of memory.\n')
- ENDSELECT
- ENDPROC
-
- PROC end() OF vbsig
- RemIntServer(INTB_VERTB,self.vbint)
-
- IF self.vbint THEN Dispose(self.vbint)
- IF self.mainsignum<>-1 THEN FreeSignal(self.mainsignum)
- ENDPROC
-