home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaMiscModsCD3.iso / _PROGRAMME / PLAYER / GUI / EasyPlayer.lha / EYP / Source / modsrc / vbsig.e < prev    next >
Encoding:
Text File  |  1999-09-20  |  1.8 KB  |  80 lines

  1. OPT MODULE
  2. OPT EXPORT
  3.  
  4. MODULE 'dos/dos',
  5. 'hardware/intbits',
  6. 'exec/interrupts','exec/memory','exec/nodes'
  7.  
  8. ENUM ERR_ECODE,ERR_SIG
  9.  
  10. OBJECT vbsig
  11.     intdata[4]:ARRAY OF LONG,
  12.     vbint,
  13.     mainsignum,
  14.     mainsig
  15. ENDOBJECT
  16.  
  17. PROC vbsig(countto,pri) OF vbsig HANDLE
  18. DEF vbint:PTR TO is,
  19. maintask=NIL,mainsignum=-1,mainsig
  20.  
  21.     vbint:=NewM(SIZEOF is,MEMF_PUBLIC OR MEMF_CLEAR)
  22.     vbint.ln.type:=NT_INTERRUPT
  23.     vbint.ln.pri:=pri -> -60
  24.     vbint.ln.name:='vbsig'
  25.     vbint.data:=self.intdata
  26.     vbint.code:={vbsigserver}
  27.     IF vbint.code=NIL THEN Raise(ERR_ECODE)
  28.  
  29.     maintask:=FindTask(NIL)
  30.     IF (mainsignum:=AllocSignal(-1))=-1 THEN Raise(ERR_SIG)
  31.     mainsig:=Shl(1,mainsignum)
  32.  
  33.     self.intdata[0]:=0
  34.     self.intdata[1]:=countto
  35.     self.intdata[2]:=maintask
  36.     self.intdata[3]:=mainsig
  37.  
  38.     self.vbint:=vbint
  39.     self.mainsignum:=mainsignum
  40.     self.mainsig:=mainsig
  41.  
  42.     AddIntServer(INTB_VERTB,vbint)
  43.  
  44.     RETURN
  45.  
  46. vbsigserver:
  47.     MOVE.L A1,A5 -> save is_Data pointer to scratch
  48.     MOVE.L (A1),D0
  49.     CMP.L 4(A1),D0 -> beyond countto amount?
  50.     BGT.S then -> then clause
  51.     ADDQ.L #1,(A1) -> else increment countto
  52.     BRA.S exit
  53. then:
  54.     CLR.L (A1) -> reset counter
  55.     MOVE.L $4.W,A6 -> execbase
  56.     MOVE.L 12(A1),D0 -> signals
  57.     MOVE.L 8(A1),A1 -> task to signal
  58.     JSR -324(A6) -> Signal()
  59. exit:
  60.     MOVE.L A5,A1 -> restore is_Data
  61.     MOVE.L #$DFF000,A0 -> vb int bug in AmigaOS
  62.     MOVEQ #0,D0 -> set zero flag (= continue server chain)
  63.     RTS
  64. EXCEPT DO
  65.     IF vbint THEN Dispose(vbint)
  66.   IF mainsignum<>-1 THEN FreeSignal(mainsignum)
  67.     SELECT exception
  68.         CASE ERR_ECODE; PrintF('vbsig() - Out of memory in eCodeIntServer().\n')
  69.         CASE ERR_SIG;   PrintF('vbsig() - No signals available.\n')
  70.         CASE "MEM"; PrintF('vbsig() - Out of memory.\n')
  71.     ENDSELECT
  72. ENDPROC
  73.  
  74. PROC end() OF vbsig
  75.     RemIntServer(INTB_VERTB,self.vbint)
  76.  
  77.     IF self.vbint THEN Dispose(self.vbint)
  78.   IF self.mainsignum<>-1 THEN FreeSignal(self.mainsignum)
  79. ENDPROC
  80.