;
; UNINSTALL routine. Is called before the driver is removed from memory.
; Must return an SER_ERR_xx code in a/x.
-
+;
+; and:
+;
+; CLOSE: Close the port, disable interrupts and flush the buffer. Called
+; without parameters. Must return an error code in a/x.
+;
INSTALL:
UNINSTALL:
+CLOSE:
; Deactivate DTR and disable 6551 interrupts
; Initialize buffers
- jsr InitBuffers
+ ldx #0
+ stx Stopped
+ stx RecvHead
+ stx RecvTail
+ stx SendHead
+ stx SendTail
+ dex ; X = 255
+ stx RecvFreeCnt
+ stx SendFreeCnt
; Set the value for the control register, which contains stop bits, word
; length and the baud rate.
ldx #>SER_ERR_BAUD_UNAVAIL
rts
-;----------------------------------------------------------------------------
-; CLOSE: Close the port, disable interrupts and flush the buffer. Called
-; without parameters. Must return an error code in a/x.
-;
-
-CLOSE:
-
-; Stop interrupts, drop DTR
-
- lda #%00001010
- sta ACIA_CMD
-
-; Initalize buffers.
-
- jsr InitBuffers
-
-; Return OK
-
- lda #<SER_ERR_OK
- tax ; A is zero
- rts
-
;----------------------------------------------------------------------------
; GET: Will fetch a character from the receive buffer and store it into the
; variable pointer to by ptr1. If no data is available, SER_ERR_NO_DATA is
IOCTL: lda #<SER_ERR_INV_IOCTL ; We don't support ioclts for now
ldx #>SER_ERR_INV_IOCTL
-; rts ; Run into IRQ instead
+ rts ; Run into IRQ instead
;----------------------------------------------------------------------------
; IRQ: Called from the builtin runtime IRQ handler as a subroutine. All
-; registers are already save, no parameters are passed and no return code
-; is expected.
+; registers are already save, no parameters are passed, but the carry flag
+; is clear on entry. The routine must return with carry set if the interrupt
+; was handled, otherwise with carry clear.
;
IRQ: lda ACIA_STATUS ; Check ACIA status for receive interrupt
and #$08
- beq @L9 ; Jump if no ACIA interrupt
+ beq @L9 ; Jump if no ACIA interrupt (carry still clear)
lda ACIA_DATA ; Get byte from ACIA
ldx RecvFreeCnt ; Check if we have free space left
beq @L1 ; Jump if no space in receive buffer
dec RecvFreeCnt ; Decrement free space counter
cpx #33 ; Check for buffer space low
bcc @L1 ; Assert flow control if buffer space low
-@L9: rts
+ rts ; Return with carry set (interrupt handled)
; Assert flow control if buffer space too low
@L1: lda RtsOff
sta ACIA_CMD
sta Stopped
- rts
+ sec ; Interrupt handled
+@L9: rts
;----------------------------------------------------------------------------
; Try to send a byte. Internal routine. A = TryHard
.endproc
-;----------------------------------------------------------------------------
-; Initialize buffers
-
-InitBuffers:
- ldx #0
- stx Stopped
- stx RecvHead
- stx RecvTail
- stx SendHead
- stx SendTail
- dex ; X = 255
- stx RecvFreeCnt
- stx SendFreeCnt
- rts
-