.addr $0000
; Jump table
- .addr INSTALL
- .addr UNINSTALL
- .addr OPEN
- .addr CLOSE
- .addr GET
- .addr PUT
- .addr STATUS
- .addr IOCTL
- .addr IRQ
+ .addr SER_INSTALL
+ .addr SER_UNINSTALL
+ .addr SER_OPEN
+ .addr SER_CLOSE
+ .addr SER_GET
+ .addr SER_PUT
+ .addr SER_STATUS
+ .addr SER_IOCTL
+ .addr SER_IRQ
;----------------------------------------------------------------------------
; I/O definitions
.code
;----------------------------------------------------------------------------
-; INSTALL: Is called after the driver is loaded into memory. If possible,
+; SER_INSTALL: Is called after the driver is loaded into memory. If possible,
; check if the hardware is present. Must return an SER_ERR_xx code in a/x.
;
; Since we don't have to manage the IRQ vector on the Apple II, this is
; actually the same as:
;
-; UNINSTALL: Is called before the driver is removed from memory.
+; SER_UNINSTALL: Is called before the driver is removed from memory.
; No return code required (the driver is removed from memory on return).
;
; and:
;
-; CLOSE: Close the port and disable interrupts. Called without parameters.
+; SER_CLOSE: Close the port and disable interrupts. Called without parameters.
; Must return an SER_ERR_xx code in a/x.
-INSTALL:
-UNINSTALL:
-CLOSE:
+SER_INSTALL:
+SER_UNINSTALL:
+SER_CLOSE:
ldx Index ; Check for open port
beq :+
rts
;----------------------------------------------------------------------------
-; OPEN: A pointer to a ser_params structure is passed in ptr1.
+; SER_OPEN: A pointer to a ser_params structure is passed in ptr1.
; Must return an SER_ERR_xx code in a/x.
-OPEN:
+SER_OPEN:
ldx #<$C000
stx ptr2
lda #>$C000
ora Slot
sta ptr2+1
-
+
; Check Pascal 1.1 Firmware Protocol ID bytes
: ldy IdOfsTable,x
lda IdValTable,x
inx
cpx #IdTableLen
bcc :-
-
+
; Convert slot to I/O register index
lda Slot
asl
rts
;----------------------------------------------------------------------------
-; GET: Will fetch a character from the receive buffer and store it into the
+; SER_GET: Will fetch a character from the receive buffer and store it into the
; variable pointed to by ptr1. If no data is available, SER_ERR_NO_DATA is
; returned.
-GET:
+SER_GET:
ldx Index
ldy SendFreeCnt ; Send data if necessary
iny ; Y == $FF?
rts
;----------------------------------------------------------------------------
-; PUT: Output character in A.
+; SER_PUT: Output character in A.
; Must return an SER_ERR_xx code in a/x.
-PUT:
+SER_PUT:
ldx Index
; Try to send
rts
;----------------------------------------------------------------------------
-; STATUS: Return the status in the variable pointed to by ptr1.
+; SER_STATUS: Return the status in the variable pointed to by ptr1.
; Must return an SER_ERR_xx code in a/x.
-STATUS:
+SER_STATUS:
ldx Index
lda ACIA_STATUS,x
ldx #$00
rts
;----------------------------------------------------------------------------
-; IOCTL: Driver defined entry point. The wrapper will pass a pointer to ioctl
+; SER_IOCTL: Driver defined entry point. The wrapper will pass a pointer to ioctl
; specific data in ptr1, and the ioctl code in A.
; Must return an SER_ERR_xx code in a/x.
-IOCTL:
+SER_IOCTL:
; Check data msb and code to be 0
ora ptr1+1
bne :+
rts
;----------------------------------------------------------------------------
-; IRQ: Called from the builtin runtime IRQ handler as a subroutine. All
+; SER_IRQ: Called from the builtin runtime IRQ handler as a subroutine. All
; registers are already saved, 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:
+SER_IRQ:
ldx Index ; Check for open port
beq Done
lda ACIA_STATUS,x ; Check ACIA status for receive interrupt
lda ACIA_STATUS,x
and #$10
bne Send
- bit tmp1 ; Keep trying if must try hard
+ bit tmp1 ; Keep trying if must try hard
bmi Again
Quit: rts