home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c072 / 1.ddi / SSTACK.ASM < prev    next >
Encoding:
Assembly Source File  |  1987-09-19  |  3.1 KB  |  102 lines

  1.         PAGE     66,132
  2.  
  3. ; Program SSTACK - Set up larger stack for Interrupt Routine
  4. ;  by Stephen R. Davis, 1987
  5. ;
  6. ; Because of the extreme stack demands of Turbo C, it is necessary
  7. ; to set up a larger stack before entering interrupt routines written
  8. ; in Turbo C with some versions of DOS.  In particular, Programs 9_2b
  9. ; and c work fine with DOS 3.0 but require SSTACK with 3.1.  SSTACK
  10. ; should only be executed as a .COM program.
  11. ;
  12.  
  13. VECT    EQU     68H                     ;SET TO UNUSED INTERRUPT
  14.  
  15. CSEG    SEGMENT  
  16.         ASSUME CS:CSEG,DS:CSEG,SS:CSEG
  17.         ORG      100H                   ;MAKE THIS INTO A .COM FILE
  18.  
  19. START:
  20.         JMP     INSTALL
  21.  
  22.         ORG     200H
  23. SAVESP  DW      0                       ;ALLOCATE PLACE TO STORE OLD SS:SP
  24. SAVESS  DW      0
  25. SFLAG   DW      0
  26.  
  27. INTRUPT:
  28.         CMP     CS:SFLAG,0              ;IS FLAG CLEAR?
  29.         JZ      NEWSTACK
  30.         INT     68H
  31.         IRET
  32. NEWSTACK:
  33.         MOV     CS:SFLAG,1
  34.         MOV     CS:SAVESP,SP            ;SAVE CALLER'S STACK
  35.         MOV     CS:SAVESS,SS
  36.         MOV     SP,CS                   ;PUT IN OUR OWN
  37.         MOV     SS,SP
  38.         MOV     SP,200H
  39.  
  40.         INT     VECT                    ;NOW INVOKE CLOCK INTERRUPT
  41.  
  42.         MOV     SS,CS:SAVESS            ;NOW RESTORE CALLER'S STACK
  43.         MOV     SP,CS:SAVESP
  44.         MOV     CS:SFLAG,0
  45.         IRET
  46. ENDINT:
  47.  
  48.       MESSG   DB "Clock interrupt stack helper installed",0DH,0AH,"$"
  49.       NOTUSMSG DB "Interrupt already in use -- try another",0DH,0AH,"$"
  50.       USMSG   DB "Do not install SSTACK more than once",0DH,0AH,"$"
  51.  
  52.         ASSUME CS:CSEG,DS:CSEG,SS:CSEG
  53. INSTALL:
  54.         MOV     AX,3500H+VECT           ;CHECK THE TARGET VECTOR
  55.         INT     21H
  56.         OR      BX,BX                   ;IN USE?
  57.         JNZ     ERR
  58.                                         ;NO - GO AHEAD THEN
  59.         MOV     AX,3508H                ;GET TIMER VECTOR
  60.         INT     21H
  61.         MOV     DX,BX                   ;INSTALL TIMER INTO 'VECT'
  62.         MOV     AX,ES
  63.         PUSH    DS
  64.         MOV     DS,AX
  65.         MOV     AX,2500H+VECT
  66.         INT     21H
  67.         POP     DS
  68.  
  69.         MOV     DX,OFFSET INTRUPT       ;INSTALL OURSELVES IN CLOCK INT
  70.         MOV     AX,2508H
  71.         INT     21H
  72.  
  73.         MOV     DX,OFFSET MESSG         ;SEND ALL'S WELL MESSAGE
  74.         MOV     AH,09H
  75.         INT     21H
  76.  
  77.         MOV     AX,3100H                ;KEEP PROCESS WITH 0 ERROR CODE
  78.         MOV     DX,OFFSET ENDINT
  79.         MOV     CL,4                    ;CONVERT BYTES TO PARAGRAPHS
  80.         SHR     DX,CL
  81.         INC     DX                      ;ACCOUNT FOR ROUND OFF
  82.         INT     21H
  83.         
  84.  
  85. ERR:
  86.         MOV     AX,3508H                ;GET THE TIMER INTERRUPT
  87.         INT     21H
  88.  
  89.         CMP     BX,OFFSET INTRUPT       ;IT IS US?
  90.         MOV     DX,OFFSET NOTUSMSG      ;ASSUME IT ISN'T
  91.         JNZ     NOTUS
  92.         MOV     DX,OFFSET USMSG         ;IT IS US
  93. NOTUS:
  94.         MOV     AH,09H
  95.         INT     21H
  96.  
  97.         MOV     AX,4CFFH                ;TERMINATE WITH FF ERROR CODE
  98.         INT     21H
  99.         
  100.         CSEG    ENDS
  101.         END      START
  102.