retro1/software/retro1-tests/monitor-test/acia.s65
2017-04-17 10:09:33 -07:00

94 lines
3.1 KiB
Plaintext

.setcpu "65C02"
.include "zeropage.inc65"
.include "io.inc65"
.include "macros.inc65"
ACIA_BUFFER_LENGTH = 10
.export acia_init
.export acia_getc
.export acia_gets
.export acia_gets_buffer
.export acia_putc
.export acia_puts
.export acia_put_newline
.bss
acia_gets_buffer: .res ACIA_BUFFER_LENGTH + 1, 0
.code
; Initialize the ACIA
acia_init: pha
lda #(ACIA_PARITY_DISABLE | ACIA_ECHO_DISABLE | ACIA_TX_INT_DISABLE_RTS_LOW | ACIA_RX_INT_DISABLE | ACIA_DTR_LOW)
sta ACIA_COMMAND
lda #(ACIA_STOP_BITS_1 | ACIA_DATA_BITS_8 | ACIA_CLOCK_INT | ACIA_BAUD_19200)
sta ACIA_CONTROL
pla
rts
; Send the character in A
acia_putc: pha
wait_txd_empty: lda ACIA_STATUS
and #ACIA_STATUS_TX_EMPTY
beq wait_txd_empty
pla
sta ACIA_DATA
rts
; Send the zero terminated string pointed to by R0
acia_puts: phay
ldy #$ff
next_char: iny
lda (R0),y
jsr acia_putc
bne next_char
play
rts
; Wait until a character was reveiced and return it in A
acia_getc:
wait_rxd_full: lda ACIA_STATUS
and #ACIA_STATUS_RX_FULL
beq wait_rxd_full
lda ACIA_DATA
rts
; Wait until a \n terminated string was received and store it at (R0)
; The accu contains the size of the buffer
; The \n is removed and the string is zero terminated
; After receiving buffer size - 1 characters, any following characters are discarded
acia_gets: sta TMP0
phay
ldy #0
gets_next_char: jsr acia_getc
jsr acia_putc ;echo back to screen
cmp #$0a ;is it end of line?
beq gets_eos
cmp #$08 ;is it a backspace?
beq gets_backspace
gets_buff_test: cpy TMP0 ;is buffer full?
beq gets_next_char
sta (R0),y
iny
jmp gets_next_char
gets_backspace: dey ;decrement y
bmi gets_reinit ;beyond start of line, reinitialize
lda #$20 ;replace backspace with space
sta (R0),y ;store space in buffer
jsr acia_putc ;blank out existing char on screen
lda #$08 ;backspace again to get correct position
jsr acia_putc
jmp gets_next_char
gets_reinit: lda TMP0 ;restore a
jmp acia_gets ;start over
gets_eos: lda #0
sta (R0),y
play
rts
; Send a newline character
acia_put_newline: lda #$0a ;lf
jmp acia_putc