home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 5 / ctrom5b.zip / ctrom5b / PROGRAM / ASM / ALIB30B / SYS4.ASM < prev    next >
Assembly Source File  |  1994-10-15  |  4KB  |  158 lines

  1.     page    66,132
  2. ;******************************** SYS4.ASM   *********************************
  3.  
  4. LIBSEG           segment byte public "LIB"
  5.         assume cs:LIBSEG , ds:nothing
  6.  
  7. ;----------------------------------------------------------------------------
  8. .xlist
  9.     include  mac.inc
  10.     include  common.inc
  11. .list
  12. ;----------------------------------------------------------------------------
  13.     extrn    breakflag:byte
  14. comment 
  15. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -( SYSTEM  )
  16. BREAK_KEY_INTERCEPT - grab keyboard abort keys
  17. ;
  18. ; inputs:  none
  19. ; output:  none
  20. ;
  21. ; note:      BREAK_KEY_INTERCEPT traps Ctrl+Break, Ctrl+C and
  22. ;            Ctrl-Alt-Del key sequences.  When one of these
  23. ;            key combinations is pressed, the inforation is passed
  24. ;            to KEY_READ, KEY_IF_READY, KEY_OR_MOUSE.
  25. ;* * * * * * * * * * * * * *
  26. 
  27.     public    BREAK_KEY_INTERCEPT
  28. BREAK_KEY_INTERCEPT    PROC    FAR
  29.      nop            ;this NOP is needed
  30.      APUSH   AX,BX,DX,DS,ES
  31.      MOV     AX,3509h
  32.      INT     21h            ;get int09 contents -> es:bx
  33.      MOV     CS:[old_break_off],BX
  34.      MOV     CS:[old_break_seg],ES
  35.      PUSH    CS
  36.      POP     DS
  37.      LEA     DX,[BREAK_INT_HANDLER]
  38.      MOV     AX,2509h
  39.      INT     21h
  40.      MOV     BYTE PTR CS:[BREAK_KEY_RESTORE],90h
  41.      MOV     BYTE PTR CS:[BREAK_KEY_INTERCEPT],0CBh
  42.      APOP    ES,DS,DX,BX,AX
  43.      RETF
  44. BREAK_KEY_INTERCEPT    ENDP
  45. comment 
  46. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -( SYSTEM  )
  47. BREAK_KEY_RESTORE - release keyboard abort keys
  48. ;
  49. ; inputs:    no parameters
  50. ; output:    nothing
  51. ;* * * * * * * * * * * * * *
  52. 
  53.     public    BREAK_KEY_RESTORE
  54. BREAK_KEY_RESTORE    PROC    FAR
  55.      RETF
  56.      APUSH   AX,DX,DS
  57.      LDS     DX,DWORD PTR CS:[old_break_off]
  58.      MOV     AX,2509h
  59.      INT     21h
  60.      MOV     BYTE PTR CS:[BREAK_KEY_INTERCEPT],90h
  61.      MOV     BYTE PTR CS:[BREAK_KEY_RESTORE],0CBh
  62.      APOP    DX,DX,AX
  63.      RETF
  64.  
  65. ;-----------------------------------------
  66. ; Break interrupt handler
  67. ;
  68. BREAK_INT_HANDLER:
  69.      PUSHF
  70.      APUSH   AX,BX,ds,es
  71.      XOR     AX,AX
  72.      MOV     ES,AX
  73.      MOV     AL,BYTE PTR ES:[0417h]    ;get keyboard flags
  74.      AND     AL,0Fh            ;isolate ctrl,alt,shift keys
  75.      CMP     AL,0Ch            ;check for ctrl and alt
  76.      JE      bih_3            ; jmp if ctrl and alt
  77.      CMP     AL,04            ;check if ctrl
  78.      JE      bih_1            ; jmp if ctrl
  79.      JMP     bih_9            ;jmp if not ctrl-break
  80. ;
  81. ; the control key is depressed
  82. ;     
  83. bih_1:
  84.      IN      AL,60h            ;read key from keyboard
  85.      JMP     bih_2
  86. bih_2:
  87.      CMP     AL,46h            ;check for ctrl-break
  88.      JZ      bih_5            ;  jmp if ctrl-bread
  89.      CMP     AL,2Eh            ;check for ctrl-c
  90.      JZ      bih_5            ;  jmp if ctrl-c
  91.      JMP     bih_9        
  92. ;
  93. ; ctrl and alt keys are down
  94. ;     
  95. bih_3:
  96.      IN      AL,60h
  97.      CMP     AL,53h              ;check if DEL key
  98.      JZ      bih_5            ;  jmp if DEL key found
  99.      JMP     bih_9
  100. ;
  101. ; ctrl-c or ctrl-break or ctrl-alt-del  has been found     
  102. ;
  103. bih_5:
  104.      MOV     BYTE PTR BREAKFLAG,01
  105. ;
  106. ; remove the break key from the keyboard
  107. ;     
  108.      IN      AL,61h
  109.      MOV     AH,AL
  110.      OR      AL,80h
  111.      OUT     61h,AL
  112.  
  113.      MOV     AL,20h    ; ' '
  114.      OUT     20h,AL
  115.      APOP    es,ds,BX,AX
  116.      POPF
  117.      IRET
  118. bih_9:
  119.      APOP    ES,DS,bx,ax
  120. ;     POPF
  121. ;     PUSHF
  122.      CALL    DWORD PTR CS:[old_break_off]
  123.      IRET
  124. old_break_off        DW    0
  125. old_break_seg        DW    0
  126.  
  127. BREAK_KEY_RESTORE    ENDP
  128. comment 
  129. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -( SYSTEM  )
  130. BREAK_CHECK -  check if break key pressed
  131. ;
  132. ; inputs:  none
  133. ; output:  flags set for je or jz if not set
  134. ;* * * * * * * * * * * * * *
  135. 
  136.     PUBLIC    BREAK_CHECK
  137. BREAK_CHECK    PROC    FAR
  138.     CMP    BREAKFLAG,0
  139.     RETF
  140. BREAK_CHECK    ENDP
  141. comment 
  142. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -( SYSTEM  )
  143. BREAK_CLEAR -  clear the break flag
  144. ;
  145. ; inputs:  none
  146. ; output:  none
  147. ;* * * * * * * * * * * * * *
  148. 
  149.     PUBLIC    BREAK_CLEAR
  150. BREAK_CLEAR    PROC    FAR
  151.     mov    BREAKFLAG,0
  152.     RETF
  153. BREAK_CLEAR    ENDP
  154.     
  155.  
  156. LIBSEG    ENDS
  157.     end
  158.