.TITLE CDDRV .IDENT /03/ ; This driver was originally adapted by RSMAS of UNIVERSITY of ; MIAMI to control their special color display from a version of ; the RK05 RSX-11M driver. ; ; Bob Brown of NCAR has modified it for use with COMTAL VISION 1 ; the COMTAL 8000-S I believe to be a compatible subset. ; ; The driver can treat the Comtal image memories as fixed head ; disks with FILES-11 access, or be used with write logical blks ; when manipulating images. The special features of Comtal are not ; low level driver functions, these are handled by a higher level ; access package(some what clumsy to use) to force portability ; to be handled at higher levels rather than shoved down as driver ; responsibility. ; ; The data base can handle 3 image memories 8 bits per pixel and ; 4 graphics planes 1 bit per pixel. Each image is treated as a ; seperate disk, as the graphics are each treated as a disk, each ; function memory and psuedo-color memory are considered to ; be a disk. This partioning into seperate units permits the ; Comtal to be used by different tasks each with his own memory/ ; image area via the ALLocate directive if desired. ; ; The only features of VISION 1 not checked out are the ability ; to access LSI-11 ram from the host; and the ability to accept ; the SEND MESSAGE interrupt from the VISION 1 . 'SEND MESSAGE' ; is not supported at all. ; ; Code uses err logger entry points to log timeouts and hardware ; errors flagged in CSR bit #15. ; ;***************************************************************** ; ; contact BOB BROWN ; Natonal Center for Atmospheric Reseach ; Boulder, Colorado 80307 ; (303) - 494 - 5151 x 718 ; FTS 322-5151 x718 ; ;*************************************************************** ; ; Modified 9-aug-79 to include Programmable Target as Function Memory ; #4 as Comtal LSI-11 expects ; ; Modified 25-jun-79 to put all independently addressable memories ; as seperate units. This allows unique device names to be assigned ; to each specific unit ,graphic 2 = GR2: using ASN CD4: GR2: ;; ; modified 28-nov-78 to treat indiviual raster lines in graphics ; instead of lumps of 8 lines as had been done originally ; ; modified 28-nov-78 to test display not busy (NOTBSY) before ; issuing next command. This is different than testing DMA done. ; ; MODIFIED 6-DEC-78 TO TEST COLUMN ADDR ( X-ADDR ) FOR LESS ; THAN OR EQUAL TO 511. ; ; modified 11-dec to use non-xfer control function pattern IO.INL ; the previous IO.INL didnt function trapped to XDT. ; ; ; IMAGE DISPLAY DRIVER ; ; MACRO LIBRARY CALLS ; .MCALL HWDDF$,PKTDF$,UCBDF$,SCBDF$,DRERR$ HWDDF$ ;DEFINE HARDWARE REGISTERS PKTDF$ ;DEFINE I/O PACKET OFFSETS UCBDF$ ;DEFINE UCB PACKET OFFSETS SCBDF$ ;DEFINE SCB PACKET OFFSETS DRERR$ ;DEFINE ERROR CODES ; ; EQUATED SYMBOLS ; ;.CDTIM=0 ;ASSEMBLE IN TIMEOUT HANDLING CODE ;.CDERR=0 ;ASSEMBLE IN DR11-B BOUNDARY CODE C$$D11=1 ;NUMBER OF CD CONTROLLERS LD$CD=1 ;WE ARE A LOADABLE DRIVER MEMBIT=60 ;MEMORY EXTENSION BITS GO=1 ;DR11-B GO BIT ; ; IO.INL=002400 ;special function code for control i/o ; READIT=100000 ;SET BIT TO READ FROM CD: GRAPHI=1000 ;SET BIT TO INDICATE GRAPHICS XFER BLKX =20000 ;blk XFER mode for psudeo-color/function FUNMEM=40000 ;XFER function memory not psudeo -color TSTC =100 ;tst subfuntion see if c bit shall be on CBIT =10 ;c bit in xfer cmd tells COMTAL to send GO2 CYCLE =0 ;NONSENSE INTEBL=100 ;interrupt enable for COMTAL display NOTBSY=4000 ;set when Comtal display is not busy ;this is different then DMA done. ; .PAGE ; ; LOCAL DATA ; ; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER) ; CNTBL: .BLKW C$$D11 ;ADDRESS OF CURRENT UNIT CONTROL BLOCK .IF GT C$$D11-1 TEMP: .BLKW 1 ;TEMPORY STORAGE FOR CONTROLLER NUMBER .ENDC ; ; DRIVER DISPATCH TABLE ; $CDTBL::.WORD CDINI ;DEVICE INITIATOR ENTRY POINT .WORD CDCAN ;CANCEL I/O OPERATION ENTRY POINT .WORD CDOUT ;DEVICE TIMEOUT ENTRY POINT .WORD CDPWF ;POWERFAIL ENTRY POINT ;+ ; **-CDINI - IMAGE DISPLAY INITIATOR ; ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUEST ; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THE EXECU- ; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN ATTEMPT ; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER IS ; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER- ; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED. ; ; INPUTS: ; ; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED. ; ; OUTPUTS: ; ; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WAIT- ; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OPER- ; ATION IS INITIATED. ;- .ENABL LSB CDINI: CALL $GTPKT ;GET AN I/O PACKET TO PROCESS BCC 4$ ;if clr go on JMP CDPWF ;IF CS CONTROLLER BUSY OR NO REQUEST ; ; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT: ; ; R1=ADDRESS OF THE I/O REQUEST PACKET. ; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB. ; R3=CONTROLLER INDEX. ; R4=ADDRESS OF THE STATUS CONTROL BLOCK. ; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED. ; ; CD11 IMAGE DISPLAY I/O REQUEST PACKET FORMAT: ; ; WD. 00 -- I/O QUEUE THREAD WORD. ; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER. ; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK. ; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER. ; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTOR TASK HEADER (UCB). ; WD. 05 -- I/O FUNCTION CODE (IO.RLB OR IO.WLB). ; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK. ; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK. ; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 140000). ; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE. ;I.PRM ; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER. ; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER. ; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED. ; +6 WD. 15 -- UNUSED. ; +10 WD. 16 -- LOW BYTE MUST BE ZERO AND HIGH BYTE NOT USED. ; +12 WD. 17 -- LOGICAL BLOCK NUMBER OF I/O REQUEST.(Y-ADDRESS [0-511.]) ; +14 WD. 20 -- X-ADDRESS (0-510. [EVEN]) ; WD. 21 -- DIAGNOSTIC REG. BLK ADRS (REAL OR DISPL.+140000) ; PB002 ; 4$: MOV R5,CNTBL(R3) ;SAVE ADDRESS OF REQUEST UCB .IF DF M$$EXT&M$$MGE CALL $STMAP ;SET UP UNIBUS MAPPING ADDRESS ; DC078 .ENDC 5$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION ; PB005 ; cmp #IO.INL,I.FCN(R1) ;tst for special display control cmd? bne 6$ ;if not control cmd go on tst xfer ; mov #INTEBL+1,U.BUF(R5) ;load MODE 0 XFER type cmd pattern ;use MOV not bis ,dont need MEX bits br 30$ ;go join actual I/O code ; 6$: CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION? BHIS 10$ ;IF HIS FUNCTION IS LEGAL ; PB005 JMP 110$ ;FUNCTION IS ILLEGAL ; PB005 10$: CALL $BLKCK ;CHECK LOGICAL BLOCK NUMBER ; PB002 ;TEST I.PRM+12 ,MAKE SURE ITS IN RANGE ; R3 = I/O BLOCK PTR ;************************************************************** ; ; ALTER THIS TO ACT ONLY WHERE NEEDED NOT ALWAYS ; ;***************************************************************** ; MOV I.PRM+14(R3),R2 ;GET X-OFFSET MOV #IE.BLK&377,R0 ;ASSUME INVALID BLOCK CMP R2,#511. ;BLOCK VALID? BLOS 17$ ;YES - BRANCH 15$: CLR R1 ;ERROR RETURN - BAD BLOCK JMP 120$ 17$: ;NORMALLY DONT ALLOW BYTE ADDRESSING ; ASR R2 ;ODD NUMBER? ; BCS 15$ ;YES - ERROR ; MOV R2,I.PRM+14(R3) ;SAVE WORD OFFSET ; ;***************************************************************** ; 18$: MOVB U.UNIT(R5),R2 ;GET UNIT NUMBER ; ;test unit / it determins type of xfer clr I.PRM+6(R3) ;zero storage location for building CMD cmp #3,R2 ;3,4,5,6 is Graphics unit, less are images bgt 19$ ;go treat as images 0,1,2 cmp #6,R2 ;test for graphics ??? 3,4,5,6 ?? blt 22$ ;if not go look for function/color mems ; ;******************* Build graphics xfer cmd word *************** ; bis #GRAPHI,I.PRM+6(R3) ;set graphics flag sub #3,R2 ;get graphics # to base zero ; ; ;******************* Build image xfer cmd word *************** ; 19$: bis I.PRM+12(R3),I.PRM+6(R3) ;save Y addr logiacl blk # ;BUILD UNIT SELECT SWAB R2 ;BIT 8 ASL R2 ;BIT 9 ASL R2 ;BIT 10 ASL R2 ;BIT 11 BIS R2,I.PRM+6(R3) ;ADD IN UNIT SELECT 20$: BIS #INTEBL+CBIT+3,U.BUF(R5) ;load CSR cmd bits ;for MODE 1 xfer ;INSERT BITS FOR CSR CMD ;PUT INTO U.BUF AROUND ;MEM EXTENSION BITS ; 21$: mov I.FCN(R3),R2 ;get function cmd word from i/o packet swab R2 ;get sub-function code to top byte clrb R2 ;save upper 8 bits bis R2,I.PRM+6(R3) ;mask in sub-function bits,they ;implement bits r14,r13,r10 special ;RAM memory functions /and MODE 3. br 25$ ;go test direction of xfer ; 22$: cmp #16,R2 ;test for special functions unit # ble 26$ ;if 15 or greater go on ; ;******************* build function & psuedo-color mem cmds ********** ;*************** also FM #4 is actually Programmable Target******** ; NOTE: Function & Color memory will support individual word ; xfers. ; mov I.PRM+14(R3),I.PRM+6(R3) ;load low 8 bits addr of word ;that xfer will start with (0-255) clrb I.PRM+7(R3) ;zero upper byte. bis #BLKX,I.PRM+6(R3) ;load blk xfer bit for all pallets BIS #INTEBL+CBIT+5,U.BUF(R5) ;cmd for function/psuedo-color ;INSERT BITS FOR CSR CMD ;PUT INTO U.BUF AROUND ;MEM EXTENSION BITS sub #7,R2 ;get unit number to function memory zero base ;function memories 0/1/2/3 cmp #3,R2 ;tst for function or color xfer ? blt 23$ ;if 0/1/2/3 =function memory ;/3 is programmable target bis #FUNMEM,I.PRM+6(R3) ;set function memory bit br 24$ ; 23$: sub #4,R2 ;get color memory to zero base ; 24$: swab R2 ;get low 2 bits to pt to memory bis R2,I.PRM+6(R3) ;load 2 bits of memory number ; bis I.PRM+12(R3),I.PRM+6(R3) ;get y addr,logical blk # ; ;****************** tst and set xfer direction ********************** ; 25$: cmpb #IO.RLB/256.,I.FCN+1(R3) ;test xfer dirction bne 30$ ;if write skip bis #READIT,I.PRM+6(R3) ;load read xfer cmd bit br 30$ ;go initiate i/o ; ; ;****************** build MODE 3 xfer cmd ************************** ; 26$: ;here is code for unit = 5 bis I.PRM+14(R3),I.PRM+6(R3) ;load low 9 bits of addr ;USE PRL(6) FOR X,Y,LSI-11 ADDR ;used by x,y,LSI-11 code blk bis #INTEBL+7,U.BUF(R5) ;load MODE 3 xfer cmd word ;C bit is added only if needed. cmp #IO.WLB,I.FCN(R3) ;tst for direction & sub func=0 beq 28$ ;if write then no C bit needed 27$: bit #TSTC,I.FCN(R3) ;tst bit 6 ,if set no C bit used bne 28$ bis #CBIT,U.BUF(R5) ;set C bit for variable DMA's 28$: br 21$ ;go set in subfunction bits ; ; ; INITIATE I/O OPERATION ; 30$: ;REF LABEL ; DC078 .IF DF M$$EXT&M$$MGE CALL $MPUBM ;MAP UNIBUS TO TRANSFER ; DC078 .ENDC MOV S.CSR(R4),R2 ;GET ADDRESS OF CSR ; PB001 MOV S.PKT(R4),R1 ;RETRIEVE ADDRESS OF I/O REQUEST PACKET MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUNT ; cmp #IO.INL,I.FCN(R1) ;tst whole I/O funtion for control type bne 31$ ;if not merely control type go on ; mov I.PRM(R1),2(R2) ; special control word from I/O packet ;out to the COMTAL data buf reg br 33$ ;go join code to issue xfer cmd. ; 31$: MOV U.CNT(R5),-(SP) ;INSERT NUMBER OF BYTES TO TRANSFER ; PB001 CLC ; JUST TO MAKE SURE CARRY IS CLEAR ROR @SP ;CONVERT TO WORD COUNT ; PB001 NEG @SP ;MAKE NEGATIVE WORD COUNT ; PB001 SUB #4,R2 ;POINT TO WORDCOUNT REGISTER MOV (SP)+,(R2)+ ;OUTPUT WORD COUNT MOV U.BUF+2(R5),(R2)+ ;INSERT BUFFER ADDRESS MOV I.PRM+6(R1),2(R2) ;SEND CMD TO BUFFER WRD XFER TYPE 33$: .IF DF .CDTIM CLR CDTMOT ; CLEAR TIMEOUT FLAG .ENDC MOV #IE.DNR&377,R0 ;ASSUME DRIVE NOT READY ; PB001 TSTB (R2) ;IS DRIVE READY? ; PB001 BPL 110$ ;IF PL NO ; PB001 ; ; ;code added to test Comtal still busy from last ;long winded commmand ? bit #NOTBSY,(R2) ;tst display not busy beq 110$ ;if its still busy exit not ready ; .IF DF E$$DVC CALL $BMSET ;SET I/O ACTIVE BIT IN MAP ; DC045 .IFTF MOV U.BUF(R5),(R2) ;SET FUNCTION AND GO ; PB001 ; ; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES. ; CDCAN: ;REF LABEL ; ; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND THEREFORE CAUSES ; NO IMMEDIATE ACTION ON THE DEVICE. THIS IS DONE TO AVOID A RACE CONDITION ; THAT COULD EXIST IN RESTARTING THE I/O OPERATION. ; CDPWF: RETURN ; ;+ ; **-$CDINT - IMAGE DISPLAY INTERRUPT ;- $CDINT:: ;;;REF LABEL INTSE$ CD,PR5,C$$D11 ;;;SAVE REGISTERS AND SET PRIORITY ; DC045 111$: MOV U.SCB(R5),R4 ;;;GET SCB ADDRESS MOV S.CSR(R4),R4 ;;;GET STATUS REGISTER ADDRESS .IF DF .CDTIM CLR CDTMOT ;;;CLEAR TIMEOUT FLAG .ENDC TST (R4) ;;;ANY ERRORS? BPL 50$ ;;;NO - BRANCH 48$: ;;; ERROR STATUS BUT TRANSFER COMPLETE... 50$: CALL $FORK ;;;CREATE A SYSTEM PROCESS MOV R4,R3 ;COPY CONTROLLER INDEX MOV U.SCB(R5),R4 ;GET ADDRESS OF SCB MOV S.CSR(R4),R2 ;GET ADDRESS OF CSR MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFER ; PB002 TST (R2) ;ANY ERRORS? BPL 110$ ;IF PL NO MOV #IE.FHE&377,R0 ;***FATAL HDWE ERROR*** .IFT CALL $DVERR ;LOG DEVICE ERROR ; DC045 .IFTF ; .ENDC MOV #IE.FHE&377,R0 ;***HDWE ERROR*** 110$: MOV U.CNT(R5),R1 ;SET FINAL VALUE OF SECOND STATUS WORD 120$: ;REF LABEL ; DC045 ; .IFT ; MOVB S.CON(R4),R3 ;RETREIVE CONTROLLER INDEX ; PB001 ; MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNT ; DC045 ; BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNT ; DC045 ; .ENDC CALL $IODON ;FINISH I/O OPERATION ; DC045 JMP CDINI ;PROCESS NEXT REQUEST ; SUCCESSFUL COMPLETION CDFIN: MOV #IS.SUC&377,R0 ;WE DID IT! mov U.BUF+2(r5),r1 ;calc final DR11-B address value add U.CNT(r5),r1 ; mov S.CSR(r4),r2 ;get CSR address sub -(r2),r1 ;see if we have a match beq 110$ ; yes - success mov #IE.BCC&377,r0 ;error - block check BR 120$ ; ERROR COMPLETION CDERR: MOV #IE.ONP&377,R0 ;ILLEGAL SUBFUNCTION CODE BR 120$ ;RETURN ; ; DEVICE TIMEOUT RESULTS IN AN ERROR RETURN. ; TIMEOUTS ARE USUALLY CAUSED BY POWERFAILURE BUT MAY ALSO BE THE ; RESULT OF A HARDWARE FAILURE. ; .IF DF .CDTIM CDTMOT: .WORD 0 ;;; FLAG WORD .ENDC CDOUT: .IF DF .CDTIM ;dont atuo restart ,just log time out err ;and return timeout message to caller ;let him restart if he needs to. ; COM CDTMOT ;;; HAVE WE TRIED RE-START? ; BEQ 125$ ;;; BRANCH IF YES ; MOVB S.ITM(R4),S.CTM(R4) ;;; RESET TIMEOUT ; MOV (R2),R3 ;;; TRY TO FINISH TRANSFER ; BIS #CYCLE!GO,R3 ; MOV R3,(R2) ;;; RE- TRIGGER DR11-B ; RETURN ;;; GO AWAY .ENDC 125$: CALL $DTOER ;;;LOG DEVICE TIMEOUT ; DC045 ;;;$DTOER save CSR contents ;;; & clrs device interrupt enable MOV #IE.TMO&377,R0 ;UN-RECOVERABLE ERROR BR 120$ ;CONTINUE .DSABL LSB ; .END