.ident /18-NOV-81/ ;internal witchcraft for setting date into ident fld .title aed_driver $CRBDEF ; Channel request block $DCDEF ; Device classes and types $DDBDEF ; Device data block $DEVDEF ; Device characteristics $IDBDEF ; Interrupt data block $IODEF ; I/O function codes $IPLDEF ; Hardware IPL definitions $IRPDEF ; I/O request packet $SSDEF ; System status codes $UCBDEF ; Unit control block $VECDEF ; Interrupt vector block p1 = 0 ; First QIO parameter p2 = 4 ; Second QIO parameter p3 = 8 ; Third QIO parameter p4 = 12 ; Fourth QIO parameter p5 = 16 ; Fifth QIO parameter p6 = 20 ; Sixth QIO parameter ae_def_bufsiz = 1024 ; Default buffer size ae_timeout_sec= 3 ; 3 second device timeout ae_timeout_sec_dma= 5 ; 20 second device timeout for dma ae_num_regs = 4 ; Device has 4 registers ie = ^o100 ; interupt enable bit ie = ^o100 ; interupt enable bit io$_prgio = io$_access ; prgio function code pbr = 27 ; handshake code back to aed bassm = ^o40000 ; byte assembled bit in csr busy = ^o100000 ; terminal busy bit in csr maxbusywait = 500 ; maximum times in loop in busy waits delay_time = 50 ; delay kludge wrd = 70 ;write raster direct rrd = 64 ;read " sda = 27 ;stop direct wda = 46 ;write direct aoi rda = 47 ;read " scd = 42 ;send commands dmawrite = ^b0000001000000000 dmaread = ^b0010001000000000 $DEFINI UCB ; Start of UCB definitions .=UCB$K_LENGTH ; Position at end of UCB $DEF ucb$l_p2 ; The p2 parm .blkl 1 $DEF ucb$l_p3 ; The p3 parm .blkl 1 $DEF ucb$l_p4 ; The p4 parm .blkl 1 $DEF ucb$l_p5 ; The p5 parm .blkl 1 $DEF ucb$l_p6 ; The p6 parm .blkl 1 $DEF ucb$l_doingdma ; some data .blkl 1 $DEF UCB$K_AE_UCBLEN ; Length of extended UCB $VIELD UCB,0,<- ; Device status ,- ; First bit ,- ; Second bit > $DEFEND UCB ; End of UCB definitions $DEFINI AE ; Start of status definitions $DEF AE_gdcs ; Control/status .BLKW 1 $DEF AE_gdps ; interface setup .BLKW 1 $DEF AE_gdba ; Buffer address .BLKW 1 $DEF AE_gdwc ; Word count .BLKW 1 $DEFEND AE ; End of device register ; definitions. DPTAB - ; DPT-creation macro END=AE_END,- ; End of driver label ADAPTER=UBA,- ; Adapter type UCBSIZE=,- ; Length of UCB NAME=AEDRIVER ; Driver name DPT_STORE INIT ; Start of load ; initialization table DPT_STORE UCB,UCB$B_FIPL,B,8 ; Device fork IPL DPT_STORE UCB,UCB$B_DIPL,B,22 ; Device interrupt IPL DPT_STORE UCB,UCB$L_DEVCHAR,L,<- ; Device characteristics DEV$M_SHR!- ; available DEV$M_AVL!- ; available DEV$M_IDV!- ; input device DEV$M_ODV> ; output device DPT_STORE UCB,UCB$B_DEVCLASS,- ; Sample device class B,DC$_realtime DPT_STORE UCB,UCB$W_DEVBUFSIZ,W,- ; Default buffer size AE_DEF_BUFSIZ DPT_STORE REINIT ; Start of reload ; initialization table DPT_STORE DDB,DDB$L_DDT,D,AE$DDT ; Address of DDT DPT_STORE CRB,CRB$L_INTD+4,D,- ; Address of interrupt AE_INTERRUPT ; service routine DPT_STORE CRB,- ; Address of controller CRB$L_INTD+VEC$L_INITIAL,- ; initialization routine D,AE_CONTROL_INIT DPT_STORE CRB,- ; Address of device CRB$L_INTD+VEC$L_UNITINIT,- ; unit initialization D,AE_UNIT_INIT ; routine DPT_STORE END ; End of initialization ; tables DDTAB - ; DDT-creation macro DEVNAM=AE,- ; Name of device START=AE_START,- ; Start I/O routine FUNCTB=AE_FUNCTABLE,- ; FDT address CANCEL=AE_CANCEL,- ; Cancel I/O routine REGDMP=AE_REG_DUMP ; Register dump routine AE_FUNCTABLE: ; FDT for driver FUNCTAB ,- ; Valid I/O functions ; Set device chars. FUNCTAB , ; No buffered functions FUNCTAB ae_fdt_routine1,- ; FDT read routine for ; Set device chars. FUNCTAB +EXE$READ,- ; FDT read routine for ; and read physical. FUNCTAB +EXE$WRITE,- ; FDT write routine for ; and write physical. FUNCTAB +EXE$SETMODE,- ; FDT set mode routine ; set mode. FUNCTAB +EXE$ZEROPARM,- ; FDT for zero parameters ; for prgio AE_CONTROL_INIT: ; Initialize controller incl num_con_init RSB ; Return AE_UNIT_INIT: ; Initialize unit incl num_init BISW #UCB$M_ONLINE, - UCB$W_STS(R5) ; Set unit online RSB ; Return AE_FDT_ROUTINE1: ; FDT routine1 movl p2(ap),ucb$l_p2(r5) movl p3(ap),ucb$l_p3(r5) movl p4(ap),ucb$l_p4(r5) movl p5(ap),ucb$l_p5(r5) movl p6(ap),ucb$l_p6(r5) RSB ; Return AE_START: ;Process an I/O packet incl num_start reqpchan ;Get the controller and r4 := csr movzwl irp$w_func(r3),r1 movw r1,ucb$w_func(r5) extzv #io$v_fcode,#io$s_fcode,r1,r2 CMPB r2,#io$_writepblk BEQL aed_driver10 BRW aed_driver7 aed_driver10=. BRw aed_driver5 aed_driver7=. CMPB r2,#io$_writelblk BEQL aed_driver11 BRW aed_driver4 aed_driver11=. aed_driver5=. BRw aed_driver2 aed_driver4=. CMPB r2,#io$_writevblk BEQL aed_driver12 BRW aed_driver1 aed_driver12=. aed_driver2=. bitl #^D<1>,ucb$l_p2(r5) BNEQ aed_driver16 BRW aed_driver13 aed_driver16=. movl #ss$_badparam,r0 insv #^D<2>,#^D<16>,#^D<16>,r0 movzwl ucb$l_p2(r5),r1 reqcom aed_driver13=. aed_driver15=. incl num_dmas clrl r0 movw ucb$l_p2(r5),r0 cmpl r0,#^O0 BEQL aed_driver20 BRW aed_driver17 aed_driver20=. clrl r1 movl #ss$_normal,r0 reqcom aed_driver17=. aed_driver19=. clrl r0 movb ucb$l_p3(r5),r0 cmpl r0,#wrd BNEQ aed_driver24 BRW aed_driver21 aed_driver24=. cmpl r0,#wda BNEQ aed_driver28 BRW aed_driver25 aed_driver28=. cmpl r0,#scd BNEQ aed_driver32 BRW aed_driver29 aed_driver32=. BRw aed_driver33 aed_driver29=. BRW aed_driver25 aed_driver33=. BRw aed_driver34 aed_driver25=. BRW aed_driver21 aed_driver34=. movl ucb$l_p3(r5),r1 movl #ss$_ivmode,r0 reqcom aed_driver21=. aed_driver23=. JSB dmasetup JSB bsywait dsbint ;disable interupts JSB dmaload clrl r0 movb ucb$l_p3(r5),r0 bisl #dmawrite,r0 movl r1,num_wc movl r0,num_csr CMPB ucb$l_p3(r5),#scd BEQL aed_driver38 BRW aed_driver35 aed_driver38=. movw r0,(r4) movw r1,ae_gdwc(r4) Brw aed_driver39 aed_driver35=. movw r1,ae_gdwc(r4) movw r0,(r4) aed_driver39=. aed_driver37=. wfikpch ae_timeout_dma,#ae_timeout_sec_dma dsbint ;prepare to wait again wfikpch ae_timeout_dma,#ae_timeout_sec_dma clrl r0 movw ae_gdwc(r4),r0 cmpl r0,#^O0 BNEQ aed_driver43 BRW aed_driver40 aed_driver43=. incl num_int3 movw num_wc,num_wcbefore aed_driver40=. aed_driver42=. iofork JSB bsywait CMPB ucb$l_p3(r5),#scd BEQL aed_driver47 BRW aed_driver44 aed_driver47=. JSB delay aed_driver44=. aed_driver46=. dsbint ;prepare to wait again movw #sda,(r4) wfikpch ae_timeout_dma,#ae_timeout_sec_dma iofork JSB bsywait movl irp$l_ucb(r3),r5 JSB dmacleanup JSB bsywait movw ae_gdps(r4),num_psdma movw ae_gdwc(r4),num_wcdma cmpl num_wcdma,#^O0 BNEQ aed_driver51 BRW aed_driver48 aed_driver51=. incl num_nzwc aed_driver48=. aed_driver50=. clrw ae_gdps(r4) movl #ss$_normal,r0 movzwl ucb$l_p2(r5),r1 reqcom Brw aed_driver3 aed_driver1=. CMPB r2,#io$_readpblk BEQL aed_driver61 BRW aed_driver58 aed_driver61=. BRw aed_driver56 aed_driver58=. CMPB r2,#io$_readlblk BEQL aed_driver62 BRW aed_driver55 aed_driver62=. aed_driver56=. BRw aed_driver53 aed_driver55=. CMPB r2,#io$_readvblk BEQL aed_driver63 BRW aed_driver52 aed_driver63=. aed_driver53=. bitl #^D<1>,ucb$l_p2(r5) BNEQ aed_driver67 BRW aed_driver64 aed_driver67=. movl #ss$_badparam,r0 insv #^D<2>,#^D<16>,#^D<16>,r0 movzwl ucb$l_p2(r5),r1 reqcom aed_driver64=. aed_driver66=. incl num_dmas clrl r0 movw ucb$l_p2(r5),r0 cmpl r0,#^O0 BEQL aed_driver71 BRW aed_driver68 aed_driver71=. clrl r1 movl #ss$_normal,r0 reqcom aed_driver68=. aed_driver70=. clrl r0 movb ucb$l_p3(r5),r0 cmpl r0,#rrd BNEQ aed_driver75 BRW aed_driver72 aed_driver75=. cmpl r0,#rda BNEQ aed_driver79 BRW aed_driver76 aed_driver79=. BRw aed_driver80 aed_driver76=. BRW aed_driver72 aed_driver80=. movl ucb$l_p3(r5),r1 movw #ss$_ivmode,r0 reqcom aed_driver72=. aed_driver74=. JSB dmasetup JSB bsywait dsbint ;disable interupts JSB dmaload clrl r0 movb ucb$l_p3(r5),r0 bisl #dmaread,r0 movl r1,num_wc movl r0,num_csr movw r1,ae_gdwc(r4) movw r0,(r4) wfikpch ae_timeout_dma,#ae_timeout_sec_dma dsbint ;prepare to wait again wfikpch ae_timeout_dma,#ae_timeout_sec_dma clrl r0 movw ae_gdwc(r4),r0 cmpl r0,#^O0 BNEQ aed_driver84 BRW aed_driver81 aed_driver84=. incl num_int3 movw num_wc,num_wcbefore aed_driver81=. aed_driver83=. iofork JSB bsywait dsbint ;prepare to wait again movw #sda,(r4) wfikpch ae_timeout_dma,#ae_timeout_sec_dma iofork JSB bsywait movl irp$l_ucb(r3),r5 JSB dmacleanup JSB bsywait movw ae_gdps(r4),num_psdma movw ae_gdwc(r4),num_wcdma cmpl num_wcdma,#^O0 BNEQ aed_driver88 BRW aed_driver85 aed_driver88=. incl num_nzwc aed_driver85=. aed_driver87=. clrw ae_gdps(r4) movl #ss$_normal,r0 movzwl ucb$l_p2(r5),r1 reqcom Brw aed_driver3 aed_driver52=. CMPB r2,#io$_prgio BEQL aed_driver92 BRW aed_driver89 aed_driver92=. clrl r2 movb ucb$l_p4(r5),r2 cmpl r2,#^O0 BEQL aed_driver96 BRW aed_driver93 aed_driver96=. movl #^D<1>,r2 aed_driver97=. cmpl r2,#maxbusywait Bleq aed_driver99 Brw aed_driver98 aed_driver99=. movw (r4),r1 bitw #busy,r1 BEQL aed_driver103 BRW aed_driver100 aed_driver103=. Brw aed_driver98 ;break aed_driver100=. aed_driver102=. addl #1,r2 Brw aed_driver97 ;back to top aed_driver98=. cmpl r2,#maxbusywait-1 BGTR aed_driver107 BRW aed_driver104 aed_driver107=. movl #ss$_timeout,r0 movl #-10,r1 reqcom ;and out we go aed_driver104=. aed_driver106=. clrb ucb$l_p3+1(r5) dsbint ; disable all interupts bisw #ie,ae_gdps(r4) movw ucb$l_p3(r5),(r4) Brw aed_driver95 aed_driver93=. cmpl r2,#^D<1> BEQL aed_driver111 BRW aed_driver108 aed_driver111=. movl ucb$l_p3(r5),r0 bisl #^b11000000000,r0 dsbint ; disable all interupts bisw #ie,ae_gdps(r4) movw r0,(r4) Brw aed_driver95 aed_driver108=. cmpl r2,#^D<2> BEQL aed_driver115 BRW aed_driver112 aed_driver115=. bisl #^b01100000000,r0 dsbint ; disable all interupts bisw #ie,ae_gdps(r4) movw r0,(r4) Brw aed_driver95 aed_driver112=. cmpl r2,#^D<3> BEQL aed_driver119 BRW aed_driver116 aed_driver119=. movl #^D<1>,r2 aed_driver120=. cmpl r2,#maxbusywait Bleq aed_driver122 Brw aed_driver121 aed_driver122=. movw (r4),r1 bitw #busy,r1 BEQL aed_driver126 BRW aed_driver123 aed_driver126=. Brw aed_driver121 ;break aed_driver123=. aed_driver125=. addl #1,r2 Brw aed_driver120 ;back to top aed_driver121=. cmpl r2,#maxbusywait-1 BGTR aed_driver130 BRW aed_driver127 aed_driver130=. movl #ss$_timeout,r0 movl #-10,r1 reqcom ;and out we go aed_driver127=. aed_driver129=. clrb ucb$l_p3+1(r5) dsbint ; disable all interupts bisw #ie,ae_gdps(r4) movw ucb$l_p3(r5),(r4) Brw aed_driver95 aed_driver116=. cmpl r2,#^D<4> BEQL aed_driver134 BRW aed_driver131 aed_driver134=. movl #^D<1>,r2 aed_driver135=. cmpl r2,#maxbusywait Bleq aed_driver137 Brw aed_driver136 aed_driver137=. movw (r4),r1 bitw #bassm,r1 BNEQ aed_driver141 BRW aed_driver138 aed_driver141=. Brw aed_driver136 ;break aed_driver138=. aed_driver140=. addl #1,r2 Brw aed_driver135 ;back to top aed_driver136=. cmpl r2,#maxbusywait-1 BGTR aed_driver145 BRW aed_driver142 aed_driver145=. movl #-2,r1 movl #ss$_timeout,r0 reqcom aed_driver142=. aed_driver144=. movl #^D<1>,r2 aed_driver146=. cmpl r2,#maxbusywait Bleq aed_driver148 Brw aed_driver147 aed_driver148=. movw (r4),r0 bitw #bassm,r0 BEQL aed_driver152 BRW aed_driver149 aed_driver152=. Brw aed_driver147 ;break aed_driver149=. aed_driver151=. addl #1,r2 Brw aed_driver146 ;back to top aed_driver147=. cmpl r2,#maxbusywait-1 BGTR aed_driver156 BRW aed_driver153 aed_driver156=. movl #-3,r1 movl #ss$_timeout,r0 reqcom aed_driver153=. aed_driver155=. movw #pbr,(r4) movl #ss$_normal,r0 reqcom Brw aed_driver95 aed_driver131=. cmpl r2,#^D<100> BEQL aed_driver160 BRW aed_driver157 aed_driver160=. decl num_start clrl r0 movb ucb$l_p3(r5),r0 moval stats,r1 cmpl r0,#</4> BGEQ aed_driver167 BRW aed_driver164 aed_driver167=. BRw aed_driver162 aed_driver164=. cmpl r0,#^O0 BLSS aed_driver168 BRW aed_driver161 aed_driver168=. aed_driver162=. movl r0,r1 movl #ss$_ivmode,r0 reqcom aed_driver161=. aed_driver163=. movl (r1)[r0],r1 ;get the value movl #ss$_normal,r0 reqcom Brw aed_driver169 aed_driver157=. movl r2,r1 movl #ss$_ivmode,r0 reqcom aed_driver169=. aed_driver95=. Brw aed_driver170 aed_driver89=. incl num_badp1 movl #ss$_badparam,r0 insv #^D<1>,#^D<16>,#^D<16>,r0 movl r2,r1 reqcom ;and out we go aed_driver170=. aed_driver3=. wait_for=. ;wait for programmed io interupts wfikpch ae_timeout,#ae_timeout_sec movw #ie,ae_gdps(r4) IOFORK movl irp$l_ucb(r3),r5 clrl r1 movb ucb$l_p4(r5),r1 aed_driver171=. cmpl r1,#^O0 bneq aed_driver173 BRW aed_driver174 aed_driver173=. cmpl r1,#^D<2> bneq aed_driver175 aed_driver174=. clrl r1 clrl r0 movw #ss$_normal,r0 JSB bsywait Brw aed_driver172 ;break aed_driver175=. cmpl r1,#^D<1> bneq aed_driver177 movl ucb$l_p3(r5),r1 clrl r0 movw #ss$_normal,r0 Brw aed_driver172 ;break aed_driver177=. cmpl r1,#^D<3> bneq aed_driver179 movw (r4),r1 movl #^D<1>,r2 aed_driver181=. cmpl r2,#maxbusywait Bleq aed_driver183 Brw aed_driver182 aed_driver183=. movw (r4),r0 bitw #bassm,r0 BEQL aed_driver187 BRW aed_driver184 aed_driver187=. Brw aed_driver182 ;break aed_driver184=. aed_driver186=. addl #1,r2 Brw aed_driver181 ;back to top aed_driver182=. cmpl r2,#maxbusywait-1 BGTR aed_driver191 BRW aed_driver188 aed_driver191=. movl #-6,r1 movl #ss$_timeout,r0 Brw aed_driver172 ;break aed_driver188=. aed_driver190=. movw #pbr,(r4) movl #ss$_normal,r0 Brw aed_driver172 ;break aed_driver179=. clrl r0 movl #-1,r1 movw #ss$_normal,r0 Brw aed_driver172 ;break aed_driver172=. aed_driver192=. COMPLETE_IO: ; Driver processing is finished. REQCOM ; Complete I/O. dmasetup: movl r3,-(sp) movl r4,-(sp) movl r5,-(sp) reqdpr ;uba data path reqmpr ;uba map registers loaduba ;load em movl #1,ucb$l_doingdma(r5) movzwl ucb$w_boff(r5),r1 movl ucb$l_crb(r5),r2 insv crb$l_intd+vec$w_mapreg(r2),#9,#9,r1 extzv #16,#2,r1,r2 movl (sp)+,r5 movl (sp)+,r4 movl (sp)+,r3 rsb dmacleanup: pushr #^m clrl num_flag cmpl ucb$l_doingdma(r5),#^O0 BNEQ aed_driver196 BRW aed_driver193 aed_driver196=. purdpr relmpr reldpr clrl ucb$l_doingdma(r5) Brw aed_driver197 aed_driver193=. incl num_clean2 aed_driver197=. aed_driver195=. popr #^m rsb dmaload: movl r0,-(sp) movw r1,ae_gdba(r4) clrl r1 movzwl ucb$l_p2(r5),r1 ashl #-1,r1,r1 mnegl r1,r1 clrl r0 insv r2,#^D<12>,#^D<2>,r0 movl #1,num_flag bisl #ie,r0 movl r0,num_ps movw r0,ae_gdps(r4) movl (sp)+,r0 rsb ae_timeout_dma: ; Timeout handling incl num_seq movl num_seq,num__tmo incl num_timeout_dma movl r4,-(sp) movl ucb$l_crb(r5),r4 movl @crb$l_intd+vec$l_idb(r4),r4 movw ae_gdps(r4),num_pstmo movw #0,ae_gdwc(r4) movw #0,ae_gdps(r4) movw ae_gdwc(r4),num_wctmo JSB bsywait movw #sda,(r4) movl (sp)+,r4 setipl ucb$b_fipl(r5) JSB dmacleanup movzwl #ss$_timeout,r0 brw complete_io ae_timeout: ; Timeout handling incl num_timeout movl r4,-(sp) movl ucb$l_crb(r5),r4 movl @crb$l_intd+vec$l_idb(r4),r4 movw #0,ae_gdps(r4) movl (sp)+,r4 setipl ucb$b_fipl(r5) movzwl #ss$_timeout,r0 brw complete_io ae_interrupt: ; Service device interrupt incl num_seq movl num_seq,num__int incl num_interupts movl @(sp)+,r4 ; Get address of IDB and remove ; pointer from stack. movl idb$l_owner(r4),r5 ; Get address of device owner's ; UCB. BEQL aed_driver201 BRW aed_driver198 aed_driver201=. incl num_badint jmp unsol_interrupt aed_driver198=. aed_driver200=. movl idb$l_csr(r4),r4 ; Get address of device's CSR. bbcc #ucb$v_int,- ; If device does not expect ucb$w_sts(r5),- ; interrupt, dismiss it. unsol_interrupt incl num_solic restore_driver: ; Jump to main driver code. movq ucb$l_fr3(r5),r3 ; Restore driver's R3 (use a ; MOVQ to restore R3-R4). jsb @ucb$l_fpc(r5) ; Call driver at interrupt ; wait address. brw dismiss unsol_interrupt: ; Dismiss unsolicited interrupt. decl num_unsol dismiss: popr #^m ; Restore R0-R5 rei ; Return from interrupt. ae_cancel: ; Cancel an I/O operation jsb g^ioc$cancelio ; Set cancel bit if appropriate. bbc #ucb$v_cancel,- ; If the cancel bit is not set, ucb$w_sts(r5),10$ ; just return. incl num_cancel movl ucb$l_crb(r5),r3 movl @crb$l_intd+vec$l_idb(r3),r3 movw #0,ae_gdps(r3) cmpl ucb$l_doingdma(r5),#^O0 BNEQ aed_driver205 BRW aed_driver202 aed_driver205=. incl num_seq movl num_seq,num__can incl num_cancel_dma movw #scd,(r3) JSB dmacleanup aed_driver202=. aed_driver204=. 10$: rsb ; Return ae_reg_dump: ; Dump device registers rsb ; Return delay: movl r2,-(sp) movl #^D<1>,r2 aed_driver206=. cmpl r2,#delay_time Bleq aed_driver208 Brw aed_driver207 aed_driver208=. addl #1,r2 Brw aed_driver206 ;back to top aed_driver207=. movl (sp)+,r2 rsb bsywait: incl num_seq movl num_seq,num__bsy movl r2,-(sp) movl r1,-(sp) clrl r1 movl #^D<1>,r2 aed_driver209=. cmpl r2,#maxbusywait Bleq aed_driver211 Brw aed_driver210 aed_driver211=. movw (r4),r1 movl r1,num_r1 bitw #busy,r1 BEQL aed_driver215 BRW aed_driver212 aed_driver215=. Brw aed_driver210 ;break aed_driver212=. aed_driver214=. addl #1,r2 Brw aed_driver209 ;back to top aed_driver210=. cmpl r2,#^D<1> BGTR aed_driver219 BRW aed_driver216 aed_driver219=. incl num_notready cmpl r2,num_maxbsy BGTR aed_driver223 BRW aed_driver220 aed_driver223=. movl r2,num_maxbsy aed_driver220=. aed_driver222=. aed_driver216=. aed_driver218=. movl (sp)+,r1 movl (sp)+,r2 rsb .ascii /Stat/ ;these lines .ascii /Stat/ .ascii /Stat/ .long ^xaaaa .long ^xaaaa ;are for crash dumps Stats: num_flag: .long 0 ;this one is used only for crash dumps num_interupts: .long 0 ;1 num_solic: .long 0 ;2 num_unsol: .long 0 ;3 num_dmas: .long 0 ;4 num_start: .long 0 ;5 num_cancel: .long 0 ;6 num_cancel_dma: .long 0 ;7 num_timeout: .long 0 ;8 num_timeout_dma: .long 0 ;9 num_con_init: .long 0 ;10 num_init: .long 0 ;11 num_wc: .long 0 ;12 num_csr: .long 0 ;13 num_ps: .long 0 ;14 num_pstmo: .long 0 ;15 num_wctmo: .long 0 ;16 num_badint: .long 0 ;17 num_wcdma: .long 0 ;18 at end of a dma, this is the wc register num_psdma: .long 0 ;19 and ps register num_badp1: .long 0 ;20 if we ever get this, there's a bug for sure num_clean2: .long 0 ;21 if we are in clean dma a second time num_wcafter: .long 0 ;22 word count after a dma interupt if not zero num_psafter: .long 0 ;23 ps after a dma interupt if >0 word cocnt num_wcbefore: .long 0 ;24 originals num_nzwc: .long 0 ;25 number of times this happens num_csafter: .long 0 ;26 csr after the interupt num_int3: .long 0 ;27 third interupt required num_seq: .long 0 ;28 sequence counter for trace num__tmo: .long 0 ;29 num__int: .long 0 ;30 num__can: .long 0 ;31 num__bsy: .long 0 ;32 num_notready: .long 0 ;33 num_maxbsy: .long 0 ;34 num_r1: .long 0 ;35 Estats: .long ^xbbbb .long ^xbbbb .ascii /End End End End / ;for crash dumps ae_end: ; Last location in driver .end