TITLE PLTSER - PLOTTER SERVICE ROUTINE SUBTTL T. EGGERS/GBH/TNM 20 MAY 1969 V012 XP VPLTSR,012 ;PUT VERSION NUMBER IN STORAGE MAP AND GLOB LISTING PLT=140 ;DEFINE DEVICE CODE PLTUP=200000 ;LIFT PEN WHEN OUTPUT FINISHED ENTRY PLTSER PLTSER: ;PLOTTER DEVICE DATA BLOCK PLTDDB: SIXBIT /PLT/ PLTCHR: XWD HUNGST*12,^D36 ;XWD (HUNG TIMEOUT),(BUFFER SIZE) PLTIOS: 0 PLTDSP ;DISPATCH TABLE ADDRESS XWD DVOUT,14403 ;XWD (OUTPUT DEVICE),(BIN,IMAGE,TEXT LEGAL) 0 0 PLTPTR: 0 ;OUTPUT BYTE POINTER PLTADR: XWD PROG,0 PLTCTR: 0 ;OUTPUT BYTE COUNTER EXTERNAL OUT,SETACT,PLTCHN,PLTCHL,IOSET,ADVBFE,ADRERR,CPOPJ1 EXTERNAL SETIOD,STOIOS,CLRACT,ILLINP,PLTSAV,IADRCK INTERN PLTDDB,PLTINT,PLTDSP ;DISPATCH TABLE JRST PLTINT ;INITIALIZE JRST PLTHNG ;HUNG DEVICE ERROR PLTDSP: JRST PLTREL ;RELEASE JRST PLTCLS ;CLOSE JRST PLTOUT ;OUTPUT JRST ILLINP ;INPUT PLTCLS: TLO IOS,PLTUP ;PLOTTER END FLAG SET MOVEM IOS,PLTIOS JRST OUT ;DO AN OUTPUT PLTINI: PLTHNG: PLTREL: CONO PLT,0 ;DEASSIGN PI CHANNEL, CLEAR DONE HLLZS PLTINT ;REMOVE PLOTTER FROM DEVICE CHAIN POPJ PDP, ;HERE BEGINS THE "OUTPUT" UUO PLTOUT: PUSHJ PDP,PLTSET ;SETUP BYTE POINTER AND COUNTER JRST ADRERR ;ADDRESS ERR RETURN FROM PLTSET PUSHJ PDP,SETACT ;SET DEVICE ACTIVE BIT TLO IOS,IO CONO PLT,PLTCHN ;ASSIGN PRIORITY CHANNEL MOVSI TAC,10 HLRM TAC,PLTINT ;PUT PLOTTER INTO DEVICE CHAIN TLZN IOS,IOBEG ;FIRST OUTPUT UUO? JRST .+3 ;NO MOVEI TAC,40 ;YES, START PLOTTER WITH PEN UP TLZ IOS,PLTUP ;INIT "CLOSE" BIT MOVE IOS,PLTIOS DATAO PLT,TAC ;START PLOTTER BY SENDING 0 OR 40 POPJ PDP, ;FROM HERE THROUGH PLTOFF IS INTERRUPT SERVICE PLTINT: CONSO PLT,10 ;PLOTTER DONE FLAG SET? JRST .-1 ;NO, CHAIN TO NEXT DEVICE SOSGE PLTCTR ;OUTPUT CHARACTERS LEFT? JRST PLT1 ;NO MOVEM TAC,TACSAV# ;YES, SAVE TAC ILDB TAC,PLTPTR ;GET NEXT CHARACTER DATAO PLT,TAC ;SEND CHARACTER MOVE TAC,TACSAV# ;RESTORE TAC JEN @PLTCHL ;DISMISS INTERRUPT PLT1: JSR PLTSAV ;SAVE AC'S. SET UP PUSH DOWN POINTER MOVEI DEVDAT,PLTDDB PUSHJ PDP,IOSET ;SETS UP PROG AND IOS PUSHJ PDP,ADVBFE ;ADVANCE AND LOOK AT NEXT BUFFERE JRST PLTOFF ;NO MORE DATA AVAILABLE PUSHJ PDP,PLTSET ;SETUP BYTE POINTER AND COUNTER JRST PLTOFF ;ADDRESS ERROR RET FROM PLTSET PLT2: TLZE IOS,IOW PUSHJ PDP,SETIOD ;LET JOB START AGAIN JRST STOIOS ;EVENTUALLY DISMISS INTERRUPT. IF ADVBFE ;FOUND MORE DATA (IT SKIPPED), ANOTHER ;INTERRUPT WILL IMMEDIATELY OCCUR BUT ;IT WILL BE HANDLED WITHOUT GOING TO PLT1 PLTOFF: CONO PLT,0 ;SHUT DOWN PLOTTER HLLZS PLTINT ;REMOVE PLOTTER FROM CHAIN PUSHJ PDP,CLRACT TLZE IOS,PLTUP ;HAS THE "CLOSE" BEEN DONE? DATAO PLT,[40] ;YES, LIFT PEN JRST PLT2 ;THIS SUBROUTINE CALCULATES A BYTE POINTER AND A BYTE COUNTER FOR ;THE BUFFER TO BE OUPUT, THE LAST WORD OF BUFFER IS ADR CHECKED TO BE IN USER AREA ; PUSHJ PDP,PLTSET ; RETURN 1 ;ADDRESS ERROR RETURN ; RETURN 2 ;GOOD RETURN PLTSET: MOVEI TAC,@PLTADR ;GET ADDRESS OF CURRENT BUFFER ADD TAC,[POINT 6,1,35] ;CONVERT TO 6 BIT BYTE POINTER WITH ;ADDRESS OF BUFFER WORD COUNT TRNN IOS,16 ;IS THIS A TEST DATA MODE? TLO TAC,[POINT 7,0,35] ;YES, CONVERT TO 7 BIT BYTE POINTER MOVEM TAC,PLTPTR ;SAVE BYTE POINTER HRRZ TAC,@TAC ;GET BUFFER WORD COUNT MOVEM TAC,PLTCTR ;SAVE AS POSITIVE WORD COUNT ADD TAC,PLTADR ;CALCULATE (LAST ADR IN BUF)-1 (RELATIVE) MOVEI TAC,1(TAC) ;GET LAST ADR IN BUF (RELATIVE) PUSHJ PDP,IADRCK ;ADDRESS CHECK. OK? POPJ PDP, ;NO, OUTSIDE. RETURN WITH NO SKIP MOVEI TAC,6 ;IMAGE OR BIN MODES - 6 BYTES/WORD TRNN IOS,16 ;IS OUTPUT A TEXT MODE (0 OR 1)? MOVEI TAC,5 ;YES, 5 BYTES/WORD IMULM TAC,PLTCTR ;CHANGE WORD COUNT TO BYTE COUNT JRST CPOPJ1 ;RETURN WITH A SKIP LIT VAR PLTEND: END