/ /COPYRIGHT (C) 1975 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY /ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH /THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS /SOFTWARE, OR ANY OTHER COPIES THEREOF, MAY NOT BE PRO- /VIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON /EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO /THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE /WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COM- /MITMENT BY DIGITAL EQUIPMENT CORPORATION. / /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY /OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. .EJECT / VTA. VT15 DISPLAY DEVICE HANDLER / ROLF HUBERT X2067 DECEMBER 1969 / EDIT#004 S. ROOT / EDIT#005 SCR 9/12/75 COPYRIGHT / EDIT#006 SCR 9/17/75 IOPS67 FOR XVM / DISPLAY IOTS RS3=703142 /READ STATUS 3 RS1=703002 /READ STATUS 1 RS2=703022 /READ STATUS 2 RYP=703042 /READ Y REGISTER RPC=703062 /READ PROGRAM COUNTER RXP=703102 /READ X REGISTER SPDI=703121 /SKIP ON ANY INTERRUPTING FLAG SPSF=703001 /SKIP ON INTERNAL STOP SPLP=703021 /SKIP ON LIGHT PEN SPPB=703041 /SKIP ON PUSHBUTTON SPEF=703061 /SKIP ON EDGE FLAG SPES=703161 /SKIP ON EXTERNAL STOP LSD=703004 /LOAD AND START DISPLAY SIC=703024 /SET INITIAL CONIDIONS STPD=703044 /EXTERNAL STOP DISPLAY RESM=703064 /RESUME DISPLAY AFTER FLAG .SCOM=100 /MONITOR COMMUNICATIONS .MED=3 /(006) MONITOR ERROR ENTRY .GLOBL VTA. VTA. DAC VTCALP /CAL POINTER DAC VTARGP /ARGUMENT POINTER ISZ VTARGP /TO FUNCTION CODE (LOC+1) LAC* VTARGP /GET FUNCTION CODE AND (177 ISZ VTARGP /POINT TO NEXT ARG (LOC+2) TAD (JMP VTDISP /SET UP FUNCTION DISPATCH DAC .+1 VTDISP XX /FUNCTION DISPATCH JMP VTINIT /1=.INIT JMP VTFST /2=.FSTAT JMP VTIGNR /3=.SEEK(IGNORED) JMP VTIGNR /4=.ENTER (IGNORED) JMP VTRET /5=.CLEAR (IGNORED) JMP VTCLOS /6=.CLOSE JMP VTRET /7=.MTAPE (IGNORED) JMP VTREAD /10=.READ JMP VTWRIT /11=.WRITE JMP VTWAIT /12=.WAIT,.WAITR ISZ VTARGP /13=.TRAN (IGNORED) ISZ VTARGP JMP VTIGNR / IOPS67 LAW 67 /(006)MEMORY VVIOLATION JMP* (.MED+1 /(006)REPORT TO MONITOR .EJECT /DISPLAY INITIALIZATION SECTION /SET INITIALIZING PARAMETERS / VTINIT LAC* VTCALP /GET CAL AND (3000 /LOOK AT F (BITS7-8) SZA /USE STANDARD INIT PARAMETERS (F=0) JMP VTIN70 /GO GET SPECIAL INIT PARAMETERS. /CHECK TO SEE WHETHER THIS CALL IS TO CLEAR THE BUSY FLAG ONLY LAC* VTARGP /GET R SNA /NON-0 MEANS YES JMP VTIN10 /NO, ACTUAL INIT WANTED DZM VTIOB /CLEAR BUSY FLAG ISZ VTARGP /INCREMENT ARGUMENT POINTER JMP VTIGNR /RETURN TO CALLER /PROCEDD WITH NORMAL .INIT VTIN10 LAC VTIC /GET INITIAL CONDITIONS SIC VTIN20 DZM VTIOB /RESET I/O BUSY FLAG VTIN30 CAL+54 /.SETUP FOR PIC AND API CHANNEL 54 VTAC 16 VTPC SPDI /SKIP ON DISPLAY FLAGS VTPIC VTINT /INTERRUPT HANDLER ADDRESS LAC (JMP VTPIC+3 /SETUP FOR JUMP AROUND DAC VTIN30 ISZ VTARGP /INCREMENT ARGP JMP VTIGNR /RETURN TO USER VTIN70 LAC* VTARGP /GET R FROM LOC+2 DAC VTR AND (700000 /(006) HIGH CORE? SZA /(006)SKIP IF NOT JMP IOPS67 /(006)COMPLAIN LAC* VTR /GET R(1), INITIAL CONDITIONS SIC /SET INITIAL CONDITIONS JMP VTIN20 VTIGNR ISZ VTARGP /POINT OF RETURN VTRET DBR /DEBREAK AND RESTORE XCT (JMP* VTARGP /RETURN PAST CAL VTBSY DBR /DEBREAK XCT (JMP* VTCALP /RETURN TO CAL .EJECT /VT15 .READ VTREAD LAC VTIOB /GET .READ BUSY SWITCH SZA /SKIP IF NOT BUSY JMP VTBSY /BUSY GO BACK LAC* VTARGP /GET BUFFER ADDRESS FROM LOC+2 DAC VTLPTR /SAVE IT AND (700000 /(006)HIGH CORE SZA /(006)SKIP IF NOT JMP IOPS67 /(006)COMPLAIN ISZ VTARGP /POINT TO LOC+3 LAC* VTARGP /GET -W (INTERRUPT COUNT) LOC+3 DAC VTIOW /SAVE IN INTERRUPT COUNT LAC* VTCALP /GET CAL AND (7000 /SAVE M (BITS 6-8) SAD (7000 /IF M=7 JMP VTRD30 /GO GET USER'S NSTD SZA /IF M JMP VTRD10 /NOT 0, GO PROCESS M=1-5 LAC VTSTD3 /=0, GET STANDARD NO-INTERRUPT WORD DAC VTNSTD JMP VTRD35 /GO READ REGISTERS /SEQUENCE TO CONVERT M=1 THRU 5 TO A STANDARD FLAGS - REGISTERS WORD VTRD10 SAD (1000 LAC VTNS-5 /INTERNAL STOP SAD (2000 LAC VTNS-4 /PUSH BUTTON SAD (3000 LAC VTNS-3 /LIGHT PEN SAD (4000 LAC VTNS-2 /EDGE SAD (5000 LAC VTNS-1 /EXTERNAL STOP AND VTSTD /AND OUT ALL BUT STANDARD REGISTERS DAC VTNSTD /AND THATS IT /SEQUENCE TO SET UP DZM OR NOP IN THE INTERRUPT HANDLER TO SAVE OR /IGNOR INTERRUPT FLAGS VTRD21 LAW -5 /SET UP COUNTER FOR 5 FLAGS DAC VTCNT LAC VTNSTD /GET NSTD VTRD22 RCL /PUT A BIT INTO LINK DAC VTAC2 /SAVE THE AC LAC VTDZM /ASSUME FLAG IS TO BE SAVED, GET DZM ISZ VTDZM /SET TO NEXT FLAG SNL /SKIP IF FLAGS IS TO BE SAVED LAC VTNOP /GET A NOP IF IT IS TO BE IGNORED VTRD24 DAC* VTNTIX /DAC THRU VTNTIX POINTER TABLE ISZ VTRD24 /NEXT ENTRY IN TABLE LAC VTAC2 /RESTORE AC ISZ VTCNT /INCREMENT COUNTER & CHECK IF DONE JMP VTRD22 /REPEAT FOR NEXT BIT LAC (DAC* VTNTIX /RESTORE DAC TO POINTER TABLE DAC VTRD24 LAC (DZM VTISTP /RESTORE DZM LIST DAC VTDZM JMS VTRD50 /SET UP READ-REGISTER IOTS /CLEAR SOFTWARE INTERRUPT FLAGS LAW -1 DAC VTLP /LIGHT PEN DAC VTPB /PUSH BUTTON DAC VTEDG /EDGE VIOLATION DAC VTISTP /STOP DAC VTESTP /EXTERNAL STOP DAC VTIOB JMP VTIGNR /RETURN /SEQUENCE TO PROCESS USER'S NSTD VTRD30 ISZ VTARGP /INCREMENT TO LOC+4 LAC* VTARGP /GET NSTD DAC VTNSTD /SAVE IT AND VTNS /MASK OFF BITS 0-4 SZA JMP VTRD33 /REGISTER BITS ON, USE THEM LAC VTSTD2 /REGISTER BITS OFF, USE STANDARD DEFAULT XOR VTSTD /INSERT USER FLAG BITS DAC VTNSTD AND VTNS /MASK OFF 0-5 VTRD33 XOR VTNSTD /INVERT, NOW 6-17 ARE OFF, 0-5=FLAG BITS SZA JMP VTRD21 /GO SET UP INTERRUPT HANDLER /NOT WAITING FOR ANY INTERRUPTS, GO SERVICE READ AND EXIT VTRD35 LAC VTNSTD /GET USER REQUEST BIT MAP RCL /MOVE REGISTER BITS RTL RTL DAC VTAC2 /SAVE IT JMS VTRD50 /SET UP READ REGISTERS IOTS JMS VTRR20 /READ THOSE REGISTERS JMS VTNT60 /INSERT IN USER'S BUFFER DZM VTIOB JMP VTIGNR /RETURN TO USER /SEQUENCE TO SET UP READ IOT OR SKIP IN INTERRUPT HANDLER DEPENDING /ON REGISTERS REQUESTED BY USER VTRD50 0 /ENTRY POINT LAW -7 /7 POSSIBLE REGISTERS DAC VTCNT /INTO COUNTER DAC VTNSFL /TO BE USED AS COUNT OF IOTS ISSUED LAC VTAC2 /GET REGISTER BITS VTRD52 RCL /PUT ONE IN LINK DAC VTAC2 /SAVE THE REST VTRD54 LAC VTREG /GET AN IOT ISZ VTRD54 /POINT TO NEXT IOT SZL /USE THE IOT IF L=1 JMP VTRD56 ISZ VTNSFL /REDUCE COUNT OF IOTS BY 1 LAC VTSKP /USE SKIP IF L=0 VTRD56 DAC* VTRR2X /DAC THRU VTRR2X POINTER TABLE ISZ VTRD56 /NEXT ENTRY IN POINTER TABLE LAC VTAC2 /RESTORE BIT MAP ISZ VTCNT /BUMP COUNT & CHECK IF FINISHED JMP VTRD52 /BACK FOR NEXT ROUND LAC (LAC VTREG /ALL DONE, RESET POINTERS DAC VTRD54 LAC (DAC* VTRR2X DAC VTRD56 JMP* VTRD50 /LEAVE .EJECT /VT15 .WRITE VTWRIT LAC* VTCALP /GET CAL AND (7000 /SAVE M(BITS 6-8) SNA JMP VTWR10 /0=RESUME DISPLAY AFTER EXT STOP SAD (4000 JMP VTWR20 /4=START THE DISPLAY AT L SAD (2000 STPD /2=STOP DISPLAY SAD (1000 RESM /1=RESUME DISPLAY AFTER STOP VTWRT ISZ VTARGP /POINT TO LOC+3 JMP VTIGNR /RETURN TO USER VTWR10 LAC VTL /GET ADDRESS OF CURRENT DISPLAY FILE JMP VTWR22 /GO RESTART DISPLAY /START DISPLAY AT L VTWR20 LAC VTCFL /CLEAR DISPLAY FLAGS SIC LAC* VTARGP /GET DISPLAY FILE POINTER DAC VTL /SAVE CURRENT DISPLAY FILE ADDRESS VTWR22 LSD /LOAD AND START DISPLAY JMP VTWRT /RETURN .EJECT /VT15 .WAIT VTWAIT LAC* VTCALP /GET CAL AND (1000 /CHECK BIT 8 SZA JMP VTWT10 /.WAITR LAC VTIOB /WAIT, GET BUSY SWITCH SZA JMP VTBSY /BUSY RETURN TO CAL JMP VTRET /NOT BUSY /.WAITR VTWT10 LAC VTIOB /GET BUSY SWITCH SNA JMP VTIGNR /NOT BUSY, RETURN LAC* VTARGP /(006) USER'S ADDRESS AND (700000 /(006)HIGH CORE SZA /(006)SKIP IF NOT JMP IOPS67 /(006)COMPLAIN LAC VTCALP /(006)CONTROL BITS FROM CAL AND (700000 /(006) TAD* VTARGP /(006)ADDR BITS FROM USER DAC VTARGP /SAVE IN RETURN POINTER JMP VTRET /AND GO THERE .EJECT /VT15 .CLOSE VTCLOS LAC VTCFL /CLEAR FLAGS SIC VTNOP NOP STPD /STOP DISPLAY JMP VTRET /RETURN TO USER .EJECT /VT15 .FSTAT VTFST LAC* VTCALP /GET CAL AND (3000 /CHECK BITS 7 & 8 TO SEE IF SAD (3000 /THIS IS AN .FSTAT JMP VTFT10 /YES JMP VTIGNR /NO, RETURN TO USER VTFT10 LAC* VTARGP AND (77777 DAC* VTARGP CLA JMP VTIGNR .EJECT /INTERRUPT HANDLER VTINT SKP /PIC ENTRY JMP VTAPI /API ENTRY (PRIORITY 2) DAC VTAC /SAVE AC LAC VTION /ION INTO INTERRUPT RETURN SEQUENCE DAC VTSW LAC* (0 /PIC RETURN ADDR. IN LOC 0 DAC VTPC /INTO RETURN PC JMP VTNT10 VTAPI DAC VTAC /API ENTRY - SAVE AC LAC VTINT /GET RETURN ADDRESS DAC VTPC /SAVE IT LAC VTNOP DAC VTSW VTNT10 RS3+10 /* AND (760000 DAC VTBP LAC VTNSTD AND (760000 AND VTBP SZA JMP VTNT69 LAC (17400 SIC LAC VTSW SAD VTNOP JMP VTIRTA JMP VTIRTB VTNT69 LAC VTIOB SNA JMP VTNT11 LAC VTBP DAC* VTBPTR JMS VTRR20 /READ REQUESTED REGISTERS VTNT11 LAC (17400 /CLEAR FLAGS SIC /SET INITIAL CONDITIONS CLA /CHECK INTERRUPT BUSY SAD VTIOB /IF READ-BUSY FLAG IS OFF(=0) JMP VTIRTB /GO TO EXIT SAD VTBUSY /IF INTERRUPT BUSY FLAG IS ON (=0) JMP VTIRTB /GO TO EXIT DZM VTBUSY /TURN ON INTERRUPT BUSY LAC VTSW /GET ION OR NOP DAC VTPIC /PIC-API INDICATOR (NOP=API) SAD VTNOP /WHICH IS IT JMP VT69 LAC* (0 /SET UP PIC RETURN FROM 0 DAC VTINTP /IN INTERRUPT PROCESSOR LAC VTAC /GET INTERRUPT AC JMP VTINTP+1 /GO TO INTERRUPT PROCESSOR /INTERRUPT HANDLER RETURN SEQUENCE VTIRTA NOP VTIRTB LAC VTBP SAD (100000 JMS VTRES VTIRT LAC VTSKP DAC VTINT LAC VTAC VTSW XX /ION OR NOP IF PIC OR API DBR /DEBREAK FROM LEVEL 2 (IF API) XCT (JMP* VTPC /RETURN VT69 LAC VTINT DAC VTINTP LAC VTAC JMP VTINTP+1 /SEQUENCE TO READ AND SAVE HARDWARE REGISTERS REQUESTED BY USER VTRR20 0 /ENTRY POINT VTAUTO=11 /AUTO INDEX REGISTER USED LAC* (VTAUTO /SAVE CONTENTS DAC VTINTT LAC VTBPTR /LOAD WITH BUFFER POINTER DAC* (VTAUTO VTRR21 RS2+10 /READ PB JMS VTPBS VTRR22 RXP+10 /READ X REGISTER DAC* VTAUTO VTRR23 RYP+10 /READ Y REGISTER DAC* VTAUTO VTRR24 RPC+10 /READ PC DAC* VTAUTO VTRR25 RS1+10 /READ STATUS ONE DAC* VTAUTO VTRR26 RS2+10 /READ STATUS 2 DAC* VTAUTO VTRR27 RS2+10 /READ STATUS 2, RETURN NAME REGISTER JMS VTNR LAC VTINTT /RESTORE AUTO-INDEX REGISTER DAC* (VTAUTO JMP* VTRR20 VTNR 0 AND (177 /RETURN NAME REGISTER DAC* VTAUTO JMP* VTNR VTPBS 0 AND (770000 /RETURN PUSHBUTTONS DAC* VTAUTO JMP* VTPBS /INTERRUPT PROCESSOR VTINTP XX /RETURN ADDRESS HERE DAC VTAC2 /SAVE AC /SET UP PROTECTS AND UNPROTECTS DEPENDING ON PIC OR API VTNT40 LAC VTPIC /GET API - PIC INDICATOR SAD VTION JMP VTNT44 /GO SET UP FOR PIC LAC VTISA /GET ISA (API) DAC VTNT46 /INTO PROTECT FOR CHECKING INTR. LAC (DBK /GET DBK DAC VTNT73 /AND INTO EXIT JMP VTNT30 /GO CHECK ON FLAGS VTNT44 DAC VTNT73 /AND INTO EXIT LAC (IOF /GET IOF DAC VTNT46 /INTO PROTECT /SET UP REMAINING SOFTWARE INTR. FLAGS VTNT30 LAC* VTBPTR /GET WORD CONTAINING FLAG BITS SPA!RAL /CHECK INTERNAL STOP FLAG VTNT15 DZM VTISTP SPA!RAL /CHECK PB FLAG VTNT13 DZM VTPB SPA!RAL /CHECK LIGHT PEN FLAG VTNT12 DZM VTLP SPA!RAL /CHECK EDGE FLAG VTNT14 DZM VTEDG SPA!RAL /CHECK EXTERNAL STOP VTNT16 DZM VTESTP /CYCLE THRU SOFTWARE FLAGS TO SEE WHICH ARE ON LAW -5 /5 SOFTWARE FLAGS DAC VTCNT /INTO LOOP COUNTER LAC (VTISTP /STOP FLAG IS 1ST ONE DAC VTFLGS /INTO FLAGS POINTER VTNT33 LAC* VTFLGS /GET A FLAG SZA /IS IT ON (0=YES) JMP VTNT37 /NO, LOOK AT NEXT VTNT35 LAW -1 /TURN OFF FLAG ABOUT TO BE DAC* VTFLGS /SERVICED JMS VTNT60 /CALL READ-REGISTERS ROUTINE ISZ VTIOW /INCREMENT USERS INTR COUNT JMP VTNT37 /REPEAT IF NOT FINISHED VTNT36 LAC (400100 /SET AC TO RAISE TO API LEVEL 1 VTNT46 XX /IOF IF PIC, ISA IF API JMP VTIRTC /DONE, GO EXIT VTNT37 ISZ VTFLGS /INCREMENT FLAG POINTER ISZ VTCNT /INCREMENT LOOP COUNTER JMP VTNT33 /REPEAT IF NOT FINISHED JMP VTNT36 /OTHERWISE GO CLOSE UP /GET REGISTERS SPECIFIED BY .READ AND .WRITE TO USER'S BUFFER VTNT60 0 LAC (VTNS /POINTER TO END+1 OF FLAG INDICATOR LIST TAD VTCNT /SUB. LOOP COUNTER TO POINT TO RIGHT INDICATOR DAC VTTEMP / LAC* VTTEMP /GET WORD SHOWING WHICH FLAG THIS IS AND VTNSTD /MASK OUT ALL OTHERS IN USER REQUEST DAC* VTLPTR /WRITE BUFFER HEADER WORD ISZ VTLPTR /INCREMENT BUFFER POINTER LAC VTNSFL /GET INTR. BUFFER WORD COUNT SNA /IF NO REGISTERS WERE READ JMP* VTNT60 /RETURN TO CALLER DAC VTCNT2 /INTO COUNTER LAC VTBPTR /GET BUFFER POINTER INTO DAC VTTEMP /MOVABLE REGISTER VTNT62 ISZ VTTEMP /NEXT WORD IN INTR. BUFFER LAC* VTTEMP /GET THE WORD DAC* VTLPTR /GIVE IT TO USER'S BUFFER ISZ VTLPTR /NEXT WORD IN USER'S BUFFER ISZ VTCNT2 /DECREMENT INTR. BUFFER WORD COUNT JMP VTNT62 /GO GET NEXT WORD JMP* VTNT60 /RETURN TO CALLER VTIRTC ISZ VTBUSY /TURN OFF INTR. PROCESSOR BUSY FLAG DZM VTIOB LAC VTBP SAD (100000 JMS VTRES VTRT1 LAC VTAC2 /RESOTORE AC VTNT73 XX /DBK TO LEVEL 4 IF API, ION IF PIC DBR XCT (JMP* VTINTP /RETURN VTRES 0 RESM JMP* VTRES .EJECT VTCALP 0 /CAL POINTER VTARGP 0 /ARGUMENT POINTER VTIC 257740 VTIOB 0 /BUSY SWITCH VTIOW 0 /INTR COUNT VTR 0 /CONTENTS OF R VTNSTD 0 VTSTD3 016600 VTSTD2 017000 VTSTD 777100 417700 /STOP FLAG 217700 /PUSH BUTTON FAG 117700 /LIGHT PEN FLAG 057700 /EDGE FLAG 037700 /EXTERNAL STOP FLAG VTNS 017777 /NO INTERRUPT, JUST READ VTAC2 0 VTDZM DZM VTISTP /DZM TO BE INSERTED IN INTERRUPT HANDLER VTNSFL 0 VTCFL 017400 /CLEAR FLAGS VTREG RS2+10 /READ PB REGISTER RXP+10 /READ X POSITION RYP+10 /READ Y POSITION RPC+10 /READ DISPLAY PC RS1+10 /READ STATUS ONE RS2+10 /READ STATUS TWO RS2+10 /READ STATUS 2,RETURN NAME REGISTER VTNTIX VTNT15 VTNT13 VTNT12 VTNT14 VTNT16 VTBUF1 .BLOCK 10 VTBPTR VTBUF1 VTRR2X VTRR21 VTRR22 VTRR23 VTRR24 VTRR25 VTRR26 VTRR27 VTBUSY 1 VTINTT 0 /CONTENTS OF AUTO-INDEX REG. VTFLGS .DSA VTISTP /FLAGS POINTER VTISTP -1 /INTERNAL STOP FLAG VTPB -1 /PB " VTLP -1 /LIGHT PEN FLAG VTEDG -1 /EDGE FLAG VTESTP -1 /EXTERNAL STOP FLAG VTTEMP 0 VTLPTR VTCNT2 VTBP 0 VTCNT 0 VTSKP SKP VTISA ISA VTL 0 VTION ION .END