Advertisement
Guest User

ASYCOM_W.ASM

a guest
Feb 8th, 2023
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     PAGE 62,130
  2. ;*********************************************************************
  3. ;
  4.     NAME        ASYMAS86
  5. ;   FUNCTION:   communication-driver ( master )
  6. ;           EW-protokoll ( subset of ISO 1745 )
  7. ;           Interface for Windows DLL
  8. ;
  9. ;*********************************************************************
  10. ;
  11. ; Data communication according to PWM-EW-standard.
  12. ;
  13. ; Formats:
  14. ;
  15. ;   SOH ADR POL ENQ             receive poll
  16. ;   SOH ADR STX 'TEXT' ETX BCC ENQ  receive message
  17. ;   SOH ADR STX 'TEXT' ETX BCC  send text
  18. ;
  19. ; Bytes ETX, EOT, DLE and SOH are prefixed by 10H ( DLE ) if part of 'text'.
  20. ;
  21. ; It is not allowed for slaves to send ACK, NAK or EOT before receiving the
  22. ; ENQ. Reason is the layout of bus structure for PR3000. The Master will
  23. ; send a required ACK, NAK or EOT before end of transmission is detected.
  24. ; Dependent on BUSMOD the receiver will be disables during sending a meesage.
  25. ; BUSMOD = 1 means: Slaves will echo any character sent by the master, so
  26. ; receiver has to be disabled during this time.
  27. ;
  28. ; Bufferdefinition BUFFER for external use:
  29. ;
  30. ;  asycom_buf = record          { PASCAL !!! }
  31. ;    adr : char;                        { ASCII-Addresse des Teilnehmers }
  32. ;    status : byte;                     { Status des Teilnehmers }
  33. ;    input_used : integer;              { Buffer-Flag fЃr Input }
  34. ;    input_length : integer;            { L„nge des Telegramms }
  35. ;    input_buffer : array [0..255] of byte; { Buffer }
  36. ;    output_used : integer;             { Buffer-Flag fЃr Output }
  37. ;    output_length : integer;           { Lange des Telegramms }
  38. ;    output_buffer : array [0..255] of byte; { Buffer }
  39. ;    stacnt : byte;                     { interner Z„hler }
  40. ;    errcnt : byte;                     { interner Z„hler }
  41. ;  end;
  42. ;
  43. ; Status:
  44. ;
  45. ;   xxxx x000B = slave is active
  46. ;   xxxx x001B = timeout ( no answer from slave due to bad line, baudrate ... )
  47. ;   xxxx x010B = retries exceeded during receiving message
  48. ;   xxxx x011B = retries exceeded during transmitting message
  49. ;   xxxx 1xxxB = message cannot be transfered ( message too long, buffer of
  50. ;        slave not empty or badline )
  51. ;   xxx1 xxxxB = fatal error reported NFATAL-times, will be set to 0 on first
  52. ;        good communication
  53. ;
  54. ; usage of registers:
  55. ;
  56. ; ES = pointer to segment aof buffers
  57. ; SI = index to current slave
  58.  
  59.     PAGE
  60.  
  61.     .model small
  62.     .sall
  63.     .xlist
  64.  
  65. ?PLM=1                          ; 'Pascal' naming
  66. ?memS=1             ; medium Memory Modell
  67. include cmacros.inc
  68.  
  69.     .list
  70.     .data
  71.  
  72. ;-----  DATA DEFINITIONS
  73.  
  74. staticW RVEC,   RXUREQ          ; receiver-jump-vector
  75. staticW SVEC,   TXUREQ          ; transmitter-jump-vector
  76. staticB BUSMOD, 0           ; mode of bus
  77. staticB LSTCNT, 0           ; last retry count
  78. staticW OLDT,   0, 2            ; address of timer interrupt
  79. staticW OLDC,   0, 2            ; address of COM1 interrupt
  80. staticB IDLE,   0           ; flag idle loop over all slaves
  81. staticB INTNUM, 0           ; number of COM-interrupt
  82. staticW RBR,    0           ; base address of UART
  83. staticB IMASK,  0           ; interrupt-mask
  84. staticW RTYCNT, 0           ; error counter 'retry'
  85. staticW WDGCNT, 0           ; error counter 'watchdog'
  86. staticW OCW1,   0           ; oper.control word on 8259-1
  87. staticW OCW2,   0           ; oper.control word on 8259-2
  88.  
  89. CHRCNT  LABEL   WORD
  90.     DW  0           ; character-counter to end of buffer
  91. BCC LABEL   BYTE
  92.     DB  0           ; checksum
  93. RETRY   LABEL   BYTE
  94.     DB  0           ; retry-Counter
  95. TIMOUT  LABEL   BYTE
  96.     DB  OFF         ; time-out-Counter
  97. NSLAVES LABEL   BYTE
  98.     DW  0           ; number of installed slaves
  99. SLAVE1  LABEL   WORD
  100.     DW  0           ; pointer to 1. buffer
  101.     DW  0
  102. BUFPNT  LABEL   WORD
  103.     DW  0           ; offset pointer to actual buffer
  104. CURSLV  LABEL   WORD
  105.     DW  0           ; pointer to actual structure
  106. SLVCNT  LABEL   BYTE
  107.     DW  0           ; counter for current slave
  108.    
  109.     PAGE
  110.  
  111.     PUBLIC _COM_BUFF
  112.  
  113. ASYMBL  EQU 256         ; length of buffer
  114.  
  115. BUFFER  STRUC
  116. ADR DB  0           ; ASCII-code of slave ( R/O )
  117. STATUS  DB  0           ; status of slave ( 0 = available )
  118. PUSE    DB  0           ; status of input buffer ( 0 = empty )
  119.     DB  0           ; filler
  120. PLEN    DW  0           ; number of valid bytes in Buffer
  121. PBF DB  ASYMBL DUP (0)      ; buffer
  122. MUSE    DB  0           ; same for output as for input above
  123.     DB  0           ; filler
  124. MLEN    DW  0
  125. MBF DB  ASYMBL DUP (0)
  126. STACNT  DB  0           ; internal status counter
  127. ERRCNT  DB  0           ; counter for fatal errors
  128. BUFFER  ENDS
  129.  
  130. _COM_BUFF  DB 16 * SIZE BUFFER DUP (0)  ; for 16 slaves
  131.  
  132.     PAGE
  133.  
  134. createSeg   INIT_TEXT, INIT_TEXT, BYTE, PUBLIC, CODE
  135. sBegin      INIT_TEXT
  136. assumes     CS, INIT_TEXT
  137.  
  138. OFF EQU -1          ; for timeout
  139. ACK EQU 6           ; acknowledge
  140. NAK EQU 15H         ; negative acknowledge
  141. SOH EQU 1           ; start of header
  142. ENQ EQU 5           ; enquiry
  143. STX EQU 2           ; start of text
  144. ETX EQU 3           ; end of text
  145. POL EQU 70H         ; polling
  146. EOT EQU 4           ; end of transmission
  147. DLE EQU 10H         ; prefix
  148.  
  149. NRETRY  EQU 3           ; number of retries for transmission
  150. NFATAL  EQU 3           ; bad communcations before fatal error
  151. CHRTIM  EQU 2           ; * 55 msec for character-time-out
  152.  
  153. TIMER   EQU 8           ; TIMER: interrupt number
  154. EOI EQU 20H         ; spec. end of interrupt 4
  155. RXERR   EQU 0EH         ; receiver error mask
  156. RTSON   EQU 1011B           ; OUT2 + RTS + DTR on
  157. EITX    EQU 2           ; enable TX-interrupt only
  158. EIRXTX  EQU 3           ; enable RX- and TX-interrupts
  159.  
  160. ; offsets to UART-base-register:
  161.  
  162. IER EQU 1           ; interr. enable register
  163. IIR EQU 2           ; interrupt identification register
  164. LCR EQU 3           ; logic control register
  165. MCR EQU 4           ; modem control register
  166. LSR EQU 5           ; line status register
  167.  
  168. extrn DOS3Call : far
  169.  
  170.     PAGE
  171.  
  172. ;------------------------------------------------------------------------------
  173. ;----- Hardware Interface -----------------------------------------------------
  174. ;------------------------------------------------------------------------------
  175.  
  176. INT1:   PUBLIC  INT1
  177.     PUSH    AX
  178.     PUSH    BX
  179.     PUSH    CX
  180.     PUSH    DX
  181.     PUSH    SI
  182.     PUSH    ES
  183.     PUSH    DS
  184.     MOV AX,_DATA
  185.     MOV DS,AX
  186.     MOV ES,SLAVE1[2]
  187.     MOV SI,CURSLV       ; SI is used to address the buffer
  188. INT1A:  MOV DX,RBR
  189.     ADD DX,IIR          ; interrupt identification
  190.     IN  AL,DX
  191.     TEST    AL,100B         ; receiver ?
  192.     JNZ RXINT
  193.     TEST    AL,010B         ; transmitter ?
  194.     JNZ TXINT
  195.     JMP SHORT IRENDE        ; no Interrupt pending !
  196.  
  197. TXINT:  CALL    (SVEC)          ; call function via vector
  198.     JMP INT1A
  199.  
  200. RXINT:  MOV DX,RBR
  201.     ADD DX,LSR
  202.     IN  AL,DX           ; read status
  203.     AND AL,RXERR        ; overrun, parity, framing error
  204.     MOV DX,RBR          ; address of dataregister
  205.     IN  AL,DX           ; get character
  206.     MOV CL,AL
  207.     CALL    (RVEC)          ; call function via vector
  208.     JMP SHORT INT1A
  209.  
  210. IRENDE: MOV DX,OCW1         ; UART's interrupt controller
  211.     MOV AL,EOI          ; reset interrupt
  212.     OUT DX,AL
  213.     MOV DX,OCW2         ; 2. interrupt controller
  214.     CMP DX,0
  215.     JE  ENDE
  216.     MOV AL,EOI
  217.     OUT DX,AL
  218. ENDE:   STI
  219.     POP DS
  220.     POP ES
  221.     POP SI
  222.     POP DX
  223.     POP CX
  224.     POP BX
  225.     POP AX
  226.     IRET
  227.  
  228. SIOOT:  MOV DX,RBR          ; send character
  229.     OUT DX,AL
  230.     MOV TIMOUT,CHRTIM       ; activate supervision
  231.  
  232. RXUREQ: ;STATE: receiver interrupt unrequested
  233. TXUREQ: ;STATE: transmitter interrupt unrequested
  234.  
  235.     RET
  236.  
  237.     PAGE
  238. ;------------------------------------------------------------------------------
  239. ;----- Busmanagement ----------------------------------------------------------
  240. ;------------------------------------------------------------------------------
  241.  
  242. NXTCNF: CMP BUSMOD,1
  243.     JNE NXTCN1
  244.     MOV DX,RBR
  245.     ADD DX,IER
  246.     MOV AL,EITX         ; disable RX-interrupt
  247.     OUT DX,AL
  248. NXTCN1: MOV AL,LSTCNT       ; generate random times to activate
  249.     AND AL,1FH
  250.     MOV ES:[SI].STACNT,AL
  251.     ADD AL,AL
  252.     MOV LSTCNT,AL
  253.     CMP ES:[SI].ERRCNT,NFATAL-1 ; test error-count
  254.     JZ  T2
  255.     INC ES:[SI].ERRCNT      ; update in memory
  256.     RET
  257.  
  258. T2: OR  ES:[SI].STATUS,10H  ; flag a fatal error
  259.     RET
  260.  
  261.     PAGE
  262.  
  263. ;----- ZeitЃberwachung
  264.  
  265. ASYWDG: PUBLIC  ASYWDG
  266.     PUSH    AX
  267.     PUSH    DX
  268.     PUSH    SI
  269.     PUSH    ES
  270.     PUSH    DS
  271.     MOV AX,_DATA
  272.     MOV DS,AX
  273.     MOV ES,SLAVE1[2]        ; Segment des Buffers
  274.     DEC LSTCNT
  275.     CMP TIMOUT,OFF
  276.     JZ  RETURN          ; no supervision of slave
  277.     DEC TIMOUT          ; update counter
  278.     JNZ RETURN          ; still time enough
  279.     MOV RVEC,OFFSET RXUREQ  ; reset vectors
  280.     MOV SVEC,OFFSET NXTSLV  ; in case of pause, slave 1
  281.     MOV SI,CURSLV
  282.     TEST    IDLE,2          ; bit 1: timer for pause
  283.     JNZ T1
  284.     MOV ES:[SI].STATUS,1    ; status = timeout
  285.     CALL    NXTCNF
  286.     INC WDGCNT
  287. T1: MOV IDLE,0
  288.     MOV DX,RBR          ; restart interrupts
  289.     MOV AL,EOT
  290.     OUT DX,AL
  291. RETURN: PUSHF
  292.     CALL    DWORD PTR [OLDT]
  293.     STI
  294.     POP DS
  295.     POP ES
  296.     POP SI
  297.     POP DX
  298.     POP AX
  299.     IRET
  300.  
  301.     PAGE
  302.  
  303. ;----- Control of slaves
  304.  
  305. NXTSLV: ;Test conditions and select next slave for polling
  306.  
  307.     ADD CURSLV,SIZE BUFFER  ; pointer to next slave
  308.     MOV SI,CURSLV
  309.         DEC SLVCNT
  310.     JNE NXTSL1          ; after end of array ?
  311.     MOV AL,NSLAVES
  312.     MOV SLVCNT,AL
  313.     MOV AX,SLAVE1       ; first slave will follow
  314.     MOV CURSLV,AX
  315.     CMP IDLE,0          ; no response for all slaves ?
  316.     MOV IDLE,1          ; then wait some time
  317.     JZ  NXTSL1
  318.     MOV IDLE,2
  319.     MOV TIMOUT,CHRTIM
  320.     RET
  321.  
  322. NXTSL1: MOV SI,CURSLV
  323.     CMP BYTE PTR ES:[SI].ADR,0  ; buffer active ?
  324.     JE  NXTSLV
  325.     CMP BYTE PTR ES:[SI].STACNT,0
  326.     JZ  NXTSL5          ; this one may be used for polling
  327.     DEC BYTE PTR ES:[SI].STACNT
  328.     JMP NXTSLV
  329.  
  330. NXTSL5: CMP BYTE PTR ES:[SI].PUSE,0 ; Send poll only if buffer is empty
  331.     JZ  STRPOL          ; else try to send a message
  332.     CMP BYTE PTR ES:[SI].MUSE,0 ; Send meassage only if buffer valid
  333.     JNZ STRM4
  334.     MOV SVEC,OFFSET NXTSLV
  335.     MOV AL,EOT
  336.     JMP SIOOT
  337.  
  338. STRM4:  JMP STRMSG
  339.  
  340.     PAGE
  341. ;------------------------------------------------------------------------------
  342. ;----- Protocoll --------------------------------------------------------------
  343. ;------------------------------------------------------------------------------
  344.  
  345. ;----- Polling: Transmitter Status
  346.  
  347. STRPOL: ; entry to start procedure for one slave
  348.     ; start message ( send 'SOH' )
  349.     ; BUFFER.ADR = code of slave ( ASCII )
  350.     ; NEXT STATE: POLREP + SADRP
  351.  
  352.     MOV IDLE,0
  353.     MOV RETRY,NRETRY        ; preset retry-counter
  354.     CMP BUSMOD,1        ; enable receiver after sending msg.
  355.     JNE STRP2
  356.     MOV DX,RBR
  357.     ADD DX,IER
  358.     MOV AL,EITX         ; disable RX-interrupts
  359.     OUT DX,AL
  360.     MOV RVEC,OFFSET RXUREQ  ; echo: slave has to wait
  361.     JMP STRP1
  362.  
  363. STRP2:  MOV RVEC,OFFSET POLREP
  364. STRP1:  MOV SVEC,OFFSET SADRP
  365.     MOV AL,SOH          ; send 'SOH' and start poll-sequence
  366.     JMP SIOOT
  367.  
  368. SADRP:  ; STATE: send address of selected slave
  369.     ; NEXT STATE: SPOL
  370.  
  371.     MOV SVEC,OFFSET SPOL    ; next state
  372.     MOV AL,ES:[SI].ADR
  373.     JMP SIOOT           ; send address
  374.  
  375. SPOL:   ; STATE:    send 'POL' to slave device
  376.     ; NEXT STATE: SENQ
  377.  
  378.     MOV SVEC,OFFSET SENQ    ; next state
  379.     MOV RVEC,OFFSET POLREP  ; set vectors
  380.     MOV AL,POL
  381.     JMP SIOOT           ; send poll-character
  382.  
  383.     PAGE
  384.  
  385. SENQ:   ; switch to slave for poll and message reply
  386.     ; send 'ENQ' to slave device
  387.     ; NEXT STATE: TXUREQ
  388.  
  389.     MOV SVEC,OFFSET RXENAB  ; next state
  390.     MOV AL,ENQ
  391.     JMP SIOOT           ; send 'ENQ'
  392.  
  393. RXENAB: CMP BUSMOD,1
  394.     JNE SENQ1
  395.     MOV DX,RBR
  396.     ADD DX,LSR
  397.     MOV AL,0F0H         ; make USART empty, clear errors
  398.     OUT DX,AL
  399.     MOV DX,RBR
  400.     ADD DX,IER
  401.     MOV AL,EIRXTX       ; enable RX-interrupts
  402.     OUT DX,AL
  403. SENQ1:  MOV TIMOUT,CHRTIM       ; activate watchdog
  404.     MOV SVEC,OFFSET TXUREQ
  405.     RET
  406.  
  407.     PAGE
  408.  
  409. ;-----  Poll: Receiver States
  410.  
  411. POLREP: ; STATE: waiting for poll request
  412.     ; INPUT: SOH --> NEXT STATE: RADR
  413.     ;    EOT --> MOUT
  414.     ;    other and parity-error --> EXIT
  415.  
  416.     JNZ RIGNOR          ; ignore character on error
  417.     CMP CL,EOT
  418.     JZ  EXITP2          ; start task if no message comming
  419.     CMP CL,SOH
  420.     JNZ RIGNOR          ; must be 'SOH', else ignore
  421.     MOV RVEC,OFFSET RADR    ; message will continue with address
  422.     MOV TIMOUT,CHRTIM       ; activate watchdog
  423. RIGNOR: RET
  424.  
  425. RADR:   ;STATE: read address of active slave after poll
  426.     ;INPUT: matching address --> NEXT STATE: RSTX
  427.     ;   other and parity-error --> EXIT
  428.  
  429.     JNZ EXITP1          ; abort on error, start message output
  430.     CMP CL,ES:[SI].ADR      ; correct address ?
  431.     JNZ EXITP1          ; abort if not, else send message
  432.     MOV RVEC,OFFSET RSTX    ; message will continue with 'STX'
  433.     MOV TIMOUT,CHRTIM       ; activate watchdog
  434.     RET
  435.  
  436. EXITP2: AND ES:[SI].STATUS,0E8H ; slave is active
  437.     MOV ES:[SI].ERRCNT,0    ; reset error-conter
  438. EXITP1: JMP EXITP
  439.  
  440. RSTX:   ; STATE: read STX after poll
  441.     ; INPUT: STX --> next state: RTEXT
  442.     ;    EOT --> exit
  443.     ;    other and parity-error --> SNAK
  444.  
  445.     JNZ SNAK1           ; send 'NAK' and wait for retry
  446.     CMP CL,EOT          ; slave was aborting, send message
  447.     JZ  EXITP1
  448.     CMP CL,STX
  449.     JNZ SNAK1           ; wrong character, retry
  450.     MOV RVEC,OFFSET RTEXT   ; next status
  451.     MOV TIMOUT,CHRTIM       ; activate watchdog
  452.     MOV CHRCNT,ASYMBL       ; init character-counter
  453.     MOV BCC,ETX         ; init BCC
  454.     MOV BUFPNT,0        ; init bufferpointer
  455.     RET
  456.  
  457. SNAK1:  JMP SNAK
  458.  
  459.     PAGE
  460.  
  461. RTEXT:  ; STATE: read message from slave device
  462.     ; INPUT: ETX --> next state: RBCC, RCTL
  463.     ;    EOT --> exit
  464.     ;    parity-error --> SNAK
  465.  
  466.     JNZ SNAK1           ; send 'NAK', retry
  467.     MOV TIMOUT,CHRTIM       ; activate watchdog
  468.     CMP CL,DLE          ; prefix in text ?
  469.     JZ  ISDLE
  470.     CMP CL,EOT          ; slave is aborting
  471.     JZ  EXITP1
  472.     CMP CL,ETX          ; end of message ?
  473.     JZ  ISETX
  474. RTEXT2: DEC CHRCNT          ; put character to buffer
  475.     JZ  EXITP1          ; abort on buffer-overflow
  476.     XOR BYTE PTR BCC,CL     ; update bcc
  477.     MOV BX,BUFPNT
  478.     MOV ES:[SI+BX].PBF,CL   ; character to buffer
  479.     INC BUFPNT
  480.     RET
  481.  
  482. ISDLE:  MOV RVEC,OFFSET RDLE    ; ignore cntl-character next interrupt
  483.     XOR BYTE PTR BCC,CL     ; update BCC
  484.     RET
  485.  
  486. RDLE:   ;STATE: read text-character without testing ETX and EOT
  487.  
  488.     JNZ SNAK            ; abort on error
  489.     MOV TIMOUT,CHRTIM       ; activate watchdog
  490.     MOV RVEC,OFFSET RTEXT   ; next character will be normally
  491.     JMP RTEXT2          ; read any character after DLE
  492.  
  493. ISETX:  ;END OF TEXT DETECTED
  494.  
  495.     MOV RVEC,OFFSET RBCC
  496.     RET
  497.  
  498. PAGE
  499.  
  500. RBCC:   ;STATE: read BCC from slave device
  501.     ;INPUT: good BCC --> ACK
  502.     ;   wrong BCC --> NAK
  503.  
  504.     JNZ SNAK            ; send 'NAK', retry on Character error
  505.     XOR BYTE PTR BCC,CL     ; test bcc
  506.     JNZ SNAK            ; send 'NAK', retry if fault BCC
  507.     MOV ES:[SI].PUSE,1      ; buffer is valid now
  508.     MOV TIMOUT,OFF      ; no supervision
  509.     MOV AX,BUFPNT       ; number of characters in buffer
  510.     MOV ES:[SI].PLEN,AX
  511.     MOV ES:[SI].STATUS,0    ; status is good now
  512.     MOV ES:[SI].ERRCNT,0    ; reset error-conter
  513.     MOV RVEC,OFFSET RXUREQ  ; no further reply requested
  514.     MOV SVEC,OFFSET STRMSG  ; continue with sending message
  515.     MOV AL,ACK          ; send 'ACK'
  516.  
  517.  
  518.     JMP SIOOT
  519.  
  520. SNAK:   ; send 'NAK' if retries may be done
  521.     ;  else exit
  522.  
  523.     INC RTYCNT          ; count retries
  524.     DEC RETRY
  525.     JZ  PABORT          ; abort if bad communication
  526.     MOV RVEC,OFFSET POLREP  ; set vector
  527.     MOV AL,NAK
  528.     JMP SIOOT           ; send 'NAK'
  529.  
  530. PABORT: MOV ES:[SI].STATUS,2
  531.     CALL    NXTCNF          ; remove this slave from list to scan
  532.  
  533. EXITP:  ; set receiver to idle ( RXUREQ ),
  534.     ; set transmitter to idle ( TXUREQ ),
  535.     ; send 'EOT', start message output to slave
  536.  
  537.     MOV TIMOUT,OFF      ; no supervision
  538.     MOV RVEC,OFFSET RXUREQ  ; next: send a message
  539.  
  540.     PAGE
  541.  
  542. ;----- Message: Transmitter Status
  543.  
  544. STRMSG: ; entry from task to start message-output
  545.     ; start message ( send 'SOH' )
  546.     ; BUFFER.ADR = code of slave ( 0...9 )
  547.     ; NEXT STATE: MSGREP + SADRT
  548.     ; set retry-counter
  549.     ; ENTRY: BUFFER.INUSE = 1
  550.  
  551.  
  552.     CMP BYTE PTR ES:[SI].MUSE,0 ; something in buffer ?
  553.     JNZ STRM0
  554.     JMP EXITMSG
  555.  
  556. STRM0:  MOV IDLE,0
  557.     MOV RETRY,NRETRY        ; preset retry-counter
  558. STRM3:  CMP BUSMOD,1        ; enable receiver after sending msg.
  559.     JNE STRM2
  560.     MOV DX,RBR
  561.     ADD DX,IER
  562.     MOV AL,EITX         ; disable RX-interrupts
  563.     OUT DX,AL
  564.     MOV RVEC,OFFSET RXUREQ  ; echo: slave has to wait
  565.     JMP STRM1
  566.  
  567. STRM2:  MOV RVEC,OFFSET TXTREP
  568. STRM1:  MOV SVEC,OFFSET SADRT
  569.     MOV AL,SOH
  570.     JMP SIOOT
  571.  
  572. SADRT:  ;STATE: send address of selected slave
  573.     ;NEXT STATE:  SSTX
  574.  
  575.     MOV SVEC,OFFSET SSTX    ; next state
  576.     MOV AL,ES:[SI].ADR      ; send address
  577.     JMP SIOOT           ; send address
  578.  
  579. SSTX:   ;STATE: SEND 'STX' TO SLAVE DEVICE
  580.     ;NEXT SLAVE: STEXT
  581.  
  582.     MOV SVEC,OFFSET STEXT   ; next state
  583.     MOV BCC,ETX         ; init BCC
  584.     MOV AX,ES:[SI].MLEN     ; init number of bytes to send
  585.     MOV CHRCNT,AX
  586.     MOV BUFPNT,0        ; init buffer-pointer
  587.     MOV AL,STX
  588.     JMP SIOOT           ; send 'STX'
  589.  
  590.     PAGE
  591.  
  592. STEXT:  ;STATE: Send number of bytes defined in BUFFER.MLEN.
  593.     ;NEXT STATE: SETX
  594.  
  595.     DEC CHRCNT          ; character counter
  596.     JS  SETX            ; end of text
  597.     MOV BX,BUFPNT
  598.     MOV AL,ES:[SI+BX].MBF   ; character to send
  599.     CMP AL,SOH
  600.     JE  ISCTRL
  601.     CMP AL,DLE
  602.     JE  ISCTRL
  603.     CMP AL,EOT
  604.     JE  ISCTRL
  605.     CMP AL,ETX
  606.     JE  ISCTRL
  607.     INC BUFPNT          ; update pointer
  608.     XOR BCC,AL          ; update BCC
  609.     JMP SIOOT           ; send character
  610.  
  611. ISCTRL: MOV SVEC,OFFSET SCTL    ; continue after sending DLE normally
  612.     MOV AL,DLE
  613.     XOR BCC,AL          ; update BCC
  614.     JMP SIOOT
  615.  
  616. SCTL:   ;STATE: send controlcharacter, last character was DLE
  617.  
  618.     MOV BX,BUFPNT
  619.     MOV AL,ES:[SI+BX].MBF
  620.     INC BUFPNT
  621.     MOV SVEC,OFFSET STEXT
  622.     XOR BCC,AL
  623.     JMP SIOOT
  624.  
  625. SETX:   ;STATE: send 'ETX' to slvae device
  626.     ;NEXT STATE: SBCC
  627.  
  628.     MOV SVEC,OFFSET SBCC    ; next state
  629.     MOV AL,ETX
  630.     JMP SIOOT           ; send 'ETX'
  631.  
  632. SBCC:   ;STATE: send calculated BCC to slave device
  633.     ;NEXT STATE: SENQ
  634.  
  635.     MOV RVEC,OFFSET TXTREP
  636.     MOV SVEC,OFFSET SENQ    ; next state
  637.     MOV AL,BCC
  638.     JMP SIOOT           ; send check-character
  639.  
  640.     PAGE
  641.  
  642. ; ----- Message: Receiver States
  643.  
  644. TXTREP: ; STATE: wait for reply to message-output
  645.     ; INPUT: ACK --> set data accepted, exit
  646.     ;    NAK --> STRMSG ( if reties may be done )
  647.     ;    other and parity-error --> EXIT
  648.  
  649.     JNZ PIGNOR          ; ignore on error
  650.     CMP CL,EOT
  651.     JE  EXITMSG
  652.     CMP CL,NAK
  653.     JZ  RNAK
  654.     CMP CL,ACK
  655.     JNZ PIGNOR          ; retry
  656.     MOV ES:[SI].MUSE,0      ; buffer is transfered
  657.     MOV ES:[SI].STATUS,0
  658.     MOV ES:[SI].ERRCNT,0    ; reset error-conter
  659.     JMP EXITMSG
  660.  
  661. PIGNOR: RET
  662.  
  663. RNAK:   INC RTYCNT          ; count reties
  664.     DEC RETRY           ; more retries ?
  665.     JZ  MABORT
  666.     JMP STRM3           ; set vectors restart message output
  667.  
  668. MABORT: MOV ES:[SI].STATUS,3    ; retries exceeded
  669.     CALL    NXTCN1          ; remove slave some time
  670.  
  671. EXITMSG:; set receiver to idle ( RXUREQ ),
  672.     ; set transmitter to idle ( TXUREQ ),
  673.     ; send 'EOT', set valid
  674.     ; ENTRY: B = status of buffer
  675.     ;        0:  buffer empty
  676.     ;        1:  buffer contains message
  677.     ;        -1: slave without valid response
  678.  
  679.     CMP BUSMOD,1        ; enable receiver after sending msg.
  680.     JNE EXM1
  681.     MOV DX,RBR
  682.     ADD DX,IER
  683.     MOV AL,EITX         ; disable RX-interrupts
  684.     OUT DX,AL
  685. EXM1:   MOV RVEC,OFFSET RXUREQ
  686.     MOV SVEC,OFFSET NXTSLV
  687.     MOV AL,EOT          ; send EOT
  688.     JMP SIOOT
  689.  
  690.     PAGE
  691. ;------------------------------------------------------------------------------
  692. ;------ User interface --------------------------------------------------------
  693. ;------------------------------------------------------------------------------
  694.  
  695.  
  696. ;------  void PASCAL apen_asycom
  697. ;------  (
  698. ;------    int port, int intr, int umask, int cw1, int cw2, int baud,
  699. ;------    int form, int slaves, int echo
  700. ;------  );
  701.  
  702. cProc   OPEN_ASYCOM_    <PUBLIC> <SI, ES, CX, BX, DX>
  703.     parmW   PORT            ; port address UART
  704.     parmW   INTR            ; software interrupt
  705.     parmW   UMASK           ; interrupt mask
  706.     parmW   CW1         ; address of interr. controller UART
  707.     parmW   CW2         ; address of other controller
  708.     parmW   BAUD            ; divider value baudrate
  709.     parmW   FORM            ; number of bits
  710.     parmW   SLAVES          ; number of slaves
  711.     parmW   ECHO            ; bus mode
  712. cBegin
  713.     MOV AX,_DATA
  714.     MOV DS,AX           ; <DS> := <CS>
  715.     MOV CX,SLAVES       ; number of slaves
  716.     MOV NSLAVES,CL      ; ignore value in CH
  717.     MOV AX,SEG _COM_BUFF
  718.     MOV SLAVE1[2],AX
  719.     MOV AX,OFFSET _COM_BUFF
  720.     MOV SLAVE1[0],AX
  721.     MOV AH,35H          ; DOS-function 'get vector': TIMER
  722.     MOV AL,TIMER        ; Number of vector
  723.     cCall   DOS3Call
  724.     MOV OLDT[0],BX      ; save old address to continue there
  725.     MOV OLDT[2],ES
  726.     MOV DX,OFFSET ASYWDG    ; <dx> = adresse of new service: TIMER
  727.     MOV AX,SEG ASYWDG       ; <dx> = adresse of new service: TIMER
  728.     MOV DS,AX           ; <DS> := <CS>
  729.     MOV AH,25H          ; new servive address
  730.     MOV AL,TIMER
  731.     cCall   DOS3Call
  732.     MOV AX,_DATA
  733.     MOV DS,AX           ; <DS> := <CS>
  734.         MOV CX,NSLAVES      ; never more than 26 slaves ( A...Z ) !
  735. SETADR: DEC CX          ; set address to NULL
  736.     LES SI,DWORD PTR SLAVE1
  737.     MOV AX,SIZE BUFFER
  738.     IMUL    CX
  739.     ADD SI,AX
  740.     MOV ES:[SI].ADR,0
  741.     MOV ES:[SI].STACNT,0
  742.     MOV ES:[SI].ERRCNT,0
  743.     MOV ES:[SI].PUSE,0
  744.     MOV ES:[SI].MUSE,0
  745.     CMP CX,0
  746.     JNE SETADR
  747.     MOV AX,_DATA
  748.     MOV DS,AX           ; <DS> := <CS>
  749.     MOV AL,INTR         ; AH will be ignored
  750.     MOV INTNUM,AL
  751.     MOV AL,UMASK        ; interrupt mask for OCW1
  752.     MOV IMASK,AL
  753.     MOV AX,CW1          ; address of UART's controller
  754.     MOV OCW1,AX
  755.     MOV AX,CW2          ; address of other interrupt controller
  756.     MOV OCW2,AX
  757.     MOV AH,35H          ; save original vector
  758.     MOV AL,INTNUM
  759.     cCall   DOS3Call
  760.     MOV OLDC[0],BX
  761.     MOV OLDC[2],ES
  762.     MOV AL,INTNUM
  763.     MOV DX,OFFSET INT1
  764.     MOV CX,SEG INT1
  765.     MOV DS,CX
  766.     MOV AH,25H          ; vector will point to driver
  767.     cCall   DOS3Call
  768.     MOV AX,_DATA
  769.     MOV DS,AX           ; <DS> := <CS>
  770.     MOV DX,PORT
  771.     MOV RBR,DX
  772.     ADD DX,LCR          ; set divisor latch access bit
  773.     MOV AL,9BH
  774.     OUT DX,AL
  775.     MOV DX,RBR
  776.     MOV AX,BAUD         ; set baudrate
  777.     OUT DX,AL
  778.     INC DX
  779.     MOV AL,AH
  780.     OUT DX,AL
  781.     MOV DX,RBR          ; set parity ...
  782.     ADD DX,LCR
  783.     MOV AX,FORM         ; AH will be ignored on output
  784.     OUT DX,AL
  785.     CLI
  786.     MOV DX,RBR          ; base address
  787.     ADD DX,MCR          ; modem Port
  788.     MOV AL,RTSON
  789.     OUT DX,AL           ; OUT2 + DTR + RTS on
  790.     MOV DX,RBR          ; base-address
  791.     ADD DX,IER
  792.     MOV AL,EIRXTX       ; enable RX-interrupts
  793.     OUT DX,AL
  794.         MOV CX,ECHO
  795.     MOV BUSMOD,CL       ; set busmode ( 0 for no echo )
  796.     MOV DX,RBR          ; empty UART
  797.     IN  AL,DX
  798.     IN  AL,DX
  799.     IN  AL,DX
  800.     MOV AX,_DATA
  801.     MOV DS,AX           ; <DS> := <CS>
  802.     MOV DX,OCW1
  803.     INC DX          ; set DX to mask register
  804.     IN  AL,DX
  805.     MOV AH,IMASK        ; reset bit to
  806.     AND AL,AH           ; interrupt enable 8259 for 8250
  807.     OUT DX,AL
  808.     LES SI,DWORD PTR SLAVE1 ; start with slave #1 in STRPOL
  809.     MOV CURSLV,SI
  810.         MOV AL,NSLAVES
  811.     MOV SLVCNT,AL       ; init current-slavecounter
  812.     MOV TIMOUT,OFF      ; no supervision
  813.     MOV RVEC,OFFSET RXUREQ
  814.     MOV SVEC,OFFSET NXTSLV
  815.     STI
  816.     MOV AL,EOT          ; send 'EOT' to start poll-sequence
  817.     CALL    SIOOT
  818. cEnd
  819.  
  820. ;------ int PASCAL retry_asycom(void);
  821.  
  822. cProc   RETRY_ASYCOM <PUBLIC,FAR>
  823. cBegin
  824.     MOV AX,_data
  825.     MOV DS,AX
  826.     MOV AX,RTYCNT       ; read and reset retry counter
  827.     MOV RTYCNT,0
  828. cEnd
  829.  
  830. ;------ int PASCAL watchdog_asycom(void);
  831.  
  832. cProc   WATCHDOG_ASYCOM <PUBLIC,FAR> <es,si>
  833. cBegin
  834.     MOV AX,_DATA
  835.     MOV DS,AX           ; <DS> := <CS>
  836.     MOV AX,WDGCNT       ; read and reset watchdog counter
  837.     MOV WDGCNT,0
  838. cEnd
  839.  
  840. ;------ void PASCAL close_asycom(void);
  841.  
  842. cProc   CLOSE_ASYCOM_   <PUBLIC> <DX>
  843. cBegin
  844.     MOV AX,_DATA
  845.     MOV DS,AX           ; <DS> := <CS>
  846.     CLI
  847.     MOV DX,OCW1
  848.     INC DX          ; set DX to mask register
  849.     IN  AL,DX
  850.     MOV AH,IMASK        ; set bit to disable interrupt
  851.     NOT AH
  852.     OR  AL,AH           ; interrupt enable 8259 for 8250
  853.     OUT DX,AL
  854.     MOV TIMOUT,OFF      ; no supervision
  855.     MOV RVEC,OFFSET RXUREQ  ; int vectors
  856.     MOV SVEC,OFFSET TXUREQ
  857.     STI
  858.     MOV DX,OLDT[0]      ; restore interrupt-vector of timer
  859.     MOV DS,OLDT[2]
  860.     MOV AH,25H
  861.     MOV AL,TIMER
  862.     cCall   DOS3Call
  863.     MOV AX,_DATA
  864.     MOV DS,AX           ; <DS> := <CS>
  865.     MOV AL,INTNUM
  866.     MOV DX,OLDC[0]      ; restore interrupt-vector of COM
  867.     MOV DS,OLDC[2]
  868.     MOV AH,25H
  869.     cCall   DOS3Call
  870.     MOV AX,_DATA
  871.     MOV DS,AX           ; <DS> := <CS>
  872. cEnd
  873.  
  874. sEnd    INIT_TEXT
  875.  
  876.     end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement