home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / PROG / MISC / FPC355_5.ZIP / TCOM96.ZIP / TCOM96 / SAMPLES / SPCODE.SEQ < prev    next >
Encoding:
Text File  |  1991-03-21  |  8.0 KB  |  234 lines

  1. \ Serial port support
  2.  
  3. $0D CONSTANT HI_THERE   \ enquiry from PC
  4. '!' constant IM_HERE    \ response to PC
  5. $0AF constant LISTEN_UP \ wake-up request from PC
  6. $0FA constant GO_AHEAD  \ response to PC's LISTEN-UP
  7.  
  8. 9600 constant BAUD                                      \ actual baud rate
  9. 7500 constant BAUD_VAL                                  \ 1/(BAUD/100)
  10. BAUD_VAL 1- 255 AND             constant BAUD_L         \ baud value to set
  11. BAUD_VAL 1- 256 / $80 OR        constant BAUD_H
  12.  
  13. $49     constant SP_SETUP        \ enable transmitter, set mode=1
  14. 3       constant TXE_BIT         \ transmit empty bit
  15. 8       constant TXE_MASK
  16. TXE_MASK not constant NOT.TXE_MASK
  17. 6       constant RI_BIT          \ receive interrupt bit
  18. $40     constant RI_MASK
  19. RI_MASK not constant NOT.RI_MASK
  20. $21     constant IOC1_SETUP      \ to enable serial port and PWM
  21.  
  22. code SET_BAUDL ( baud -- ) \ set baud rate ( called by code word )
  23.         LD      W0  # 29104
  24.         LD      W2  # 11        \ put 750,000 in W0W2 ( =12MHz / 16 )
  25.         DIVU    W0  TTOS        \ 750,000 / baud rate
  26.         DEC     W0              \ -1
  27.         LDB     BAUD_RATE  W0   \ put low byte part into baud generator
  28.         ORB     W1  # $80       \ MSB selects XTAL1 clock source
  29.         LDB     BAUD_RATE  W1   \ put high byte part into baud generator
  30.         RET
  31.         end-code
  32.  
  33. code SET_BAUD ( baud -- ) \ set baud rate
  34.         CALL    SET_BAUDL
  35.         LOAD_TTOS
  36.         RET
  37.         end-code
  38.  
  39. CODE SP_INIT       \ initialise serial port
  40.         LDB     IOC1  # IOC1_SETUP      \ enable serial port
  41.         SAVE_TTOS
  42.         LD      TTOS  # BAUD
  43.         CALL    SET_BAUDL               \ set baud rate
  44.         LOAD_TTOS
  45.         LDB     SP_CON  # SP_SETUP      \ enable transmitter, set mode
  46.         LDB     SP_FLAGS  0             \ clear flags rememberer
  47.         RET
  48.         END-CODE
  49.  
  50. code SP_SEND?L \ ready to send?
  51.                 \ usage    1 $: CALL    SP_SEND?L
  52.                 \               JNC     1 $
  53.                 \               CALL    SP_SENDL
  54.                 \
  55.                 \ returns with W1 = SP_FLAGS
  56.                 \
  57.         LDB     W1  SP_STAT             \ get the status port
  58.         ORB     W1  SP_FLAGS            \ and the remembered flags
  59.         STB     W1  SP_FLAGS            \ remember them again
  60.         BITSET  W1 TXE_BIT IF  SETC  THEN
  61.         RET
  62.         end-code                \ return with C set if ready
  63.  
  64. code SP_SENDL  \ send the byte in W0
  65.         LD      W2  0
  66. 1 $:
  67.         DEC     W2
  68.         JE      2 $             \ timeout in case transmitter broken
  69.         CALL    SP_SEND?L
  70.         JNC     1 $             \ wait for transmitter ready
  71.         LDB     SBUF W0         \ send the byte
  72.  
  73.         ANDB    W1  # NOT.TXE_MASK
  74.         STB     W1  SP_FLAGS            \ update the remembered flags
  75.         RET
  76. 2 $:
  77.         LDB     SBUF  W0        \ if timed out send the byte, anyway
  78.         RET
  79.         end-code
  80.  
  81. CODE SP_SEND ( c -- ) \ send one byte for hi-level
  82.         LD      W0 TTOS
  83.         CALL    SP_SENDL
  84.         LOAD_TTOS
  85.         RET
  86.         end-code
  87.  
  88. code SP_RX?L   \ something received?
  89.                 \ usage    1 $: CALL    SP_RX?L
  90.                 \               JNC     1 $
  91.                 \               CALL    SP_RXL
  92.                 \
  93.                 \ returns with W1 = SP_FLAGS
  94.                 \
  95.                 \ changes W1 and SP_FLAGS
  96.                 \
  97.         LDB     W1  SP_STAT             \ get the status port
  98.         ORB     W1  SP_FLAGS            \ and the remembered flags
  99.         STB     W1  SP_FLAGS            \ remember them again
  100.         BITSET  W1 RI_BIT IF  SETC  THEN
  101.         RET             \ return with C set if something received
  102.         END-CODE
  103.  
  104. CODE SP_RX? ( -- f ) \ see if something received for hi-level
  105.         SAVE_TTOS
  106.         CLR TTOS
  107.         CALL    SP_RX?L
  108.         C0<> IF   DEC TTOS   THEN     \ FFFF on stack if something to pick up
  109.         RET
  110.         end-code
  111.  
  112. code SP_RXL ( -- C ) \ get received byte, in W0, for code definitions
  113.         BEGIN   CALL SP_RX?L
  114.                 C0<> UNTIL              \ wait for something to get
  115.         LDB     W0 SBUF                 \ get the byte
  116.         ANDB    W1  # NOT.RI_MASK
  117.         STB     W1  SP_FLAGS            \ update the remembered flags
  118.         RET
  119.         end-code
  120.  
  121. CODE SP_RX ( -- c ) \ get recieved byte for high-level
  122.         SAVE_TTOS
  123.         CALL    SP_RXL
  124.         LDB     TTOS W0
  125.         CLRB    TTOSH
  126.         RET
  127.         end-code
  128.  
  129.  
  130. code SP_RX_TL ( -- )  \ get received byte, or timeout after 10ms
  131.                 \ on exit, W0 = received byte
  132.                 \          if timed out, W2 = 0 and Z flag is true
  133.                 \          if not timed out W2 <> 0 and Z flag is false
  134.         LD      W2  # 900
  135. 3 $:                   \ ( approx. 58 states in loop, = 10 usec. )
  136.         DEC     W2              \ decrement timeout counter
  137.         JE      4 $             \ go exit if timed out
  138.         CALL    SP_RX?L
  139.         JNC     3 $             \ wait for item in receiver
  140.         CALL    SP_RXL          \ get item from receiver
  141. 4 $:    RET     end-code
  142.  
  143.  
  144. CODE SP_RX_T ( -- C )  \ get received byte, or timeout after 10ms
  145.                 \          if timed out TTOS word = -1
  146.                 \          if not timed out TTOSH = 0 and TTOS has the byte
  147.         SAVE_TTOS
  148.         LD      W2  # 900
  149. 3 $:                   \ ( approx. 58 states in loop, = 10 usec. )
  150.         DEC     W2              \ decrement timeout counter
  151.         JE      4 $             \ go exit if timed out
  152.         CALL    SP_RX?L
  153.         JNC     3 $             \ wait for item in receiver
  154.         CALL    SP_RXL          \ get item from receiver
  155.         LDB     TTOS W0
  156.         CLRB    TTOSH           \ return the received byte on the stack
  157.         RET
  158. 4 $:    LD      TTOS # -1       \ otherwise put -1 on the stack
  159.         RET
  160.         end-code
  161.  
  162. CODE SP_POLLC   \ serial port poll
  163.         CALL    SP_RX?L                 \ see if there's something received
  164.         JNC     2 $                     \ if not, return to background
  165.         CALL    SP_RXL                  \ get received byte
  166.         CMPB    W0  # HI_THERE          \ see if it is a "hi-there"
  167.         JNE     1 $
  168.  
  169.         LD      W0  # IM_HERE            \ if so  respond with a "i'm here"
  170.         CALL    SP_SENDL
  171.         SJMP    2 $
  172. 1 $:
  173.         CMPB    W0  # LISTEN_UP         \ see if it is a request
  174.         JNE     2 $                     \ if not, return to background
  175.         LD      W0  # GO_AHEAD
  176.         CALL    SP_SENDL                \ send "I'm here" byte
  177.         RET                     \ and let high-level do the rest
  178.  
  179. 2 $:|   POP     W0      \ exit from the word that called SP_POLLC
  180.                         \  if there's no command to do
  181.         RET
  182.         end-code
  183.  
  184. code SP_POLL_L  END-CODE       \ entry to SP_POLL from a code word
  185. : SP_POLL
  186.         SP_POLLC        \ It may exit SP_POLL from within SP_POLLC
  187.         SP_RX_T
  188.         DUP 0< IF  DROP EXIT  THEN   \ exit if it timed out
  189. \        DUP 30 >= IF  DROP EXIT  THEN   \ exit if it is too big
  190.         exec:
  191. \ table of function subroutines
  192. \ 0
  193.         JUMP_TO
  194.         NULL_FUNCT
  195.         NULL_FUNCT      \        MEASURE_ALL
  196.         WRITE_BYTES
  197.         READ_BYTES
  198. \ 5
  199.         NULL_FUNCT      \        MEASURE_AD
  200.         WRITE_WORDS
  201.         READ_WORDS
  202.         NULL_FUNCT
  203.         NULL_FUNCT
  204. \ 10
  205.         NULL_FUNCT
  206.         NULL_FUNCT
  207.         NULL_FUNCT      \        WRITE_BYTESW
  208.         NULL_FUNCT      \        READ_BYTESW     \ 0Dh -- subverted by the "Hi-there"?
  209.         NULL_FUNCT      \        WRITE_WORDSW
  210. \ 15
  211.         NULL_FUNCT      \        READ_WORDSW
  212.         NULL_FUNCT
  213.         NULL_FUNCT
  214.         NULL_FUNCT
  215.         NULL_FUNCT
  216. \ 20
  217.         NULL_FUNCT
  218.         NULL_FUNCT
  219.         NULL_FUNCT
  220.         NULL_FUNCT
  221.         FILL_MEM
  222. \ 25
  223.         TESTEMIT
  224.         UNTRAP
  225.         copy-boot-to-EE1
  226.         copy-boot-to-EE2
  227.         NULL_FUNCT
  228.         NULL_FUNCT
  229.         ;
  230.  
  231. : NULL_FUNCT  ;
  232.  
  233.  
  234.