49 lines
1020 B
NASM
49 lines
1020 B
NASM
;;
|
|
;; Read input from the keyboard, and echo to console.
|
|
;;
|
|
|
|
|
|
IOBASE = $8800
|
|
IOSTATUS = IOBASE + 1
|
|
IOCMD = IOBASE + 2
|
|
IOCTRL = IOBASE + 3
|
|
|
|
.segment "CODE"
|
|
.org $C000
|
|
|
|
START: CLI
|
|
LDA #$09
|
|
STA IOCMD ; Set command status
|
|
LDA #$1A
|
|
STA IOCTRL ; 0 stop bits, 8 bit word, 2400 baud
|
|
|
|
;;
|
|
;; Infinite idle loop, waiting for interrupt.
|
|
;;
|
|
IDLE: LDA #$FF
|
|
TAX
|
|
IDLE1: DEX
|
|
BNE IDLE1
|
|
JMP IDLE
|
|
|
|
;;
|
|
;; IRQ handler
|
|
;;
|
|
IRQ: LDA IOBASE ; Get the character in the ACIA.
|
|
PHA ; Save accumulator
|
|
ECHO1: LDA IOSTATUS ; Read the ACIA status
|
|
AND #$10 ; Is the tx register empty?
|
|
BEQ ECHO1 ; No, wait for it to empty
|
|
PLA ; Otherwise, load saved accumulator,
|
|
STA IOBASE ; write to output,
|
|
RTI ; and return
|
|
|
|
; system vectors
|
|
|
|
.segment "VECTORS"
|
|
.org $FFFA
|
|
|
|
.word IRQ ; NMI vector
|
|
.word START ; RESET vector
|
|
.word IRQ ; IRQ vector
|