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