home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / progpas / opstack.arj / OPSTACK.ASM next >
Assembly Source File  |  1990-01-15  |  4KB  |  109 lines

  1. ;******************************************************
  2. ;                  OPSTACK.ASM 1.00
  3. ;               by TurboPower Software
  4. ;******************************************************
  5.  
  6. ;****************************************************** Equates
  7.  
  8. Ofst            EQU     (WORD PTR 0)
  9. Segm            EQU     (WORD PTR 2)
  10.  
  11. ;****************************************************** Data
  12.  
  13. DATA    SEGMENT WORD PUBLIC
  14.  
  15.         EXTRN   OurSS : WORD            ;value of SS when program began
  16.         EXTRN   LowestSP : WORD         ;lowest value for SP
  17.         EXTRN   HeapHigh : DWORD        ;highest address pointed to by HeapPtr
  18.         EXTRN   HeapPtr : DWORD
  19.         EXTRN   FreePtrLow : WORD       ;lowest offset pointed to by FreePtr
  20.         EXTRN   FreePtr : DWORD
  21.         EXTRN   CountsPerTick : WORD
  22.         EXTRN   Counts : WORD
  23.  
  24. DATA    ENDS
  25.  
  26. ;****************************************************** Code
  27.  
  28. CODE    SEGMENT BYTE PUBLIC
  29.  
  30.         ASSUME  CS:CODE,DS:DATA
  31.  
  32.         PUBLIC  ActualSaveInt8, Int8
  33.  
  34. ActualSaveInt8  DD      0               ;stores previous INT 8 handler
  35.  
  36. ;****************************************************** Int8
  37.  
  38. ;procedure Int8;
  39. ;Interrupt service routine used to monitor stack and heap usage
  40.  
  41. Flags   EQU     WORD PTR [BP+6]         ;position of pushed flags
  42.  
  43. Int8    PROC NEAR
  44.  
  45.         PUSH    BP                      ;set up stack frame
  46.         MOV     BP,SP
  47.         PUSH    AX                      ;save registers used
  48.         PUSH    DI
  49.         PUSH    DS
  50.         MOV     AX,SEG DATA             ;set up DS
  51.         MOV     DS,AX
  52.  
  53.         MOV     AX,SS                   ;make sure we're in the right SS
  54.         CMP     AX,OurSS
  55.         JNE     WrongSS
  56.  
  57.         LEA     DI,Flags                ;flags are where SS:SP was when the
  58.         CMP     DI,LowestSP             ;interrupt occurred
  59.         JNB     WrongSS
  60.         MOV     LowestSP,DI
  61.  
  62. WrongSS:
  63.         ;compare HeapPtr and HeapHigh; both are normalized
  64.         MOV     AX,HeapPtr.Segm         ;HeapPtr into AX:DI
  65.         MOV     DI,HeapPtr.Ofst
  66.         CMP     AX,HeapHigh.Segm        ;if the segment is higher,
  67.         JA      IsHigher                ;HeapPtr points higher
  68.         JNE     HeapDone                ;check offsets only if segments equal
  69.         CMP     DI,HeapHigh.Ofst        ;done if offset isn't higher
  70.         JNA     HeapDone
  71.  
  72. IsHigher:
  73.         MOV     HeapHigh.Ofst,DI        ;HeapHigh = HeapPtr
  74.         MOV     HeapHigh.Segm,AX
  75.  
  76. HeapDone:
  77.         ;compare FreePtr and FreePtrLow
  78.         MOV     AX,FreePtr.Ofst         ;FreePtr.Ofst into AX
  79.         OR      AX,AX                   ;Exit if Ofst = 0
  80.         JZ      Done
  81.         CMP     AX,FreePtrLow           ;Is current offset lower?
  82.         JNB     Done
  83.         MOV     FreePtrLow,AX           ;FreePtrLow = FreePtr.Ofst
  84.  
  85. Done:   INC     Counts                  ;increment counter
  86.         MOV     AX,CountsPerTick        ;see if we need to chain to old ISR
  87.         CMP     Counts,AX
  88.         JAE     Chain
  89.         MOV     AL,20h                  ;send EOI to interrupt controller
  90.         OUT     20h,AL
  91.         POP     DS                      ;restore registers used
  92.         POP     DI
  93.         POP     AX
  94.         POP     BP
  95.         IRET
  96.  
  97. Chain:  MOV     Counts,0                ;reset counter
  98.         POP     DS                      ;restore registers used
  99.         POP     DI
  100.         POP     AX
  101.         POP     BP
  102.         JMP     DWORD PTR ActualSaveInt8 ;chain to old INT $8 handler
  103.  
  104. Int8    ENDP
  105.  
  106. CODE    ENDS
  107.  
  108.         END
  109.