z8530.s
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:3k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. ; Zilog 8530 general-purpose control subroutines
  2. ; Copyright 1991 Phil Karn, KA9Q
  3. include asmglobal.h
  4. LOCALS
  5. .CODE
  6. ; Write a 8530 register. Called from C as
  7. ; write_scc(int ctl,unsigned char reg,unsigned char val);
  8. public write_scc
  9. write_scc proc
  10. arg ctl:word,reg:byte,val:byte
  11. pushf
  12. mov dx,ctl
  13. mov al,reg
  14. cmp al,0
  15. jz @@doit ; no need to set register 0
  16. cli
  17. out dx,al
  18. ; Allow enough delay for 16 MHz 80386 and a 4.9152 MHz 8530
  19. ; The delay uses a NOP in a loop because of the pipeline in the 80386.
  20. ; The loop instruction causes the 80386 to flush the pipeline and reload.
  21. ; The 8530 requires a delay of 6 PCLK + 200 ns - a loop of 8 should be
  22. ; adequate to a 16 Mhz 80386.
  23. mov cx,8
  24. @@w1: nop
  25. loop @@w1
  26. @@doit: mov al,val
  27. out dx,al
  28. POPFLAGS
  29. ret
  30. write_scc endp
  31. ; Read a 8530 register. Called from C as
  32. ; unsigned char read_scc(int ctl,unsigned char reg);
  33. public read_scc
  34. read_scc proc
  35. arg ctl:word,reg:byte
  36. pushf
  37. mov dx,ctl
  38. mov al,reg
  39. cmp al,0
  40. jz @@doit ; no need to set reg if R0
  41. cli
  42. out dx,al
  43. ; allow enough delay for the 8530 to settle (see comments above)
  44. mov cx,8
  45. @@r1: nop
  46. loop @@r1
  47. @@doit: in al,dx
  48. mov ah,0
  49. POPFLAGS
  50. ret
  51. read_scc endp
  52. ; Read packets from the 8530 receiver.
  53. ; Returns when either a good frame is received, or when carrier drops.
  54. ; If a good frame is received, the length is returned; otherwise -1.
  55. public rx8530
  56. rx8530 proc
  57. arg ctl:word,data:word,buf:ptr,bufsize:word
  58. uses di
  59. @@restart:
  60. if @Datasize NE 0
  61. les di,buf
  62. else
  63. mov di,buf ; cp = buf
  64. mov ax,ds
  65. mov es,ax
  66. endif
  67. cld
  68. mov cx,0 ; cnt = 0
  69. @@rxloop:
  70. mov dx,ctl ; read status
  71. in al,dx ; into al
  72. test al,08h ; DCD still present?
  73. jz @@dcdoff ; nope, quit
  74. test al,080h ; Abort?
  75. jnz @@restart ; yes, start again
  76. test al,01h ; character available?
  77. jz @@nochar ; nope, go on
  78. mov dx,data
  79. in al,dx ; get it
  80. stosb ; and stash: *cp++ = char
  81. inc cx ; cnt++
  82. cmp cx,bufsize ; cx == bufsize?
  83. jnz @@rxloop
  84. mov dx,ctl ; buffer overflowed; abort receiver
  85. mov al,3 ; select register 3
  86. out dx,al
  87. mov al,0d9h ; ENT_HM|RxENABLE|RxCRC_ENAB|Rx8
  88. nop
  89. nop
  90. nop
  91. nop
  92. nop
  93. out dx,al
  94. jmp @@restart
  95. @@nochar:
  96. mov al,1 ; Select error register (R1)
  97. mov dx,ctl
  98. out dx,al
  99. nop
  100. nop
  101. nop
  102. nop
  103. nop
  104. nop
  105. in al,dx ; read error reg (R1)
  106. test al,080h ; end of frame?
  107. jz @@rxloop ; nope, keep looking
  108. test al,040h ; End of frame. CRC error?
  109. jnz @@restart ; yup; start again
  110. mov ax,cx ; good frame; return with count
  111. ret
  112. @@dcdoff:
  113. mov ax,0ffffh ; DCD dropped, return -1
  114. ret
  115. rx8530 endp
  116. end