.TITLE DE ANZA 2000 SERIES HANDLER ; DE ANZA SYSTEMS, INCORPORATED ; ALL NEW CODE: APRIL 13, 1977 ; REVISIONS TO: DECEMBER 21, 1977 ; ORTEC ADDRESSES: MAY 16, 1978 ; 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. .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 (ORTEC VERSION) 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 ; LSI-11 IDENTIFICATION FLAG LSI11 =0 ; ASSEMBLE FOR THE PDP-11 .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),R5 ; PICK UP BUFFER POINTER MOV 6(R0),R3 ; 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 R3 ; WORD COUNT POSITIVE ? BPL DZRAM0 ; YES, SHOW READ NEG R3 ; NO, NEGATE WORD COUNT BR DZRAM1 ; AND PROCEED DZRAM0: INC MFLAG ; SHOW READ OPERATION REQUEST DZRAM1: JSR PC,TCALC ; CALCULATE TRANSFER PARAMETERS MOV MFLAG,R4 SUB #2,R4 ; OPERATION TYPE ? BEQ WRIT16 ; IF WRITE .PAGE READ16: MOV XFINIT,RD16-2 ; PICK UP INITIAL OFFSET .IF EQ,LSI11-1 BIS #1000,@#CSR ; PREPARE TO READ DATA REGISTER BIS #1000,CSRSAV ; IF DUMMY READ REQUIRED FOR ITT .ENDC JMP 0(PC) ; START INITIAL READ RD16: .REPT 20 MOV @#DREG,(R5)+ ; TRANSFER WORD FROM DISPLAY .ENDR DEC XFREPT ; ACCOUNT FOR TRANSFER JSR PC,ITTXF ; GO TEST FOR ITT TRANSFER RD16I: TST XFREPT ; MORE BLOCKS TO READ ? BNE RD16 ; IF SO, ATTEND TO IT .IF EQ,LSI11-1 BIC #1000,@#CSR ; RETURN TO WRITE DATA REGISTER MODE BIC #1000,CSRSAV ; AND RESTORE SAVED CSR CODE ALSO .ENDC BR DZHOME ; GO RETURN TO MONITOR Q MANAGER .PAGE WRIT16: MOV XFINIT,WR16-2 ; PICK UP INITIAL OFFSET JMP 0(PC) ; START INITIAL WRITE WR16: .REPT 20 MOV (R5)+,@#DREG ; TRANSFER WORD TO DISPLAY .ENDR DEC XFREPT ; ACCOUNT FOR TRANSFER JSR PC,ITTXF ; GO TEST FOR ITT TRANSFER WR16I: TST XFREPT ; MORE BLOCKS TO WRITE ? BNE WR16 ; IF SO ATTEND TO IT TST MFLAG ; IMAGE WRITE ? BNE DZHOME ; NO, GO RETURN TO MONITOR Q MANAGER MOV CSRSAV,@#CSR ; ENABLE TRANSFER WITH INTERRUPT RTS PC ; GO AWAY FOR I/O .PAGE IMAGE: MOV (R5)+,@#YREG ; Y-REGISTER TO DISPLAY MOV (R5)+,@#BPMR ; BIT-PLANE MASK TO DISPLAY MOV (R5)+,R4 ; PICK UP CONTROL/STATUS BIS #GO,R4 ; AND WITH GO AND INTERRUPT MOV R4,CSRSAV ; SAVE FOR FUTURE REFERENCE CLR MFLAG ; SET MODE FOR IMAGE WRITE TST R3 ; WORD COUNT POSITIVE ? BPL DZIM0 ; YES, SET FOR IMAGE READ NEG R3 ; NO, NEGATE WORD COUNT BR DZIM1 ; AND PROCEED DZIM0: INC MFLAG ; FLAG FOR IMAGE READ DZIM1: JSR PC,TCALC ; CALCULATE TRANSFER PARAMETERS TST MFLAG ; WRITE MODE ? BEQ WRIT16 ; YES, START WRITING OPERATION MOV #READBK,R4 ; PICK UP READBACK WITH INTERRUPT CODE BIS CSRSAV,R4 ; INCLUDE CONTROL BITS SUPPLIED MOV R4,@#CSR ; INITIATE READBACK OPERATION MOV R5,R5SAV ; SAVE CURRENT BUFFER POINTER 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 TST MFLAG ; WRITE IMAGE MODE ? BEQ DZHOME ; IF SO, WE'RE DONE MOV R5SAV,R5 ; RESTORE R5 MOV MFLAG,R4 DEC R4 ; READ IMAGE MODE ? BEQ IMRD ; YES, GO DO IT MOV SAVX,@#XREG ; RESTORE DISPLAY X-REGISTER DEC R4 ; WRITE ITT MODE ? BEQ WR16I ; YES, GO DO IT DEC R4 ; READ ITT MODE ? BEQ RD16I ; YES, GO DO IT MOV DZCQE,R5 ; PICK UP CURRENT Q ENTRY POINTER BIS #HDERR,@-(R5) ; SOMETHING IS VERY WRONG BR DZHOME ; RETURN TO MONITOR Q MANAGER IMRD: MOV XADDR,R4 ; PICK UP X-ADDRESS BIC #1000,R4 ; CLEAR BIT 9, IF SET MOV R4,@#XREG ; SET X-REGISTER IN DISPLAY JMP READ16 ; AND GO READ DATA FROM DISPLAY BUFFER .PAGE 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 MFLAG: .WORD 0 ; TRANSFER MODE FLAG XFINIT: .WORD 0 ; INITIAL OFFSET INTO TRANSFER INSTRUCTIONS XFREPT: .WORD 0 ; TRANSFER BLOCK CYCLE COUNT XADDR: .WORD 0 ; STORAGE FOR INITIAL X-ADDRESS R5SAV: .WORD 0 ; STORAGE FOR R5 (CURRENT BUFFER POINTER) CSRSAV: .WORD 0 ; STORAGE FOR COMPLETE CONTROL/STATUS REGISTER SAVX: .WORD 0 ; STORAGE FOR INTERIM X-REGISTER .PAGE .SBTTL SUBROUTINES TCALC: MOV R3,R4 BIC #177760,R4 ; SAVE LEAST-SIGNIFICANT 4 BITS CLC ROL R4 ROL R4 ; MULTIPLY BY 4 MOV #100,R0 SUB R4,R0 ; DETERMINE STARTING OFFSET INTO TRANSFERS MOV R0,XFINIT ; SAVE FOR FUTURE REFERENCE ASR R3 ASR R3 ASR R3 ASR R3 ; DIVIDE BY 16 INC R3 ; ADD 1 FOR FIRST CYCLE MOV R3,XFREPT ; AND SAVE FOR FUTURE REFERENCE RTS PC .PAGE 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 MOV R5,R5SAV ; SAVE CURRENT BUFFER POINTER MOV @#XREG,SAVX ; SAVE CURRENT X-ADDRESS 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 ITTXF3: RTS PC ; GO AWAY TO AWAIT INTERRUPT INTPTR: .WORD 0 ; MONITOR ENTRY ADDRESS DZSIZE =.-DZSTRT ; HANDLER SIZE .END