?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1.     module Uart
  2.     assert $ > #8000 ;; Important keep it in FAST memory
  3. init:
  4.     di
  5.     ld a, #07
  6.     ld bc, #fffd
  7.     out (c), a
  8.     ld a, #fc
  9.     ld b, #bf
  10.     out (c), a ; Enable read mode
  11.    
  12.     ld a, #0e
  13.     ld bc, #fffd
  14.     out (c), a
  15.  
  16.     ld b, #bf
  17.     in a, (c)
  18.     and #fb
  19.     out (c), a ; Make CTS low
  20.  
  21.     ei
  22.     ld b, #ff
  23. .flush
  24.     halt
  25.     djnz .flush
  26.     ret
  27.  
  28.  
  29. write:
  30.     push hl, de, bc
  31.     push af
  32.     ld c, #fd ; prepare port addresses
  33.     ld d, #ff
  34.     ld e, #bf
  35.     ld b, d
  36.    
  37.     ld a, #0e
  38.     out (c), a ; Select AY's PORT A
  39.  
  40.     ld hl, (_baud)
  41.     ld de, #0002
  42.     or a
  43.     sbc hl, de
  44.     ex hl, de
  45.  
  46.     pop af
  47.     cpl
  48.     scf
  49.     ld b, #0b ; Numbers of bits - 1 start, 8 data, 2 stop
  50.  
  51.     di ; Hard timing starts
  52. transmitBit:
  53.     push bc
  54.     push af
  55.  
  56.     ld a, #fe
  57.     ld h, d
  58.     ld l, e
  59.     ld bc, #bffd
  60.     jp nc, transmitOne
  61. ; Transmit Zero:
  62.     and #f7
  63.     out (c), a
  64.     jr transmitNext
  65. transmitOne:
  66.     or 8
  67.     out (c), a
  68.     jr transmitNext
  69.  
  70. transmitNext:
  71.     dec hl
  72.     ld a, h
  73.     or l
  74.     jr nz, transmitNext
  75.    
  76.     nop
  77.     nop
  78.     nop
  79.  
  80.     pop af
  81.     pop bc
  82.     or a
  83.     rra
  84.     djnz transmitBit
  85.     exx
  86.     ei
  87.     pop bc, de, hl
  88.     ret
  89.  
  90. read:
  91.     push bc, de, hl
  92.     call uartRead
  93.     pop hl, de, bc
  94.     ret c
  95.     jr read
  96.  
  97. uartRead:
  98.     ld hl, _isSecondByteAvail
  99.     ld a, (hl)
  100.     and a
  101.     jr z, startReadByte
  102.     ld (hl), 0
  103.     inc hl
  104.     ld a, (hl)
  105.     scf
  106.     ret
  107. startReadByte:
  108.     di
  109.     xor a
  110.     exx
  111.     ld de, (_baud)
  112.     ld hl, (_baud)
  113.     srl h
  114.     rr l  ; HL=_baud/2
  115.     or a
  116.     ld b, #FA ; Wait look length
  117.     exx
  118.     ld c, #fd
  119.     ld d, #ff
  120.     ld e, #bf
  121.     ld b, d
  122.     ld a, #0e
  123.     out (c), a
  124.     in a, (c)
  125.     or #f0      ; Input lines is 1
  126.     and #fb     ; CTS force to 0
  127.     ld b, e     ; B = #BF
  128.     out (c), a  ; Make CTS high
  129.     ld h, a
  130.  
  131. waitStartBit:
  132.     ld b, d
  133.     in a, (c)
  134.     and #80
  135.     jr z, startBitFound
  136. readTimeOut:
  137.     exx
  138.     dec b
  139.     exx
  140.     jr nz, waitStartBit
  141.     xor a
  142.     push af
  143.     jr readFinish
  144. startBitFound:
  145.     in a, (c)
  146.     and #80
  147.     jr nz, readTimeOut
  148.  
  149.     in a, (c)
  150.     and #80
  151.     jr nz, readTimeOut
  152.     ;; Start bit found!
  153.    
  154.     exx
  155.     ld bc, #fffd
  156.     ld a, #80
  157.     ex af, af
  158. readTune:
  159.     add hl, de ; HL = 1.5 * _baud
  160.     nop
  161.     nop
  162.     nop
  163.     nop ; Fine tuning delay
  164.  
  165. bdDelay:
  166.     dec hl
  167.     ld a, h
  168.     or l
  169.     jr nz, bdDelay
  170.  
  171.     in a, (c)
  172.     and #80
  173.     jp z, zeroReceived
  174. ; One received:      
  175.     ex af, af
  176.     scf
  177.     rra
  178.     jr c, receivedByte
  179.     ex af, af
  180.     jp readTune
  181. zeroReceived:
  182.     ex af, af
  183.     or a
  184.     RRA
  185.     jr c, receivedByte
  186.     ex af, af
  187.     jp readTune
  188. receivedByte:
  189.     scf
  190.     push af
  191.     exx
  192. readFinish:
  193.     ld a, h
  194.     or #04
  195.     ld b, e
  196.     out (c), a
  197.    
  198.     exx
  199.     ld h, d
  200.     ld l, e
  201.  
  202.     ld bc, #0007
  203.     or a
  204.     sbc hl, bc
  205.  
  206. delayForStopBit:
  207.     dec hl
  208.     ld a, h
  209.     or l
  210.     jr nz, delayForStopBit
  211.  
  212.     ld bc, #fffd
  213.     add hl, de
  214.     add hl, de
  215.     add hl, de
  216.  
  217. waitStartBitSecondByte:
  218.     in a, (c)
  219.     and #80
  220.     jr z, secondStartBitFound
  221.     dec hl
  222.     ld a, h
  223.     or l
  224.     jr nz, waitStartBitSecondByte
  225.     ; No second byte
  226.     pop af
  227.     ei
  228.     ret
  229.  
  230. secondStartBitFound:
  231.     in a, (c)
  232.     and #80
  233.     jr nz, waitStartBitSecondByte
  234.     ld h, d
  235.     ld l, e
  236.     ld bc, #0002
  237.     srl h
  238.     rr l
  239.     or a
  240.     sbc hl, bc
  241.     ld bc, #fffd
  242.     ld a, #80
  243.     ex af, af
  244. secondByteTune:
  245.     nop
  246.     nop
  247.     nop
  248.     nop
  249.     add hl, de
  250.  
  251. secondDelay:
  252.     dec hl
  253.     ld a, h
  254.     or l
  255.     jr nz, secondDelay
  256.  
  257.     in a, (c)
  258.     and #80
  259.     jr z, secondZeroReceived
  260. ; Second 1 received    
  261.     ex af, af
  262.     scf
  263.     rra
  264.     jr c, secondByteFinished
  265.     ex af, af
  266.     jp secondByteTune
  267.  
  268. secondZeroReceived:
  269.     ex af, af
  270.     or a
  271.     rra
  272.     jr c, secondByteFinished
  273.     ex af, af
  274.     jp secondByteTune
  275. secondByteFinished:
  276.     ld hl, _isSecondByteAvail
  277.     ld (hl), 1
  278.     inc hl
  279.     ld (hl), a
  280.     pop af
  281.     ei
  282.     ret
  283.  
  284.  
  285. _baud dw 11 ; 54 - 2400 --- 25 - 4800 --- 11 - 9600
  286. _isSecondByteAvail dw #0
  287. _testByte dw #0
  288.  
  289.     endmodule