home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Zone / VRZONE.ISO / mac / PC / PCGLOVE / POWER386 / STROBE.C < prev    next >
C/C++ Source or Header  |  1994-12-20  |  2KB  |  93 lines

  1. /*
  2.  * Subroutine and test program to strobe NES controller.
  3.  * Jan 5, 1990
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <sys/types.h>
  8. #include <sys/param.h>
  9. #include <sys/at_ansi.h>
  10. #include <sys/inline.h>
  11. #include <sys/kd.h>
  12.  
  13. unsigned char strobe( /* unsigned char port */ );
  14.  
  15. main() {
  16.     unsigned char old, new;
  17.     extern errno;
  18.  
  19.     old = new = 0;
  20.     setbuf(stdout, (char *) 0);
  21.     errno = 0;
  22.     ioctl(0, KDADDIO, 0x378);
  23.     if (errno) {
  24.         perror("ADDIO");
  25.     }
  26.     ioctl(0, KDADDIO, 0x379);
  27.     if (errno) {
  28.         perror("ADDIO");
  29.     }
  30.     ioctl(0, KDADDIO, 0x37a);
  31.     if (errno) {
  32.         perror("ADDIO");
  33.     }
  34.     ioctl(0, KDENABIO);
  35.     if (errno) {
  36.         perror("ENABIO");
  37.     }
  38.     strobe_init(0x378);
  39.     while(1) {
  40.         new = strobe(0x378);
  41.         if (new != old) 
  42.             printf("%02x  ", new);
  43.         old = new;
  44.     }
  45. }
  46.  
  47. #define    NES_CLOCK    0x1        /* to port */
  48. #define    NES_RESET    0x2        /* to port */
  49. #define    NES_DATA    0x10        /* from port + 1 */
  50.  
  51. unsigned char nes_shift[16] = { 4, 5, 6, 7, 8, 9, 10, 11 };
  52.  
  53. int c1 = 20;
  54. int c2 = 20;
  55. int c3 = 20;
  56. int c4 = 20;
  57. int c5 = 20;
  58.  
  59. strobe_init(port)
  60. {
  61.     outb(port, 0);
  62.     outb(port+1, 0);
  63. }
  64.  
  65. #define    hold(clk)        for(slow = clk; slow; slow--);
  66.  
  67. unsigned char
  68. strobe(port)
  69. int port;
  70. {
  71.     int i, slow;
  72.     unsigned char data;
  73.     unsigned short bits = 0;
  74.     unsigned char xx[8];
  75.  
  76.     /* stop interrupts */
  77.     outb(port, NES_RESET | NES_CLOCK);
  78.     hold(c1);
  79.     outb(port, NES_CLOCK);
  80.     hold(c2);
  81.     for(i = 0; i < 8; i++) {
  82.         data = inb(port + 1);
  83.         bits |= ((data & NES_DATA) << nes_shift[i]);
  84.         hold(c5);
  85.         outb(port, 0);
  86.         hold(c3);
  87.         outb(port, NES_CLOCK);
  88.         hold(c4);
  89.     }
  90.     bits >>= 8; 
  91.     return (unsigned char) ~bits;
  92. }
  93.