annotate level1/modules/dw3mess.asm @ 2690:6e40b043d3e0 lwtools-port

Removed coco port, added coco1 and coco2 ports. Cleaned term* descriptors to make unified between Level 1 and Level 2
author Boisy Pitre <boisy.pitre@nuance.com>
date Thu, 19 Jul 2012 10:09:15 -0500
parents c92a6c65bbd9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2534
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
1 ********************************************************************
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
2 * DW3 - DriveWire 3 Low Level Subroutine Module - MESS version
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
3 *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
4 * $Id$
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
5 *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
6 * Edt/Rev YYYY/MM/DD Modified by
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
7 * Comment
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
8 * ------------------------------------------------------------------
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
9 * 1 2008/01/26 Boisy G. Pitre
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
10 * Started as a segregated subroutine module.
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
11 *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
12 * 2 2010/01/20 Boisy G. Pitre
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
13 * Added support for DWNet
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
14 *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
15 * 3 2010/01/23 Aaron A. Wolfe
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
16 * Added dynamic polling frequency
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
17 *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
18 * 4 2010/04/27 Aaron A. Wolfe
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
19 * hacked to use MESS FIFO routines
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
20 *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
21 *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
22 nam DW3
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
23 ttl DriveWire 3 Low Level Subroutine Module
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
24
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
25 ifp1
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
26 use defsfile
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
27 use dwdefs.d
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
28 endc
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
29
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
30 tylg set Sbrtn+Objct
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
31 atrv set ReEnt+rev
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
32 rev set $01
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
33
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
34 mod eom,name,tylg,atrv,start,0
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
35
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
36 * irq
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
37 IRQPckt fcb $00,$01,$0A ;IRQ packet Flip(1),Mask(1),Priority(1) bytes
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
38 * Default time packet
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
39 DefTime fcb 109,12,31,23,59,59
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
40
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
41 * for dynamic poll frequency, number of ticks between firing poller - should we move to dwdefs?
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
42 * speed 1 = interactive (typing)
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
43 PollSpd1 fcb 3
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
44 * speed 2 = bulk transfer (depending on how much processing needs to be done to incoming stream, 5-8 seems good)
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
45 PollSpd2 fcb 6
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
46 * speed 3 = idle
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
47 PollSpd3 fcb 40
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
48 * X pollidle -> drop to next slower rate
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
49 PollIdle fcb 60
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
50
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
51
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
52 name fcs /dw3/
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
53
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
54 * DriveWire subroutine entry table
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
55 start lbra Init
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
56 bra Read
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
57 nop
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
58 lbra Write
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
59
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
60 * Term
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
61 *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
62 * Entry:
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
63 * U = address of device memory area
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
64 *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
65 * Exit:
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
66 * CC = carry set on error
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
67 * B = error code
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
68 *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
69 Term
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
70 clrb clear Carry
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
71 rts
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
72
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
73 * Read
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
74 *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
75 * ON ENTRY:
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
76 * X = ADDRESS OF THE RECEIVE BUFFER
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
77 * A = TIMEOUT VALUE (182 = APPROX ONE SECOND @ 0.89 MHz)
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
78 *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
79 * ON EXIT:
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
80 * Y = DATA CHECKSUM
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
81 * D = ACTUAL NUMBER OF BYTES RECEIVED
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
82 * X AND U ARE PRESERVED
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
83 * CC.CARRY IS SET IF A FRAMING ERROR WAS DETECTED
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
84 *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
85 Read
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
86 use dwrdmess.asm
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
87
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
88 * Write
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
89 *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
90 * Entry:
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
91 Write
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
92 use dwwrmess.asm
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
93
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
94 * Init
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
95 *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
96 * Entry:
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
97 * Y = address of device descriptor
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
98 * U = address of device memory area
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
99 *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
100 * Exit:
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
101 * CC = carry set on error
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
102 * B = error code
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
103 *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
104 * Initialize the serial device
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
105 Init
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
106 clrb clear Carry
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
107 pshs y,x,cc then push CC on stack
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
108 orcc #IntMasks
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
109 * no init for bitbanger in mess
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
110 * ldx #PIA1Base $FF20
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
111 * clr 1,x clear CD
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
112 * lda #%11111110
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
113 * sta ,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
114 * lda #%00110100
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
115 * sta 1,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
116 * lda ,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
117
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
118 ; allocate DW statics page
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
119 pshs u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
120 ldd #$0100
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
121 os9 F$SRqMem
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
122 tfr u,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
123 puls u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
124 lbcs InitEx
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
125 ifgt Level-1
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
126 stx <D.DWStat
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
127 else
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
128 stx >D.DWStat
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
129 endc
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
130 ; clear out 256 byte page at X
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
131 clrb
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
132 loop@ clr ,x+
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
133 decb
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
134 bne loop@
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
135
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
136 * send OP_DWINIT
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
137 ; setup DWsub command
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
138 pshs u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
139 ldb #1 ; DRIVER VERSION
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
140 lda #OP_DWINIT ; load command
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
141 pshs d ; command store on stack
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
142 leax ,s ; point X to stack
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
143 ldy #2 ; 1 byte to send
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
144 ifgt Level-1
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
145 ldu <D.DWSubAddr
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
146 else
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
147 ldu >D.DWSubAddr
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
148 endc
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
149 jsr 6,u ; call DWrite
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
150 leas 1,s ; leave one byte on stack for response
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
151
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
152 ; read protocol version response, 1 byte
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
153 leax ,s ; point X to stack head
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
154 ldy #1 ; 1 byte to retrieve
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
155 jsr 3,u ; call DWRead
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
156 beq InstIRQ ; branch if no error
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
157 leas 3,s ; error, cleanup stack (u and 1 byte from read)
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
158 lbra InitEx ; don't install IRQ handler
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
159
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
160 * install ISR
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
161 InstIRQ
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
162 puls a,u ; a has proto version from server.. not used yet
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
163
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
164 ifgt Level-1
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
165 ldx <D.DWStat
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
166 else
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
167 ldx >D.DWStat
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
168 endc
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
169 leax DW.VIRQPkt,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
170 pshs u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
171 tfr x,u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
172 leax Vi.Stat,x ;fake VIRQ status register
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
173 lda #$80 ;VIRQ flag clear, repeated VIRQs
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
174 sta ,x ;set it while we're here...
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
175 tfr x,d ;copy fake VIRQ status register address
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
176 leax IRQPckt,pcr ;IRQ polling packet
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
177 leay IRQSvc,pcr ;IRQ service entry
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
178 os9 F$IRQ ;install
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
179 puls u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
180 bcs InitEx ;exit with error
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
181 clra
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
182 ldb PollSpd3,pcr ; start at idle
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
183 ifgt Level-1
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
184 ldx <D.DWStat
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
185 else
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
186 ldx >D.DWStat
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
187 endc
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
188 leax DW.VIRQPkt,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
189 std Vi.Rst,x ; reset count
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
190 tfr x,y ; move VIRQ software packet to Y
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
191 tryagain
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
192 ldx #$0001 ; code to install new VIRQ
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
193 os9 F$VIRQ ; install
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
194 bcc IRQok ; no error, continue
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
195 cmpb #E$UnkSvc
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
196 bne InitEx
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
197 ; if we get an E$UnkSvc error, then clock has not been initialized, so do it here
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
198 leax DefTime,pcr
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
199 os9 F$STime
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
200 bra tryagain ; note: this has the slim potential of looping forever
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
201 IRQok
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
202 ifgt Level-1
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
203 ldx <D.DWStat
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
204 else
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
205 ldx >D.DWStat
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
206 endc
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
207 ; cheat: we know DW.StatTbl is at offset $00 from D.DWStat, do not bother with leax
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
208 leax DW.StatTbl,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
209 tfr u,d
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
210 ldb <V.PORT+1,u ; get our port #
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
211 sta b,x ; store in table
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
212
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
213 InitEx
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
214 puls cc,x,y,pc
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
215
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
216
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
217 ; ***********************************************************************
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
218 ; Interrupt handler - Much help from Darren Atkinson
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
219
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
220 IRQMulti3 anda #$0F ; mask first 4 bits, a is now port #+1
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
221 deca ; we pass +1 to use 0 for no data
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
222 pshs a ; save port #
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
223 cmpb RxGrab,u ; compare room in buffer to server's byte
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
224 bhs IRQM06 ; room left >= server's bytes, no problem
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
225
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
226 stb RxGrab,u ; else replace with room left in our buffer
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
227
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
228 ; also limit to end of buffer
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
229 IRQM06 ldd RxBufEnd,u ; end addr of buffer
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
230 subd RxBufPut,u ; subtract current write pointer, result is # bytes left going forward in buff.
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
231
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
232 IRQM05 cmpb RxGrab,u ; compare b (room left) to grab bytes
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
233 bhs IRQM03 ; branch if we have room for grab bytes
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
234
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
235 stb RxGrab,u ; else set grab to room left
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
236
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
237 ; send multiread req
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
238 IRQM03 puls a ; port # is on stack
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
239 ldb RxGrab,u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
240
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
241 pshs u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
242
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
243 ; setup DWsub command
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
244 pshs d ; (a port, b bytes)
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
245 lda #OP_SERREADM ; load command
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
246 pshs a ; command store on stack
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
247 leax ,s ; point X to stack
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
248 ldy #3 ; 3 bytes to send
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
249
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
250 ifgt Level-1
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
251 ldu <D.DWSubAddr
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
252 else
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
253 ldu >D.DWSubAddr
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
254 endc
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
255 jsr 6,u ; call DWrite
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
256
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
257 leas 3,s ; clean 3 DWsub args from stack
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
258
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
259 ldx ,s ; pointer to this port's area (from U prior), leave it on stack
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
260 ldb RxGrab,x ; set B to grab bytes
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
261 clra ; 0 in high byte
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
262 tfr d,y ; set # bytes for DW
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
263
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
264 ldx RxBufPut,x ; point X to insert position in this port's buffer
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
265 ; receive response
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
266 jsr 3,u ; call DWRead
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
267 ; handle errors?
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
268
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
269
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
270 puls u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
271 ldb RxGrab,u ; our grab bytes
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
272
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
273 ; set new RxBufPut
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
274 ldx RxBufPut,u ; current write pointer
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
275 abx ; add b (# bytes) to RxBufPut
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
276 cmpx RxBufEnd,u ; end of Rx buffer?
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
277 blo IRQM04 ; no, go keep laydown pointer
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
278 ldx RxBufPtr,u ; get Rx buffer start address
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
279 IRQM04 stx RxBufPut,u ; set new Rx data laydown pointer
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
280
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
281 ; set new RxDatLen
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
282 ldb RxDatLen,u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
283 addb RxGrab,u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
284 stb RxDatLen,u ; store new value
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
285
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
286 lbra CkSSig ; had to lbra
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
287
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
288 IRQMulti
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
289 ; set IRQ freq for bulk
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
290 pshs a
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
291 lda PollSpd2,pcr
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
292 lbsr IRQsetFRQ
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
293 puls a
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
294
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
295 ; initial grab bytes
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
296 stb RxGrab,u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
297
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
298 ; limit server bytes to bufsize - datlen
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
299 ldb RxBufSiz,u ; size of buffer
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
300 subb RxDatLen,u ; current bytes in buffer
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
301 bne IRQMulti3 ; continue, we have some space in buffer
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
302 ; no room in buffer
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
303 tstb
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
304 lbne CkSSig ;had to lbra
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
305 lbra IRQExit ;had to lbra
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
306
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
307
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
308 ; **** IRQ ENTRY POINT
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
309 IRQSvc equ *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
310 pshs cc,dp ; save system cc,DP
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
311 orcc #IntMasks ; mask interrupts
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
312
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
313 ; mark VIRQ handled (note U is pointer to our VIRQ packet in DP)
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
314 lda Vi.Stat,u ; VIRQ status register
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
315 anda #^Vi.IFlag ; clear flag in VIRQ status register
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
316 sta Vi.Stat,u ; save it...
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
317
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
318 ; poll server for incoming serial data
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
319
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
320 ; send request
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
321 lda #OP_SERREAD ; load command
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
322 pshs a ; command store on stack
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
323 leax ,s ; point X to stack
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
324 ldy #1 ; 1 byte to send
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
325
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
326 ifgt Level-1
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
327 ldu <D.DWSubAddr
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
328 else
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
329 ldu >D.DWSubAddr
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
330 endc
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
331 jsr 6,u ; call DWrite
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
332
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
333 ; receive response
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
334 leas -1,s ; one more byte to fit response
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
335 leax ,s ; point X to stack head
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
336 ldy #2 ; 2 bytes to retrieve
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
337 jsr 3,u ; call DWRead
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
338 beq IRQSvc2 ; branch if no error
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
339 leas 2,s ; error, cleanup stack 2
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
340 lbra IRQExit2 ; don't reset error count on the way out
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
341
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
342 ; process response
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
343 IRQSvc2
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
344 ldd ,s++ ; pull returned status byte into A,data into B (set Z if zero, N if multiread)
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
345 bne IRQGotOp ; branch if D != 0 (something to do)
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
346 * this is a NOP response.. do we need to reschedule
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
347 ifgt Level-1
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
348 ldx <D.DWStat
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
349 else
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
350 ldx >D.DWStat
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
351 endc
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
352 lda DW.VIRQPkt+Vi.Rst+1,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
353 cmpa PollSpd3,pcr
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
354 lbeq IRQExit ;we are already at idle speed
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
355
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
356 lda DW.VIRQNOP,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
357 inca
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
358 cmpa PollIdle,pcr
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
359 beq FRQdown
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
360
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
361 sta DW.VIRQNOP,x ;inc NOP count, exit
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
362 lbra IRQExit
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
363
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
364 FRQdown lda DW.VIRQPkt+Vi.Rst+1,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
365 cmpa PollSpd1,pcr
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
366 beq FRQd1
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
367 lda PollSpd3,pcr
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
368 FRQd2
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
369 sta DW.VIRQPkt+Vi.Rst+1,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
370 clr DW.VIRQNOP,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
371 lbra IRQExit
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
372 FRQd1 lda PollSpd2,pcr
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
373 bra FRQd2
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
374
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
375 ; save back D on stack and build our U
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
376 IRQGotOp pshs d
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
377 * mode switch on bits 7+6 of A: 00 = vserial, 01 = system, 10 = wirebug?, 11 = ?
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
378 anda #$C0 ; mask last 6 bits
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
379 beq mode00 ; virtual serial mode
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
380 ; future - handle other modes
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
381 lbra IRQExit ; for now, bail
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
382
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
383 mode00 lda ,s ; restore A
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
384 anda #$0F ; mask first 4 bits, a is now port #+1
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
385 beq IRQCont ; if we're here with 0 in the port, its not really a port # (can we jump straight to status?)
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
386 deca ; we pass +1 to use 0 for no data
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
387 ; here we set U to the static storage area of the device we are working with
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
388 ifgt Level-1
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
389 ldx <D.DWStat
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
390 else
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
391 ldx >D.DWStat
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
392 endc
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
393 ; cheat: we know DW.StatTbl is at offset $00 from D.DWStat, do not bother with leax
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
394 ; leax DW.StatTbl,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
395 lda a,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
396 bne IRQCont ; if A is 0, then this device is not active, so exit
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
397 puls d
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
398 lbra IRQExit
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
399 IRQCont
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
400 clrb
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
401 tfr d,u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
402
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
403 puls d
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
404
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
405 * multiread/status flag is in bit 4 of A
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
406 bita #$10
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
407 beq IRQPutch ; branch for read1 if multiread not set
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
408
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
409 * all 0s in port means status, anything else is multiread
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
410
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
411 bita #$0F ;mask bit 7-4
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
412 beq dostat ;port # all 0, this is a status response
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
413 lbra IRQMulti ;its not all 0, this is a multiread
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
414
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
415
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
416 * in status events, databyte is split, 4bits status, 4bits port #
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
417 dostat bitb #$F0 ;mask low bits
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
418 lbne IRQExit ;we only implement code 0000, term
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
419 * set u to port #
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
420 ifgt Level-1
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
421 ldx <D.DWStat
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
422 else
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
423 ldx >D.DWStat
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
424 endc
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
425 lda b,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
426 bne statcont ; if A is 0, then this device is not active, so exit
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
427 lbra IRQExit
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
428
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
429 * IRQ set freq routine
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
430 * sets freq and clears NOP counter
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
431 * a = desired IRQ freq
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
432 IRQsetFRQ pshs x ; preserve
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
433 ifgt Level-1
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
434 ldx <D.DWStat
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
435 else
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
436 ldx >D.DWStat
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
437 endc
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
438 sta DW.VIRQPkt+Vi.Rst+1,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
439 * +++ BGP +++ added following line so that the counter (which was copied by
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
440 * clock before calling us) gets reset to the same value the reset value. Without
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
441 * this line, we get called again with the PRIOR Vi.Rst value.
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
442 sta DW.VIRQPkt+Vi.Cnt+1,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
443 clr DW.VIRQNOP,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
444 puls x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
445 rts
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
446
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
447
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
448 * This routine roots through process descriptors in a queue and
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
449 * checks to see if the process has a path that is open to the device
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
450 * represented by the static storage pointer in U. if so, the S$HUP
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
451 * signal is sent to that process
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
452 *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
453 * Entry: X = process descriptor to evaluate
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
454 * U = static storage of device we want to check against
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
455 RootThrough
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
456 ldb #NumPaths
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
457 leay P$Path,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
458 pshs x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
459 loop decb
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
460 bmi out
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
461 lda ,y+
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
462 beq loop
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
463 pshs y
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
464 ifgt Level-1
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
465 ldx <D.PthDBT
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
466 else
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
467 ldx >D.PthDBT
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
468 endc
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
469 os9 F$Find64
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
470 ldx PD.DEV,y
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
471 leax V$STAT,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
472 puls y
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
473 bcs out
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
474
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
475 cmpu ,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
476 bne loop
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
477
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
478 ldx ,s
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
479 lda P$ID,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
480 ldb #S$HUP
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
481 os9 F$Send
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
482
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
483 out puls x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
484 ldx P$Queue,x
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
485 bne RootThrough
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
486 rts
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
487
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
488 statcont clrb
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
489 tfr d,u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
490 * NEW: root through all process descriptors. if any has a path open to this
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
491 * device, send then S$HUP
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
492 ldx <D.AProcQ
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
493 beq dowaitq
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
494 bsr RootThrough
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
495 dowaitq ldx <D.WProcQ
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
496 beq dosleepq
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
497 bsr RootThrough
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
498 dosleepq ldx <D.SProcQ
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
499 beq CkLPRC
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
500 bsr RootThrough
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
501
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
502 CkLPRC
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
503 lda <V.LPRC,u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
504 beq IRQExit ; no last process, bail
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
505 ldb #S$HUP
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
506 os9 F$Send ; send signal, don't think we can do anything about an error result anyway.. so
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
507 bra CkSuspnd ; do we need to go check suspend?
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
508
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
509 ; put byte B in port As buffer - optimization help from Darren Atkinson
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
510 IRQPutCh
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
511 ; set IRQ freq for bulk
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
512 lda PollSpd1,pcr
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
513 lbsr IRQsetFRQ
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
514 ldx RxBufPut,u ; point X to the data buffer
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
515
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
516 ; process interrupt/quit characters here
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
517 ; note we will have to do this in the multiread (ugh)
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
518 tfr b,a ; put byte in A
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
519 ldb #S$Intrpt
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
520 cmpa V.INTR,u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
521 beq send@
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
522 ldb #S$Abort
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
523 cmpa V.QUIT,u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
524 bne store
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
525 send@ lda V.LPRC,u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
526 beq IRQExit
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
527 os9 F$Send
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
528 bra IRQExit
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
529
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
530 store
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
531 ; store our data byte
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
532 sta ,x+ ; store and increment buffer pointer
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
533
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
534 ; adjust RxBufPut
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
535 cmpx RxBufEnd,u ; end of Rx buffer?
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
536 blo IRQSkip1 ; no, go keep laydown pointer
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
537 ldx RxBufPtr,u ; get Rx buffer start address
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
538 IRQSkip1 stx RxBufPut,u ; set new Rx data laydown pointer
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
539
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
540 ; increment RxDatLen
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
541 inc RxDatLen,u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
542
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
543 CkSSig
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
544 lda <SSigID,u ; send signal on data ready?
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
545 beq CkSuspnd
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
546 ldb <SSigSg,u ; else get signal code
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
547 os9 F$Send
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
548 clr <SSigID,u
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
549 bra IRQExit
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
550
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
551 ; check if we have a process waiting for data
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
552 CkSuspnd
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
553 lda <V.WAKE,u ; V.WAKE?
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
554 beq IRQExit ; no
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
555 clr <V.WAKE,u ; clear V.WAKE
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
556
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
557 ; wake up waiter for read
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
558 ifeq Level-1
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
559 ldb #S$Wake
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
560 os9 F$Send
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
561 else
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
562 clrb
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
563 tfr d,x ; copy process descriptor pointer
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
564 lda P$State,x ; get state flags
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
565 anda #^Suspend ; clear suspend state
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
566 sta P$State,x ; save state flags
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
567 endc
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
568
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
569 IRQExit
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
570 IRQExit2 puls cc,dp,pc ; restore interrupts cc,dp, return
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
571
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
572 emod
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
573 eom equ *
c92a6c65bbd9 dw3 MESS driver
aaronwolfe
parents:
diff changeset
574 end