.TITLE AD-11 DRIVER ; ; ; This handler will scan the A/D once. The length of ; the scan is determined by the number of words ; requested in the I/O queue element. ; ; .IDENT /V04.0/ ; ; .SBTTL PREAMBLE SECTION ; ; .MCALL .QELDF,.DRBEG,.DRAST,.DRFIN,.DREND,.FORK ; ; ; SYSGEN DEFAULT DEFINITIONS ; ; MMG$T = 1 .IIF NDF,MMG$T MMG$T = 0 .IIF NDF,ERL$T ERL$G = 0 .IIF NDF,TIM$IT TIM$IT = 0 ; ; ; DEVICE UNIBUS ADDRESSES ; ; .IIF NDF,AD$VEC AD$VEC=340 ;A/D VECTOR .IIF NDF,AD$CSR AD$CSR=170400 ;A/D CSR ADBUFF = AD$CSR + 2 ;BUFFER REGISTER HDERR = 1 ;HARD ERROR ON CHANNEL ; ; ; DEVICE STATUS INFORMATION ; ; ADDSIZ = 0 ;DEVICE BLOCK SIZE ADSTS = 40370 ;DEVICE STATUS WORD ; ; ; DEFINITION OF Q ELEMENT SYMBOLICS ; ; .QELDF WCNT = Q.WCNT - Q.BLKN BUFF = Q.BUFF - Q.BLKN ; ; .SBTTL SET OPTIONS ; ; ; NO SET OPTIONS ; ; ; ; .SBTTL HEADER SECTION ; ; .DRBEG AD,AD$VEC,ADDSIZ,ADSTS ; ; ; ENTRY POINT FROM QUEUE MANAGER ; ; MOV ADCQE,R4 ;POINT TO CURRENT QUEUE ELEMENT TST WCNT(R4) ;WHAT DO YOU WANT?? BEQ ADDONE ;SEEK COMPLETES RIGHT AWAY BMI ADERR ;WE DON'T DO WRITES ; ; ; ASSUME A READ ; ; MOV @#ADBUFF,R0 ;CLEAR OUT A/D FLAG MOV #1,@#AD$CSR ;START A/D AT CHANNEL 0 RET: BIS #100,@#AD$CSR ;ENABLE INTERRUPT RETURN ;BYE ; ; .SBTTL INTERRUPT SERVICING ; ; .DRAST AD,4,ADDONE MOV ADCQE,R4 ;POINT TO ELEMENT .IF EQ,MMG$T MOV @#ADBUFF,@BUFF(R4) ;READ THE WORD SUB #2048.,@BUFF(R4) ;UNBIAS THE DATA ADD #2,BUFF(R4) ;BUMP BUFFER ADDRESS .IFF MOV @#ADBUFF,R0 ;READ THE WORD SUB #2048.,R0 ;UNBIAS THE DATA MOV R0,-(SP) ;STACK IT CALL @$PTWRD ;GIVE TO THE USER .ENDC DEC WCNT(R4) ;ONE LESS WORD BEQ ADDONE ;WE ARE DONE ADD #401,@#AD$CSR ;START NEXT CONVERSION RETURN ;RETURN ; ; .SBTTL I/O COMPLETION SECTION ; ; ADERR: BIS #HDERR,@Q.CSW-Q.BLKN(R4) ;SET ERROR BIT IN CHANNEL ADDONE: BIC #100,@#AD$CSR ;DISABLE INTERRUPT .DRFIN AD .DREND AD .END