WIN16APP.C
上传用户:lx1888888
上传日期:2007-01-04
资源大小:136k
文件大小:4k
源码类别:

驱动编程

开发平台:

Visual C++

  1. #include <stdlib.h>    
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #include <windows.h>
  6. #define RTC_IRQ 8
  7. #define RTC_STATUSA 0xA
  8. #define RTC_STATUSB 0xB
  9. #define RTC_STATUSC 0xC
  10. #define STATUSB_ENINT 0x40
  11. #define CMOS_ADDR    0x70
  12. #define CMOS_DATA    0x71
  13. #define DOS_GET_INT_VECTOR          0x35
  14. #define DOS_SET_INT_VECTOR          0x25
  15. #define SLAVE_PIC_MASK              0xA1
  16. #define SLAVE_PIC_CTRL           0xA0
  17. #define MASTER_PIC_CTRL          0x20
  18. #define EOI                      0x20
  19. typedef void (FAR interrupt *VOIDINTPROC)();
  20. static char MsgBoxBuf[ 1024 ] = { 0 };
  21. static VOIDINTPROC pfOldHandler = NULL;
  22. BYTE StatusA, StatusB;
  23. VOIDINTPROC DosGetIntVector( BYTE Irq );
  24. void DosSetIntVector( BYTE Irq, VOIDINTPROC pHandler );
  25. void interrupt FAR RtcIsr( void );
  26. VOIDINTPROC DosGetIntVector( BYTE vector )
  27. {
  28.    WORD  selHandler, offHandler;
  29.    _asm
  30.    {
  31.       mov  al, vector
  32.       mov  ah, DOS_GET_INT_VECTOR
  33.       push es
  34.       int  21h
  35.       mov  offHandler,bx
  36.       mov  selHandler,es
  37.       pop  es
  38.    }
  39.    return( MAKELP( selHandler, offHandler ) );
  40. }
  41. void DosSetIntVector( BYTE vector, VOIDINTPROC pHandler )
  42. {
  43.    WORD  offHandler, selHandler;
  44.    selHandler = SELECTOROF( pHandler );
  45.    offHandler = OFFSETOF( pHandler );
  46.   _asm
  47.    {
  48.       mov  al, vector
  49.       mov  ah, DOS_SET_INT_VECTOR
  50.       mov  dx, offHandler
  51.       mov  bx, selHandler
  52.       push ds
  53.       mov  ds, bx
  54.       int  21h
  55.       pop  ds
  56.    }
  57. }
  58. BYTE CmosReadReg( BYTE reg )
  59. {
  60. BYTE data;
  61. _asm 
  62. {
  63. ; disable NMI then ints
  64. mov al, reg
  65. or al, 80h     
  66. cli
  67. ; first output reg to address port
  68. out CMOS_ADDR, al
  69.       jmp   _1
  70. _1:
  71.       jmp   _2
  72. _2:   
  73. ; then read data from data port
  74. in al, CMOS_DATA
  75. mov data, al
  76.       jmp   _3
  77. _3:
  78.       jmp   _4
  79. _4:
  80. ; reenable NMI then ints 
  81. xor al, al 
  82. out CMOS_ADDR, al
  83. sti
  84. }
  85. return data;
  86. }
  87. void CmosWriteReg( BYTE reg, BYTE val )
  88. {
  89. _asm 
  90. {
  91. ; disable NMI then ints
  92. mov al, reg
  93. or al, 80h
  94. cli
  95. ; first output reg to address port
  96. out CMOS_ADDR, al
  97.       jmp   __1
  98. __1:
  99.       jmp   __2
  100. __2:
  101. ; then output val to data port
  102.       mov   al, val
  103. out  CMOS_DATA, al
  104.       jmp   __3
  105. __3:
  106.       jmp   __4
  107. __4:
  108. ; reenable NMI then ints 
  109. xor al, al 
  110. out CMOS_ADDR, al
  111. sti
  112. }
  113. }
  114. void interrupt FAR RtcIsr( void )
  115. {
  116. CmosReadReg( RTC_STATUSC );
  117.    _outp( SLAVE_PIC_CTRL, EOI );
  118.    _outp( MASTER_PIC_CTRL, EOI );   
  119. }
  120. void InstallHandler()
  121. {
  122.    BYTE mask;
  123.    
  124.    // mask (disable) RTC IRQ
  125. MessageBox( NULL, "Masking IRQ", "RCTTEST", MB_OK );
  126.    mask = _inp( SLAVE_PIC_MASK );
  127.    mask |= 0x01;  // set bit 0 for IRQ 8
  128.    _outp( SLAVE_PIC_MASK, mask );
  129.    // install ISR
  130.    pfOldHandler = DosGetIntVector( 0x70 );
  131.    DosSetIntVector( 0x70, RtcIsr );
  132.    // configure RTC to generate ints
  133. StatusA = CmosReadReg(RTC_STATUSA);
  134. StatusB = CmosReadReg(RTC_STATUSB);
  135. CmosWriteReg(RTC_STATUSA, StatusA | 0x0F );
  136. // enable clock interrupts
  137. CmosWriteReg(RTC_STATUSB, StatusB | STATUSB_ENINT);
  138. // clear flags 
  139. CmosReadReg(RTC_STATUSC);
  140.    // unmask (enable) RTC IRQ
  141. MessageBox( NULL, "Unmasking IRQ", "RCTTEST", MB_OK );
  142.    mask = _inp( SLAVE_PIC_MASK );
  143.    mask &= ~0x01;  // clear bit 0 for IRQ 8
  144.    _outp( SLAVE_PIC_MASK, mask );
  145. }
  146. void UnInstallHandler()
  147. {
  148.    BYTE mask;
  149.    
  150. CmosWriteReg(RTC_STATUSA, StatusA );         
  151. CmosWriteReg(RTC_STATUSB, StatusB );
  152.    // mask (disable) RTC IRQ
  153.    mask = _inp( SLAVE_PIC_MASK );
  154.    mask |= 0x01;  // set bit 0 for IRQ 8
  155.    _outp( SLAVE_PIC_MASK, mask );
  156.    // install ISR
  157.    DosSetIntVector( 0x70, pfOldHandler );
  158. }
  159. int PASCAL WinMain( HANDLE hInstance, HANDLE hPrevInstance, 
  160.                     LPSTR lpCmdLine, int nCmdShow )
  161. {
  162. char tmpbuf[ 128 ];
  163.    InstallHandler();   
  164. MessageBox( NULL, "Installed ISR", "RCTTEST", MB_OK );
  165. MessageBox( NULL, "Dismiss to exit", "RCTTEST", MB_OK );
  166.    UnInstallHandler();   
  167. MessageBox( NULL, "UnInstalled ISR", "RCTTEST", MB_OK );
  168. return 0;
  169. }