|
|
DataMuseum.dkPresents historical artifacts from the history of: Philips Data Systems |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Philips Data Systems Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 123060 (0x1e0b4)
Notes: pts_type(SC)
Names: »DRVU01.SC«
└─⟦bc20f3abf⟧ Bits:30009670 Philips computer tape "600126"
└─⟦this⟧ »TOSSWORK/DRVU01.SC«
IDENT DRVU01 REL 11.0 81-07-07 870105041100 * ************************************************** * * PHILIPS TERMINAL SYSTEM PTS * * DRVU01 = DRIVER VIDEO CONNECTED DISPLAY PTS8041 * AND * DRIVER CHANNEL UNIT FOR VIDEO TERMINALS * * * * * * ************************************************** * * THIS DRIVER CONSISTS OF THE FOLLOWING TWO SECTIONS: * * - S C R E E N S E C T I O N * - P E R I P H E R A L S E C T I O N * EJECT * * THE S C R E E N S E C T I O N HANDLES OUTPUT TO * THE VIDEO DISPLAY PTS8041 * CONNECTED VIA THE SCREEN SECTION OF THE VIDEO CHANNEL UNIT VCCU1/4. * * THE DRIVER INCLUDES DEVICE DEPENDENT ECHO-FUNCTIONS * WHICH MAKES IT POSSIBLE TO USE THE DISPLAY AS AN * ECHO-DEVICE TO ANY KEYBOARD, THAT RUNS UNDER THE * GENERAL KEYBOARD DRIVER DRKB04. * * * * * * THE S C R E E N S E C T I O N OF THE DRIVER * CONSISTS OF FOLLOWING PARTS: * * - D E V I C E D R I V E R P A R T * - L I N E D R I V E R P A R T * EJECT * * THE D E V I C E D R I V E R P A R T * OF THE SCREEN SECTION OF THE DRIVER * CONSISTS OF THE FOLLOWING ROUTINES: * * * * * A C T I V A T I O N R O U T I N E * * -ACVU ACTIVATION OF DEVICE DRIVER, AT LKM DATA 1 * * * * * A B O R T R O U T I N E * * -ABVU ABORT HANDLING IN DEVICE DRIVER, AT LKM DATA 10 * * * * * R E C O V E R Y R O U T I N E * * -RCVU RECOVERY HANDLING IN DEVICE DRIVER, AT POWER ON * * * * * E C H O R O U T I N E * * -ECHOVU ECHO-HANDLING OF KEYBOARD INPUT * * * * * E R R O R R O U T I N E * * -DEVERR DEVICE DRIVER ERROR HANDLING, * AT ERROR-RETURN FROM LINE DRIVER * * * * S U B - R O U T I N E S * * -CHKOUT CHECK IF LAST COLUMN WRITTEN, AND OUTPUT ONE CHARACTER * -ECHOUT OUTPUT ONE CHARACTER IN ECHO MODE * -NXTROW UPDATE ROW COUNTER TO NEXT ROW, * AND IF NECESSARY HANDLE SCROLL. * -NXTCOL CALLED AFTER WRITE IN CURRENT COLUMN, SO: * UPDATE COLUMN COUNTER TO NEXT COLUMN, * AND IF NECESSARY HANDLE LAST COLUMN WRITTEN. * -SAVCN SAVE CURRENT NEXT WRITE POSITION * -RESCN RESTORE SAVED WRITE POSITION TO BECOME CURRENT NEXT * * * * * NORMAL REGISTER USAGE * IN THE DEVICE DRIVER PART OF SCREEN SECTION: * * REGISTER A1 = RETURN CODE TO ECB * A2 = OUTPUT CHARACTER OR WRITE POSITION OR CURSOR POSITION * A3 = BUFFER INDEX * A4 = WORK REGISTER * A5 = STACK BASE * A6 = DWT-ADDRESS * A7 = ORDER * A8 = ECB-ADDRESS * EJECT * * THE L I N E D R I V E R P A R T * OF THE SCREEN SECTION OF THE DRIVER * CONSISTS OF THE FOLLOWING ROUTINES: * * * * * A C T I V A T I O N R O U T I N E S * * -STAWRI START WRITE SCREEN IN SPECIFIED POSITION * -OUTCHA OUTPUT ONE SCREEN CHARACTER * -ENDWRI END WRITE SCREEN * -OUTCUR OUTPUT VISUAL CURSOR IN SPECIFIED POSITION * -CLESCR CLEAR SCREEN AND RESET CURSOR * * * * * I N T E R R U P T R O U T I N E S * * IHSVU1 VCCU NO 1 * IHSVU2 VCCU NO 2 * IHSVU3 VCCU NO 3 * IHSVU4 VCCU NO 4 * IHSVU5 VCCU NO 5 * IHSVU6 VCCU NO 6 * IHSVU7 VCCU NO 7 * IHSVU8 VCCU NO 8 * * * * EJECT * * E R R O R R O U T I N E S * * -LINER0 CIO START NOT ACCEPTED * -LINER1 OTR NOT ACCEPTED * -LINER2 SST NOT ACCEPTED * -LINER3 SST UNEXPECTEDLY ACCEPTED * -LINER4 UNEXPECTED INTERRUPT * -LINER5 I/O-INSTRUCTION TRIED DURING POWER FAIL POST PROCESSING * * * * S U B - R O U T I N E S * * -CONPOS CONVERT SCREEN POSITION INTO SCREEN MEMORY DISPLACEMENT * -IXTERM INDEX SCREEN MEMORY DISPLACEMENT WITH TERMINAL NUMBER * -CWTDWT GET CWT-ADDRESS FROM DWT-ADDRESS * -PUTQUE PUT DWT INTO SCREEN OUTPUT QUEUE * -GETQUE GET DWT FROM SCREEN OUTPUT QUEUE * * * * NORMAL REGISTER USAGE * IN THE LINE DRIVER PART OF THE SCREEN SECTION: * * A1 = RETURN CODE TO DEVICE DRIVER PART * A2 = BIO-LINES OUTPUT * A3 = WORK REGISTER * A4 = WORK REGISTER * A5 = CWT-ADDRESS * A6 = DWT-ADDRESS * A7 = WORK REGISTER * A8 = WORK REGISTER * * EJECT * * THE P E R I P H E R A L S E C T I O N OF THE DRIVER IS A * L I N E D R I V E R ONLY. * IT HANDLES INPUT FROM AND OUTPUT TO DEVICES CONNECTED VIA * THE PERIPHERAL SECTION OF THE VIDEO CHANNEL UNIT VCCU1/4. * * * THE PERIPHERAL SECTION OF THE DRIVER CONSISTS OF * THE FOLLOWING (LINE DRIVER) ROUTINES: * * A C T I V A T I O N R O U T I N E S * * -VUSTBL DEFINE START OF OUTPUT BLOCK * -VUCHRO CHARACTER OUTPUT * -VUENBL DEFINE END OF OUTPUT BLOCK * -VUCHRI CHARACTER INPUT * -VUDISP VIDEO DISPATCHER * * * I N T E R R U P T R O U T I N E S * * FOR DATA INPUT * * -IHPVU1 VCCU NO 1 * -IHPVU2 VCCU NO 2 * -IHPVU3 VCCU NO 3 * -IHPVU4 VCCU NO 4 * -IHPVU5 VCCU NO 5 * -IHPVU6 VCCU NO 6 * -IHPVU7 VCCU NO 7 * -IHPVU8 VCCU NO 8 * * AND FOR DATA OUTPUT * * -TIMOUT MONITOR CLOCK TIME-OUT * EJECT * * R E C O V E R Y R O U T I N E * * -VUON LINE DRIVER RECOVERY ROUTINE, * COMMON TO PERIPHERAL AND SCREEN SECTIONS. * * * * * NORMAL REGISTER USAGE IN THE LINE DRIVER PART * OF THE PERIPHERAL SECTION: * * A1 = WORK REGISTER * A2 = INPUT WORD * A3 = WORK REGISTER * A4 = WORK REGISTER * A5 = CWT-ADDRESS * A6 = DWT-ADDRESS * A7 = WORK REGISTER * A8 = WORK REGISTER * * * EJECT * * * SYSTEM ADAPTATION * * * BY MEANS OF CONDITIONAL ASSEMBLY THE DRIVER: * * -IS ADAPTED TO CONTROL ONE OR UP TO EIGHT VIDEO CHANNELS * -IS ADAPTED FOR CONNECTION OF THE VIDEO CHANNELS * EITHER ON PROGRAMMED CHANNEL OR IOP. * -HANDLES EITHER OF TWO CHARACTER GENERATORS. * -HANDLES ONE OF ELEVEN DIFFERENT (COUNTRY DEPENDANT) CHARACTER SETS, * PROVIDED THAT THE SELECTED CHARACTER SET, * IS SUPPORTED BY THE SELECTED CHARACTER GENERATOR. * -CAN ECHO ALSO END OF RECORD CHARACTER * -CAN SUPPRESS TRAILING STRINGS COMPOSED OF: * SPACE (/20) * TABULATION (/11 + POS.CHAR.) * UNDERLINE START (/12) * LOW INTENSITY START (/1E) * LOW INTENSITY STOP (/1F) * -CAN BE ADAPTED TO THE EXTENDED INSTRUCTION SET. * -CONTAINS LENGTH OF DRIVER MMU-BUFFER. EJECT * * * * *********** * ENTRIES * *********** * * * SCREEN SECTION DEVICE DRIVER ACTIVATION ROUTINES * * ENTRY VUAD ADDRESS TO ADDRESSBLOCK * * * SCREEN SECTION LINE DRIVER * INTERRUPT ROUTINES ENTERED FROM INTERRUPT VECTOR * ENTRY IHSVU1 INTERRUPT FROM VCCU1/4 NO 1 ENTRY IHSVU2 INTERRUPT FROM VCCU1/4 NO 2 ENTRY IHSVU3 INTERRUPT FROM VCCU1/4 NO 3 ENTRY IHSVU4 INTERRUPT FROM VCCU1/4 NO 4 ENTRY IHSVU5 INTERRUPT FROM VCCU1/4 NO 5 ENTRY IHSVU6 INTERRUPT FROM VCCU1/4 NO 6 ENTRY IHSVU7 INTERRUPT FROM VCCU1/4 NO 7 ENTRY IHSVU8 INTERRUPT FROM VCCU1/4 NO 8 * EJECT * * PERIPHERAL SECTION LINE DRIVER * ACTIVATION ROUTINES ENTERED FROM DEVICE DRIVERS VIA NETWORK DISTRIBUTO * ENTRY VUCHRI CHARACTER INPUT ENTRY VUSTBL DEFINE START OF OUTPUT BLOCK ENTRY VUCHRO CHARACTER OUTPUT ENTRY VUENBL DEFINE END OF OUTPUT BLOCK ENTRY VUDISP VIDEO DISPATCHER * * PERIPHERAL SECTION LINE DRIVER * INTERRUPT ROUTINES ENTERED FROM INTERRUPT VECTOR * ENTRY IHPVU1 INTERRUPT FROM VCCU1/4 NO 1 ENTRY IHPVU2 INTERRUPT FROM VCCU1/4 NO 2 ENTRY IHPVU3 INTERRUPT FROM VCCU1/4 NO 3 ENTRY IHPVU4 INTERRUPT FROM VCCU1/4 NO 4 ENTRY IHPVU5 INTERRUPT FROM VCCU1/4 NO 5 ENTRY IHPVU6 INTERRUPT FROM VCCU1/4 NO 6 ENTRY IHPVU7 INTERRUPT FROM VCCU1/4 NO 7 ENTRY IHPVU8 INTERRUPT FROM VCCU1/4 NO 8 * * MISCELLENEOUS ENTRIES * ENTRY VUON START RECOVERY OF VCCU1/4 UNITS * * * * EJECT * ***************************************** * EXTERNAL TOSS MODULE ENTRIES * ***************************************** * * * EXTRN SAVE8 SAVE A1-A8 EXTRN TDISP DISPATCH EXTRN TENDIO END I/O EXTRN DISEND END I/O AND DISPATCH EXTRN DISIOE ERROR, END I/O AND DISPATCH EXTRN IHRTN RETURN EXTRN SWL48 SWITCH TO LEVEL 48 AND ENB * EXTRN INTVU1 INTERRUPT TABLE FOR VCCU1/4 NO 1 EXTRN INTVU2 INTERRUPT TABLE FOR VCCU1/4 NO 2 EXTRN INTVU3 INTERRUPT TABLE FOR VCCU1/4 NO 3 EXTRN INTVU4 INTERRUPT TABLE FOR VCCU1/4 NO 4 EXTRN INTVU5 INTERRUPT TABLE FOR VCCU1/4 NO 5 EXTRN INTVU6 INTERRUPT TABLE FOR VCCU1/4 NO 6 EXTRN INTVU7 INTERRUPT TABLE FOR VCCU1/4 NO 7 EXTRN INTVU8 INTERRUPT TABLE FOR VCCU1/4 NO 8 * EXTRN SETIMP GET TIMER BLOCK EXTRN INTSAV SAVE AREA LAST INTERRUPT EXTRN PFPOST POWER FAIL POST PROCESSING FLAG * EXTRN NDSAV8 SAVE A3-A5, A7-A8 IN DWT EXTRN NDGEDW GET DWT ADDRESS FOR A DEVICE EXTRN NDREWS CALL RECOVERY FOR A WORK-STATION EXTRN NDRET RETURN EXTRN NDRETO OK & RETURN EXTRN NDREP POP & RETURN EXTRN NDREPO POP, OK AND RETURN EXTRN ECHRTN RETURN TO KEYBOARD AFTER ECHO EXTRN GETCHR GET CHARACTER FROM ECB-BUFFER EJECT * ****************************************************** * DRIVER ADDRESS BLOCK DISPLACEMENTS ******************************************************* * EXTRN INTADR INTERRUPT ADDRESS DISPLACEMENT * * ***************************************************** * DEVICE INDEX VALUES ***************************************************** * EXTRN PC:DIX PROGRAMMED CHANNEL DEVICE INDEX * * *********************************************************** * ECB DISPLACEMENTS *********************************************************** * EXTRN ECBBA ECB BUFFER ADDRESS EXTRN ECBRL ECB REQUESTED LENGTH EXTRN ECBEL ECB EFFECTIVE LENGTH EXTRN ECBRC ECB RETURN CODE EXTRN ECBCW ECB CONTROL WORD EJECT * * ************************ * DWT PARAMETERS * ************************ * EXTRN DWTST STATUS EXTRN DWTOCH LAST OUTPUT CHARACTER EXTRN DWTADR ADDRESS TO ADDRESS-BLOCK EXTRN DWTOTQ OUTPUT QUEUE EXTRN DWTSB2 STACK BASE 2 IN DWT EXTRN DWTCP2 CHANNEL PARAMETERS 2 EXTRN DWTLD1 LINE DRIVER DEPENDANT 1 EXTRN DWTLD2 LINE DRIVER DEPENDANT 2 * * EXTRN DWTDEV DEVICE DRIVER DEPENDANT (FIRST FIELD) * EJECT * * ***************************************** * CONDITIONAL ASSEMBLY * ***************************************** * * THE NUMBER OF VIDEO CHANNELS HANDLED BY * THE LINE DRIVER PART OF THIS DRIVER * IS SELECTED BY SETTING X:A TO 1,2,3,4,5,6,7 OR 8. * X:A EQU 1 VUCHAN EQU X:A * * * * WHEATHER THE LINE DRIVER PART OF THE DRIVER * SHOULD HANDLE SCREEN SECTION OF VCCU1/4 * CONNECTED ON PROGRAMMED CHANNEL OR IOP * IS SELECTED BY SETTING X:B TO 0 OR 1. * X:B EQU 0 IOP EQU X:B * * * * IF A DRIVER VERSION USING THE EXTENDED INSTRUCTION SET IS WANTED, * THIS IS SELECTED BY SETTING CPU852 TO 0. * CPU852 EQU 0 * * * * WHICH ONE OF EITHER OF THE TWO CHARACTER GENERATORS * FOR SCREEN OUTPUT (TYPE I = ENGLISH, OR TYPE II = AMERICAN) * THE LINE DRIVER PART OF THE DRIVER SHOULD HANDLE, * IS SELECTED BY SETTING X:C TO 1 OR 2. * X:C EQU 1 CHAGEN EQU X:C * * WHICH CHARACTER-SET FOR SCREEN OUTPUT, * THE LINE DRIVER PART OF THE DRIVER SHOULD HANDLE * (PROVIDED THAT THE CHARACTER SET IS SUPPORTED * BY THE SELECTED CHARACTER GENERATOR), * IS SELECTED BY SETTING X:D TO 0,1,2,3,4,5,6,7,8,9 OR /A. * CHARACTER-SET COUNTRY * 0 GB/NZ/SA/NL/B * 1 D/A/L/CH * 2 F/CH/B/L * 3 E * 4 I/CH * 5 S/SF * 6 DK/N * 7 P * 8 YU * 9 US * A S (INDUSTRY VERSION) * X:D EQU 0 CHASET EQU X:D * * * EJECT * * IF THE DEVICE DRIVER PART OF THE DRIVER * SHOULD ECHO ALSO END-OF-RECORD-CHARACTER, * THIS IS SELECTED BY SETTING X:E TO 1. * X:E EQU 0 EORECH EQU X:E * * IF THE DEVICE DRIVER PART OF THE DRIVER * SHOULD SUPPRESS TRAILING STRINGS COMPOSED ONLY OF * /20, /11+POS.CHARACTERS, /12, /1E, /1F, * THIS IS SELECTED BY SETTING X:F TO 1. * X:F EQU 1 TRASPA EQU X:F * * * MEMORY MANAGEMENT BUFFER SIZE FOR * THE DEVICE DRIVER PART OF THE DRIVER * IS SELECTED BY SETTING X:G TO THE WANTED SIZE IN BYTES. * * X:G EQU 80 DVBLEN EQU X:G * EJECT * * ******************************** * DWT-DISPLACEMENTS RELATIVE DWTDEV * ******************************** * * * * DWTCN EQU 2 CURRENT NEXT WRITE POS. DURING REQUEST DWTCNR EQU DWTCN CURRENT NEXT WRITE POSITION ROW NUMBER DWTCNC EQU DWTCN+1 CURRENT NEXT WRITE POS. COLUMN NUMBER * * DWTSN EQU 4 SAVED CURRENT NEXT WRITE POSITION * AFTER PREVIOUS REQUEST OR AT /14 COMMAND DWTSNR EQU DWTSN SAVED NEXT WRITE POSITION ROW NUMBER DWTSNC EQU DWTSN+1 SAVED NEXT WRITE POS. COLUMN NUMBER EJECT * ************* * CONSTANTS * ************* * * USED BY SCREEN SECTION, DEVICE DRIVER PART * MAXROW EQU /1818 MAX NUMBER OF ROWS PER SCREEN IS 24 MAXCOL EQU /5050 MAX NUMBER OF COLUMNS PER SCREEN IS 80 * DWTDEV-BITS UNDBIT EQU /0400 UNDERLINE/NON-UNDERLINE DISPLAY-MODE INTBIT EQU /0100 HIGH/LOW INTENSITY DISPLAY-MODE ROLBIT EQU /80 SCROLL MODE LCWBIT EQU /40 LAST COLUMN WRITTEN LCPBIT EQU /20 LAST COLUMN WRITTEN BY PREVIOUS REQUEST * SPACE EQU /20 SPACE POINT EQU /2E POINT CHARACTER * CCERR EQU /4 STATUS: CODE CHECK ERROR OPERR EQU /1 STATUS: NOT OPERABLE * * * USED BY SCREEN SECTION, LINE DRIVER PART * IOPPAR EQU /C000 WORD-MODE + READ-MEMORY TRANSFER * DWTST BIT 11,12,13 (LINE DRIVER DEPENDANT) OTRFLA EQU /0010 OTR-ACTION AT NEXT INTERRUPT HLTFLA EQU /0008 HALT-ACTION AT NEXT INTERRUPT SSTFLA EQU /0004 SST-ACTION AT NEXT INTERRUPT * SMLCUR EQU /07FF SCREEN MEMORY LOCATION * HOLDING CURSOR POSITION * AUTCLE EQU /2000 BIO-BIT FOR AUTO-CLEAR * ERROR-STATUS FROM LINE DRIVER TO DEVICE DRIVER PART OF SCREEN SECTION CIOERR EQU /8000 ERROR: CIO START NOT ACCEPTED OTRERR EQU /4000 ERROR: OTR NOT ACCEPTED SSTERR EQU /2000 ERROR: SST NOT ACCEPTED SSTER2 EQU /1000 ERROR: SST UNEXPECTEDLY ACCEPTED * (AFTER CIO START OR OTR, * BUT BEFORE CIO HALT) PFERR EQU /0800 I/O-INSTRUCTION TRIED DURING PFPOST * * * USED BY PERIPHERAL SECTION: * * QUETIM EQU 1 CWT PERIPHERAL OUTPUT QUEUE TIME-OUT VALUE * (MULTIPLES OF 100MS) MAXTVU EQU 4 MAX NBR OF TERMINALS ON ANY VCCU1/4 TCPON EQU /0001 RECOVERY CAUSE: TC POWER ON PONPSW EQU /2080 POWER-ON-PSW: LEVEL 8, RUN-MODE, INH-MODE * INSTAT EQU /0800 MASK FOR BIO BIT : STATUS OR DATA INPUT TERMNR EQU /0300 MASK FOR BIO BITS : TERM.NBR WITHIN CHANNEL DEVADR EQU /0400 MASK FOR BIO BIT: DEV.ADR. WITHIN TERM. INDATA EQU /00FF MASK FOR BIO DATA BITS IN INPUT WORD * EJECT * ********** * TABLES * ********** * * DRIVER ADDRESS BLOCK * DATA DVBLEN BUFFER LENGTH DATA PC:DIX PROGRAMMED CHANNEL DEVICE INDEX (ALWAYS!) VUAD EQU * ADDRESS BLOCK DATA ACVU ACTIVATION DRIVER DATA ABVU ABORT ROUTINE ADDRESS DATA 0 INTERRUPT HANDLER DATA RCVU RECOVERY ROUTINE DATA ECHOVU DEVICE-DEPENDENT ECHO-ROUTINE * * * * CODE CONVERSION TABLE * * CODINP EQU * DATA /2340,/5B5C,/5D60,/7B7C,/7D7E CODOUT EQU * IFT CHASET=0 IFT CHAGEN=1 DATA /2340,/5B5C,/5D60,/7B7C,/7D7E XIF IFT CHASET=0 IFT CHAGEN=2 DATA /0340,/5B5C,/5D60,/7B7C,/7D7E XIF IFT CHASET=1 IFT CHAGEN=1 DATA /0310,/0B0C,/0E60,/1B1C,/1E11 XIF IFT CHASET=2 IFT CHAGEN=1 DATA /2312,/0618,/1060,/1716,/1305 XIF IFT CHASET=3 IFT CHAGEN=2 DATA /0340,/5B08,/5D60,/7B18,/7D7E XIF IFT CHASET=4 IFT CHAGEN=1 DATA /2310,/0618,/1716,/1215,/1314 XIF IFT CHASET=5 IFT CHAGEN=1 DATA /0307,/0B0C,/0D17,/1B1C,/1D7E XIF IFT CHASET=6 IFT CHAGEN=1 DATA /2340,/0A02,/0D60,/1A04,/1D7E XIF IFT CHASET=7 IFT CHAGEN=2 DATA /0340,/0604,/0560,/1614,/157E XIF IFT CHASET=8 IFT CHAGEN=2 DATA /0307,/0B0C,/0D17,/1B1C,/1D7E XIF IFT CHASET=9 IFT CHAGEN=1 DATA /0340,/5B5C,/5D60,/7B7C,/7D7E XIF IFT CHASET=9 IFT CHAGEN=2 DATA /2340,/5B5C,/5D60,/7B7C,/7D7E XIF IFT CHASET=/A IFT CHAGEN=1 DATA /2340,/0B0C,/0D60,/1B1C,/1D7E XIF * * IF ERROR IN SYSGEN (WRONG COMBINATION OF CHASET AND CHAGEN), * THEN CHARACTER-SET DEPENDANT INPUT-CODES * ARE CONVERTED TO QUESTION MARKS. * DATA /3F3F,/3F3F,/3F3F,/3F3F,/3F3F * * EJECT * ********************************************** * C W T T A B * ********************************************** * * THIS TABLE HOLDS ADDRESSES TO CHANNEL WORK TABLES, CWT:S, * ONE CWT PER VIDEO CHANNEL UNIT. * * CWTTAB EQU * DATA CWTABE-* TABLE LENGTH DATA CWTVU1 IFF VUCHAN=1 DATA CWTVU2 XIF IFF VUCHAN=1 IFF VUCHAN=2 DATA CWTVU3 XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 DATA CWTVU4 XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 DATA CWTVU5 XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 DATA CWTVU6 XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 IFF VUCHAN=6 DATA CWTVU7 XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 IFF VUCHAN=6 IFF VUCHAN=7 DATA CWTVU8 XIF CWTABE EQU * END OF TABLE * EJECT * * ***************************************************** * C W T V U 1 * ***************************************************** * * CHANNEL WORK TABLE FOR VIDEO CHANNEL UNIT NO. 1 * * VU1 EQU /0C CONTROL UNIT ADDRESS * CWTVU1 EQU * TABLE ENTRY CWTDOS EQU *-CWTVU1 DATA 0 DWT OCCUPYING SCREEN SECTION OF VCCU1/4 CWTPQ EQU *-CWTVU1 DATA 0 PERIPHERAL SECTION OUTPUT QUEUE ANCHOR CWTSEQ EQU *-CWTVU1 DATA 0 SCREEN SECTION ECHO OUTPUT QUEUE ANCHOR CWTSLQ EQU *-CWTVU1 DATA 0 SCREEN SECTION LKM OUTPUT QUEUE ANCHOR CWTTP EQU *-CWTVU1 DATA 0 PERIPH. SECTION OUTPUT QUEUE TIMER PTR CWTACK EQU *-CWTVU1 DATA 0 ACKUMULATOR DATA INPUT ERRORS PERIPHERAL SECTION CWTSRD EQU *-CWTVU1 DATA 0 SST-READY DWT (SCREEN ONLY) CWTITA EQU *-CWTVU1 DATA INTVU1 ADDRESS TO POINTER TO WORK-STATION TABLE CWTCSS EQU *-CWTVU1 CIO A2,1,VU1 CIO START SCREEN CWTCSP EQU *-CWTVU1 CIO A2,1,VU1+1 CIO START PERIPHERAL CWTOTS EQU *-CWTVU1 OTR A2,0,VU1 OTR SCREEN CWTOTP EQU *-CWTVU1 OTR A2,0,VU1+1 OTR PERIPHERAL CWTCHS EQU *-CWTVU1 CIO A2,0,VU1 CIO HALT SCREEN CWTCHP EQU *-CWTVU1 CIO A2,0,VU1+1 CIO HALT PERIPHERAL CWTSST EQU *-CWTVU1 SST A2,VU1 SST (SCREEN ONLY) CWTINR EQU *-CWTVU1 INR A2,0,VU1+1 INR (PERIPHERAL ONLY) IFT IOP=1 CWTWE1 EQU *-CWTVU1 WER A2,VU1+VU1 WER1 (SCREEN ONLY, IOP ONLY) CWTWE2 EQU *-CWTVU1 WER A2,VU1+VU1+1 WER2 (SCREEN ONLY, IOP ONLY) CWTBUF EQU *-CWTVU1 RES 160 IOP-BUFFER (SCREEN ONLY, IOP ONLY) CWTBIN EQU *-CWTVU1 DATA 0 IOP-BUFFER INDEX (SCREEN ONLY, IOP ONLY) XIF * IFF VUCHAN=1 EJECT * * ***************************************************** * C W T V U 2 * ***************************************************** * * CHANNEL WORK TABLE FOR VIDEO CHANNEL UNIT NO. 2 * * VU2 EQU /06 CONTROL UNIT ADDRESS * CWTVU2 EQU * TABLE ENTRY * DATA 0 DWT OCCUPYING SCREEN SECTION OF VCCU1/4 DATA 0 PERIPHERAL SECTION OUTPUT QUEUE ANCHOR DATA 0 SCREEN SECTION ECHO OUTPUT QUEUE ANCHOR DATA 0 SCREEN SECTION LKM OUTPUT QUEUE ANCHOR DATA 0 PERIPH. SECTION OUTPUT QUEUE TIMER PTR DATA 0 ACKUMULATOR DATA INPUT ERRORS PERIPHERAL SECTION DATA 0 SST-READY DWT (SCREEN ONLY) DATA INTVU2 ADDRESS TO POINTER TO WORK-STATION TABLE CIO A2,1,VU2 CIO START SCREEN CIO A2,1,VU2+1 CIO START PERIPHERAL OTR A2,0,VU2 OTR SCREEN OTR A2,0,VU2+1 OTR PERIPHERAL CIO A2,0,VU2 CIO HALT SCREEN CIO A2,0,VU2+1 CIO HALT PERIPHERAL SST A2,VU2 SST (SCREEN ONLY) INR A2,0,VU2+1 INR (PERIPHERAL ONLY) IFT IOP=1 WER A2,VU2+VU2 WER1 (SCREEN ONLY, IOP ONLY) WER A2,VU2+VU2+1 WER2 (SCREEN ONLY, IOP ONLY) RES 160 IOP-BUFFER (SCREEN ONLY, IOP ONLY) DATA 0 IOP-BUFFER INDEX (SCREEN ONLY, IOP ONLY) XIF IFF VUCHAN=1 IFF VUCHAN=2 EJECT * * ***************************************************** * C W T V U 3 * ***************************************************** * * CHANNEL WORK TABLE FOR VIDEO CHANNEL UNIT NO. 3 * * VU3 EQU /02 CONTROL UNIT ADDRESS * CWTVU3 EQU * TABLE ENTRY * DATA 0 DWT OCCUPYING SCREEN SECTION OF VCCU1/4 DATA 0 PERIPHERAL SECTION OUTPUT QUEUE ANCHOR DATA 0 SCREEN SECTION ECHO OUTPUT QUEUE ANCHOR DATA 0 SCREEN SECTION LKM OUTPUT QUEUE ANCHOR DATA 0 PERIPH. SECTION OUTPUT QUEUE TIMER PTR DATA 0 ACKUMULATOR DATA INPUT ERRORS PERIPHERAL SECTION DATA 0 SST-READY DWT (SCREEN ONLY) DATA INTVU3 ADDRESS TO POINTER TO WORK-STATION TABLE CIO A2,1,VU3 CIO START SCREEN CIO A2,1,VU3+1 CIO START PERIPHERAL OTR A2,0,VU3 OTR SCREEN OTR A2,0,VU3+1 OTR PERIPHERAL CIO A2,0,VU3 CIO HALT SCREEN CIO A2,0,VU3+1 CIO HALT PERIPHERAL SST A2,VU3 SST (SCREEN ONLY) INR A2,0,VU3+1 INR (PERIPHERAL ONLY) IFT IOP=1 WER A2,VU3+VU3 WER1 (SCREEN ONLY, IOP ONLY) WER A2,VU3+VU3+1 WER2 (SCREEN ONLY, IOP ONLY) RES 160 IOP-BUFFER (SCREEN ONLY, IOP ONLY) DATA 0 IOP-BUFFER INDEX (SCREEN ONLY, IOP ONLY) XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 EJECT * * ***************************************************** * C W T V U 4 * ***************************************************** * * CHANNEL WORK TABLE FOR VIDEO CHANNEL UNIT NO. 4 * * VU4 EQU /0E CONTROL UNIT ADDRESS * CWTVU4 EQU * TABLE ENTRY * DATA 0 DWT OCCUPYING SCREEN SECTION OF VCCU1/4 DATA 0 PERIPHERAL SECTION OUTPUT QUEUE ANCHOR DATA 0 SCREEN SECTION ECHO OUTPUT QUEUE ANCHOR DATA 0 SCREEN SECTION LKM OUTPUT QUEUE ANCHOR DATA 0 PERIPH. SECTION OUTPUT QUEUE TIMER PTR DATA 0 ACKUMULATOR DATA INPUT ERRORS PERIPHERAL SECTION DATA 0 SST-READY DWT (SCREEN ONLY) DATA INTVU4 ADDRESS TO POINTER TO WORK-STATION TABLE CIO A2,1,VU4 CIO START SCREEN CIO A2,1,VU4+1 CIO START PERIPHERAL OTR A2,0,VU4 OTR SCREEN OTR A2,0,VU4+1 OTR PERIPHERAL CIO A2,0,VU4 CIO HALT SCREEN CIO A2,0,VU4+1 CIO HALT PERIPHERAL SST A2,VU4 SST (SCREEN ONLY) INR A2,0,VU4+1 INR (PERIPHERAL ONLY) IFT IOP=1 WER A2,VU4+VU4 WER1 (SCREEN ONLY, IOP ONLY) WER A2,VU4+VU4+1 WER2 (SCREEN ONLY, IOP ONLY) RES 160 IOP-BUFFER (SCREEN ONLY, IOP ONLY) DATA 0 IOP-BUFFER INDEX (SCREEN ONLY, IOP ONLY) XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 EJECT * * ***************************************************** * C W T V U 5 * ***************************************************** * * CHANNEL WORK TABLE FOR VIDEO CHANNEL UNIT NO. 5 * * VU5 EQU /20 CONTROL UNIT ADDRESS * CWTVU5 EQU * TABLE ENTRY * DATA 0 DWT OCCUPYING SCREEN SECTION OF VCCU1/4 DATA 0 PERIPHERAL SECTION OUTPUT QUEUE ANCHOR DATA 0 SCREEN SECTION ECHO OUTPUT QUEUE ANCHOR DATA 0 SCREEN SECTION LKM OUTPUT QUEUE ANCHOR DATA 0 PERIPH. SECTION OUTPUT QUEUE TIMER PTR DATA 0 ACKUMULATOR DATA INPUT ERRORS PERIPHERAL SECTION DATA 0 SST-READY DWT (SCREEN ONLY) DATA INTVU5 ADDRESS TO POINTER TO WORK-STATION TABLE CIO A2,1,VU5 CIO START SCREEN CIO A2,1,VU5+1 CIO START PERIPHERAL OTR A2,0,VU5 OTR SCREEN OTR A2,0,VU5+1 OTR PERIPHERAL CIO A2,0,VU5 CIO HALT SCREEN CIO A2,0,VU5+1 CIO HALT PERIPHERAL SST A2,VU5 SST (SCREEN ONLY) INR A2,0,VU5+1 INR (PERIPHERAL ONLY) IFT IOP=1 WER A2,VU5+VU5 WER1 (SCREEN ONLY, IOP ONLY) WER A2,VU5+VU5+1 WER2 (SCREEN ONLY, IOP ONLY) RES 160 IOP-BUFFER (SCREEN ONLY, IOP ONLY) DATA 0 IOP-BUFFER INDEX (SCREEN ONLY, IOP ONLY) XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 EJECT * * ***************************************************** * C W T V U 6 * ***************************************************** * * CHANNEL WORK TABLE FOR VIDEO CHANNEL UNIT NO. 6 * * VU6 EQU /22 CONTROL UNIT ADDRESS * CWTVU6 EQU * TABLE ENTRY * DATA 0 DWT OCCUPYING SCREEN SECTION OF VCCU1/4 DATA 0 PERIPHERAL SECTION OUTPUT QUEUE ANCHOR DATA 0 SCREEN SECTION ECHO OUTPUT QUEUE ANCHOR DATA 0 SCREEN SECTION LKM OUTPUT QUEUE ANCHOR DATA 0 PERIPH. SECTION OUTPUT QUEUE TIMER PTR DATA 0 ACKUMULATOR DATA INPUT ERRORS PERIPHERAL SECTION DATA 0 SST-READY DWT (SCREEN ONLY) DATA INTVU6 ADDRESS TO POINTER TO WORK-STATION TABLE CIO A2,1,VU6 CIO START SCREEN CIO A2,1,VU6+1 CIO START PERIPHERAL OTR A2,0,VU6 OTR SCREEN OTR A2,0,VU6+1 OTR PERIPHERAL CIO A2,0,VU6 CIO HALT SCREEN CIO A2,0,VU6+1 CIO HALT PERIPHERAL SST A2,VU6 SST (SCREEN ONLY) INR A2,0,VU6+1 INR (PERIPHERAL ONLY) IFT IOP=1 WER A2,VU6+VU6 WER1 (SCREEN ONLY, IOP ONLY) WER A2,VU6+VU6+1 WER2 (SCREEN ONLY, IOP ONLY) RES 160 IOP-BUFFER (SCREEN ONLY, IOP ONLY) DATA 0 IOP-BUFFER INDEX (SCREEN ONLY, IOP ONLY) XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 IFF VUCHAN=6 EJECT * * ***************************************************** * C W T V U 7 * ***************************************************** * * CHANNEL WORK TABLE FOR VIDEO CHANNEL UNIT NO. 7 * * VU7 EQU /26 CONTROL UNIT ADDRESS * CWTVU7 EQU * TABLE ENTRY * DATA 0 DWT OCCUPYING SCREEN SECTION OF VCCU1/4 DATA 0 PERIPHERAL SECTION OUTPUT QUEUE ANCHOR DATA 0 SCREEN SECTION ECHO OUTPUT QUEUE ANCHOR DATA 0 SCREEN SECTION LKM OUTPUT QUEUE ANCHOR DATA 0 PERIPH. SECTION OUTPUT QUEUE TIMER PTR DATA 0 ACKUMULATOR DATA INPUT ERRORS PERIPHERAL SECTION DATA 0 SST-READY DWT (SCREEN ONLY) DATA INTVU7 ADDRESS TO POINTER TO WORK-STATION TABLE CIO A2,1,VU7 CIO START SCREEN CIO A2,1,VU7+1 CIO START PERIPHERAL OTR A2,0,VU7 OTR SCREEN OTR A2,0,VU7+1 OTR PERIPHERAL CIO A2,0,VU7 CIO HALT SCREEN CIO A2,0,VU7+1 CIO HALT PERIPHERAL SST A2,VU7 SST (SCREEN ONLY) INR A2,0,VU7+1 INR (PERIPHERAL ONLY) IFT IOP=1 WER A2,VU7+VU7 WER1 (SCREEN ONLY, IOP ONLY) WER A2,VU7+VU7+1 WER2 (SCREEN ONLY, IOP ONLY) RES 160 IOP-BUFFER (SCREEN ONLY, IOP ONLY) DATA 0 IOP-BUFFER INDEX (SCREEN ONLY, IOP ONLY) XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 IFF VUCHAN=6 IFF VUCHAN=7 EJECT * * ***************************************************** * C W T V U 8 * ***************************************************** * * CHANNEL WORK TABLE FOR VIDEO CHANNEL UNIT NO. 8 * * VU8 EQU /2C CONTROL UNIT ADDRESS * CWTVU8 EQU * TABLE ENTRY * DATA 0 DWT OCCUPYING SCREEN SECTION OF VCCU1/4 DATA 0 PERIPHERAL SECTION OUTPUT QUEUE ANCHOR DATA 0 SCREEN SECTION ECHO OUTPUT QUEUE ANCHOR DATA 0 SCREEN SECTION LKM OUTPUT QUEUE ANCHOR DATA 0 PERIPH. SECTION OUTPUT QUEUE TIMER PTR DATA 0 ACKUMULATOR DATA INPUT ERRORS PERIPHERAL SECTION DATA 0 SST-READY DWT (SCREEN ONLY) DATA INTVU8 ADDRESS TO POINTER TO WORK-STATION TABLE CIO A2,1,VU8 CIO START SCREEN CIO A2,1,VU8+1 CIO START PERIPHERAL OTR A2,0,VU8 OTR SCREEN OTR A2,0,VU8+1 OTR PERIPHERAL CIO A2,0,VU8 CIO HALT SCREEN CIO A2,0,VU8+1 CIO HALT PERIPHERAL SST A2,VU8 SST (SCREEN ONLY) INR A2,0,VU8+1 INR (PERIPHERAL ONLY) IFT IOP=1 WER A2,VU8+VU8 WER1 (SCREEN ONLY, IOP ONLY) WER A2,VU8+VU8+1 WER2 (SCREEN ONLY, IOP ONLY) RES 160 IOP-BUFFER (SCREEN ONLY, IOP ONLY) DATA 0 IOP-BUFFER INDEX (SCREEN ONLY, IOP ONLY) XIF * * * * EJECT * ************************************************************ * * S C R E E N S E C T I O N * D E V I C E D R I V E R P A R T * A C T I V A T I O N R O U T I N E * ************************************************************* * * * ENTERED: AT LKM DATA 1 * * FUNCTIONS: * * * ORDER /00: TEST STATUS. * 1.DUMMY IS SENT TO DISPLAY VIA VCCU1/4. * 2.STATUS IS RETURNED INTO ECBRC IF VCCU1/4 NOT OPERABLE * 3.CURSOR POSITION IS RETURNED INTO ECBCW. * ADDITIONALLY: * IF CURSOR POSITION IS LAST COLUMN OF A ROW, * AND IF THAT LAST COLUMN IS WRITTEN INTO, * AND IF THE CURSOR HAS NOT BEEN POSITIONED SINCE * THE WRITING OF THAT LAST COLUMN, THEN: * ECBCW IS INCREMENTED WITH 1 * (INDICATING LAST+1 COLUMN OF THAT ROW) * * * ORDER /05: BASIC WRITE. * 1.DISPLAY-ACTION IS PERFORMED * ACCORDING TO CHARACTER(S) FROM ECB-BUFFER. * CHARACTERS IN THE RANGE /20 - /7F ARE ACCEPTED AND DISPLAYED. * CHARACTERS IN THE RANGE /00 - /1F (COMMAND CHARACTERS) * FROM ECB-BUFFER, ARE ILLEGAL EXCEPT FOR /0A AND /0D. * ILLEGAL CHARACTERS ARE IGNORED WITHOUT ANY ERROR * INDICATION IN ECBRC. * WHEN THE LAST COLUMN OF A ROW HAS BEEN WRITTEN INTO, * THE CURSOR REMAINS IN THAT POSITION, * AND THE FOLLOWING CHARACTERS (/20-/7F) * ARE WRITTEN INTO THAT SAME POSITION. * 2.EFFECTIVE LENGTH IS RETURNED INTO ECBEL. * 3.STATUS IS RETURNED INTO ECBRC, IF VCCU1/4 IS NOT OPERABLE. * 4.CURSOR POSITION AFTER REQUEST IS RETURNED INTO ECBCW. * ADDITIONALLY: * IF CURSOR POSITION IS LAST COLUMN OF A ROW, * AND IF THAT LAST COLUMN IS WRITTEN INTO, * AND IF THE CURSOR HAS NOT BEEN POSITIONED SINCE * THE WRITING OF THAT LAST COLUMN, THEN: * ECBCW IS INCREMENTED WITH 1 * (INDICATING LAST+1 COLUMN OF THAT ROW) * * ORDER /06: STANDARD WRITE. * 1.IF REQUESTED LENGTH IS LESS THAN 2 BYTES * (NO CONTROL CHARACTER), THEN DEFAULT-ACTION LF+CR IS DONE. * 2.IF REQUESTED LENGTH IS AT LEAST 2 BYTES, THEN * ACTIONS SPECIFIED BY USER IN RIGHT-MOST BYTE OF FIRST WORD IN BUFF * (CONTROL CHARACTER) ARE CARRIED OUT: * /2B NO MOVING OF WRITE POSITION * /30 LF, LF, CR * /31 ERASE SCREEN AND WRITE FROM HOME POSITION * OTHER VALUE: LF, CR * * 3.IF REQUESTED LENGTH EXCEEDS 2 BYTES, THEN ALSO * DISPLAY-ACTION IS PERFORMED * ACCORDING TO CHARACTER(S) FROM ECB-BUFFER . * CHARACTERS IN THE RANGE /20 - /7F ARE ACCEPTED AND DISPLAYED. * CHARACTERS IN THE RANGE /00 - /1F (COMMAND CHARACTERS) * FROM ECB-BUFFER, ARE ILLEGAL EXCEPT FOR /11, /12, /13, * /14, /1E, /1F. ILLEGAL CHARACTERS ARE IGNORED AND * WHEN THE REQUEST IS COMPLETED, ERROR INDICATION IS * GIVEN IN ECBRC. * WHEN THE LAST COLUMN OF A ROW HAS BEEN WRITTEN INTO, * THE CURSOR REMAINS IN THAT POSITION, * AND THE FOLLOWING CHARACTERS (/20-/7F) * ARE WRITTEN INTO THAT SAME POSITION. * 4.EFFECTIVE LENGTH IS RETURNED INTO ECBEL. * 5.STATUS IS RETURNED INTO ECBRC, * IF VCCU1/4 IS NOT OPERABLE OR IF CODE CHECK ERROR. * 6.CURSOR POSITION AFTER REQUEST IS RETURNED INTO ECBCW. * ADDITIONALLY: * IF CURSOR POSITION IS LAST COLUMN OF A ROW, * AND IF THAT LAST COLUMN IS WRITTEN INTO, * AND IF THE CURSOR HAS NOT BEEN POSITIONED SINCE * THE WRITING OF THAT LAST COLUMN, THEN: * ECBCW IS INCREMENTED WITH 1 * (INDICATING LAST+1 COLUMN OF THAT ROW) * * * ORDER /0B: CURSOR POSITIONING AND STANDARD WRITE. * 1.THE CURSOR IS SENT TO THE POSITION GIVEN * IN ECBCW AT START OF REQUEST. * NO INFORMATION ON SCREEN IS ERASED. * 2.THEN, IF REQUESTED LENGTH EXCEEDS 2 BYTES, * DISPLAY-ACTION IS PERFORMED ACCORDING TO * CHARACTERS FROM ECB BUFFER (SEE ORDER /06, NOTE NUMBER 3-6). * * ORDER /31: ERASE. * 1.THE SCREEN IS ERASED ON THE LINE * WHERE THE CURSOR IS POSITIONED. * THE NUMBER OF CHARACTERS (1-80) TO BE ERASED, * IS DEFINED IN ECBCW AT START OF REQUEST. * ERASING STARTS IN THE CURSOR POSITION. * THE CURSOR REMAINS IN THAT POSITION. * 2.STATUS IS RETURNED INTO ECBRC, IF VCCU1/4 IS NOT OPERABLE. * * * INPUT: A5 = DWT STACK BASE * A6 = DWT ADDRESS * A7 = ORDER * A8 = ECB ADDRESS * * OUTPUT: A1 = RETURN CODE FOR ECB * A6 = DWT ADDRESS * A7 = ORDER * A8 = ECB ADDRESS * ***************************************************************** * ACVU EQU * * * SWITCH TO LEVEL 48 AND ENB * (TO HAVE, DURING IOP-PREPARATION-LOOP, * LOWER PRIORITY THAN VCCU-INPUT-INTERRUPTS) * CF A15,SWL48 SWITCH TO LEVEL 48 AND ENB * * CHECK ORDER CODE * CWK A7,/06 ORDER /06 ? RF(E) ACV100 YES CWK A7,/0B ORDER /0B ? ABL(E) ACV420 YES CWK A7,/31 ORDER /31 ? ABL(E) ACV450 YES CWK A7,/00 ORDER /00 ? ABL(E) ACV460 YES CWK A7,/05 ORDER /05 ? ABL(E) ACV470 YES * * ILLEGAL ORDER CODE * ABL DISIOE I/O REQUEST ERROR EJECT ************************************************** * ORDER /06 * STANDARD WRITE ************************************************** * ACV100 EQU * LD A3,ECBRL,A8 INITIATE BUFFER INDEX(=REQUESTED LENGTH IF IT IS < 2) LD A2,ECBRL,A8 GET REQUESTED LENGTH SUK A2,2 AT LEAST 2 BYTES ? RF(N) ACV120 NO. THEN NO CONTROL CHARACTER, SO * DO DEFAULT: LF+CR. * * CHECK BUFFER CONTROL CHARACTER * LDK A3,2 INITIATE BUFFER INDEX * TO POINT AFTER 2 CONTROL CHARACTERS LD A2,ECBBA,A8 GET ECB BUFFER ADDRESS LC A2,1,A2 GET BUFFER CONTROL CHAR ANK A2,/FF CLEAN LEFT BYTE SUK A2,/2B WITHOUT POSITIONING BEFORE WRITE ? RF(Z) ACV150 YES SUK A2,5 LF+LF+CR ? (=/30) RF(Z) ACV110 YES SUK A2,1 CLEAR SCREEN, HOME WRITE POS. ? (=/31) RF(NZ) ACV120 NO. THEN FOR ALL OTHER VALUES: LF+CR * * INITIAL ACTION * ACCORDING TO DETECTED BUFFER CONTROL CHARACTER * LDKL A2,/0101 HOME WRITE POSITION ST A2,DWTCN+DWTDEV,A6 AS CURRENT NEXT WRITE POSITION LDK A4,ROLBIT BIT 8 (SET IF SCROLL MODE) C1R A4,A4 COMPLEMENT ANS A4,DWTDEV,A6 RESET BIT 8 (NO LONGER SCROLL MODE) CF A5,CLESCR CLEAR SCREEN, RESET WRITE+CURSOR POS ABL(NZ) DEVERR STATUS NOT OK RF ACV140 GO RESET DWTDEV BIT 9 ACV110 EQU * CF A5,NXTROW DO LINE-FEED TO NEXT ROW ACV120 EQU * CF A5,NXTROW DO LINE-FEED TO NEXT ROW * DO CR ACV130 EQU * LDK A2,/01 FIRST COLUMN SC A2,DWTCNC+DWTDEV,A6 AS CURRENT NEXT WRITE COLUMN ACV140 EQU * LDK A4,LCWBIT BIT 9 (SET IF LAST COLUMN WRITTEN) C1R A4,A4 COMPLEMENT ANS A4,DWTDEV,A6 RESET BIT 9 EJECT * * START WRITING * ACCORDING TO ASCII CHARACTERS FROM BUFFER * ACV150 EQU * LD A2,DWTCN+DWTDEV,A6 GET CURRENT NEXT WRITE POSITION CF A5,STAWRI START NEW WRITE REQUEST ABL(NZ) DEVERR STATUS NOT OK IFT TRASPA=1 EJECT * * REMOVE ANY TRAILING /20, /11, /12, /1E, /1F * BY DECREMENTING REQUESTED LENGTH * LD A1,ECBBA,A8 GET BUFFER ADDRESS LD A2,ECBRL,A8 GET REQUESTED LENGTH ADR A1,A2 GET ADDRESS TO END OF BUFFER ACV160 CWK A2,2 REQUESTED LENGTH < 3 ? RF(NG) ACV200 YES. THEN NO (MORE) ACTION SUK A1,1 DECR ADDRESS IN BUFFER LCR A4,A1 GET CHAR CCK A4,/2020 TRAILING SPACE ? RF(NE) ACV180 NO. GO CHECK IF OTHER SKIPPABLE CHAR ACV170 SUK A2,1 DECR REQUESTED LENGTH * TO SKIP THAT TRAILING CHAR RB ACV160 GO BACKWARDS TO CHECK PRECEEDING CHAR ACV180 CWK A2,4 REQUESTED LENGTH < 5 ? RF(NG) ACV200 YES. THEN NO (MORE) ACTION LC A4,-2,A1 NOW GET THE CHAR 2 BYTES BEFORE CCK A4,/1111 TRAILING TABULATION CHAR ? RF(NE) ACV190 NO. GO CHECK IF OTHER SKIPPABLE CHAR SUK A1,2 DECR ADDRESS IN BUFFER SUK A2,2 DECR REQUESTED LENGTH RB ACV170 ACV190 LCR A4,A1 GET THE CHARACTER AGAIN ANK A4,/FF SUK A4,/12 TRAILING UNDERLINE START? RB(Z) ACV170 YES. SKIP IT SUK A4,/C TRAILING LOW INTENSITY START? RB(Z) ACV170 YES. SKIP IT SUK A4,1 TRAILING LOW INTENSITY STOP? RB(Z) ACV170 YES. SKIP IT * ACV200 ST A2,ECBRL,A8 STORE (NEW) REQUESTED LENGTH EJECT XIF ACV210 EQU * CF A15,GETCHR GET CHAR FROM ECB BUFFER LDR A1,A1 END OF ECB BUFFER ? RF(NP) ACV380 YES ANK A2,/7F CLEAN CWK A2,SPACE < /20 ? RF(L) ACV220 YES. THEN CHECK COMMAND CHARACTER CF A5,CHKOUT CHECK IF LAST COLUMN AND DO OUTPUT RB ACV210 GET NEXT CHAR EJECT * * CHECK OF COMMAND CHARACTER * ACV220 EQU * CWK A7,/05 ORDER /05 RUNNING ? ABL(E) ACV480 YES. THEN DIFFERENT CHARACTER CHECK SUK A2,/11 TABULATION ? RF(Z) ACV290 YES SUK A2,1 START UNDERLINE ? (/12) RF(Z) ACV230 YES SUK A2,1 STOP UNDERLINE ? (/13) RF(Z) ACV250 YES SUK A2,1 FAST OUTPUT ? (/14) RF(Z) ACV350 YES SUK A2,/A START LOW INTENSITY ? (/1E) RF(Z) ACV270 YES SUK A2,1 STOP LOW INTENSITY ? (/1F) RF(Z) ACV280 YES * * ILLEGAL (COMMAND) CHARACTER * LDK A1,CCERR CODE CHECK ERROR STATUS ORS A1,ECBRC,A8 INTO ECB RETURN CODE RB ACV210 GO GET NEXT CHAR EJECT * * START UNDERLINE * ACV230 EQU * LDKL A2,UNDBIT GET UNDERLINE MODE BIT ACV240 EQU * ORS A2,DWTDEV,A6 SET BIT INTO DWT RB ACV210 GO GET NEXT CHAR * * STOP UNDERLINE * ACV250 EQU * LDKL A2,UNDBIT GET UNDERLINE MODE BIT ACV260 EQU * C1R A2,A2 COMPLEMENT ANS A2,DWTDEV,A6 RESET BIT IN DWT RB ACV210 GO GET NEXT CHAR * * START LOW (!) INTENSITY * ACV270 EQU * LDKL A2,INTBIT GET HIGH INTENSITY MODE BIT RB ACV260 GO RESET BIT IN DWT * * STOP LOW (!) INTENSITY * ACV280 EQU * LDKL A2,INTBIT GET HIGH INTENSITY MODE BIT RB ACV240 GO SET BIT INTO DWT EJECT * * ORDER /06, COMMAND /11 (TABULATION) * ACV290 EQU * CF A5,ENDWRI END THE WRITE REQUEST ABL(NZ) DEVERR STATUS NOT OK CF A15,GETCHR GET TAB COLUMN NUMBER (FIRST DIGIT) LDR A4,A2 SAVE FIRST DIGIT CF A15,GETCHR GET TAB COLUMN NUMBER (SECOND DIGIT) * * CONVERT FROM DECIMAL INTO HEXA * ANK A2,/F GET UNITS ANK A4,/F GET TENTHS. ANY ? RF(Z) ACV310 NO ACV300 EQU * ADK A2,/A INCR WITH TEN UNITS SUK A4,1 ONE MORE TIME ? RB(NZ) ACV300 YES * * CHECK COLUMN NUMBER TABULATED INTO * ACV310 EQU * LDK A4,0 CLEAR REGISTER LC A4,DWTCNR+DWTDEV,A6 GET CURRENT NEXT WRITE ROW NUMBER ECR A4,A4 ROW NUMBER INTO LEFT BYTE ACV320 EQU * CWK A2,1 < COLUMN 1 ? (=COLUMN 'ZERO' ?) RF(NL) ACV330 NO LCK A2,/0101 YES. SET COLUMN 1 INSTEAD RF ACV340 ACV330 EQU * CCK A2,MAXCOL EXCEEDING MAX NUMBER OF COLUMNS ? RF(NG) ACV340 NO LCK A2,MAXCOL YES. SET LAST COLUMN INSTEAD * * EXECUTE THE TABULATION * ACV340 EQU * ORR A2,A4 COMBINE ROW AND COLUMN NUMBERS ST A2,DWTCN+DWTDEV,A6 SET CURRENT NEXT WRITE POSITION ABL ACV140 GO RESET BIT 9 IN DWTDEV, DO STAWRI. EJECT * * ORDER /06, COMMAND /14 (FAST OUTPUT) * ACV350 EQU * CF A15,SAVCN SAVE CURRENT NEXT WRITE POSITION CF A15,GETCHR GET NEXT CHARACTER FROM ECB BUFFER LD A4,ECBRL,A8 GET REQUESTED LENGTH ST A4,ECBEL,A8 SET EFFECTIVE LENGTH SUR A4,A3 SUBTRACT BUFFER INDEX LDR A3,A4 SAVE REMAINING LENGTH FOR 'FAST OUTPUT' RF(Z) ACV370 NO OUTPUT IF ZERO LENGTH * * NO OUTPUT IF NO ASCII CHARACTERS : SET STATUS * ANK A2,/7F CWK A2,SPACE </20? RF(NL) ACV360 LDK A1,CCERR CODE CHECK ERROR STATUS ORS A1,ECBRC,A8 INTO ECB RETURN CODE RF ACV370 ACV360 EQU * CF A5,CHKOUT CHECK LAST COLUMN WRITTEN AND DO OUTPUT SUK A3,1 ONE MORE TIME ? RB(NZ) ACV360 YES ACV370 EQU * CF A5,ENDWRI END THE WRITE REQUEST ABL(NZ) DEVERR STATUS NOT OK CF A15,RESCN RESTORE SAVED WRITE POS. AS CURRENT NEXT RF ACV390 GO SET CURSOR TO IT EJECT * * END OF LKM-REQUEST * ACV380 EQU * CF A5,ENDWRI END THE WRITE REQUEST ABL(NZ) DEVERR STATUS NOT OK CF A15,SAVCN SAVE CURRENT NEXT WRITE POSITION ACV390 EQU * CWK A7,/31 ORDER /31 ? RF(E) ACV395 YES. THEN DO NOT MODIFY ECBCW. ACV392 EQU * ST A2,ECBCW,A8 SAVE NEXT WRITE POSITION ALSO INTO ECB LD A4,DWTDEV,A6 ANK A4,LCWBIT BIT 9 SET ? RF(Z) ACV395 NO = LAST COLUMN NOT WRITTEN IM ECBCW,A8 YES. INDICATE BY RETURNING LAST+1 COLUMN ACV395 EQU * CF A5,OUTCUR SET CURSOR TO NEXT WRITE POSITION ABL(NZ) DEVERR STATUS NOT OK * * RESET DISPLAY MODE BITS IN DWT * ACV400 EQU * LDKL A2,UNDBIT GET UNDERLINE MODE BIT C1R A2,A2 COMPLEMENT ANS A2,DWTDEV,A6 RESET BIT IN DWT LDKL A2,INTBIT GET HIGH INTENSITY MODE BIT ORS A2,DWTDEV,A6 SET BIT INTO DWT ACV410 EQU * ABL DISEND END I/O AND DISPATCH EJECT ******************************************************* * ORDER /0B * SET CURSOR (AND WRITE) ********************************************************* * ACV420 EQU * LDK A3,2 INITIATE BUFFER INDEX * (SKIP UNUSED LEADING 2 BYTES) LDK A2,0 CLEAR WORK REGISTER LDK A4,0 CLEAR WORK REGISTER LC A4,ECBCW,A8 GET REQUESTED ROW NUMBER CWK A4,1 < ROW 1 ? (=ROW 'ZERO' ?) RF(NL) ACV430 NO LCK A4,/0101 YES. SET ROW 1 INSTEAD RF ACV440 ACV430 EQU * CCK A4,MAXROW EXCEEDING MAX NUMBER OF ROWS ? RF(NG) ACV440 NO LCK A4,MAXROW YES. SET LAST ROW INSTEAD ACV440 EQU * ECR A4,A4 ROW NUMBER INTO LEFT BYTE LC A2,ECBCW+1,A8 GET REQUESTED COLUMN NUMBER RB ACV320 GO CHECK REQUESTED COLUMN NUMBER ETC. EJECT ******************************************************** * ORDER /31 * ERASE ******************************************************* * ACV450 EQU * LD A2,DWTCN+DWTDEV,A6 GET CURRENT NEXT WRITE POSITION LD A3,ECBCW,A8 GET NUMBER OF CHARACTERS TO ERASE RB(Z) ACV395 NO ERASE IF ZERO CHARACTERS, * BUT THEN GO SET CURSOR ETC * + DO ENDIO. CF A5,STAWRI START NEW WRITE REQUEST ABL(NZ) DEVERR STATUS NOT OK LDK A2,SPACE GET SPACE TO DO ERASE WITH RB ACV360 GO DO ERASE EJECT ************************************************ * ORDER /00 * TEST STATUS ************************************************* * ACV460 EQU * LD A2,DWTCN+DWTDEV,A6 GET CURRENT NEXT WRITE POSITION RB ACV392 SET ECBCW AND DO (DUMMY) OUTPUT CURSOR EJECT ************************************************* * ORDER /05 * BASIC WRITE ************************************************* * ACV470 EQU * LDK A3,0 INITIATE BUFFER INDEX ABL ACV150 GO START WRITE REQUEST ETC. * * * * * CHECK OF DETECTED COMMAND CHARACTER * ACV480 EQU * SUK A2,/0A LINE-FEED ? (=/0A) RF(NZ) ACV490 NO CF A5,ENDWRI END THE WRITE REQUEST ABL(NZ) DEVERR STATUS NOT OK CF A5,NXTROW DO LINE-FEED TO NEXT ROW ABL ACV150 GO START NEW WRITE REQUEST ETC. ACV490 EQU * SUK A2,3 CARRIAGE RETURN ? (=/0D) ABL(NZ) ACV210 NO. THEN ILLEGAL COMMAND CHAR ! * NO OUTPUT, NO ERROR STATUS, GET NEXT CHAR CF A5,ENDWRI END THE WRITE REQUEST RF(NZ) DEVERR STATUS NOT OK ABL ACV130 GO DO CARRIAGE RETURN ETC. EJECT * *********************************************************** * * S C R E E N S E C T I O N * D E V I C E D R I V E R P A R T * A B O R T R O U T I N E * *********************************************************** * * * CALL: CFR A15,A2 (A2 = ABVU) * * USED BY: ABORT-LKM PROCESSOR * AT ABORT OF KEYBOARD INPUT WITH ECHO * * FUNCTION:SAVE CURRENT NEXT WRITE POSITION (DEFINING * END OF REQUEST POSITION) INTO DWT * * INPUT: A6 = DWT-ADDRESS OF ECHO DEVICE * A8 = DWT-ADDRESS OF INPUT DEVICE * * OUTPUT: A6,A8 UNCHANGED ! * ************************************************************ * ABVU EQU * CF A15,SAVCN SAVE CURRENT NEXT WRITE POSITION IFT CPU852=1 ABL IHRTN RETURN XIF RTN A15 EJECT * *********************************************************** * * S C R E E N S E C T I O N * D E V I C E D R I V E R P A R T * R E C O V E R Y R O U T I N E * *********************************************************** * * ENTERED: FROM LINE DRIVER PART VIA NETWORK DISTRIBUTOR, * AT POWER ON * * FUNCTIONS: * 1. SET DWT BUSY * 2. CLEAR SCREEN * 3. INITIATE CURRENT NEXT WRITE POSITION IN DWT * 4. RESET BITS IN DWT FOR * - SCROLL MODE * - LAST COLUMN WRITTEN * - UNDERLINE MODE * 5. SET BIT IN DWT FOR * - HIGH INTENSITY MODE * 6. SET RETURN STATUS FOR ECBRC: 'NOT OPERABLE' * 7. EXIT: ENDIO+DISPATCH * * INPUT: A4 = RECOVERY CAUSE * A5 = DWT STACK BASE * A6 = DWT ADDRESS * A7 = ORDER (IF REQUEST IS ON) * A8 = ECB ADDRESS (IF REQUEST IS ON) * 0 (IF NO REQUEST IS ON) * * OUTPUT: A1 = RETURN CODE * A6 = DWT ADDRESS * ************************************************************** * RCVU EQU * LDKL A2,/7FFF READY-BIT ANS A2,DWTST,A6 RESET IT (=SET DWT BUSY) CF A5,CLESCR CLEAR SCREEN, RESET WRITE+CURSOR POS. RF(NZ) DEVERR STATUS NOT OK LDKL A2,/0101 HOME POSITION ST A2,DWTCN+DWTDEV,A6 AS CURRENT NEXT WRITE POSITION LDK A4,ROLBIT+LCWBIT BIT 8+9 (SCROLL + LAST COLUMN WRITTEN) C1R A4,A4 COMPLEMENT ANS A4,DWTDEV,A6 RESET BITS IN DWT CF A15,SAVCN SAVE CURRENT NEXT WRITE POSITION LDK A1,OPERR STATUS NOT OPERABLE (FOR ECBRC) RB ACV400 GO RESET UNDERLINE+INTENSITY MODE, * AND EXIT: ENDIO+DISPATCH EJECT * ************************************************************** * * S C R E E N S E C T I O N * D E V I C E D R I V E R P A R T * E C H O R O U T I N E * ************************************************************** * * * ENTERED: FROM KEYBOARD DRIVER VIA NETWORK DISTRIBUTOR, * AT KEYBOARD INPUT WITH ECHO * * FUNCTIONS: * 1. ECHOING OF ALPHANUMERIC CHARACTERS * 2. HANDLING OF BACKSPACE-CHARACTER * 3. HANDLING OF CLEAR-CHARACTER * 4. HANDLING OF LINEFEED-CHARACTER * 5. HANDLING OF CARRIAGE-RETURN-CHARACTER * 6. HANDLING OF END-OF-RECORD-CHARACTER (ALPHANUM., LF OR CR) * 7. EXIT: TO KEYBOARD DRIVER VIA NETWORK DISTRIBUTOR * * INPUT: A2 = BITS 0-7 : ZERO * BITS 8-15: CHARACTER * A5 = DWT STACK BASE * A6 = DWT ADDRESS * A7 = BIT 0 =1 IF END OF ECHO * =0 IF NOT * * OUTPUT: A6 = DWT ADDRESS * *************************************************************** * ECHOVU EQU * LDR A7,A7 END OF REQUEST FOR ECHO ? RF(N) ECV110 YES * * CHECK IF SPECIAL ECHO CHARACTER * CWK A2,/80 8-BIT SET ? (=EOR-CHARACTER, >=/80) IFT EORECH=0 RF(NL) ECV120 YES. NOT TO BE ECHOED. XIF IFT EORECH=1 RF(L) ECV080 NO. THEN NOT EOR-CHARACTER * * ECHO OF EOR-CHARACTER * ANK A2,/7F CLEAN CWK A2,/20 </20 ? RF(L) ECV085 YES. COMMAND CHARACTER AS EOR-CHAR. RF ECV095 NO. ALPHANUMERIC CHAR AS EOR-CHAR. XIF * * ECHO OF NON-EOR CHARACTER * ECV080 EQU * CWK A2,/20 </20 ? RF(NL) ECV095 NO. THEN ALPHANUMERIC CHARACTER. SUK A2,/08 BACKSPACE ? (/08) RF(Z) ECV130 YES SUK A2,/10 CLEAR-CHARACTER ? (/18) RF(Z) ECV160 YES ADK A2,/18 RESTORE CHARACTER ECV085 EQU * SUK A2,/0A LINEFEED ? (/0A) RF(NZ) ECV090 NO * * ECHO OF LINEFEED * CF A5,NXTROW DO LINEFEED TO NEXT ROW RF ECV100 GO SET CURSOR ECV090 EQU * SUK A2,3 CARRIAGE RETURN ? (/0D) RF(NZ) ECV120 NO. THEN ILLEGAL ECHO CHARACTER! * * ECHO OF CARRIAGE RETURN * LDK A2,/01 FIRST COLUMN OF ROW SC A2,DWTCNC+DWTDEV,A6 AS CURRENT NEXT WRITE COLUMN LDK A4,LCWBIT BIT 9 (SET IF LAST COLUMN WRITTEN) C1R A4,A4 COMPLEMENT ANS A4,DWTDEV,A6 RESET BIT 9 RF ECV100 GO SET CURSOR * * DO ECHO OF ALPHANUMERIC CHARACTER * ECV095 EQU * CF A5,ECHOUT ECHO THE CHARACTER CF A15,NXTCOL UPDATE COLUMN COUNTER TO NEXT COLUMN ECV100 EQU * LD A2,DWTCN+DWTDEV,A6 GET CURRENT NEXT WRITE POSITION CF A5,OUTCUR OUTPUT CURSOR IN IT RF(NZ) DEVERR STATUS NOT OK RF ECV120 RETURN * * END THE ECHO REQUEST * ECV110 EQU * CF A15,SAVCN SAVE CURRENT NEXT WRITE POSITION CF A15,TENDIO END ECHO-OUTPUT I/O-REQUEST * * RETURN FROM ECHO HANDLING * ECV120 EQU * ABL ECHRTN RETURN FROM ECHO TO KB-DRIVER EJECT * * HANDLING OF A BACKSPACE-CHARACTER * ECV130 EQU * LD A2,DWTDEV,A6 LDR A4,A2 SAVE INTO A4 ANK A4,LCPBIT BIT 10 SET ? (=LAST COLUMN ALREADY WRITTEN * BY PREVIOUS REQUEST) RB(NZ) ECV120 YES. THEN NO RUBOUT ! ANK A2,LCWBIT BIT 9 SET ? RF(NZ) ECV140 YES.LAST COLUMN WRITTEN (DURING REQUEST) LD A4,DWTSN+DWTDEV,A6 GET NEXT WRITE POSITION SAVED AFTER * PREVIOUS REQUEST CW A4,DWTCN+DWTDEV,A6 = CURRENT NEXT WRITE POSITION ? RB(E) ECV120 YES. THEN NO RUB-OUT ! LDKL A4,-1 ADS A4,DWTCN+DWTDEV,A6 DECR CURRENT NEXT WRITE POSITION RF ECV150 ECV140 EQU * XRS A2,DWTDEV,A6 RESET BIT 9 (LAST COLUMN NO LONGER WRITTEN) ECV150 EQU * LDK A2,SPACE RUBOUT PREVIOUS (OR LAST) COLUMN CF A5,ECHOUT OUTPUT ONE SPACE TO RUBOUT RB ECV100 GO SET CURSOR EJECT * * HANDLING OF A CLEAR-CHARACTER * ECV160 EQU * LD A4,DWTDEV,A6 LDR A2,A4 ALSO INTO A2 ANK A4,LCPBIT BIT 10 SET ? (=LAST COLUMN WRITTEN * ALREADY BY PREVIOUS REQUEST) RB(NZ) ECV120 YES. THEN NO RUBOUT ! * * PREPARE THE RUBOUT * LD A3,DWTCN+DWTDEV,A6 GET CURRENT NEXT WRITE POSITION SU A3,DWTSN+DWTDEV,A6 SUBTRACT WITH NEXT WRITE POSITION * SAVED AFTER PREVIOUS REQUEST ANK A2,LCWBIT BIT 9 SET ? (=LAST COLUMN WRITTEN, * DURING REQUEST !) RF(Z) ECV170 NO ADK A3,1 YES. MODIFY TO RUBOUT ALSO LAST COLUMN ECV170 EQU * ADK A3,0 ANY ECHOED CHARACTERS TO RUBOUT ? RB(Z) ECV120 NO * * DO THE RUBOUT * CF A15,RESCN RESTORE SAVED WRITE POS. AS CURRENT NEXT CF A5,STAWRI START NEW WRITE REQUEST TO DO RUBOUT RF(NZ) DEVERR STATUS NOT OK ECV180 EQU * LDK A2,SPACE GET SPACE TO DO RUBOUT WITH CF A5,OUTCHA OUTPUT IT RF(NZ) DEVERR STATUS NOT OK SUK A3,1 ONE MORE CHAR TO RUBOUT ? RB(NZ) ECV180 YES CF A5,ENDWRI END THE WRITE REQUEST RF(NZ) DEVERR STATUS NOT OK RB ECV100 GO SET CURSOR EJECT * ******************************************************** * * S C R E E N S E C T I O N * D E V I C E D R I V E R P A R T * E R R O R R O U T I N E * ******************************************************** * * * ENTERED: FROM DEVICE DRIVER PART, * AT ERROR STATUS AT RETURN FROM LINE DRIVER PART * * FUNCTION: 1. INDICATE STATUS 'NOT OPERABLE' FOR ECBRC * 2. EXIT FROM DRIVER * * INPUT: A6 = DWT ADDRESS * * OUTPUT: A1 = BIT 15 =1 (STATUS NOT OPERABLE) * A6 = DWT ADDRESS * ********************************************************* * DEVERR EQU * LDK A1,OPERR STATUS NOT OPERABLE (FOR ECBRC) ABL ACV410 EXIT: ENDIO AND DISPATCH EJECT * ***************************************************************** * * S C R E E N S E C T I O N * D E V I C E D R I V E R P A R T * S U B - R O U T I N E S * ***************************************************************** * * * * -CHKOUT CHECK IF LAST COLUMN WRITTEN, AND OUTPUT ONE CHARACTER * -ECHOUT OUTPUT ONE CHARACTER IN ECHO MODE * -NXTROW UPDATE ROW COUNTER TO NEXT ROW, * AND IF NECESSARY HANDLE SCROLL. * -NXTCOL CALLED AFTER WRITE IN CURRENT COLUMN, SO: * UPDATE COLUMN COUNTER TO NEXT COLUMN, * AND IF NECESSARY HANDLE LAST-COLUMN-WRITTEN. * -SAVCN SAVE CURRENT NEXT WRITE POSITION * -RESCN RESTORE SAVED WRITE POSITION TO BECOME CURRENT NEXT * * * EJECT * ******************************************************** * * C H K O U T * ********************************************************* * * * CALL: CF A5,CHKOUT * * USED BY: SCREEN SECTION, DEVICE DRIVER PART * * FUNCTION: 1. CHECK IF LAST COLUMN WRITTTEN, * AND IF SO END THE WRITE REQUEST AND START A NEW ONE. * 2. OUTPUT ONE CHARACTER * 3. UPDATE COLUMN COUNTER TO NEXT COLUMN * * INPUT: A2 = CHARACTER TO BE OUTPUT * A5 = DWT STACK POINTER * A6 = DWT ADDRESS * * OUTPUT: A2 = UNCHANGED ! * A4 = CHANGED * A5 = DWT STACK BASE * A6 = DWT ADDRESS * ****************************************************************** * CHKOUT EQU * LDR A4,A2 SAVE CHARACTER TO BE OUTPUT LD A2,DWTDEV,A6 ANK A2,LCWBIT BIT 9 SET ? (=LAST COLUMN WRITTEN) RF(Z) CHKO10 NO CF A5,ENDWRI END THE WRITE REQUEST RB(NZ) DEVERR STATUS NOT OK LD A2,DWTCN+DWTDEV,A6 NOW ALSO NEXT CHAR IN LAST COLUMN CF A5,STAWRI START NEW WRITE REQUEST RB(NZ) DEVERR STATUS NOT OK CHKO10 EQU * LDR A2,A4 RESTORE SAVED CHARACTER CF A5,OUTCHA OUTPUT IT RB(NZ) DEVERR STATUS NOT OK LDR A2,A4 RESTORE A2 AGAIN CF A15,NXTCOL UPDATE COLUMN COUNTER TO NEXT COLUMN ABL NDRET RETURN VIA A5-STACK EJECT * ************************************************************ * * E C H O U T * ************************************************************ * * * CALL: CF A5,ECHOUT * * USED BY: SCREEN SECTION, DEVICE DRIVER PART * * FUNCTION: OUTPUT ONE CHARACTER IN ECHO MODE * OBS: COLUMN COUNTER IS NOT UPDATED * * INPUT: A2 = ECHO CHARACTER * A5 = DWT STACK POINTER * A6 = DWT ADDRESS * * OUTPUT: A2 = CHANGED * A4 = CHANGED * A5 = DWT STACK BASE * A6 = DWT ADDRESS * ******************************************************** * ECHOUT EQU * LDR A4,A2 SAVE CHARACTER TO BE OUTPUT LD A2,DWTCN+DWTDEV,A6 GET CURRENT NEXT WRITE POSITION CF A5,STAWRI START THE WRITE REQUEST RB(NZ) DEVERR STATUS NOT OK LDR A2,A4 RESTORE SAVED CHARACTER CF A5,OUTCHA OUTPUT IT RB(NZ) DEVERR STATUS NOT OK CF A5,ENDWRI END THE WRITE REQUEST RB(NZ) DEVERR STATUS NOT OK ABL NDRET RETURN VIA A5-STACK EJECT * ********************************************************** * * N X T R O W * ********************************************************** * * * CALL: CF A5, NXTROW * * USED BY: SCREEN SECTION, DEVICE DRIVER PART * * FUNCTION: UPDATE ROW COUNTER TO NEXT ROW, * AND IF NECESSARY HANDLE SCROLL * * INPUT: A5 = DWT STACK POINTER * A6 = DWT ADDRESS * * OUTPUT: A2 = CHANGED * A4 = CHANGED * A5 = DWT STACK BASE * A6 = DWT ADDRESS * ********************************************************** * NXTROW EQU * LC A4,DWTCNR+DWTDEV,A6 GET CURRENT ROW NUMBER CCK A4,MAXROW = LAST ROW ? RF(E) NXTR10 YES. START SCROLLING LDKL A2,/0100 POSITION DISPLACEMENT = ONE ROW ADS A2,DWTCNR+DWTDEV,A6 INCR CURRENT ROW NUMBER LD A4,DWTDEV,A6 ANK A4,ROLBIT BIT 8 SET ? (=ALREADY IN SCROLL MODE) RF(Z) NXTR40 NO. THEN RETURN * * CONTINUE SCROLLING * LC A4,DWTCNR+DWTDEV,A6 GET CURRENT ROW NUMBER AFTER LF CCK A4,MAXROW = LAST ROW ? RF(E) NXTR40 YES. THE NO RUBOUT ONE ROW IN ADVANCE. * * CONTINUE RUBOUT * LD A2,DWTCN+DWTDEV,A6 GET CURRENT NEXT WRITE POSITION ADKL A2,/0100 RUBOUT ONE ROW IN ADVANCE LDK A4,/50 ONE ROW CONTAINS 80 CHAR TO RUBOUT RF NXTR20 GO DO RUBOUT * * START SCROLLING AND RUBOUT * NXTR10 EQU * LDK A4,ROLBIT SET BIT 8 (SCROLL MODE) ORS A4,DWTDEV,A6 INTO DWT LDK A2,/01 SET FIRST ROW SC A2,DWTCNR+DWTDEV,A6 AS CURRENT WRITE ROW LDK A4,/A0 TWO ROWS CONTAIN 160 CHAR TO RUBOUT LD A2,DWTCN+DWTDEV,A6 GET CURRENT NEXT WRITE POSITION NXTR20 EQU * ANKL A2,/FF00 RUB FROM BEGIN OF THAT ROW ADK A2,1 BEGIN OF ROW IS COLUMN 1 (NOT 'ZERO') CF A5,STAWRI START NEW WRITE REQUEST TO RUBOUT RB(NZ) DEVERR STATUS NOT OK NXTR30 EQU * LDK A2,SPACE GET SPACE TO DO RUBOUT WITH CF A5,OUTCHA OUTPUT IT RB(NZ) DEVERR STATUS NOT OK SUK A4,1 ONE MORE TIME ? RB(NZ) NXTR30 YES CF A5,ENDWRI END THE WRITE REQUEST RB(NZ) DEVERR STATUS NOT OK NXTR40 EQU * ABL NDRET RETURN VIA A5 STACK EJECT * ********************************************************* * * N X T C O L * ********************************************************* * * * CALL: CF A15,NXTCOL * * USED BY: SCREEN SECTION, DEVICE DRIVER PART * * FUNCTION: CALLED AFTER WRITE IN CURRENT COLUMN, SO: * 1. IF LAST COLUMN NOT WRITTEN, * UPDATE COLUMN COUNTER TO NEXT COLUMN. * 2. IF LAST COLUMN WRITTEN, * SET BIT 9 IN DWTDEV. * * INPUT: NONE. * * OUTPUT: A4 CHANGED. * *********************************************************** * NXTCOL EQU * LD A4,DWTDEV,A6 ANK A4,LCWBIT BIT 9 SET ? RF(NZ) NXTC20 YES. LAST COLUMN IS WRITTEN LC A4,DWTCNC+DWTDEV,A6 GET CURRENT NEXT WRITE COLUMN CCK A4,MAXCOL = LAST COLUMN ? RF(NE) NXTC10 NO LDK A4,LCWBIT LAST COLUMN WRITTEN ORS A4,DWTDEV,A6 SET BIT 9 RF NXTC20 NXTC10 EQU * IM DWTCN+DWTDEV,A6 INCR CURRENT NEXT WRITE COLUMN NXTC20 EQU * RTN A15 RETURN EJECT * ********************************************************* * * S A V C N * ********************************************************** * * * CALL: CF 15,SAVCN * * USED BY: SCREEN SECTION, DEVICE DRIVER PART * * FUNCTION: 1. SAVE DWTCN (CURRENT NEXT WRITE POSITION) INTO DWTSN * 2. SAVE DWTDEV BIT 9 INTO BIT 10 * * INPUT: NONE * * OUTPUT: A2,A4 CHANGED * *************************************************************** * SAVCN EQU * * COPY DWTDEV BIT 9 INTO BIT 10 LD A4,DWTDEV,A6 LDR A2,A4 SAVE INTO A2 ANK A4,LCWBIT GET BIT 9 (SET IF LAST COLUMN WRITTEN) LDK A2,LCPBIT BIT 10 (SET IF LAST COLUMN WRITTEN * ALREADY BY PREVIOUS REQUEST) C1R A2,A2 COMPLEMENT ANS A2,DWTDEV,A6 RESET BIT 10 SRL A4,1 SHIFT BIT 9 INTO BIT 10 ORS A4,DWTDEV,A6 STORE INTO DWT * COPY DWTCN INTO DWTSN LD A2,DWTCN+DWTDEV,A6 GET CURRENT NEXT WRITE POSITION ST A2,DWTSN+DWTDEV,A6 SET SAVED WRITE POSITION RTN A15 RETURN EJECT * *********************************************************** * * R E S C N * ************************************************************ * * * CALL: CF A15,RESCN * * USED BY: SCREEN SECTION,DEVICE DRIVER PART * * FUNCTION: 1. RESTORE, FROM DWTSN INTO DWTCN, * SAVED WRITE POSITION TO BECOME CURRENT NEXT. * 2. RESTORE DWTDEV BIT 9 FROM BIT 10. * * INPUT: NONE. * * OUTPUT: A2,A4 CHANGED. * ************************************************************** * RESCN EQU * * COPY DWTDEV BIT 10 INTO BIT 9 LD A4,DWTDEV,A6 ANK A4,LCPBIT GET BIT 10 (SET IF LAST COLUMN WRITTEN * ALREADY BY PREVIOUS REQUEST) LDK A2,LCWBIT BIT 9 (SET IF LAST COLUMN WRITTEN) C1R A2,A2 COMPLEMENT ANS A2,DWTDEV,A6 RESET BIT 9 SLL A4,1 SHIFT BIT 10 INTO BIT 9 ORS A4,DWTDEV,A6 STORE INTO DWT * COPY DWTSN INTO DWTCN LD A2,DWTSN+DWTDEV,A6 GET SAVED NEXT WRITE POSITION ST A2,DWTCN+DWTDEV,A6 RESTORE CURRENT NEXT WRITE POSITION RTN A15 RETURN EJECT * ********************************************************** * * S C R E E N S E C T I O N * L I N E D R I V E R P A R T * A C T I V A T I O N R O U T I N E S * ********************************************************** * * * THEESE ACTIVATION ROUTINES ARE CALLED DIRECTLY * FROM THE SCREEN SECTION DEVICE DRIVER PART OF THIS DRIVER. * RETURN TO DEVICE DRIVER PART IS MADE VIA THE NETWORK DISTRIBUTOR. * * EJECT * ***************************************************** * * S T A W R I * ***************************************************** * * * CALL: CF A5, STAWRI * * USED BY: SCREEN SECTION, DEVICE DRIVER PART * * FUNCTION:TO DEFINE, FOR THIS CIO-REQUEST, * THE START WRITE POSITION ON SCREEN. * * INPUT: A2 = WRITE POSITION ON SCREEN * ( /0101-/1850 ) * A6 = DWT-ADDRESS * * OUTPUT: A1 = RETURN CODE * 0 IF OK, NOT 0 IF ERROR * A2 = DESTROYED * ****************************************************** * STAWRI EQU * CF A15,NDSAV8 SAVE A3-A5, A7-A8 INTO DWT CF A15,CONPOS CONVERT SCREEN POSITION * INTO SCREEN MEMORY DISPLACEMENT CF A15,IXTERM INDEX SCREEN MEMORY DISPL. WITH TERM. NBR ST A2,DWTLD1,A6 SAVE SCREEN MEMORY LOCATION * (=BIO FOR CIO START) CF A15,CWTDWT GET CWT FROM DWT INH LD A3,CWTDOS,A5 ANY DWT OCCUPYING SCREEN SECTION ? RF(Z) STAWR2 NO STAWR1 EQU * CF A15,PUTQUE PUT REQUESTING DWT INTO SCREEN QUEUE ABL TDISP DISPATCH STAWR2 EQU * ST A6,CWTDOS,A5 OCCUPY SCREEN SECTION OF VCCU1/4 IFT IOP=0 RF CLESC2 DO CIO START XIF IFT IOP=1 CM CWTBIN,A5 RESET INDEX IN IOP-BUFFER ABL NDREPO POP REGISTERS, SET OK-STATUS AND RETURN XIF EJECT * **************************************************** * * O U T C H A * **************************************************** * * * CALL: CF A5,OUTCHA * * USED BY: SCREEN SECTION, DEVICE DRIVER PART * * FUNCTION:TO OUTPUT ONE VIDEO CHARACTER * * INPUT: A2 = ASCII-CHARACTER (/20-/7F) * A6 = DWT-ADDRESS * * OUTPUT: A1 = RETURN CODE * 0 IF OK, NOT 0 IF ERROR * A2 = DESTROYED * ****************************************************** * OUTCHA EQU * CF A15,NDSAV8 SAVE A3-A5, A7-A8 INTO DWT * * A 7-BIT ASCII-CHAR IS CONVERTED, * ACCORDING TO CHARACTER GENERATOR IN SYSTEM AND CURRENT DISPLAY MODE, * INTO A 11-BIT VIDEO-CHARACTER. * ANK A2,/7F CLEAR INSIGNIFICANT BITS LDK A4,CODOUT-CODINP LENGTH OF CONVERSION TABLE OUTCH1 EQU * SUK A4,1 DECR INDEX IN TABLE. END OF TABLE ? RF(N) OUTCH2 YES CC A2,CODINP,A4 COMPARE CHAR WITH TABLE ELEMENT RB(NE) OUTCH1 NOT EQUAL LC A2,CODOUT,A4 CONVERT CHARACTER OUTCH2 EQU * LD A3,DWTDEV,A6 GET DISPLAY-MODE ANKL A3,INTBIT+UNDBIT BITS ORR A2,A3 INTO BIO * * CF A15,CWTDWT GET CWT FROM DWT OUTCH3 EQU * INH IFT IOP=0 EX CWTOTS,A5 EXECUTE OTR ON SCREEN SECTION OF VCCU1/4 ABL(NA) LINER1 ERROR IF NOT ACCEPTED ABL TDISP DISPATCH XIF IFT IOP=1 LD A3,CWTBIN,A5 GET WORD-INDEX IN IOP-BUFFER ADR A3,A3 CONVERT TO DISPLACEMENT IN BYTES LDKL A4,CWTBUF GET ADDRESS TO IOP-BUFFER ADR A4,A5 IN CWT ADR A4,A3 INDEXING IN BUFFER STR A2,A4 STORE VIDEO-CHAR INTO IOP-BUFFER IM CWTBIN,A5 INCR BUFFER INDEX ABL NDREPO POP REGISTERS, SET OK-STATUS AND RETURN XIF EJECT * **************************************************** * * E N D W R I * ***************************************************** * * * CALL: CF A5,ENDWRI * * USED BY: SCREEN SECTION, DEVICE DRIVER PART * * FUNCTION:TO END CURRENT CIO-WRITE-REQUEST * * INPUT: A6 = DWT-ADDRESS * * OUTPUT: A1 = RETURN CODE * 0 IF OK, NOT O IF ERROR * A2 = DESTROYED * ************************************************* * ENDWRI EQU * CF A15,NDSAV8 SAVE A3-A5, A7-A8 INTO DWT CF A15,CWTDWT GET CWT FROM DWT INH IFT IOP=0 LDKL A4,HLTFLA FLAG HALT-ACTION REQUESTED ORS A4,DWTST,A6 INTO DEVICE STATUS ABL IHS125 DO CIO HALT XIF IFT IOP=1 ENDWR1 EQU * LD A2,CWTBIN,A5 GET WORD-INDEX IN IOP-BUFFER RF(NZ) ENDWR2 INDEX NOT ZERO * IF INDEX IS ZERO, THEN NO OUTPUT CM CWTDOS,A5 SCREEN SECTION NO LONGER OCCUPIED ABL NDREPO POP REGISTERS, SET OK-STATUS AND RETURN ENDWR2 EQU * ORKL A2,IOPPAR WORD-MODE + READ-MEMORY TRANSFER EX CWTWE1,A5 WRITE BUFFER LENGTH INTO IOP LDKL A2,CWTBUF GET ADDRESS TO IOP-BUFFER ADR A2,A5 IN CWT EX CWTWE2,A5 WRITE BUFFER ADDRESS INTO IOP LDKL A3,SSTFLA FLAG SST-ACTION AT NEXT INTERRUPT ORS A3,DWTST,A6 INTO DEVICE STATUS RF CLESC2 DO CIO START XIF EJECT * *************************************************** * * O U T C U R * *************************************************** * * * CALL: CF A5,OUTCUR * * USED BY: SCREEN SECTION, DEVICE DRIVER PART * * FUNCTION:TO OUTPUT THE VISUAL CURSOR * * INPUT: A2 = REQUESTED CURSOR POSITION ON SCREEN * ( /0101 - /1850 ) * A6 = DWT-ADDRESS * * OUTPUT: A1 = RETURN CODE * 0 IF OK, NOT 0 IF ERROR * A2 = DESTROYED * *************************************************** * OUTCUR EQU * CF A15,NDSAV8 SAVE A3-A5, A7-A8 INTO DWT CF A15,CONPOS CONVERT SCREEN POSITION * INTO SCREEN MEMORY DISPLACEMENT CF A15,IXTERM INDEX SCREEN MEMORY DISPL. WITH TERM. NBR ST A2,DWTLD2,A6 SAVE SCREEN MEMORY LOCATION * (=BIO FOR OTR) LDKL A2,SMLCUR SCREEN MEM.LOC. HOLDING CURSOR POS. CF A15,IXTERM INDEX SCREEN MEMORY WITH TERMINAL NBR ST A2,DWTLD1,A6 SAVE SCREEN MEMORY LOCATION * (=BIO FOR CIO-START) LDKL A3,OTRFLA FLAG OTR-ACTION AT NEXT INTERRUPT ORS A3,DWTST,A6 INTO DEVICE STATUS CF A15,CWTDWT GET CWT FROM DWT INH LD A3,CWTDOS,A5 ANY DWT OCCUPYING SCREEN SECTION ? RB(NZ) STAWR1 YES. QUEUE REQUESTING DWT OUTCU1 EQU * ST A6,CWTDOS,A5 OCCUPY SCREEN SECTION OF VCCU1/4 IFT IOP=0 RF CLESC2 DO CIO START XIF IFT IOP=1 LDKL A3,OTRFLA IF THEN RESET OTR-FLAG XRS A3,DWTST,A6 IN DEVICE STATUS LD A3,DWTLD2,A6 GET SCREEN MEMORY CURSOR POSITION OUTCU2 EQU * ST A3,CWTBUF,A5 STORE INTO IOP-BUFFER CM CWTBIN,A5 RESET INDEX IN IOP-BUFFER IM CWTBIN,A5 INCR BUFFER INDEX RB ENDWR1 DO WER:S XIF EJECT * **************************************************** * * C L E S C R * **************************************************** * * * CALL: CF A5,CLESCR * * USED BY: SCREEN SECTION, DEVICE DRIVER PART * * FUNCTION:TO CLEAR SCREEN, RESET CURSOR AND * RESET START WRITE POSITION. * * INPUT: A6 = DWT-ADDRESS * * OUTPUT: A1 = RETURN CODE * 0 IF OK, NOT 0 OF ERROR * A2 = DESTROYED * *************************************************** * CLESCR EQU * CF A15,NDSAV8 SAVE A3-A5, A7-A8 INTO DWT LDKL A2,AUTCLE SET BIO FOR AUTO-CLEAR CF A15,IXTERM INDEX WITH TERMINAL NUMBER ST A2,DWTLD1,A6 SAVE BIO FOR CIO START LDKL A3,HLTFLA FLAG HALT-ACTION AT NEXT INTERRUPT ORS A3,DWTST,A6 INTO DEVICE STATUS CF A15,CWTDWT GET CWT FROM DWT INH LD A3,CWTDOS,A5 ANY DWT OCCUPYING SCREEN SECTION ? RB(NZ) STAWR1 YES. QUEUE REQUESTING DWT CLESC1 EQU * ST A6,CWTDOS,A5 OCCUPY SCREEN SECTION OF VCCU1/4 IFT IOP=1 LDKL A3,HLTFLA RESET HALT-FLAG XRS A3,DWTST,A6 IN DEVICE STATUS LDKL A3,/0120 SPACE (HIGH-INTENSITY MODE) RB OUTCU2 STORE INTO IOP-BUFFER AND DO WER:S XIF CLESC2 EQU * LD A3,PFPOST GET POWER FAIL POST PROCESSING FLAG ABL(NZ) LINER5 FLAG SET: I/O-INSTRUCTIONS NOT ALLOWED. LD A2,DWTLD1,A6 GET BIO FOR CIO START EX CWTCSS,A5 CIO START ON SCREEN SECTION OF VCCU1/4 ABL(NA) LINER0 ERROR IF NOT ACCEPTED CLESC3 EQU * LD A6,CWTSRD,A5 ANY SST-READY DWT ? ABL(Z) TDISP NO. DISPATCH CM CWTSRD,A5 YES. RESET SAVE-AREA ABL NDREPO POP REGISTERS, SET OK-STATUS AND RETURN EJECT * ***************************************************** * * S C R E E N S E C T I O N * L I N E D R I V E R P A R T * I N T E R R U P T R O U T I N E S * ***************************************************** * * * ENTERED: VIA THE INTERRUPT VECTOR * * FUNCTIONS FOR EACH INTERRUPT ROUTINE: * * 1. SAVE START ADDRESS OF ENTERED INTERRUPT ROUTINE. * 2. SAVE A1-A8 ONTO STACK. * 3. GET CWT-ADDRESS FOR ENTERED INTERRUPT ROUTINE. * 4. GET THE DWT OCCUPYING THE SCREEN SECTION OF THIS CWT. * 5. TEST CHANNEL UNIT STATUS. * 6. TEST AND UPDATE INTERRUPT-ACTION-FLAGS, * GO TO ERROR ROUTINE, OR: * 7. GO TO APROPRIATE ACTIVATION ROUTINE, * IN SCREEN SECTION LINE DRIVER PART, * OR * GET DWT FROM OUTPUT QUEUE, * AND GO TO APROPRIATE ACTIVATION ROUTINE. * * * * ON EXIT: A5 = CWT-ADDRESS * A6 = DWT-ADDRESS * *********************************************************** * * * EJECT * * * INTERRUPT FROM SCREEN SECTION OF VCCU1/4 NO 1 * IHSVU1 EQU * IFT VUCHAN=1 IHSVU2 EQU * IHSVU3 EQU * IHSVU4 EQU * IHSVU5 EQU * IHSVU6 EQU * IHSVU7 EQU * IHSVU8 EQU * XIF ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * LDKL A5,CWTVU1 SET CWT-ADDRESS FOR VCCU1/4 NO 1 IFF VUCHAN=1 RF IHS100 * * INTERRUPT FROM SCREEN SECTION OF VCCU1/4 NO 2 * IHSVU2 EQU * XIF IFT VUCHAN=2 IHSVU3 EQU * IHSVU4 EQU * IHSVU5 EQU * IHSVU6 EQU * IHSVU7 EQU * IHSVU8 EQU * XIF IFF VUCHAN=1 ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFF VUCHAN=1 IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * IFF VUCHAN=1 LDKL A5,CWTVU2 SET CWT-ADDRESS FOR VCCU1/4 NO 2 XIF IFT VUCHAN=2 IHS100 EQU * * XIF * IFF VUCHAN=1 IFF VUCHAN=2 RF IHS100 * * INTERRUPT FROM SCREEN SECTION OF VCCU1/4 NO 3 * IHSVU3 EQU * XIF IFT VUCHAN=3 IHSVU4 EQU * IHSVU5 EQU * IHSVU6 EQU * IHSVU7 EQU * IHSVU8 EQU * XIF IFF VUCHAN=1 IFF VUCHAN=2 ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 LDKL A5,CWTVU3 SET CWT-ADDRESS FOR VCCU1/4 NO 3 XIF IFT VUCHAN=3 IHS100 EQU * * XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 RF IHS100 * * INTERRUPT FROM SCREEN SECTION OF VCCU1/4 NO 4 * IHSVU4 EQU * XIF IFT VUCHAN=4 IHSVU5 EQU * IHSVU6 EQU * IHSVU7 EQU * IHSVU8 EQU * XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 LDKL A5,CWTVU4 SET CWT-ADDRESS FOR VCCU1/4 NO 4 XIF IFT VUCHAN=4 IHS100 EQU * XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 RF IHS100 * * INTERRUPT FROM SCREEN SECTION OF VCCU1/4 NO 5 * IHSVU5 EQU * XIF IFT VUCHAN=5 IHSVU6 EQU * IHSVU7 EQU * IHSVU8 EQU * XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1 - A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFT CPU852=0 MSR 8,A15 SAVE A1 - A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 LDKL A5,CWTVU5 SET CWT-ADDRESS FOR VCCU1/4 NO 5 XIF IFT VUCHAN=5 IHS100 EQU * XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 RF IHS100 * * INTERRUPT FROM SCREEN SECTION OF VCCU1/4 NO 6 * IHSVU6 EQU * XIF IFT VUCHAN=6 IHSVU7 EQU * IHSVU8 EQU * XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1 - A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 IFT CPU852=0 MSR 8,A15 SAVE A1 - A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 LDKL A5,CWTVU6 SET CWT-ADDRESS FOR VCCU1/4 NO 6 XIF IFT VUCHAN=6 IHS100 EQU * XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 IFF VUCHAN=6 RF IHS100 * * INTERRUPT FROM SCREEN SECTION OF VCCU1/4 NO 7 * IHSVU7 EQU * XIF IFT VUCHAN=7 IHSVU8 EQU * XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 IFF VUCHAN=6 ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1 - A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 IFF VUCHAN=6 IFT CPU852=0 MSR 8,A15 SAVE A1 - A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 IFF VUCHAN=6 LDKL A5,CWTVU7 SET CWT-ADDRESS FOR VCCU1/4 NO 7 XIF IFT VUCHAN=7 IHS100 EQU * XIF IFT VUCHAN=8 RF IHS100 * * INTERRUPT FROM SCREEN SECTION OF VCCU1/4 NO 8 * IHSVU8 EQU * ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1 - A8 ON STACK XIF * IFT VUCHAN=8 IFT CPU852=0 MSR 8,A15 SAVE A1 - A8 ON STACK XIF * IFT VUCHAN=8 LDKL A5,CWTVU8 SET CWT-ADDRESS FOR VCCU1/4 NO 8 IHS100 EQU * XIF EJECT * * * * COMMON PART FOR ALL SCREEN SECTION LINE DRIVER INTERRUPT ROUTINES * * LD A6,CWTDOS,A5 GET DWT OCCUPYING SCREEN SECTION OF CWT ABL(Z) LINER4 IF NOT OCCUPYED: CIO HALT+SST+DISPATCH IHS110 EQU * EX CWTSST,A5 EXECUTE SST ON SCREEN SECTION OF VCCU1/4 RF(NA) IHS120 NOT ACCEPTED LD A3,DWTST,A6 GET DEVICE STATUS ANKL A3,SSTFLA TEST SST-ACTION FLAG ABL(Z) LINER3 ERROR IF NOT SET * * END OF CIO-REQUEST * XRS A3,DWTST,A6 RESET SST-ACTION FLAG ST A6,CWTSRD,A5 SAVE SST-READY DWT CM CWTDOS,A5 SCREEN SECTION NO LONGER OCCUPYED * * GET AND CHECK QUEUED DWT * CF A15,GETQUE GET QUEUED DWT FROM SCREEN QUEUE ADK A6,0 ANY QUEUED DWT ? RB(Z) CLESC3 NO. GET SAVED SST-READY DWT LD A3,DWTST,A6 YES. GET DEVICE STATUS LDR A4,A3 ANKL A4,HLTFLA TEST HALT-ACTION FLAG RB(NZ) CLESC1 IF SET: CLEAR WAS QUEUED ANKL A3,OTRFLA TEST OTR-ACTION FLAG ABL(NZ) OUTCU1 IF SET: OUTPUT CURSOR WAS QUEUED ABL STAWR2 ELSE: WRITE SCREEN WAS QUEUED EJECT * * SST NOT ACCEPTED * IHS120 EQU * LD A3,DWTST,A6 GET DEVICE STATUS LDR A4,A3 ANKL A4,SSTFLA TEST SST-ACTION FLAG ABL(NZ) LINER2 ERROR IF SET LDR A4,A3 ANKL A4,HLTFLA TEST HALT-ACTION FLAG RF(Z) IHS130 NOT SET * * HALT-FLAG IS SET. DO CIO HALT. * IHS125 EQU * XRS A4,DWTST,A6 RESET HALT-ACTION FLAG EX CWTCHS,A5 CIO HALT ON SCREEN SECTION OF VCCU1/4 LDKL A3,SSTFLA FLAG SST-ACTION REQUESTED ORS A3,DWTST,A6 INTO DEVICE STATUS RB IHS110 DO SST IHS130 EQU * ANKL A3,OTRFLA TEST OTR-ACTION FLAG ABL(Z) NDREPO POP REGISTERS, SET OK-STATUS AND RETURN * * OTR-FLAG IS SET: DO OTR-CURSOR. * XRS A3,DWTST,A6 RESET OTR-ACTION FLAG LDKL A3,HLTFLA FLAG HALT-ACTION AT NEXT INTERRUPT ORS A3,DWTST,A6 INTO DEVICE STATUS LD A2,DWTLD2,A6 GET BIO FOR OTR-CURSOR ABL OUTCH3 DO OTR-CURSOR EJECT * **************************************************** * * S C R E E N S E C T I O N * L I N E D R I V E R P A R T * E R R O R R O U T I N E S * ***************************************************** * * * -LINER0 CIO START NOT ACCEPTED * -LINER1 OTR NOT ACCEPTED * -LINER2 SST NOT ACCEEPTED * -LINER3 SST UNEXPECTEDLY ACCEPTED (AFTER CIO START OR OTR, * BUT BEFORE CIO HALT) * -LINER4 UNEXPECTED INTERRUPT * -LINER5 I/O-INSTRUCTIONS TRIED DURING POWER FAIL POST PROCESSING * * EJECT * ************************************************* * * L I N E R X ( X = 0,1,2,3,4,5 ) * ************************************************* * * * CALL: ABL LINERX ( X = 0,1,2,3,4,5 ) * * USED BY: SCREEN SECTION, LINE DRIVER PART * * FUNCTION:1.TO RESET VCCU1/4 CONTROL UNIT SCREEN SECTION * AFTER I/O-ERROR, (LINER0-4) * 2. INDICATE THE ERROR IN THE RETURN CODE * AND RETURN TO DEVICE DRIVER PART * VIA NETWORK DISTRIBUTOR (LINER0-3, LINER5) * 3. DISPATCH. (LINER4) * * INPUT: A5 = CWT-ADDRESS * A6 = DWT-ADDRESS (IF LINER0-3) * * OUTPUT: A1 = RETURN CODE (IF LINER0-3, LINER5) * /8000 IF LINER0 * /4000 IF LINER1 * /2000 IF LINER2 * /1000 IF LINER3 * /0800 IF LINER5 * *********************************************** * LINER0 EQU * LDKL A1,CIOERR SET STATUS BIT 0 LINERR EQU * EX CWTCHS,A5 CIO HALT ON SCREEN SECTION OF VCCU1/4 EX CWTSST,A5 SST ON SCREEN SECTION OF VCCU1/4 LINERP EQU * CM CWTDOS,A5 SCREEN SECTION NO LONGER OCCUPYED LDKL A3,OTRFLA+HLTFLA GET ACTION-FLAGS ADKL A3,SSTFLA ALL ACTION-FLAGS C1R A3,A3 COMPLEMENT ANS A3,DWTST,A6 RESET ALL ACTION-FLAGS ABL NDREP POP REGISTERS AND RETURN WITH A1=STATUS * LINER1 EQU * LDKL A1,OTRERR SET STATUS BIT 1 RB LINERR * LINER2 EQU * LDKL A1,SSTERR SET STATUS BIT 2 RB LINERR * LINER3 EQU * LDKL A1,SSTER2 SET STATUS BIT 3 RB LINERR * LINER4 EQU * UNEXPECTED INTERRUPT EX CWTCHS,A5 CIO HALT ON SCREEN SECTION OF VCCU1/4 EX CWTSST,A5 SST ON SCREEN SECTION OF VCCU1/4 ABL TDISP DISPATCH * LINER5 EQU * I/O-INSTRUCTIONS TRIED DURING PFPOST LDKL A1,PFERR SET STATUS BIT 4 RB LINERP EJECT * ************************************************* * * S C R E E N S E C T I O N * L I N E D R I V E R P A R T * S U B - R O U T I N E S * ************************************************ * * * -CONPOS CONVERT SCREEN POSITION INTO SCREEN MEMORY DISPLACEMENT * -IXTERM INDEX SCREEN MEMORY DISPLACEMENT WITH TERMINAL NUMBER * -CWTDWT GET CWT-ADDRESS FROM DWT-ADDRESS * -PUTQUE PUT DWT INTO SCREEN OUTPUT QUEUE * -GETQUE GET DWT FROM SCREEN OUTPUT QUEUE * * EJECT * ********************************************************* * * C O N P O S * ********************************************************* * * * CALL: CF A15,CONPOS * * USED BY: SCREEN SECTION, LINE DRIVER PART * * FUNCTION:TO CONVERT A SCREEN POSITION * INTO A SCREEN MEMORY DISPLACEMENT * * INPUT: A2 = BITS 0-7: SCREEN POSITION ROW NUMBER 1-24 HEXADECIMAL * BITS 8-15: SCREEN POSITION COLUMN NUMBER 1-80 HEXADECIMAL * * OBS: NO CHECK IS MADE HERE, THAT INPUT IS WITHIN /0101-/1850 * * OUTPUT: A2 = SCREEN MEMORY DISPLACEMENT /0000-/077F * A3 = DESTROYED * ********************************************************* * CONPOS EQU * SUKL A2,/0101 SCREEN HOME POSITION IS DEFINED /0101 LDR A3,A2 SAVE INPUT ANK A2,/FF GET MODULO 80 * MULTIPLY (LINENUMBER-1) WITH 80 (=64+16) ANKL A3,/FF00 ALREADY MULTIPLIED WITH 256 SRL A3,2 NOW ONLY MULTIPLIED WITH 64 ADR A2,A3 ADD SRL A3,2 NOW ONLY MULTIPLIED WITH 16 ADR A2,A3 ADD RTN A15 RETURN EJECT * ********************************************************* * * I X T E R M * ********************************************************* * * * CALL: CF A15,IXTERM * * USED BY: SCREEN SECTION, LINE DRIVER PART * * FUNCTION:TO INDEX A SCREEN MEMORY DISPLACEMENT * WITH THE TERMINAL NUMBER OF CURRENT DWT * * INPUT: A2 = SCREEN MEMORY DISPLACEMENT * A6 = DWT-ADDRESS * * OUTPUT: A2 = SCREEN MEMORY LOCATION * A3 = DESTROYED * ******************************************************* * IXTERM EQU * LD A3,DWTCP2,A6 GET CHANNEL PARAMETERS 2 ANKL A3,/300 GET TERMINAL NUMBER (0-3) SLL A3,3 INTO BITS 3 AND 4 ORR A2,A3 COMBINE WITH SCREEN MEMORY DISPLACEMENT RTN A15 RETURN EJECT * ********************************************************* * * C W T D W T * ********************************************************* * * * CALL: CF A15,CWTDWT * * USED BY: SCREEN SECTION, LINE DRIVER PART * * FUNCTION:TO GET THE CWT-ADDRESS FOR THE CWT USED BY CURRENT DWT * * INPUT: A6 = DWT-ADDRESS * * OUTPUT: A5 = CWT-ADDRESS * NO DESTROYED REGISTERS * ************************************************************* * CWTDWT EQU * LDR* A5,A6 GET DWTCHP-CONTENTS ANK A5,/F BITS 12-15 = CHANNEL UNIT INDEX ADR A5,A5 GET CWTTAB-DISPLACEMENT FROM INDEX ADK A5,2 SKIP TABLE LENGTH ITEM LD A5,CWTTAB,A5 GET CWT-ADDRESS INTO A5 RTN A15 RETURN EJECT * ************************************************************** * * P U T Q U E * ************************************************************* * * * CALL: CF A15,PUTQUE * * USED BY: SCREEN SECTION, LINE DRIVER PART * * FUNCTION:TO QUEUE A DWT LAST IN SCREEN ECHO OUTPUT QUEUE, * IF DWT IN ECHO MODE, ELSE LAST IN SCREEN LKM OUTPUT QUEUE. * * INPUT: A5 = CWT-ADDRESS * A6 =DWT-ADDRESS * * OUTPUT: A3,A4,A7 = DESTROYED * *********************************************************** * PUTQUE EQU * * * SELECT ECHO- OR LKM-QUEUE * LD A7,DWTST,A6 GET DEVICE STATUS ANKL A7,/2000 DEVICE IN ECHO MODE ? RF(Z) PUTQ05 NO LDKL A7,CWTSEQ GET SCREEN ECHO OUTPUT QUEUE RF PUTQ07 PUTQ05 EQU * LDKL A7,CWTSLQ GET SCREEN LKM OUTPUT QUEUE PUTQ07 EQU * ADR A7,A5 ANCHOR * * QUEUE DWT INTO SELECTED QUEUE * LDR* A4,A7 GET FIRST QUEUED DWT. QUEUE EMPTY ? RF(Z) PUTQ20 YES PUTQ10 EQU * CWR A6,A4 CURRENT DWT ALREADY IN QUEUE ? RF(E) PUTQ60 YES LD A3,DWTOTQ,A4 GET DWT NEXT IN QUEUE RF(Z) PUTQ30 END OF QUEUE FOUND LDR A4,A3 FOLLOW THE QUEUE RB PUTQ10 PUTQ20 EQU * STR A6,A7 QUEUE DWT, IF QUEUE WAS EMPTY RF PUTQ40 PUTQ30 EQU * ST A6,DWTOTQ,A4 QUEUE DWT, IF QUEUE WAS NOT EMPTY PUTQ40 EQU * CM DWTOTQ,A6 SET END OF QUEUE PUTQ60 EQU * IFT CPU852=1 ABL IHRTN RETURN IN INHIBIT MODE XIF IFT CPU852=0 RTN A15 RETURN XIF EJECT * ***************************************************** * * G E T Q U E * ***************************************************** * * * CALL: CF A15,GETQUE * * USED BY: SCREEN SECTION, LINE DRIVER PART * * FUNCTION:TO GET FIRST DWT FROM SCREEN ECHO OUTPUT QUEUE, * OR, IF ECHO OUTPUT QUEUE IS EMPTY, * FROM SCREEN LKM OUTPUT QUEUE. * * INPUT: A5 = CWT-ADDRESS * * OUTPUT: A6 = DWT-ADDRESS (OR 0 IF NO DWT IN QUEUES) * A3 = DESTROYED * ***************************************************** * GETQUE EQU * LD A6,CWTSEQ,A5 GET FIRST DWT FROM ECHO OUTPUT QUEUE RF(Z) GETQ10 ECHO QUEUE EMPTY LD A3,DWTOTQ,A6 GET QUEUE LINK ST A3,CWTSEQ,A5 STORE IT INTO CWT RF GETQ30 GETQ10 EQU * LD A6,CWTSLQ,A5 GET FIRST DWT FROM LKM OUTPUT QUEUE RF(Z) GETQ30 ALSO LKM QUEUE EMPTY LD A3,DWTOTQ,A6 GET QUEUE LINK ST A3,CWTSLQ,A5 STORE IT INTO CWT GETQ30 EQU * IFT CPU852=1 ABL IHRTN RETURN IN INHIBIT MODE XIF IFT CPU852=0 RTN A15 RETURN XIF EJECT * **************************************************** * * P E R I P H E R A L S E C T I O N * L I N E D R I V E R P A R T * A C T I V A T I O N R O U T I N E S * ********************************************************* * * FOR THE PERIPHERAL SECTION OF THE VCCU1/4 * THIS DRIVER IS A LINE-DRIVER ONLY, * WHICH IS USED BY SEPARATE TERMINAL DEVICE DRIVERS. * BELOW APPEARS THOSE ACTIVATION ROUTINES WHICH ARE USING THE * PERIPHERAL SECTION OF THE VCCU1/4. * THE ACTIVATION ROUTINES ARE CALLED FROM TERMINAL DEVICE DRIVERS * VIA THE NETWORK DISTRIBUTOR. * * ******************************************************** * * CHARACTER INPUT * VUCHRI EQU * LDK A2,/20 ORS A2,DWTST,A6 SET INPUT REQUESTED IN DWT CF A15,NDSAV8 SAVE A3-A5, A7-A8 IN DWT RF VUDISP VIDEO DISPATCHER * * START OF A BLOCK * VUSTBL EQU * * * END OF A BLOCK * VUENBL EQU * ABL NDRETO RETURN TO DEVICE DRIVER. STATUS = OK. * * VIDEO DISPATCHER * VUDISP EQU * ABL TDISP GO TO DISPATCHER * * * CHARACTER OUTPUT * VUCHRO EQU * EJECT * ******************************************************* * * * FUNCTIONS: * * 1. SAVE A1-A8 ONTO STACK * 2. INHIBIT INTERRUPTS * 3. COMPUTE CWT FROM DWT * 4. TEST IF PERIPHERAL SECTION OUTPUT QUEUE IS EMPTY * 5. IF NOT THEN TEST IF DWT IS ALREADY IN CWT OUTPUT QUEUE, * FOR PERIPHERAL SECTION * IF NOT THEN QUEUE THE DWT LAST IN QUEUE, * STORE OUTPUT-CHARACTER INTO QUEUED DWT, * AND THEN DISPATCH. * ELSE: * 7. STORE OUTPUT-CHAR INTO ALREADY QUEUED DWT, * AND THEN DISPATCH. * ELSE: * 8. PREPARE TO SEND THE CHAR TO THE CHANNEL * 9. TEST IF THE DWT IS FOR DEVICE ON PERIPHERAL * SECTION ON CHANNEL. * IF NOT THEN NO OUTPUT, * ELSE: * 10. OUTPUT CHARACTER. * 11. IF OTR ACCEPTED * STORE INTO DWT THE CHAR BEING OUTPUT * AND RETURN TO DEVICE DRIVER. * 12. IF CHAR NOT ACCEPTED BY CHANNEL THEN * TEST IF CWT OUTPUT QUEUE IS EMPTY. * IF SO THEN: * 13. * START TIMER * AND SET OUTPUT QUEUE TIMER POINTER IN CWT. * 14. GO QUEUE DWT INTO CWT OUTPUT QUEUE * AND DISPATCH.(5-7) * * * * ON ENTRY: * * A2 = OUTPUT CHARACTER IN RIGHT BYTE * A6 = DWT-ADDRESS ************************************************************ * * * EJECT OUTPER EQU * CF A15,NDSAV8 SAVE A3-A5, A7-A8 IN DWT * * GET CWT FOR THIS DWT * INH INHIBIT INTERRUPT LDR* A1,A6 CHANNEL PARAMETER ANK A1,/F CHANNEL INDEX SLL A1,1 ADK A1,2 LD A5,CWTTAB,A1 GET CWT-ADDRESS INTO A5 RB(Z) VUDISP IF NO CWT: DISPATCH * * TEST IF PERIPHERAL SECTION OUTPUT QUEUE IS EMPTY * LD A4,CWTPQ,A5 IS OUTPUT QUEUE EMPTY ? RF(NZ) PER560 NO. THEN QUEUE DWT AND DISPATCH EJECT * * PREPARE TO SEND CHARACTER * PER500 EQU * LD A3,DWTCP2,A6 GET CHANNEL PARAMETERS 2 LDR A4,A3 ANK A3,/3 DEVICE ADDRESS * * TEST IF THE DEVICE IS ON THE PERIPHERAL SECTION OF CHANNEL * SUK A3,1 DEVICE-ADDRESS = 0 ? RF(N) PER520 IF SO, NO OUTPUT SUK A3,2 DEVICE-ADDRESS = 3 ? RF(Z) PER520 IF SO, NO OUTPUT * * IF NOT POWER FAIL POST PROCESSING, THEN * SEND CHARACTER TO CHANNEL * ADK A3,2 COMPUTE DEVICE-ADDRESS FOR BIO SRC A3,6 ANKL A4,/300 TERMINAL NUMBER ORR A3,A4 COMBINE DEV.ADDR. AND TERMINAL NUMBER ANK A2,/FF ORR A2,A3 BIO IS READY-MADE LD A3,PFPOST GET POWER FAIL POST PROCESSING FLAG RF(NZ) PER510 FLAG SET: I/O-INSTRUCTIONS NOT ALLOWED. EX CWTOTP,A5 EXECUTE OTR ON PERIPHERAL SECTION RF(NA) PER510 OTR NOT ACCEPTED * * OTR IS ACCEPTED. * SAVE OUTPUT CHARACTER INTO DWT, * THEN RETURN TO DEVICE DRIVER. * SC A2,DWTOCH,A6 SAVE OUTPUT ABL NDREPO POP REGISTERS,SET OK-STATUS AND RETURN * * OTR IS NOT ACCEPTED. * TEST IF PERIPHERAL SECTION OUTPUT QUEUE IS EMPTY. * PER510 EQU * LD A4,CWTPQ,A5 IS OUTPUT QUEUE EMPTY ? RF(NZ) PER560 NO. THEN ONLY QUEUE DWT, AND DISPATCH. * * OUTPUT QUEUE IS EMPTY, THEN * 1.START TIMER (AND SET TIMER POINTER). * 2.QUEUE DWT. * 3.DISPATCH * * PER520 EQU * LDKL A4,CWTTP TIMER POINTER ADR A4,A5 ADD WITH CWT-ADDRESS LDR A1,A5 PARAMETER (=CWT-ADDRESS) INTO A1 CF A15,SETIMP GET TIMER BLOCK DATA TIMOUT,QUETIM ADDRESS TO TIME-OUT ROUTINE AND DELAY RF PER570 QUEUE DWT WHEN QUEUE WAS EMPTY EJECT * * QUEUE OUTPUT * WHEN QUEUE NOT EMPTY (A4 POINTS TO FIRST QUEUED DWT) * PER560 CWR A6,A4 RF(E) PER600 THIS DWT IS ALREADY IN PERIPHERAL QUEUE LD A3,DWTOTQ,A4 GET DWT NEXT IN PERIPHERAL QUEUE RF(Z) PER580 END OF QUEUE FOUND LDR A4,A3 FOLLOW THE QUEUE RB PER560 * * QUEUE OUTPUT WHEN QUEUE IS EMPTY * PER570 ST A6,CWTPQ,A5 QUEUE DWT, IF QUEUE WAS EMPTY RF PER590 PER580 ST A6,DWTOTQ,A4 QUEUE DWT, IF QUEUE WAS NOT EMPTY PER590 CM DWTOTQ,A6 SET END OF QUEUE PER600 EQU * SC A2,DWTOCH,A6 STORE CHARACTER INTO DWT RB VUDISP DISPATCH * EJECT * ******************************************* * * P E R I P H E R A L S E C T I O N * L I N E D R I V E R P A R T * I N T E R R U P T H A N D L E R * ******************************************** * * FOR THE PERIPHERAL SECTION OF THE VCCU1/4 * THIS DRIVER IS A LINE DRIVER ONLY, WHICH IS USED BY * SEPARATE TERMINAL DEVICE DRIVERS. * BELOW APPEARS THE INTERRUPT HANDLING ROUTINES, * USING THE PERIPHERAL SECTION OF THE VCCU1/4. * THE ROUTINES ARE OF TWO KINDS: * * 1. INTERRUPT HANDLER FOR DATA INPUT. * THEESE INTERRUPT ROUTINES ARE ENTERED VIA THE INTERRUPT VECTOR. * * 2. INTERRUPT HANDLER FOR DATA OUTPUT. * THIS INTERRUPT ROUTINE IS ENTERED FROM THE MONITOR CLOCK ROUTINE, * AT SOFTWARE TIME-OUT. * EJECT * * **************************************************** * THIS IS THE INTERRUPT HANDLER FOR * DATA INPUT TO THE PERIPHERAL SECTION OF VCCU1/4. ******************************************************* * * * * ENTERED: * VIA THE INTERRUPT VECTOR. * * * FUNCTIONS FOR EACH INTERRUPT ROUTINE: * * 1. SAVE START ADDRESS OF ENTERED ROUTINE * 2. SAVE A1-A8 ONTO STACK * 3. GET CWT-ADDRESS FOR ENTERED INTERRUPT ROUTINE * 4. GET THE DATA INPUT FROM CHANNEL UNIT * 5. COMPUTE DWT FROM DATA INPUT * IF NO DWT EXISTS THEN EXIT, * ELSE: * 6. TEST IF STATUS- OR DATA-INPUT * IF STATUS-INPUT: INCREMENT ERROR ACKUMULATOR IN CWT AND THEN EXIT, * ELSE * 7. TEST IF DWT BELONGS TO INPUT-DEVICE. * IF NOT THEN EXIT, * ELSE: * 8. TEST IF INPUT REQUESTED OR NOT * IF INPUT REQUESTED: RETURN TO DEVICE DRIVER VIA NETWORK DISTRIBUTOR * ELSE: * 9. TEST IF ANY INTERRUPT ROUTINE DEFINED FOR THIS DEVICE * IF NOT THEN EXIT * ELSE: * ENTER DEVICE DEPENDANT INTERRUPT HANDLER. * * * * ON EXIT: * A2 = INPUT CHARACTER IN RIGHT BYTE * A6 = DWT ADDRESS * **************************************************** * * * INTERRUPT FROM PERIPHERAL SECTION OF VCCU1/4 NO 1 * IHPVU1 EQU * IFT VUCHAN=1 IHPVU2 EQU * IHPVU3 EQU * IHPVU4 EQU * IHPVU5 EQU * IHPVU6 EQU * IHPVU7 EQU * IHPVU8 EQU * XIF ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * LDKL A5,CWTVU1 SET CWT-ADDRESS FOR VCCU1/4 NO 1 IFT VUCHAN=1 EX CWTINR,A5 EXECUTE INR INSTRUCTION * XIF IFF VUCHAN=1 RF IHP100 * * INTERRUPT FROM PERIPHERAL SECTION OF VCCU1/4 NO 2 * IHPVU2 EQU * XIF IFT VUCHAN=2 IHPVU3 EQU * IHPVU4 EQU * IHPVU5 EQU * IHPVU6 EQU * IHPVU7 EQU * IHPVU8 EQU * XIF IFF VUCHAN=1 ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFF VUCHAN=1 IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * IFF VUCHAN=1 LDKL A5,CWTVU2 SET CWT-ADDRESS FOR VCCU1/4 NO 2 XIF IFT VUCHAN=2 IHP100 EX CWTINR,A5 EXECUTE INR-INSTRUCTION * XIF * IFF VUCHAN=1 IFF VUCHAN=2 RF IHP100 * * INTERRUPT FROM PERIPHERAL SECTION OF VCCU1/4 NO 3 * IHPVU3 EQU * XIF IFT VUCHAN=3 IHPVU4 EQU * IHPVU5 EQU * IHPVU6 EQU * IHPVU7 EQU * IHPVU8 EQU * XIF IFF VUCHAN=1 IFF VUCHAN=2 ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 LDKL A5,CWTVU3 SET CWT-ADDRESS FOR VCCU1/4 NO 3 XIF IFT VUCHAN=3 IHP100 EX CWTINR,A5 EXECUTE INR * XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 RF IHP100 * INTERRUPT FROM PERIPHERAL SECTION OF VCCU1/4 NO 4 * IHPVU4 EQU * XIF IFT VUCHAN=4 IHPVU5 EQU * IHPVU6 EQU * IHPVU7 EQU * IHPVU8 EQU * XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 LDKL A5,CWTVU4 SET CWT-ADDRESS FOR VCCU1/4 NO 4 XIF IFT VUCHAN=4 IHP100 EX CWTINR,A5 EXECUTE INR XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 RF IHP100 * * INTERRUPT FROM PERIPHERAL SECTION OV VCCU1/4 NO 5 * IHPVU5 EQU * XIF IFT VUCHAN=5 IHPVU6 EQU * IHPVU7 EQU * IHPVU8 EQU * XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1 - A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFT CPU852=0 MSR 8,A15 SAVE A1 - A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 LDKL A5,CWTVU5 SET CWT-ADDRESS FOR VCCU1/4 NO 5 XIF IFT VUCHAN=5 IHP100 EX CWTINR,A5 EXECUTE INR XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 RF IHP100 * * INTERRUPT FROM PERIPHERAL SECTION OF VCCU1/4 NO 6 * IHPVU6 EQU * XIF IFT VUCHAN=6 IHPVU7 EQU * IHPVU8 EQU * XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1 - A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 IFT CPU852=0 MSR 8,A15 SAVE A1 - A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 LDKL A5,CWTVU6 SET CWT-ADDRESS FOR VCCU1/4 NO 6 XIF IFT VUCHAN=6 IHP100 EX CWTINR,A5 EXECUTE INR XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 IFF VUCHAN=6 RF IHP100 * * INTERRUPT FROM PERIPHERAL SECTION OF VCCU1/4 NO 7 * IHPVU7 EQU * XIF IFT VUCHAN=7 IHPVU8 EQU * XIF IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 IFF VUCHAN=6 ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1 - A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 IFF VUCHAN=6 IFT CPU852=0 MSR 8,A15 SAVE A1 - A8 ON STACK XIF * IFF VUCHAN=1 IFF VUCHAN=2 IFF VUCHAN=3 IFF VUCHAN=4 IFF VUCHAN=5 IFF VUCHAN=6 LDKL A5,CWTVU7 SET CWT-ADDRESS FOR VCCU1/4 NO 7 XIF IFT VUCHAN=7 IHP100 EX CWTINR,A5 EXECUTE INR XIF IFT VUCHAN=8 RF IHP100 * * INTERRUPT FROM PERIPHERAL SECTION OF VCCU1/4 NO 8 * IHPVU8 EQU * ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1 - A8 ON STACK XIF * IFT VUCHAN=8 IFT CPU852=0 MSR 8,A15 SAVE A1 - A8 ON STACK XIF * IFT VUCHAN=8 LDKL A5,CWTVU8 SET CWT-ADDRESS FOR VCCU1/4 NO 8 IHP100 EX CWTINR,A5 EXECUTE INR XIF EJECT * * * DETERMINE FROM INPUT: TERMINAL NUMBER AND DEVICE ADDRESS * THEN COMPUTE DWT-ADDRESS * LDR A6,A2 GET INPUT-WORD (BIO) ANKL A6,TERMNR GET TERMINAL NBR WITHIN CHANNEL SRL A6,8 LDR A7,A2 GET INPUT WORD ANKL A7,DEVADR GET DEVICE ADDR WITHIN TERMINAL SRL A7,/A ADK A7,1 LD* A1,CWTITA,A5 GET ADDR TO WORKSTATION TABLE CF A15,NDGEDW GET DWT ADDRESS INTO A6 ADK A6,0 DWT ADDRESS FOUND ? ABL(Z) VUDISP NO. THEN EXIT * * TEST IF STATUS- OR DATA-INPUT * LDR A3,A2 SAVE INPUT-WORD ANK A2,INDATA CLEAN INPUT-WORD ANKL A3,INSTAT STATUS INPUT ? RF(Z) IHP150 NO * * STATUS INPUT * IM CWTACK,A5 INCR ERROR ACKUMULATOR ABL VUDISP EXIT * * DATA INPUT * IHP150 EQU * LD A7,DWTST,A6 DEVICE STATUS ANK A7,/60 MASK INPUT DEV. AND INPUT REQ. SUK A7,/40 RF(Z) IHP160 INPUT DEV. BUT NO INPUT REQUESTED ABL(N) VUDISP NO INPUT-DEVICE. THEN EXIT. * * INPUT DEV. WITH INPUT REQUESTED * LDKL A7,/FFDF ANS A7,DWTST,A6 RESET FLAG 'INPUT REQUESTED' LDK A1,0 RESET INDICATOR OF MORE THAN 1 CHAR ABL NDREP RETURN TO DEVICE DRIVER * * * GO TO INTERRUPT ROUTINE OF DEVICE DRIVER * IHP160 EQU * LD A1,DWTADR,A6 ADDRESS BLOCK LD A1,INTADR,A1 INTERRUPT ENTRY DEFINED? ABL(Z) VUDISP NO, SKIP CHARACTER LDR A5,A6 DWT ADDRESS ADKL A5,DWTSB2 STACK BASE ABR A1 DEVICE DRIVER INTERRUPT ENTRY EJECT * ****************************************** * THIS IS THE INTERRUPT HANDLER FOR * DATA OUTPUT TO THE PERIPHERAL SECTION OF THE VCCU1/4. ***************************************************** * * * ENTERED: * VIA THE MONITOR CLOCK TIME-OUT ROUTINE. * * * FUNCTIONS: * * 1. GET FIRST QUEUED DWT FOR PERIPHERAL SECTION OUTPUT PART OF THIS CWT * IF QUEUE EMPTY THEN: * 2. RESET OUTPUT QUEUE TIMER POINTER IN CWT, * AND DISPATCH. * ELSE: * 3. GET,FROM THAT FIRST QUEUED DWT, THE CHAR TO BE OUTPUT, * REMOVE THE DWT FROM CWT PERIPHERAL SECTION OUTPUT QUEUE * IF OUTPUT QUEUE IS STILL NOT EMPTY * THEN: RESTART TIMER * ELSE: * 4. * RESET OUTPUT QUEUE TIMER POINTER IN CWT. * 5. GO OUTPUT CHARACTER. * * * ON ENTRY: * A1 = TIME-OUT PARAMETER (CWT-ADDRESS) * * ON EXIT: * A2 = CHARACTER TO BE OUTPUT * A5 = CWT ADDRESS * A6 = DWT ADDRESS * ********************************************** * TIMOUT EQU * LDR A5,A1 CWT-ADDRESS INTO A5 * * CHECK PERIPHERAL SECTION OUTPUT QUEUE FOR THIS CWT * LD A6,CWTPQ,A5 GET NEXT DWT FROM OUTPUT QUEUE RF(NZ) TIM200 QUEUE NOT EMPTY * * PERIPHERAL SECTION OUTPUT QUEUE IS EMPTY AT THE TIMEOUT! * CM CWTTP,A5 RESET POINTER TO TIMER BLOCK ABL VUDISP DISPATCH * * PERIPHERAL SECTION OUTPUT QUEUE IS NOT EMPTY AT THE TIMEOUT. * GET QUEUED DWT AND TEST IF QUEUE IS EMPTY NOW. * TIM200 EQU * LD A3,DWTOTQ,A6 GET QUEUE LINK ST A3,CWTPQ,A5 STORE IT INTO CWT RF(Z) TIM210 NOW QUEUE IS EMPTY * * QUEUE STILL NOT EMPTY: RESTART TIMER. * LDKL A3,-QUETIM TIMEOUT VALUE ST* A3,CWTTP,A5 INTO TIMER BLOCK RF TIM220 GO OUTPUT ONE CHARACTER * * NOW QUEUE IS EMPTY * TIM210 EQU * CM CWTTP,A5 RESET POINTER TO TIMER BLOCK * * GET AND SEND ONE CHARACTER * TIM220 EQU * LC A2,DWTOCH,A6 GET CHARACTER FROM DWT ABL PER500 GO SEND CHARACTER EJECT * *************************************************************** * * L I N E D R I V E R R E C O V E R Y R O U T I N E * C O M M O N T O * S C R E E N A N D P E R I P H E R A L S E C T I O N S . * ***************************************************************** * * V U O N * * SUBROUTINE TO RESTART THE VIDEO CHANNEL UNITS AT POWER ON **************************************************** * * * CALL: CF A15,VUON * * * USED BY: 'PFINIT' * * FUNCTIONS: * * 1. SWITCH TO LEVEL 8, RUN-MODE, INH-MODE. * 2. TEST IF ALL CHANNELS IN SYSTEM HAVE BEEN TREATED. * IF SO THEN ENABLE INTERRUPTS AND RETURN FROM SUBROUTINE, * ELSE: * 3. GET CWT FOR NEXT CHANNEL. * IF NO CWT DEFINED THEN CONTINUE IN 2, * ELSE: * 4. CIO START INPUT ON PERIPHERAL SECTION OF CHANNEL * 5. RESET DATA AREAS USED BY SCREEN AND PERIPHERAL SECTIONS, * LINE DRIVER PART. * 6. FOR EACH TERMINAL ON THE CHANNEL * CALL DEVICE DEPENDANT RECOVERY ROUTINE * VIA NETWORK DISTRIBUTOR * 7. CONTINUE IN 2. * ******************************************************* * * * SWITCH TO LEVEL 8 (LOWER THAN LEVEL OF ANY VCCU1/4 ON ANY CPU, * HIGHER THAN LEVEL OF POWER FAIL OR DC) * VUON EQU * LDKL A2,VUON05 GET LEVEL 8 START ADDRESS STR A2,A15 STORE ONTO A15-STACK LDKL A2,PONPSW GET NEW PSW STR A2,A15 STORE ONTO A15-STACK RTN A15 ENTER LEVEL 8 VUON05 EQU * IFT CPU852=1 INH XIF * * LOOP OVER ALL CWT:S IN CWTTAB * LD A1,CWTTAB VUON10 SUK A1,2 ALL CWT:S TREATED ? RF(NZ) VUON20 NO TAKE NEXT * * RETURN AND ENABLE INTERRUPTS AND SWITCH BACK TO LEVEL 0. * LDK A1,/40 BIT FOR ENABLE MODE ORS A1,2,A15 INTO PSW ON STACK RTN A15 RETURN * * GET CWT * VUON20 LD A5,CWTTAB,A1 LOAD CWT-ADDRESS RB(Z) VUON10 NO CWT ADDRESS * * CIO START INPUT * EX CWTCSP,A5 EXECUTE CIO-START PERIPHERAL (INPUT) EJECT * * RESET DATA AREAS * USED BY SCREEN AND PERIPHERAL SECTIONS * LINE DRIVER PART * LDK A4,OTRFLA+HLTFLA GET ACTION-FLAGS ADKL A4,SSTFLA ALL ACTION FLAGS C1R A4,A4 COMPLEMENT LD A6,CWTDOS,A5 ANY DWT OCCUPYING SCREEN SECTION ? RF(NZ) VUON25 YES. GO RESET DWTST BITS 11,12,13. VUON22 EQU * CF A15,GETQUE GET QUEUED DWT FROM SCREEN QUEUE ADK A6,0 ANY (MORE) QUEUED DWT ? RF(Z) VUON27 NO. SCREEN QUEUE EMPTY VUON25 EQU * ANS A4,DWTST,A6 RESET ALL ACTION-FLAGS RB VUON22 GET NEXT (QUEUED) DWT VUON27 EQU * CM CWTDOS,A5 RESET INDICATOR OF DWT OCCUPYING SCREEN CM CWTSRD,A5 RESET INDICATOR SST-READY DWT (SCREEN) CM CWTPQ,A5 RESET OUTPUT QUEUE ON PERIPH. SECTION * * * PREPARE LOOP OVER ALL TERMINALS ON THE CHANNEL * LD* A3,CWTITA,A5 GET ADDRESS TO WORK-STATION TABLE RB(Z) VUON10 NO ADDRESS DEFINED IN TABLE LDK A6,0 RESET TERMINAL NUMBER * * START DEVICE DRIVER RECOVERY FOR ALL TERMINALS ON THE CHANNEL * VUON30 EQU * LDK A4,TCPON INDICATE RECOVERY CAUSE CF A15,NDREWS CALL RECOVERY FOR THIS WORK-STATION * (=TERMINAL) ADK A6,1 NEXT TERMINAL CWK A6,MAXTVU ANY MORE TERMINAL ON THIS CHANNEL ? RB(L) VUON30 YES RB VUON10 NO * * * END