mirror of https://github.com/zxdos/zxuno.git
195 lines
2.7 KiB
NASM
195 lines
2.7 KiB
NASM
UART_DATA_REG = #c6
|
|
UART_STAT_REG = #c7
|
|
UART_BYTE_RECIVED = #80
|
|
UART_BYTE_SENT = #40
|
|
ZXUNO_ADDR = #FC3B
|
|
ZXUNO_REG = #FD3B
|
|
|
|
; 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
|
|
|
|
; Pushes to UART zero-terminated string
|
|
; HL - string poiner
|
|
uartWriteStringZ:
|
|
ld a, (hl)
|
|
and a
|
|
ret z
|
|
push hl
|
|
call uartWriteByte
|
|
pop hl
|
|
inc hl
|
|
jp uartWriteStringZ
|
|
|
|
; Blocking read one byte
|
|
uartReadBlocking:
|
|
call uartRead
|
|
push af
|
|
ld a, 1
|
|
cp b
|
|
jr z, urb
|
|
pop af
|
|
ret nz
|
|
jp uartReadBlocking
|
|
urb:
|
|
pop af
|
|
ret
|
|
|
|
; Write single byte to UART
|
|
; A - byte to write
|
|
; BC will be wasted
|
|
uartWriteByte:
|
|
push af
|
|
rst #10
|
|
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_SENT
|
|
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:
|
|
ld a, 0
|
|
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 |