home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / advos2 / ch13 / signal.asm next >
Encoding:
Assembly Source File  |  1988-12-12  |  5.4 KB  |  143 lines

  1.         title   SIGNAL.ASM Example signal handle
  2.         page    55,132
  3.         .286
  4. ; SIGNAL.ASM  Example signal handler for OS/2.
  5. ;             Registers a signal handler then goes to
  6. ;             sleep for 10 seconds.  During the sleep
  7. ;             you can enter ^C and the signal handler
  8. ;             will display a message.
  9. ; Copyright (C) 1987 Ray Duncan
  10. ;
  11. ; Build:        MASM SIGNAL;
  12. ;               LINK SIGNAL,,,OS2,SIGNAL
  13. ;
  14. ; Usage:        SIGNAL
  15.  
  16. stdin   equ     0                       ; standard input handle
  17. stdout  equ     1                       ; standard output handle
  18. stderr  equ     2                       ; standard error handle
  19.  
  20. cr      equ     0dh                     ; ASCII carriage return
  21. lf      equ     0ah                     ; ASCII line feed
  22.  
  23.                                         ; OS/2 signal codes
  24. SIGINTR         equ     1               ; Ctrl-C
  25. SIGBROKENPIPE   equ     2               ; broken pipe
  26. SIGTERM         equ     3               ; program terminated
  27. SIGBREAK        equ     4               ; Ctrl-Break
  28. FlagA           equ     5               ; Event flag A
  29. FlagB           equ     6               ; Event flag B
  30. FlagC           equ     7               ; Event flag C
  31.  
  32.         extrn   DosExit:far             ; references to OS/2 API
  33.         extrn   DosFlagProcess:far
  34.         extrn   DosHoldSignal:far
  35.         extrn   DosSetSigHandler:far
  36.         extrn   DosSleep:far
  37.         extrn   DosWrite:far
  38.  
  39. DGROUP  group   _DATA
  40.  
  41. _DATA   segment word public 'DATA'
  42.  
  43. msg1    db      cr,lf,'Signal detected!',cr,lf
  44. msg1_len equ $-msg1
  45.  
  46. msg2    db      cr,lf 
  47.         db      'Signal handler installed.'
  48.         db      cr,lf
  49.         db      'Press Ctrl-C to demonstrate handler...'
  50.         db      cr,lf
  51. msg2_len equ $-msg2
  52.  
  53. wlen    dw      ?                       ; receives bytes written
  54.  
  55. prvact  dw      ?                       ; receives previous signal action
  56. prvhdlr dd      ?                       ; receives previous handler address
  57.  
  58. _DATA   ends
  59.  
  60.  
  61. _TEXT   segment word public 'CODE'
  62.  
  63.         assume  cs:_TEXT,ds:DGROUP
  64.  
  65. main    proc    far                     ; OS/2 entry point
  66.  
  67.                                         ; register signal handler...
  68.         push    cs                      ; address of handler
  69.         push    offset _TEXT:handler
  70.         push    ds                      ; receives previous handler address
  71.         push    offset DGROUP:prvhdlr
  72.         push    ds                      ; receives previous action
  73.         push    offset DGROUP:prvact
  74.         push    2                       ; action = 2, call handler
  75.         push    SIGINTR                 ; signal of interest= ^C
  76.         call    DosSetSigHandler        ; transfer to OS/2
  77.         or      ax,ax                   ; was set successful?
  78.         jnz     error                   ; jump if set failed.
  79.  
  80.                                         ; display message 'Press Ctrl-C
  81.                                         ; to demonstrate handler'
  82.         push    stdout                  ; standard output handle
  83.         push    ds                      ; message address
  84.         push    offset DGROUP:msg2
  85.         push    msg2_len                ; message length
  86.         push    ds                      ; receives bytes written
  87.         push    offset DGROUP:wlen
  88.         call    DosWrite                ; transfer to OS/2
  89.  
  90.         mov     cx,10                   ; delay for 10 seconds...
  91.  
  92. main1:  push    0                       ; delay for 1 second
  93.         push    1000
  94.         call    DosSleep
  95.  
  96.         loop    main1
  97.  
  98. exit:   push    1                       ; terminate all threads
  99.         push    0                       ; return success code
  100.         call    DosExit                 ; exit program
  101.  
  102. error:  push    1                       ; terminate all threads
  103.         push    1                       ; return error code
  104.         call    DosExit
  105.  
  106. main    endp
  107.  
  108.  
  109. handler proc    far                     ; this is the signal handler    
  110.                                               
  111.                                         ; display message showing
  112.                                         ; handler is active...
  113.         push    stdout                  ; standard output handle
  114.         push    ds                      ; address of data to write
  115.         push    offset DGROUP:msg1
  116.         push    msg1_len                ; length of data
  117.         push    ds                      ; receives length written
  118.         push    offset DGROUP:wlen
  119.         call    DosWrite                ; transfer to OS/2
  120.  
  121.                                         ; now reset signal...
  122.         push    cs                      ; addr of handler
  123.         push    offset _TEXT:handler
  124.         push    ds                      ; receives addr previous handler
  125.         push    offset DGROUP:prvhdlr
  126.         push    ds                      ; receives previous action
  127.         push    offset DGROUP:prvact
  128.         push    4                       ; action = 4; reset signal
  129.         push    SIGINTR                 ; signal of interest= ^C
  130.         call    DosSetSigHandler        ; transfer to OS/2
  131.         or      ax,ax                   ; handler set successfully?
  132.         jnz     error                   ; jump if set failed
  133.  
  134.         ret     4                       ; return from handler, clear stack 
  135.  
  136. handler endp
  137.  
  138. _TEXT   ends
  139.  
  140.         end     main
  141.  
  142.