Subversion Repositories pentevo

Rev

Rev 638 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1.  
  2. ;LAST UPDATE: 22.03.2014 savelij
  3.  
  4. ;Receive array buf of max length with ending ZDLE sequence
  5. ; and CRC.  Returns the ending character or error code.
  6. ; NB: On errors may store length+1 bytes!
  7. ;НА ВХОДЕ: DE=ДЛИНА, HL=АДРЕС БУФЕРА
  8. ;НА ВЫХОДЕ: С=1 ЗАКОНЧИЛСЯ БУФЕР
  9. ZRDATA          LD A,(rxframeind)
  10.                 CP ZBIN32
  11.                 JR NZ,ZM_0072
  12.                 RET;JP ZRDAT32
  13.                
  14. ZM_0072         CALL ZDLREAD
  15.                 DEC B
  16.                 JR Z,ZM_0078
  17.                 LD (HL),A
  18.                 INC HL
  19.                 CALL UPDCRC
  20.                 DEC DE
  21.                 LD A,D
  22.                 OR E
  23.                 JR NZ,ZM_0072
  24.                 LD (ADR_BUFRECV),HL
  25.                 LD A,ERROR
  26.                 RET
  27.  
  28. ;crcfoo
  29. ZM_0078         LD (ADR_BUFRECV),HL
  30.                 LD HL,zmblkmax
  31.                 AND A
  32.                 SBC HL,DE
  33.                 LD (rxcount),HL
  34.                 CP ZDLE
  35.                 RET Z
  36.                 CP LOW (GOTCRCE)
  37.                 JR Z,ZM_0080
  38.                 CP LOW (GOTCRCG)
  39.                 JR Z,ZM_0080
  40.                 CP LOW (GOTCRCQ)
  41.                 JR Z,ZM_0080
  42.                 CP LOW (GOTCRCW)
  43.                 JR Z,ZM_0080
  44.                 LD A,ZCAN
  45.                 RET
  46.  
  47. ZM_0080         PUSH AF
  48.                 CALL UPDCRC
  49.                 CALL ZDLREAD
  50.                 CALL UPDCRC
  51.                 CALL ZDLREAD
  52.                 CALL UPDCRC
  53.                 POP AF
  54.                 LD C,A
  55.                 LD HL,(CRC16_WORD)
  56.                 LD A,H
  57.                 OR L
  58.                 LD A,C
  59.                 RET
  60.  
  61. ;Read a ZMODEM header to hdr, either binary or hex.
  62. ;eflag controls local display of non zmodem characters:
  63. ;    0:  no display
  64. ;    1:  display printing characters only
  65. ;    2:  display all non ZMODEM characters
  66. ;On success, set Zmodem to 1, set rxpos and return type of header.
  67. ; Otherwise return negative on error.
  68. ; Return ERROR instantly if ZCRCW sequence, for fast error recovery.
  69. ZGETHDR         LD A,(rxtype)
  70.                 LD (prev_rxtype),A
  71.                 XOR A
  72.                 LD (rxtype),A
  73.                 LD (rxframeind),A
  74. ;again
  75. ZM_0113         CALL RS232_READ
  76.                 CP ZPAD
  77.                 JR Z,ZM_0115
  78.                 CP ZPAD|0X80
  79.                 JR NZ,ZM_0118
  80.                 LD (Not8bit),A
  81.                 JR ZM_0115
  82.  
  83. ZM_0118         INC A
  84.                 RET Z
  85.                 CP ZPAD
  86.                 JR NZ,ZM_0113
  87. ;gotcan
  88.                 JR $
  89.  
  90. ;garbage
  91. ZM_0115         CALL NOXRD7
  92.                 CP ZDLE
  93.                 JR Z,ZM_0133
  94.                 CP ZPAD
  95.                 JR Z,ZM_0115
  96. ZM_0133         CALL NOXRD7
  97.                 CP ZBIN
  98.                 JR NZ,ZM_0140
  99.                 LD (rxframeind),A
  100.                 CALL ZRBHDR
  101.                 LD A,(rxtype)
  102.                 RET
  103.  
  104. ZM_0140         CP ZBIN32
  105.                 JR NZ,ZM_0141
  106.                 LD (rxframeind),A
  107.                 JR $
  108.  
  109. ZM_0141         CP ZHEX
  110.                 JR NZ,ZM_0143
  111.                 LD (rxframeind),A
  112.                 CALL ZRHHDR
  113.                 LD A,(rxtype)
  114.                 RET
  115.  
  116. ZM_0143         CP ZDLE
  117.                 JR NZ,ZM_0113
  118.                 RET
  119.  
  120. ;Receive a binary style header (type and position)
  121. ZRBHDR          LD DE,0
  122.                 LD (CRC16_WORD),DE
  123.                 CALL ZDLREAD
  124.                 LD (rxtype),A
  125.                 CALL UPDCRC
  126.                 LD HL,rxhdr
  127.                 CALL ZDLREAD    ;1
  128.                 LD (HL),A
  129.                 INC HL
  130.                 CALL UPDCRC
  131.                 CALL ZDLREAD    ;2
  132.                 LD (HL),A
  133.                 INC HL
  134.                 CALL UPDCRC
  135.                 CALL ZDLREAD    ;3
  136.                 LD (HL),A
  137.                 INC HL
  138.                 CALL UPDCRC
  139.                 CALL ZDLREAD    ;4
  140.                 LD (HL),A
  141.                 INC HL
  142.                 CALL UPDCRC
  143.                 CALL ZDLREAD    ;1
  144.                 CALL UPDCRC
  145.                 CALL ZDLREAD    ;2
  146.                 CALL UPDCRC
  147.                 LD HL,(CRC16_WORD)
  148.                 LD A,H
  149.                 OR L
  150.                 LD A,(rxtype)
  151.                 RET
  152.  
  153. ;Read a byte, checking for ZMODEM escape encoding
  154. ; including CAN*5 which represents a quick abort
  155. ;НА ВЫХОДЕ: B=0-ПРИНЯТ БАЙТ
  156. ;           B=1-ПРИНЯТ УПРАВЛЯЮЩИЙ БАЙТ
  157. ZDLREAD         LD B,0
  158. ZM_0359         CALL RS232_READ
  159.                 LD C,A
  160.                 AND 0X60
  161.                 LD A,C
  162.                 RET NZ
  163.                 CP ZDLE
  164.                 JR Z,ZM_0233
  165.                 CP 0X11
  166.                 JR Z,ZM_0359
  167.                 CP 0X13
  168.                 JR Z,ZM_0359
  169.                 CP 0X91
  170.                 JR Z,ZM_0359
  171.                 CP 0X93
  172.                 JR Z,ZM_0359
  173.                 LD A,(zctlesc)
  174.                 AND A
  175.                 LD A,C
  176.                 RET Z
  177.                 AND 0X60
  178.                 LD A,C
  179.                 JR Z,ZM_0359
  180.                 RET
  181.  
  182. ;again2
  183. ZM_0233         CALL RS232_READ
  184.                 CP ZDLE
  185.                 JR NZ,ZM_0248
  186.                 CALL RS232_READ
  187. ZM_0248         CP ZDLE
  188.                 JR NZ,ZM_0252
  189.                 CALL RS232_READ
  190. ZM_0252         CP ZDLE
  191.                 JR NZ,ZM_0256
  192.                 CALL RS232_READ
  193. ZM_0256         LD C,A
  194.                 CP ZFREECNT
  195.                 JR Z,ZM_0233
  196.                 CP ZSTDERR
  197.                 JR Z,ZM_0233
  198.                 LD B,1
  199.                 CP ZDLE
  200.                 RET Z
  201.                 CP ZCRCE
  202.                 RET Z
  203.                 CP ZCRCG
  204.                 RET Z
  205.                 CP ZCRCQ
  206.                 RET Z
  207.                 CP ZCRCW
  208.                 RET Z
  209.                 DEC B
  210.                 CP 0X91
  211.                 JR Z,ZM_0260
  212.                 CP 0X93
  213.                 JR NZ,ZM_0263
  214. ZM_0261         LD A,0XFF
  215.                 RET
  216.  
  217. ZM_0260         LD A,0X7F
  218.                 RET
  219.  
  220. ZM_0263         LD A,(zctlesc)
  221.                 AND A
  222.                 LD A,C
  223.                 JR Z,ZM_0265
  224.                 AND 0X60
  225.                 JR Z,ZM_0233
  226. ZM_0265         LD A,C
  227.                 AND 0X60
  228.                 XOR 0X40
  229.                 RET NZ
  230. ZM_0268         LD A,C
  231.                 XOR 0X40
  232.                 RET
  233.  
  234. ;Receive a hex style header (type and position)
  235. ZRHHDR          LD DE,0
  236.                 LD (CRC16_WORD),DE
  237.                 CALL ZGETHEX
  238.                 LD (rxtype),A
  239.                 CALL UPDCRC
  240.                 LD HL,rxhdr
  241.                 CALL ZGETHEX    ;1
  242.                 LD (HL),A
  243.                 INC HL
  244.                 CALL UPDCRC
  245.                 CALL ZGETHEX    ;2
  246.                 LD (HL),A
  247.                 INC HL
  248.                 CALL UPDCRC
  249.                 CALL ZGETHEX    ;3
  250.                 LD (HL),A
  251.                 INC HL
  252.                 CALL UPDCRC
  253.                 CALL ZGETHEX    ;4
  254.                 LD (HL),A
  255.                 CALL UPDCRC
  256.                 CALL ZGETHEX    ;1
  257.                 CALL UPDCRC
  258.                 CALL ZGETHEX    ;2
  259.                 CALL UPDCRC
  260.                 LD HL,(CRC16_WORD)
  261.                 LD A,H
  262.                 OR L
  263.                 RET NZ
  264.                 CALL RS232_READ
  265.                 CP 0X0D
  266.                 JR Z,ZM_0193
  267.                 CP 0X8D
  268.                 JR NZ,ZM_0195
  269.                 LD (Not8bit),A
  270. ZM_0193         CALL RS232_READ
  271.                 CP 0X0A
  272.                 JR NZ,ZM_0195
  273.                 LD HL,Not8bit
  274.                 OR (HL)
  275.                 LD (HL),A
  276. ZM_0195         LD A,(rxtype)
  277.                 AND A
  278.                 RET
  279.  
  280. ;Decode two lower case hex digits into an 8 bit byte value
  281. ZGETHEX         CALL NOXRD7
  282.                 BIT 7,A
  283.                 SCF
  284.                 RET NZ
  285.                 SUB '0'
  286.                 CP 10
  287.                 JR C,ZGETHEX1
  288.                 AND %11011111
  289.                 SUB 7
  290. ZGETHEX1        RRCA
  291.                 RRCA
  292.                 RRCA
  293.                 RRCA
  294.                 AND 0XF0
  295.                 LD E,A
  296.                 CALL NOXRD7
  297.                 BIT 7,A
  298.                 SCF
  299.                 RET NZ
  300.                 SUB '0'
  301.                 CP 10
  302.                 JR C,ZGETHEX2
  303.                 AND %11011111
  304.                 SUB 7
  305. ZGETHEX2        AND 0X0F
  306.                 OR E
  307.                 RET
  308.  
  309. ;Read a character from the modem line with timeout.
  310. ;Eat parity, XON and XOFF characters.
  311. NOXRD7          CALL RS232_READ
  312.                 AND 0X7F
  313.                 LD C,A
  314.                 CP XON
  315.                 JR Z,NOXRD7
  316.                 CP XOFF
  317.                 JR Z,NOXRD7
  318.                 CP 0X0A
  319.                 RET Z
  320.                 CP 0X0D
  321.                 RET Z
  322.                 CP ZDLE
  323.                 RET Z
  324.                 LD A,(zctlesc)
  325.                 AND A
  326.                 LD A,C
  327.                 RET Z
  328.                 LD A,C
  329.                 AND 0X60
  330.                 JR Z,NOXRD7
  331.                 LD A,C
  332.                 RET
  333.  
  334. ;Send ZMODEM HEX header hdr of type type
  335. ;A=type
  336. ZSHHDR          LD (tryzhdrtype),A
  337.                 LD A,ZPAD
  338.                 CALL RS232_WRITE
  339.                 LD A,ZPAD
  340.                 CALL RS232_WRITE
  341.                 LD A,ZDLE
  342.                 CALL RS232_WRITE
  343.                 LD A,ZHEX
  344.                 CALL RS232_WRITE
  345.                 LD A,(tryzhdrtype)
  346.                 CALL TO_HEX
  347.                 LD E,A
  348.                 XOR A
  349.                 LD D,A
  350.                 LD (CRC16_WORD),DE
  351.                 CALL TO_HEX
  352.                 CALL UPDCRC
  353.                 CALL TO_HEX
  354.                 CALL UPDCRC
  355.                 CALL TO_HEX
  356.                 CALL UPDCRC
  357.                 LD A,(txhdr+3)
  358.                 CALL TO_HEX
  359.                 CALL UPDCRC
  360.                 XOR A
  361.                 CALL UPDCRC
  362.                 CALL UPDCRC
  363.                 LD DE,(CRC16_WORD)
  364.                 LD A,D
  365.                 CALL TO_HEX
  366.                 LD A,E
  367.                 CALL TO_HEX
  368.                 LD A,0X0D
  369.                 CALL RS232_WRITE
  370.                 LD A,0X8A
  371.                 CALL RS232_WRITE
  372.                 LD A,(tryzhdrtype)
  373.                 CP ZFIN
  374.                 RET Z
  375.                 CP ZACK
  376.                 RET Z
  377.                 LD A,0X11
  378.                 JP RS232_WRITE
  379.  
  380. ;ПЕРЕДАЧА БАЙТА В HEX ВИДЕ
  381. TO_HEX          LD B,A
  382.                 RRCA
  383.                 RRCA
  384.                 RRCA
  385.                 RRCA
  386.                 CALL TO_HEX1
  387. TO_HEX1         AND 0X0F
  388.                 CP 0X0A
  389.                 JR C,TO_HEX2
  390.                 ADD A,7
  391.                 OR %00100000
  392. TO_HEX2         ADD A,'0'
  393.                 CALL RS232_WRITE
  394.                 LD A,B
  395.                 RET
  396.  
  397. ;A=БАЙТ ДЛЯ ОБНОВЛЕНИЯ CRC16
  398. UPDCRC          EXX
  399.                 LD DE,(CRC16_WORD)
  400.                 LD B,A
  401.                 LD C,E
  402.                 LD L,D
  403.                 LD H,HIGH (CRC16_TABLE)
  404.                 LD A,(HL)
  405.                 XOR B
  406.                 LD E,A
  407.                 INC H
  408.                 LD A,(HL)
  409.                 XOR C
  410.                 LD D,A
  411.                 LD A,B
  412.                 LD (CRC16_WORD),DE
  413.                 EXX
  414.                 RET
  415.  
  416. ;Store long integer pos in txhdr
  417. STOHDR          LD HL,txhdr
  418.                 LD (HL),E
  419.                 INC HL
  420.                 LD (HL),D
  421.                 INC HL
  422.                 LD (HL),C
  423.                 INC HL
  424.                 LD (HL),B
  425.                 RET
  426.  
  427. ;Recover a long integer from a header
  428. RCLHDR          LD HL,rxhdr
  429.                 LD E,(HL)
  430.                 INC HL
  431.                 LD D,(HL)
  432.                 INC HL
  433.                 LD C,(HL)
  434.                 INC HL
  435.                 LD B,(HL)
  436.                 RET
  437.  
  438. ;Output the attention string (if there is one).
  439. RXATTN          LD HL,attn
  440. RXATTN1         LD A,(HL)
  441.                 AND A
  442.                 RET Z
  443.                 CALL RS232_WRITE
  444.                 JR RXATTN1
  445.  
  446. ;send cancel string to get the other end to shut up
  447. ABORTTX         LD E,10
  448. ABORTTX1        LD A,0X18
  449.                 CALL RS232_WRITE                ;ПЕРЕДАЧА БАЙТА
  450.                 DEC E
  451.                 JR NZ,ABORTTX1
  452.                 LD E,10
  453. ABORTTX2        LD A,8
  454.                 CALL RS232_WRITE                ;ПЕРЕДАЧА БАЙТА
  455.                 DEC E
  456.                 JR NZ,ABORTTX2
  457.                 RET
  458.