mirror of https://github.com/zxdos/zxuno.git
				
				
				
			
		
			
				
	
	
		
			114 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			NASM
		
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			NASM
		
	
	
	
UART_DATA_REG = #c6
 | 
						|
UART_STAT_REG = #c7
 | 
						|
UART_BYTE_RECIVED = #80
 | 
						|
UART_BYTE_SENDING = #40
 | 
						|
 | 
						|
; Enable UART
 | 
						|
; Cleaning all flags by reading UART regs
 | 
						|
; Wastes AF and BC
 | 
						|
uartBegin:
 | 
						|
    ld bc, ZXUNO_ADDR : ld a, UART_STAT_REG : out (c), a
 | 
						|
    ld bc, ZXUNO_REG : in A, (c)
 | 
						|
    ld bc, ZXUNO_ADDR : ld a, UART_DATA_REG : out (c), a
 | 
						|
    ld bc, ZXUNO_REG : in A, (c)
 | 
						|
    ret
 | 
						|
 | 
						|
; Blocking read one byte
 | 
						|
uartReadBlocking:
 | 
						|
    call uartRead
 | 
						|
    push af : ld a, 1 : cp b : jr z, urb : pop af
 | 
						|
    jp uartReadBlocking
 | 
						|
urb: 
 | 
						|
    pop af
 | 
						|
    ret
 | 
						|
 | 
						|
; Write single byte to UART
 | 
						|
; A - byte to write
 | 
						|
; BC will be wasted
 | 
						|
uartWriteByte:
 | 
						|
    push af
 | 
						|
    ld bc, ZXUNO_ADDR : ld a, UART_STAT_REG : out (c), a
 | 
						|
waitWriteReady:
 | 
						|
    ld bc, ZXUNO_REG : in A, (c) : and UART_BYTE_RECIVED
 | 
						|
    jr nz,  is_recvF
 | 
						|
checkSent:
 | 
						|
    ld bc, ZXUNO_REG : in A, (c) : and UART_BYTE_SENDING
 | 
						|
    jr nz, checkSent
 | 
						|
 | 
						|
    ld bc, ZXUNO_ADDR : ld a, UART_DATA_REG : out (c), a
 | 
						|
 | 
						|
    ld bc, ZXUNO_REG : pop af : out (c), a
 | 
						|
    ret
 | 
						|
is_recvF:
 | 
						|
    push af : push hl
 | 
						|
    
 | 
						|
    ld hl, is_recv : ld a, 1 : ld (hl), a 
 | 
						|
    
 | 
						|
    pop hl : pop af
 | 
						|
    jr checkSent
 | 
						|
 | 
						|
; Is data avail in UART
 | 
						|
; NZ - Data Presents
 | 
						|
; Z - Data absent
 | 
						|
uartAvail:
 | 
						|
    ld a, (is_recv) : and 1 : ret nz
 | 
						|
    ld a, (poked_byte) : and 1 : ret nz
 | 
						|
 | 
						|
    call uartRead
 | 
						|
 | 
						|
    push af : ld a, b : and 1 : jr z, noneData : pop af
 | 
						|
 | 
						|
    push af
 | 
						|
    ld hl, byte_buff : ld (hl), a : ld hl, poked_byte : ld a, 1 : ld (hl), a
 | 
						|
    pop af
 | 
						|
 | 
						|
    ld b, a : ld a, 1 : or a : ld a, b
 | 
						|
    ret
 | 
						|
noneData:
 | 
						|
    pop bc : xor a
 | 
						|
    ret
 | 
						|
 | 
						|
; Read byte from UART
 | 
						|
; A: byte
 | 
						|
; B:
 | 
						|
;     1 - Was read
 | 
						|
;     0 - Nothing to read
 | 
						|
uartRead:
 | 
						|
    ld a, (poked_byte) : and 1 : jr nz, retBuff
 | 
						|
 | 
						|
    ld a, (is_recv) : and 1 : jr nz, recvRet
 | 
						|
 | 
						|
    ld bc, ZXUNO_ADDR : ld a, UART_STAT_REG : out (c), a
 | 
						|
    ld bc, ZXUNO_REG : in a, (c) : and UART_BYTE_RECIVED
 | 
						|
    jr nz, retReadByte
 | 
						|
 | 
						|
    ld b, 0
 | 
						|
    ret
 | 
						|
 | 
						|
retReadByte:
 | 
						|
    xor a : ld (poked_byte), a : ld (is_recv), a
 | 
						|
 | 
						|
    ld bc, ZXUNO_ADDR : ld a, UART_DATA_REG : out (c), a
 | 
						|
    ld bc, ZXUNO_REG : in a, (c)
 | 
						|
 | 
						|
    ld b, 1
 | 
						|
    ret
 | 
						|
 | 
						|
recvRet:
 | 
						|
    ld bc, ZXUNO_ADDR : ld a,  UART_DATA_REG : out (c),a
 | 
						|
 | 
						|
    ld bc, ZXUNO_REG : in a, (c)
 | 
						|
    ld hl, is_recv : ld (hl), 0
 | 
						|
    ld hl, poked_byte : ld (hl), 0
 | 
						|
    
 | 
						|
    ld b, 1
 | 
						|
    ret
 | 
						|
 | 
						|
retBuff
 | 
						|
    ld a, 0 : ld (poked_byte), a : ld a, (byte_buff)
 | 
						|
    ld b, 1
 | 
						|
    ret
 | 
						|
 | 
						|
poked_byte defb 0
 | 
						|
byte_buff defb 0
 | 
						|
is_recv defb 0 |