main.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. //roms: receiving chars by interrupt (interrupt and user mode have been splitted)
  2. // C Source File
  3. // Created 18/09/02; 13:25:02
  4. #define USE_TI89 // Produce .89z File
  5. #define OPTIMIZE_ROM_CALLS // Use ROM Call Optimization
  6. #define SAVE_SCREEN // Save/Restore LCD Contents
  7. #include <tigcclib.h> // Include All Header Files
  8. #define IO_DBUS_CONFIG 0x60000C
  9. #define IO_DBUS_STATUS 0x60000D
  10. #define IO_LINK_STATES 0x60000E
  11. #define IO_LINK_BUFFER 0x60000F
  12. #define AE (1 << 7)
  13. #define LD (1 << 6)
  14. #define LTO (1 << 5)
  15. #define CLE (1 << 3)
  16. #define CA (1 << 2)
  17. #define CTX (1 << 1)
  18. #define CRX (1 << 0)
  19. #define SLE (1 << 7)
  20. #define STX (1 << 6)
  21. #define SRX (1 << 5)
  22. #define SLI (1 << 4)
  23. #define SA (1 << 3)
  24. #define EA (1 << 2)
  25. INT_HANDLER oldint4 = NULL;
  26. volatile int counter = 0;
  27. volatile unsigned char data = 0;
  28. static unsigned char ctrl = /*AE |*/ CRX; // enable interrupt on RX, auto-start must be DISABLED !
  29. // DBus interrupt handler
  30. DEFINE_INT_HANDLER (link_handler)
  31. {
  32. unsigned char status = peekIO(IO_DBUS_STATUS); // save status (getting it -> clear register)
  33. putchar('$');
  34. counter++;
  35. if(status & SLE)
  36. { // link error
  37. putchar('E');
  38. pokeIO(IO_DBUS_CONFIG, AE | LD | LTO);
  39. pokeIO(IO_DBUS_STATUS, peekIO(IO_DBUS_STATUS) & ~SLE); // clear flag
  40. pokeIO(IO_DBUS_CONFIG, 0xE0); // reset DBus
  41. pokeIO(IO_DBUS_CONFIG, ctrl);
  42. }
  43. if(status & STX)
  44. { // TX buffer empty
  45. putchar('T');
  46. pokeIO(IO_DBUS_STATUS, peekIO(IO_DBUS_STATUS) & ~STX); // clear flag
  47. }
  48. if(status & SRX)
  49. { // RX buffer full
  50. putchar('R');
  51. data = peekIO(IO_LINK_BUFFER);
  52. pokeIO(IO_DBUS_STATUS, peekIO(IO_DBUS_STATUS) & ~SRX); // clear flag
  53. }
  54. if(status & SLI)
  55. { // link interrupt ?
  56. putchar('I');
  57. pokeIO(IO_DBUS_STATUS, peekIO(IO_DBUS_STATUS) & ~SLI); // clear flag
  58. }
  59. if(status & SA)
  60. { // auto-start triggered
  61. putchar('S');
  62. pokeIO(IO_DBUS_STATUS, peekIO(IO_DBUS_STATUS) & ~SA); // clear flag
  63. }
  64. if(status & EA)
  65. { // external activity triggered
  66. putchar('A');
  67. pokeIO(IO_DBUS_STATUS, peekIO(IO_DBUS_STATUS) & ~EA); // clear flag
  68. }
  69. putchar(' ');
  70. }
  71. // Main Function
  72. void _main(void)
  73. {
  74. unsigned char old_control = peekIO(IO_DBUS_CONFIG);
  75. // Save old handler and install new one
  76. oldint4 = GetIntVec(AUTO_INT_4);
  77. SetIntVec(AUTO_INT_4, &link_handler);
  78. pokeIO(IO_DBUS_CONFIG, ctrl); // configure DBus
  79. ClrScr();
  80. FontSetSys(F_6x8);
  81. while(!kbhit())
  82. {
  83. // notice that counter is incremented twice
  84. // spurious interrupts ? Flags: TRI and next TI
  85. }
  86. // restore register and handler
  87. pokeIO(IO_DBUS_CONFIG, old_control);
  88. SetIntVec(AUTO_INT_4, oldint4);
  89. }