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
|