.TITLE DZD ; * * * ID-2000 DEVICE HANDLER FOR RT-11 V02 (DMA) * * * ; DE ANZA SYSTEMS, INCORPORATED ; ALL NEW CODE: 13 APRIL 77 ; MODIFICATIONS INCORPORATING DMA: 21 JULY 78 ; REVISIONS TO: 19 OCTOBER 78 ; PROGRAMMER: KEN DINWIDDIE ; IMPLEMENTS BI-DIRECTIONAL 16-BIT WORD TRANSFERS BETWEEN ; DIGITAL EQUIPMENT CORPORATION 11 SERIES COMPUTERS ; OPERATING WITH THE RT-11 OPERATING SYSTEM AND ; DE ANZA SYSTEMS, INCORPORATED 2000 SERIES IMAGE DISPLAY SYSTEMS. ; TRANSFERS OF TWO DIFFERENT TYPES ARE PROVIDED: ; (1) READ/WRITE TO ANNOTATION OR INTENSITY TRANSFORMATION ; TABLE - STARTING BLOCK NUMBER SPECIFIES X-ADDRESS > 1777. ; (2) READ/WRITE TO IMAGE REFRESH MEMORY - STARTING BLOCK ; NUMBER SPECIFIES X-ADDRESS 0-1777; FIRST THREE WORDS OF ; BUFFER CONTAIN Y-REGISTER, BIT-PLANE MASK REGISTER AND ; CONTROL/STATUS REGISTER RESPECTIVELY. A MAXIMUM OF ; 256 WORDS MAY BE TRANSFERRED PER TYPE 2 CALL. ; NOTE: JOYSTICK INTERRUPTS ARE FLAGGED AS ERRORS. .PAGE .SBTTL HANDLER DEFINITIONS .MCALL ..V2..,.REGDEF ..V2.. ; REGISTER DEFINITION .REGDEF ; RT-11 MONITOR DEFINED CONSTANTS MONLOW =54 ; MONITOR BASE POINTER OFFSET =270 ; POINTER TO Q MANAGER COMPLETION ENTRY HDERR =1 ; HARD ERROR BIT ; PRIORITY CONSTANTS PR7 =340 ; HANDLER ENTERED AT PRIORITY 7 PR6 =300 ; HANDLER RUNS AT PRIORITY 6 ; ID-2000 COMMUNICATION CONSTANTS GO =101 ; TRANSFER AND INTERRUPT ENABLE READBK =117 ; READBACK AND INTERRUPT ENABLE DZVEC =234 ; INTERRUPT VECTOR ADDRESS ; ID-2000 CONTROL REGISTERS (DMA SYSTEM) XREG =166020 ; X-REGISTER ADDRESS YREG =166022 ; Y-REGISTER ADDRESS BPMR =166024 ; BIT-PLANE MASK REGISTER ADDRESS CSR =166026 ; CONTROL/STATUS REGISTER ADDRESS DREG =166030 ; DATA REGISTER ADDRESS .PAGE ; DMA REGISTERS DAWC = 166040 ; WORD COUNT DABA = 166042 ; BUS ADDRESS DACS = 166044 ; CONTROL/STATUS ; DMA OPERATION CODES DMARD = 504 ; READ WITH INTERRUPT AND CYCLE DMAWR = 502 ; WRITE WITH INTERRUPT AND CYCLE ; INTERRUPT FLAGS DRDY = 20000 ; DISPLAY SYSTEM WCZ = 10000 ; WORD COUNT ZERO (DMA) JYKN = 4000 ; JOYSTICK/KNOB (CURRENTLY ERRONEOUS) .PAGE .SBTTL ID-2000 DEVICE HANDLER DZSTRT: ; LOAD POINT .WORD DZVEC ; ADDRESS OF INTERRUPT VECTOR .WORD DZINT-. ; OFFSET TO INTERRUPT ROUTINE .WORD PR7 ; PRIORITY 7 DZLQE: .WORD 0 ; POINTER TO LAST Q ENTRY DZCQE: .WORD 0 ; POINTER TO CURRENT Q ENTRY MOV DZCQE,R0 ; PICK UP POINTER MOV (R0),XADDR ; PICK UP X-ADDRESS MOV 4(R0),BUFF ; PICK UP BUFFER POINTER MOV 6(R0),WCNT ; PICK UP WORD COUNT MOV XADDR,@#XREG ; X-ADDRESS TO X-REGISTER CMP XADDR,#2000 BMI IMAGE ; IMAGE REFRESH TRANSFER IF < 2000 MOV #2,MFLAG ; SET FLAG TO WRITE TST WCNT ; WORD COUNT POSITIVE ? BPL DZRAM0 ; YES, SHOW READ NEG WCNT ; NO, NEGATE WORD COUNT BR DZRAM1 ; AND PROCEED DZRAM0: INC MFLAG ; SHOW READ OPERATION REQUEST DZRAM1: MOV MFLAG,R4 SUB #2,R4 ; OPERATION TYPE ? BEQ WRITE ; IF WRITE READ: MOV #DMARD,DMAMOD ; PREPARE FOR READ OPERATION BR TSTITT ; GO CHECK ON ITT TRANSFER WRITE: MOV #DMAWR,DMAMOD ; PREPARE FOR WRITE OPERATION TSTITT: JSR PC,ITTXF ; GO TEST FOR ITT TRANSFERS DMAXFR: MOV WCNT,@#DAWC ; SET WORD COUNT MOV DMAMOD,@#DACS ; SET OPERATION CODE, CYCLE, INTERRUPT ENABLE MOV BUFF,@#DABA ; SET BUFFER STARTING ADDRESS BIS #1,@#DACS ; INITIATE DMA TRANSFER RTS PC ; AND GO AWAY TO AWAIT INTERRUPT .PAGE IMAGE: MOV BUFF,R5 ; PICK UP BUFFER POINTER MOV (R5)+,@#YREG ; Y-REGISTER TO DISPLAY MOV (R5)+,@#BPMR ; BIT-PLANE MASK TO DISPLAY MOV (R5)+,R4 ; PICK UP CONTROL/STATUS MOV R5,BUFF ; RESTORE UPDATED BUFFER POINTER BIS #GO,R4 ; AND WITH GO AND INTERRUPT MOV R4,CSRSAV ; SAVE FOR FUTURE REFERENCE CLR MFLAG ; SET MODE FOR IMAGE WRITE TST WCNT ; WORD COUNT POSITIVE ? BPL DZIM0 ; YES, SET FOR IMAGE READ NEG WCNT ; NO, NEGATE WORD COUNT BR DZIM1 ; AND PROCEED DZIM0: INC MFLAG ; FLAG FOR IMAGE READ DZIM1: TST MFLAG ; WRITE MODE ? BEQ WRITE ; YES, START WRITING OPERATION MOV #DMARD,DMAMOD ; PREPARE FOR READ OPERATION MOV #READBK,R4 ; PICK UP READBACK WITH INTERRUPT CODE BIS CSRSAV,R4 ; INCLUDE CONTROL BITS SUPPLIED MOV R4,@#CSR ; INITIATE READBACK OPERATION BIS #100,@#DACS ; ENABLE DMA INTERRUPT RTS PC ; AND GO AWAY TO AWAIT INTERRUPT .PAGE .SBTTL INTERRUPT PROCESSING ROUTINE BR DZHOME ; ABORT BRANCH FOR F/B MONITOR DZINT: JSR R5,@INTPTR ; NOTIFY MONITOR AND .WORD ^C&PR7 ; SET PRIORITY TO LEVEL 6 MOV @#DACS,R5 ; PICK UP DMA CSR CONTENTS CLR @#DACS ; CLEAR DMA CSR FLAGS BIT #DRDY,R5 ; DISPLAY READY ? BEQ DZINT2 ; NO, GO CHECK WORD COUNT ZERO BIT #1,MFLAG ; WRITE OPERATION ? BNE DZINT3 ; NO, GO CHECK FOR IMAGE READ BIT #2,MFLAG ; YES, IS IT AN IMAGE WRITE ? BNE DZINT4 ; NO, GO START DMA TRANSFER BR DZHOME ; YES, RETURN TO MONITOR ; WORD COUNT ZERO INTERRUPT PROCESSING: DZINT2: BIT #1,MFLAG ; WRITE OPERATION ? BNE DZHOME ; NO, RETURN TO MONITOR BIT #2,MFLAG ; YES, IS IT AN IMAGE WRITE ? BNE DZHOME ; NO, RETURN TO MONITOR MOV CSRSAV,@#CSR ; YES, ENABLE BUFFER TO IMAGE TRANSFER BIS #100,@#DACS ; ENABLE DMA INTERRUPT RTS PC ; AND GO AWAY TO AWAIT INTERRUPT DZINT3: BIT #2,MFLAG ; IMAGE READ OPERATION ? BNE DZINT4 ; NO, SKIP BIT 9 RESET BIC #1000,XADDR ; RESET BIT 9 FOR BUFFER/CPU TRANSFER ; BUFFER TO CPU TRANSFER AFTER IMAGE REFRESH TO BUFFER, ; OR ITT TRANSFER AFTER AWAITING VERTICAL INTERVAL: DZINT4: MOV XADDR,@#XREG ; INITIALIZE DISPLAY X BR DMAXFR ; GO INITIATE DMA TRANSFER ERROR: MOV DZCQE,R5 ; PICK UP CURRENT Q ENTRY POINTER BIS #HDERR,@-(R5) ; SOMETHING IS VERY WRONG DZHOME: MOV PC,R4 ADD #DZCQE-.,R4 ; PIC ADDRESS OF CURRENT Q ENTRY MOV @#MONLOW,R5 JMP @OFFSET(R5) ; EXIT TO MONITOR QUEUE COMPLETION ; TEMPORARY STORAGE LOCATIONS BUFF: .BLKW 1 ; BUFFER STARTING ADDRESS CSRSAV: .BLKW 1 ; COMPLETE CONTROL/STATUS REGISTER DMAMOD: .BLKW 1 ; DMA OPERATION CODE MFLAG: .BLKW 1 ; TRANSFER MODE FLAG WCNT: .BLKW 1 ; TRANSFER BLOCK LENGTH XADDR: .BLKW 1 ; DISPLAY SYSTEM INITIAL X-ADDRESS .PAGE .SBTTL SUBROUTINE FOR MINIMIZING ITT TRANSFER VISIBILITY ITTXF: BIT #10000,XADDR ; ITT TRANSFER ? BNE ITTXF1 ; YES, TEST READY BIT IN DISPLAY CSR RTS PC ; NO, RETURN ITTXF1: TSTB @#CSR ; READY BIT SET ? BPL ITTXF2 ; NO, GO PREPARE FOR IT RTS PC ITTXF2: TST (SP)+ ; PUSH STACK POINTER UP ONE NOTCH CLR @#YREG ; POINT TO LINE ZERO IN DISPLAY MOV #READBK,R5 ; PICK UP READBACK WITH INTERRUPT CODE BIS CSRSAV,R5 ; INCLUDE PREVIOUS CONTROL BITS BIC #40,R5 ; CLEAR ZERO BIT IF SET (DO NOT SET "V" BITS) MOV R5,@#CSR ; ENABLE READBACK WITH INTERRUPT BIS #100,@#DACS ; ENABLE DMA INTERRUPT ITTXF3: RTS PC ; GO AWAY TO AWAIT INTERRUPT INTPTR: .WORD 0 ; MONITOR ENTRY ADDRESS DZSIZE =.-DZSTRT ; HANDLER SIZE .END