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 |