mirror of
https://github.com/jonthomasson/retro1.git
synced 2024-10-05 05:56:37 +00:00
94 lines
3.1 KiB
Plaintext
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
|