?login_element?

Subversion Repositories NedoOS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.     MODULE Uart
  2. UART_DATA_REG = #c6
  3. UART_STAT_REG = #c7
  4. UART_BYTE_RECIVED = #80
  5. UART_BYTE_SENDING = #40
  6. SCANDBLCTRL_REG = #0B
  7. ZXUNO_ADDR = #FC3B
  8. ZXUNO_REG = #FD3B
  9.  
  10.  
  11. ; Enable UART
  12. ; Cleaning all flags by reading UART regs
  13. ; Wastes AF and BC
  14. init:
  15.     ld bc, ZXUNO_ADDR : ld a, UART_STAT_REG : out (c), a
  16.     ld bc, ZXUNO_REG : in A, (c)
  17.     ld bc, ZXUNO_ADDR : ld a, UART_DATA_REG : out (c), a
  18.     ld bc, ZXUNO_REG : in A, (c)
  19.     ld b, #ff
  20. .loop
  21.     push bc
  22.     call uartRead
  23.     pop bc
  24.     djnz .loop
  25.     ret
  26.  
  27. read:
  28. .loop
  29.     call uartRead
  30.     jr nc, .loop
  31.     ret
  32.  
  33. ; Write single byte to UART
  34. ; A - byte to write
  35. ; BC will be wasted
  36. write:    
  37.     push af
  38.     ld a, 3 : out (#fe), a
  39.     ld bc, ZXUNO_ADDR : ld a, UART_STAT_REG : out (c), a
  40.     ld bc, ZXUNO_REG : in A, (c) : and UART_BYTE_RECIVED
  41.     jr nz, .is_recvF
  42. .checkSent
  43.     ld bc, ZXUNO_REG : in A, (c) : and UART_BYTE_SENDING
  44.     jr nz, .checkSent
  45.  
  46.     ld bc, ZXUNO_ADDR : ld a, UART_DATA_REG : out (c), a
  47.  
  48.     ld bc, ZXUNO_REG : pop af : out (c), a
  49.     xor a : out (#fe), a
  50.     ret
  51. .is_recvF
  52.     push af : push hl
  53.     ld hl, is_recv : ld a, 1 : ld (hl), a
  54.    
  55.     pop hl : pop af
  56.     jr .checkSent
  57.  
  58. ; Read byte from UART
  59. ; A: byte
  60. ; B:
  61. ;     1 - Was read
  62. ;     0 - Nothing to read
  63. uartRead:
  64.     ld a, (poked_byte) : and 1 : jr nz, .retBuff
  65.  
  66.     ld a, (is_recv) : and 1 : jr nz, recvRet
  67.  
  68.     ld bc, ZXUNO_ADDR : ld a, UART_STAT_REG : out (c), a
  69.     ld bc, ZXUNO_REG : in a, (c) : and UART_BYTE_RECIVED
  70.     jr nz, retReadByte
  71.  
  72.     or a
  73.     ret
  74. .retBuff
  75.     ld a, 0 : ld (poked_byte), a : ld a, (byte_buff)
  76.     scf
  77.     ret
  78.  
  79. retReadByte:
  80.     xor a : ld (poked_byte), a : ld (is_recv), a
  81.  
  82.     ld bc, ZXUNO_ADDR : ld a, UART_DATA_REG : out (c), a
  83.     ld bc, ZXUNO_REG : in a, (c)
  84.  
  85.     scf
  86.     ret
  87.  
  88. recvRet:
  89.     ld bc, ZXUNO_ADDR : ld a,  UART_DATA_REG : out (c),a
  90.  
  91.     ld bc, ZXUNO_REG : in a, (c)
  92.     ld hl, is_recv : ld (hl), 0
  93.     ld hl, poked_byte : ld (hl), 0
  94.    
  95.     scf
  96.     ret
  97.  
  98. poked_byte defb 0
  99. byte_buff defb 0
  100. is_recv defb 0
  101.  
  102.     ENDMODULE