|
|
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: 35666 (0x8b52)
Notes: pts_type(SC)
Names: »DRLT01.SC«
└─⟦3a2bec7de⟧ Bits:30009687 Philips computer tape "600313"
└─⟦this⟧ »M:821/DRLT01.SC«
└─⟦726a6c4ca⟧ Bits:30009685 Philips computer tape "600309"
└─⟦this⟧ »M:92D2/DRLT01.SC«
└─⟦dab19bdd7⟧ Bits:30009677 Philips computer tape "600218"
└─⟦this⟧ »M:261/DRLT01.SC«
IDENT DRLT01 REL 9.2 79-11-16 870105040920 =8,TIMER RESET,TEST ORDER,INH-A15 REL 9.1 79-05-23 =7,CLT010 DUBLE DEF LABEL, RB - ABL PRR 9.1 79-05-14 =6,CWT ADRESS ERROR A5 - A1 PRR 9.1 79-04-25 =5,GETLIN CORRECTED REL 9.1 79-04-06 =1-4, GEN UPDATE TO 8.2+ STATUS REL 8.2 79-04-02 =4,TIMER RESET CORRECTED REL 8.2 79-03-22 =3,NAK HANDLING CORRECTED REL 8.2 79-03-16 =2,IMPROV. OF TEST ORDER REL 8.2 79-01-11 =1,DISPL.RECV,NAK ERROR,ERR. RETRYCNT REL 8.2 78-09-15 * * ************************************************** * * PHILIPS TERMINAL SYSTEM PTS * * DRLT01 = DRIVER CHANNEL UNIT * FOR LOCAL TERMINALS * * * * * ********************************************* * * THIS IS THE CHANNEL UNIT DRIVER FOR LOCAL TERMINALS. * AT INTERRUPT AN INPUT WORD IS READ TO REGISTER A2. IF DATA * INPUT OR DATA REQUEST A BRANCH IS MADE TO INTERRUPT HANDLER * FOR ACTUAL DEVICE. * IF CONTROL CHARACTER, THIS IS EXAMINED AND NECESSARY ACTIONS * ARE CARRIED OUT. * * THE DRIVER ALSO INCLUDES THE FOLLOWING SUBROUTINES:- * * - OUTLIN SEND ONE CHARACTER VIA CHLT * * - CHLTON EXECUTE CIO-START ON EVERY CHLT IN SYSTEM * * - GETCHR GET ONE CHARACTER FROM ECB-BUFFER * * CONTROL WORK TABLES FOR THE CHANNELS ARE * INCLUDED IN THE DRIVER. EJECT * * * * THE FOLLOWING FUNCTIONS ARE ALSO INCLUDED IN THE DRIVER:- * * - OUTPUT SEND ONE CHARACTER, SAVE A3-A5 AND RETURN TO DISPATCHER * * - STREG SAVE A3-A5 AND RETURN TO DISPATCHER * * - LDREG IF INTERRUPT IS ALLOWED, RESTORE A3-A5 AND RETURN * TO USER VIA A5 * * - LDREGE RESTORE A3-A5 AND RETURN TO USER VIA A5 * * * * NORMAL REGISTER USAGE IN THE DRIVER:- * * A1 = RETURN CODE * A2 = INPUT WORD * A3 = LINE NUMBER * 2 * A4 = DEVICE NUMBER * 2 * A5 = CWT-ADDRESS * A6 = DWT-ADDRESS * A7 = ORDER * A8 = ECB-ADDRESS * * * EJECT * *********** * ENTRIES * *********** * * ENTRY CHLT1 INTERRUPT FROM CHLT01 ENTRY CHLT2 INTERRUPT FROM CHLT2 ENTRY CHLT3 INTERRUPT FROM CHLT3 ENTRY CHLT4 INTERRUP FROM CHLT4 ENTRY OUTLIN SEND ONE CHARACTER ENTRY CHLTON START OF CHLT ENTRY OUTPUT SAVE REGISTERS, SEND CHAR. AND DISPATCH ENTRY LDREG RESTORE A3-A5 ANDRETURN ENTRY LDREGE WAY BACK FROM ECHO HANDLING ENTRY LDREGF RETURN ENTRY STREG SAVE REGISTERS A3-A5 IN DWT ENTRY GETCHR GET ONE CHARACTER FROM ECB-BUFFER ENTRY LOCHAN NUMBER OF LOCAL CHANNEL UNITS ENTRY RECHAN NUMBER OF REMOTE CHANNEL UNITS ENTRY REMFC DUMMY ENTRY ENTRY DWREMU DUMMY ENTRY ENTRY ECHRTN RETURN FROM ECHO ENTRY ECHO ECHO ROUTINE ENTRY ECHEND END OF ECHO * EJECT * ****************************************** * EXTERNAL TOSS MODULE ENTRIES * ****************************************** * * EXTRN SAVE8 SAVE REGISTERS A1-A8 EXTRN TDISP DISPATCHER EXTRN IHRET8 RESTORE A1-A8 EXTRN INTLT1 INTERRUPT TABLE EXTRN INTLT2 INTERRUPT TABLE EXTRN INTLT3 INTERRUPT TABLE EXTRN INTLT4 INTERRUPT TABLE EXTRN SETIME GET TIMER BLOCK EXTRN SETIMP GET TIMER BLOCK EXTRN INTSAV SAVE AREA LAST INTERRUPT EXTRN TENDIO * * *********************************** * DWT PARAMETERS * *********************************** EXTRN DWTST STATUS EXTRN DWTOR ORDER EXTRN DWTOCH LAST OUTPUT CHARACTER EXTRN DWTECB ECB-ADDRESS EXTRN DWTADR ADDRESS TO ADDRESS-BLOCK EXTRN DWTWAT EXTRN DWTOTQ OUTPUT QUEUE EXTRN DWTA3 SAVE AREA A3 EXTRN DWTA4 SAVE AREA A4 EXTRN DWTA5 SAVE AREA A5 EXTRN DWTSB2 STACK BASE 2 IN DWT EXTRN DWTTP TIMER POINTER EXTRN DWTECH ECHO DEVICE DWT EXTRN INTADR INTERRUPT ADDRESS DISPLACEMENT EXTRN RECADR RECOVERY ADDRESS DISPLACEMENT EXTRN ECHADR ECHO ADDRESS DISPLACEMENT * EJECT * ************* * CONSTANTS * ************* * * NOERR EQU 1 RETURN CODE. NOT OPERABLE DUMMSP EQU /03 SPECIAL DUMMY DRQTIM EQU 30 * EJECT * ************************ * CONDITIONAL ASSEMBLY * ************************ * * A LOGG FUNCTION OF EVERY INPUT AND OUTPUT CHARACTER * MAY BE INCLUDED TO THE DRIVER BY SETTING X:A=1 * X:A EQU 1 LOGING EQU 0 * * THIS DRIVER HANDLES ONE OR UP TO FOUR LOCAL * CHANNELS BY SETTING X:B TO 1,2,3 OR 4 * X:B EQU 1 LOCHAN EQU 1 * * ACKUMULATORS FOR NAK, RETRANSMISSION FAULT AND * UNDEFINED CONTROL CHARACTERS ARE UPDATED IN * THE DRIVER. THIS FUNCTION CAN BE EXCLUDED FROM * DRIVER BY SETTING X:C = 0. * X:C EQU 1 ACKMUL EQU 0 * * BY SETTING X:D = 1 A SOFTWARE TIME OUT HANDLING * MISSING DATA REQUESTS FROM PRINTERS CAN BE INCLUDED * IN THE DRIVER. * AN ACKUMULATOR TO BE UPDATED EVERY TIME A SOFTWARE * TIME OUT OCCURS IS ALSO INCLUDED. * X:D EQU 1 SOFTIM EQU 0 * * * ECHO FONCTION CAN BE EXCLODED * BY SETTING X:E = 0 X:E EQU 1 CECHO EQU 01 * * * * A PROGRAM VERSION USING THE EXTENDED INSTRUCTION * SET IS OBTAINED BY SETTING CPU852 EQU 0. * CPU852 EQU 0 * EJECT RECHAN EQU 0 REMFC EQU 0 CWTRT1 EQU * CWTRT2 EQU * CWTRT3 EQU * CWTRT4 EQU * CWTRT5 EQU * CWTRT6 EQU * CWTRT7 EQU * CWTRT8 EQU * DWREMU EQU * EJECT * * ***************************************************** * C W T L T 1 * ***************************************************** * * CONTROL WORK TABLE FOR LOCAL TERMINAL NO. 1 * * DWA1 EQU /03 DEVICEADDRESS * CWTLT1 EQU * TABLE ENTRY CWTLDW EQU *-CWTLT1 LAST OUTPUT DWT-ADDRESS DATA 0 CWTLOW EQU *-CWTLT1 DATA 0 LAST OUTPUT WORD CWTITA EQU *-CWTLT1 ADDRESS TO INTLT1 DATA INTLT1 CWTINR EQU *-CWTLT1 INR INR A2,0,DWA1 CWTOTR EQU *-CWTLT1 OTR OTR A2,0,DWA1 CWTCIS EQU *-CWTLT1 CIO-START CIO A2,1,DWA1 CWTRTC EQU *-CWTLT1 DATA 0 RETRANSMISSION COUNTER CWTEQ EQU *-CWTLT1 END OF QUEUE DATA 0 CWTADD EQU *-CWTLT1 * IFT ACKMUL=1 * DATA 0 NAK-ACKUMULATOR DATA 0 RETR. FAULT-ACKUMULATOR DATA 0 UNDEFINED-INTERRUPT-ACKUMULATOR ACKTIM EQU *-CWTLT1 DATA 0 PRINTER TIMEOUT ACKUMULATOR * XIF EJECT * * ***************************************************** * C W T L T 2 * ***************************************************** * * CONTROL WORK TABLE FOR LOCAL TERMINAL NO. 2 * CWTLT2 EQU * * IFT LOCHAN=2 DWA2 EQU /13 DEVICE ADDRESS * DATA 0 LAST OUTPUT DWT-ADDRESS DATA 0 LAST OUTPUT WORD DATA INTLT2 INTERRUPT TABLE INR A2,0,DWA2 INR OTR A2,0,DWA2 OTR CIO A2,1,DWA2 CIO-START DATA 0 RETRANSMISSION COUNTER DATA 0 END OF QUEUE * IFT ACKMUL=1 * DATA 0 NAK-ACKUMULATOR DATA 0 RETR. FAULT-ACKUMULATOR DATA 0 UNDEFINED- INTERRUPT-ACKUMULATOR DATA 0 PRINTER TIMEOUT ACKUMULATOR * XIF * IFT LOCHAN=2 * EJECT XIF IFT LOCHAN=3 DWA2 EQU /13 DEVICE ADDRESS * DATA 0 LAST OUTPUT DWT-ADDRESS DATA 0 LAST OUTPUT WORD DATA INTLT2 INTERRUPT TABLE INR A2,0,DWA2 INR OTR A2,0,DWA2 OTR CIO A2,1,DWA2 CIO-START DATA 0 RETRANSMISSION COUNTER DATA 0 END OF QUEUE * IFT ACKMUL=1 * DATA 0 NAK-ACKUMULATOR DATA 0 RETR. FAULT-ACKUMULATOR DATA 0 UNDEFINED- INTERRUPT-ACKUMULATOR DATA 0 PRINTER TIMEOUT ACKUMULATOR * XIF * * XIF IFT LOCHAN=4 * * * CHANNEL UNIT WORK TABLE FOR LOCAL TERMINAL NO.2 * DWA2 EQU /13 DEVICE ADDRESS * DATA 0 LAST OUTPUT DWT-ADDRESS DATA 0 LAST OUTPUT WORD DATA INTLT2 INTERRUPT TABLE INR A2,0,DWA2 INR OTR A2,0,DWA2 OTR CIO A2,1,DWA2 CIO-START DATA 0 RETRANSMISSION COUNTER DATA 0 END OF QUEUE * IFT ACKMUL=1 * DATA 0 NAK-ACKUMULATOR DATA 0 RETR. FAULT-ACKUMULATOR DATA 0 UNDEFINED- INTERRUPT-ACKUMULATOR DATA 0 PRINTER TIMEOUT ACKUMULATOR * XIF EJECT * * * CHANNEL UNIT WORK TABLE FOR LOCAL TERMINAL NO.3 * CWTLT3 EQU * IFT LOCHAN=3 DWA3 EQU /23 DEVICE ADDRESS * DATA 0 LAST OUTPUT DWT-ADDRESS DATA 0 LAST OUTPUT WORD DATA INTLT3 INTERRUPT TABLE INR A2,0,DWA3 INR OTR A2,0,DWA3 OTR CIO A2,1,DWA3 CIO-START DATA 0 RETRANSMISSION COUNTER DATA 0 END OF QUEUE * IFT ACKMUL=1 * DATA 0 NAK-ACKUMULATOR DATA 0 RETR. FAULT-ACKUMULATOR DATA 0 UNDEFINED- INTERRUPT-ACKUMULATOR DATA 0 PRINTER TIMEOUT ACKUMULATOR * XIF * * IFT LOCHAN=4 DWA3 EQU /23 DEVICE ADDRESS * DATA 0 LAST OUTPUT DWT-ADDRESS DATA 0 LAST OUTPUT WORD DATA INTLT3 INTERRUPT TABLE INR A2,0,DWA3 INR OTR A2,0,DWA3 OTR CIO A2,1,DWA3 CIO-START DATA 0 RETRANSMISSION COUNTER DATA 0 END OF QUEUE * IFT ACKMUL=1 * DATA 0 NAK-ACKUMULATOR DATA 0 RETR. FAULT-ACKUMULATOR DATA 0 UNDEFINED- INTERRUPT-ACKUMULATOR DATA 0 PRINTER TIMEOUT ACKUMULATOR * XIF EJECT * * CONTROL WORK TABLE FOR LOCAL TERMINAL NO. 4 * CWTLT4 EQU * * * IFT LOCHAN=4 DWA4 EQU /33 DEVICE ADDRESS * DATA 0 LAST OUTPUT DWT-ADDRESS DATA 0 LAST OUTPUT WORD DATA INTLT4 INTERRUPT TABLE INR A2,0,DWA4 INR OTR A2,0,DWA4 OTR CIO A2,1,DWA4 CIO-START DATA 0 RETRANSMISSION COUNTER DATA 0 END OF QUEUE * IFT ACKMUL=1 * DATA 0 NAK-ACKUMULATOR DATA 0 RETR. FAULT-ACKUMULATOR DATA 0 UNDEFINED- INTERRUPT-ACKUMULATOR DATA 0 PRINTER TIMEOUT ACKUMULATOR * XIF * EJECT * ********************************************** * C H T A B * ********************************************** * * THIS TABLE HOLDS ADDRESSES OF CONTROLLER WORK * TABLES CWT TO CHANNEL UNITS FOR LOCAL AND REMOTE * TERMINALS. * * CHTAB EQU * DATA CHTABE-* TABLE LENGTH DATA CWTLT1 DATA CWTLT2 IFT LOCHAN=3 DATA CWTLT3 XIF IFT LOCHAN=4 DATA CWTLT3 DATA CWTLT4 XIF CHTABE EQU * END OF TABLE * * * * * EJECT * IFF LOCHAN=1 * * C H L T 1 / C H L T 2 * THIS IS THE INTERRUPT HANDLER FOR CHLT * * C H L T 1 * INTERRUPT FROM CHLT1 * XIF IFT LOCHAN=2 CHLT3 EQU * CHLT4 EQU * XIF IFF LOCHAN=1 CHLT1 EQU * ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFF LOCHAN=1 IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * IFF LOCHAN=1 LDKL A5,CWTLT1 SET CWT-ADDRESS FOR CHLT1 RF CLT010 * * C H L T 2 * INTERRUPT FROM CHLT2 * CHLT2 EQU * ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFF LOCHAN=1 IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * IFF LOCHAN=1 LDKL A5,CWTLT2 SET CWT-ADDRESS FOR CHLT2 XIF IFT LOCHAN=2 CLT010 EX CWTINR,A5 EXECUTE INR-INSTRUCTION * XIF * IFT LOCHAN=3 RF CLT010 * * C H L T 3 * INTERRUPT FROM CHLT3 * CHLT3 EQU * CHLT4 EQU * ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFT LOCHAN=3 IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * IFT LOCHAN=3 LDKL A5,CWTLT3 SET CWT-ADDRESS FOR CHLT3 CLT010 EX CWTINR,A5 EXECUTE INR * XIF IFT LOCHAN=4 RF CLT010 * * * C H L T 2 * INTERRUPT FROM CHLT3 * CHLT3 EQU * ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFT LOCHAN=4 IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * IFT LOCHAN=4 LDKL A5,CWTLT3 SET CWT-ADDRESS FOR CHLT3 RF CLT010 * C H L T 4 * INTERRUPT FROM CHLT4 * CHLT4 EQU * ST P,INTSAV SAVE LAST INTERRUPT IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFT LOCHAN=4 IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * IFT LOCHAN=4 LDKL A5,CWTLT4 SET CWT-ADDRESS FOR CHLT4 CLT010 EX CWTINR,A5 EXECUTE INR XIF * IFT LOCHAN=1 * * * C H L T 1 * * INTERRUPT FROM CHLT1 * CHLT1 EQU * CHLT2 EQU * CHLT3 EQU * CHLT4 EQU * IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFT LOCHAN=1 IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * IFT LOCHAN=1 LDKL A5,CWTLT1 GET CWT-ADDRESS ST P,INTSAV SAVE LAST INTERRUPT INR A2,0,DWA1 * XIF * IFT LOGING=1 CF A15,LOGG ** LOGG OF INPUT CHARACTER ** XIF EJECT * * * DETERMINE LINE- AND DEVICE NUMBER * LDK A1,0 RESET RETURN CODE LDR A3,A2 INPUT WORD IN A3 SRL A3,8 LDR A4,A3 ANK A3,/E 2 * LINE NUMBER IN A3 SRL A4,3 ANK A4,/E 2 * DEVICE NUMBER IN A4 ABL(NE) CLT100 INPUT IS A DATA CHARACTER ANK A2,/7F SUK A2,3 POWER ON ? RF(E) CHPOWO SUK A2,2 NAK ? =3 RF(Z) CLT035 =3 CLT015 EQU * =7(=3) * * * CHECK QUEUE AND SEND IF SOMETHING THERE * LDR* A7,A5 LAST OUTPUT DWT IN A7 CMR A5 RESET LAST OUTPUT LD A6,CWTEQ,A5 OUTPUT QUEUE RF(E) CLT020 STR A2,A15 SAVE A2 LD A2,DWTOTQ,A6 GET QUEUE LINK ST A2,CWTEQ,A5 STORE IT IN CWT LC A2,DWTOCH,A6 GET CHARACTER CF A15,OUTLIN SEND CHARACTER LDR* A2,A15 RELOAD A2 EJECT * * * CHECK CONTROL CHARACTER AND UPDATE ERROR- * ACKUMULATORS IF NAK, RETRANSMISSION FAULT * OR UNDEFINED CONTROL CHARACTER * CLT020 EQU * LDR A6,A7 GET LAST OUTPUT RF(E) CLT062 SUK A2,2 ACK ? =3 RF(Z) CLT040 ADK A2,7 TIME-OUT ? RF(E) CLT028 SUK A2,5 7 NAK ? =3 RF(Z) CLT032 =3 * IFT ACKMUL=1 * =1 =1 LDK A7,2 SUK A2,/16 RETRANSMISSION FAULT RF(E) CLT025 ADK A7,2 UNDEFINED INTERRUPT CLT025 ADR A7,A5 IM CWTADD,A7 INCREMENT ACKUMULATOR FOR THIS TYPE OF INTERRUPT * XIF * EJECT * * * NAK, TIME-OUT, RETRANSMISSION FAULT OR * UNDEFINED CONTROL CHARACTER * * CHECK LAST OUTPUT AND TRY RECOVERY OF THAT DEVICE * ONE TIME. IF NOT SUCCESS GO TO DRIVER WITH * MESSAGE NOT OPERABLE. * CLT028 EQU * LDKL A2,/3000 ECHO MODE AND RECOVERY BIT AN A2,DWTST,A6 AT LEAST ONE OF THE BITS SET ? RF(NE) CLT032 LDKL A2,/1000 INDICATE RECOVERY TRIAL DONE XRS A2,DWTST,A6 SET BIT IN STATUS WORD CLT030 LDK A3,2 INDICATE RECOVERY OF DEVICE LDK A4,1 =1 LDK A4,0 RF CPO025 CLT032 LDK A1,NOERR INDICATE NOT OPERABLE CM CWTRTC,A5 CLEAR RETRY COUNTER =1 ABL CLT110 EJECT * * * N A K * * ERROR ACKUMULATOR AND RETRANSMISSION COUNTER IS UPDATED. * LAST OUTPUT CHARACTER IS RETRANSMITTED BY CHANNEL DRIVER * UP TO SIX TIMES AND IF STILL NO SUCCESS RETURN CODE NOT * OPERABLE IS SENT TO DEVICE DRIVER. * CLT035 EQU * IFT ACKMUL=1 * IM CWTADD,A5 UPDATE ERROR ACKUMULATOR XIF * IM CWTRTC,A5 INCREMENT RETRANSMISSION COUNTER LD A4,CWTRTC,A5 GET COUNTER SUK A4,7 SEVEN TIMES ? RB(E) CLT015 =7(=3) LD A2,CWTLOW,A5 GET LAST OUTPUT WORD LDR A1,A5 EX CWTOTR,A1 EXECUTE OTR-INSTRUCTION =3 IFT LOGING=1 CF A15,LOGG ** LOGG OUTPUT CHARACTER ** XIF =3 ABL TDISP EJECT * * * ACK DATA = 07 * * SIMULATE DATA REQUEST IF RETURN CODE FROM * CHLT OR DEVICE WITHOUT DATA REQUEST, * ELSE GO TO DISPATCHER * CLT040 EQU * LDKL A7,/EFFF ANS A7,DWTST,A6 RESET RECOVERY BIT IN STATUS WORD LDR A1,A1 RF(NZ) CLT110 RETURN CODE,SIMULATE DATA REQUEST LDR* A7,A6 DEVICE WITHOUT DATA REQUEST? RF(N) CLT110 YES. SIMULATE DATA REQUEST * IFF SOFTIM=1 * CLT062 EQU * RF EXIT * XIF * * IFT SOFTIM=1 * EJECT * * * PRINTER TIMING * INH =4 =4 =4 LD A3,DWTTP,A6 ADDRESS TO TIMER BLOCK RF(E) CLT060 * * RESTART TIMER * LDKL A3,-DRQTIM RESTART TIMER ST* A3,DWTTP,A6 RF EXIT * * START TIMER * CLT060 LDR A1,A6 PARAMETER LDKL A4,DWTTP TIMER POINTER ADR A4,A6 ADD WITH DWT-ADDRESS CF A15,SETIMP GET TIMER BLOCK DATA DRQTUT,DRQTIM ADDRESS TO TIME-OUT ROUTINE AND DELAY CLT062 EQU * RF EXIT EJECT * * * RESET TIMER IF STARTED * =4 =4 =4 =4 =4 EJECT * * TIME-OUT ROUTINE HANDLING MISSING INTERRUPTS * FROM PRINTERS * DRQTUT EQU * LDR A6,A1 GET DWT-ADDRESS CM DWTTP,A6 RESET POINTER TO TIMER BLOCK LD A3,DWTST,A6 SLL A3,2 ECHO MODE ? RF(N) CLT110 YES * IFT ACKMUL=1 IFF LOCHAN=1 * LDR* A5,A6 CHANNEL PARAMETER ANK A5,/F SLL A5,1 2 * INDEX ADK A5,2 JUST TO AVOID TABLE LENGTH LD A5,CHTAB,A5 GET CWT-ADDRESS IM ACKTIM,A5 INCREMENT ACKUMULATOR * XIF IFT SOFTIM=1 IFT ACKMUL=1 IFT LOCHAN=1 * LDKL A5,CWTLT1 GET CWT-ADDRESS IM ACKTIM,A5 INCREMENT ACKUMULATOR * XIF IFT SOFTIM=1 * LD A7,DWTOR,A6 TEST ORDER ? =2 ANK A7,/FE U =9(=2) RB(E) CLT032 YES, GO TO DEV. INT. HANDLER =2 RB CLT030 NO, EXECUTE DEV. RECOVERY =2 * XIF * EJECT * * POWER ON DATA = 03 * * RECOVERY ROUTINES ARE STARTED FOR EVERY DEVICE * ON ACTUAL LINE EXCEPT THOSE OCCUPYING CHANNEL * UNIT OR THOSE IN ECHO MODE. * * * ON EXIT TO RECOVERY ROUTINE: * * A5 = STACKBASE 2 IN DWT * A6 = DWT-ADDRESS * A7 = ORDER * CHPOWO EQU * CF A15,GETLIN LDR* A2,A5 GET LAST OUTPUT DWT CM CWTRTC,A5 RESET RETRANSMISSION COUNTER LDK A4,0 LDR A3,A6 DEVICE COUNTER LDR A1,A8 ADDRESS POINTER RF(Z) EXIT EXIT IF NOT DEFINED CPO020 ADK A1,2 LDR* A6,A1 GET DWT-ADDRESS RF(E) CPO030 NO DWT SRC A6,1 RF(N) CPO030 SLC A6,1 LCR A7,A6 LEFT BYTE OF DWTCHP ANK A7,1 INPUT DEVICE ? RF(NE) CPO025 YES LDKL A7,/EFFF ANS A7,DWTST,A6 RESET RECOVERY BIT LC A7,DWTST,A6 ANK A7,/20 ECHO MODE ? RF(NE) CPO030 YES CWR A6,A2 DEVICE WAITING FOR CHANNEL ANSWER ? RF(E) CPO030 YES CPO025 LD A7,DWTADR,A6 ADDRESS TO ADDRESSBLOCK IN A7 LD A7,RECADR,A7 ADDRESS TO RECOVERY IN A7 RF(E) CPO030 NO RECOVERY LDKL A5,DWTSB2 STACKBASE ADR A5,A6 INH CFR A15,A7 GO TO RECOVERY ROUTINE CPO030 SUK A3,2 ALL DEVICES THREATED RB(NE) CPO020 NO TAKE NEXT EXIT ABL TDISP EJECT * * * DATA-REQUEST * CLT100 CF A15,GETLIN GET DWT-ADDRESS SUR A6,A4 VALID INTERRUPT ? RB(N) EXIT LDR A8,A8 RB(Z) EXIT EXIT NOT DEFINED LDR* A6,A8 GET DWT RB(E) EXIT ANKL A6,/FFFE LCR A7,A6 LEFT BYTE IN CHANNEL PARAMETER ANK A7,1 DATA INPUT ? RF(NE) CLT110 YES LDR* A7,A6 GET CHANNEL PARAMETER RB(N) EXIT CLT110 LD A7,DWTOR,A6 SET ORDER IN A7 ANK A7,/FF LD A8,DWTECB,A6 AND ECB-ADDRESS IN A8 IFT SOFTIM=1 LC A3,DWTOCH,A6 GET LAST CHARACTER =4 ANK A3,/7F =4 SUK A3,DUMMSP SPECIAL DUMMY=ETX ? =4 RF(NE) CLT120 NO =4 LDR* A3,A6 DEVICE WITHOUT DATA REQUEST ? =9 RF(N) CLT120 YES, DO NOT TOUCH TIMER POINTER =9 LD A3,DWTTP,A6 TIMER RUNNING ? =4 RF(E) CLT120 NO =4 INH =4 CM* DWTTP,A6 RESET TIMER =4 CM DWTTP,A6 RESET ADDRESS POINTER TO TIMER =4 CLT120 EQU * =4 XIF LD A3,DWTADR,A6 ADDRESS TO ADDRESS-BLOCK IN A3 ENB ABI INTADR,A3 GO TO INTERRUPT HANDLER * * THE FOLLOWING REGISTER VAULES ARE VALID WHEN ENTERING * THE DEVICE DEPENDANT INTERRUPT HANDLER:- * * A1 = ERROR CODE (A1=0 NOERROR) * (A1=1 NOT OPERABLE , HARDWARE TIME-OUT) * A6 = DWT-ADDRESS * * A7 = ORDER * * A8 = ECB-ADDRESS EJECT * * G E T L I N * * SUBROUTINE TO GET ADDRESS IN INTERRUPT TABLE 'INTLTX' * FOR A GIVEN LINE- AND DEVICE NUMBER * * ON ENTRY:- * * A3 = LINE NUMBER * 2 * A4 = DEVICE NUMBER * 2 * * ON EXIT:- * * A6 = TOTAL NUMBER OF DEVICES*2 ON ACTUAL LINE * A8 = ADDRESS IN 'INTLTX' WHERE DWT-ADDRESS IS FOUND * * GETLIN EQU * LD* A8,CWTITA,A5 ADDRESS TO INTERRUPT TABLE RF(Z) GTL010 =5 ADR A8,A3 POSITION IN TABLE LDR* A8,A8 ADDRESS TO TERMINAL SECTION RF(Z) GTL010 RETURN IF NOT DEFINED LDR* A6,A8 GET ID-WORD ANK A6,/FF TWO TIMES NUMBER OF DEVICES ADR A8,A4 ADDRESS TO DEVICE WORK TABLE POSITION GTL010 ABL RTNA15 RETURN AND ENB EJECT * * O U T L I N * * SUBROUTINE TO SEND ONE CHARACTER VIA CHANNEL UNIT. * * CHARACTER GIVEN IN A2 IS SENT VIA CHLT IF CONTROL * UNIT IS FREE. IN OTHER CASE DWT IS QUEUED ON A * OUTPUT QUEUE THREAD. * * ON ENTRY: * * A2 = OUTPUT CHARACTER IN RIGHT BYTE * A6 = DWT-ADDRESS * OUTLIN EQU * IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * * IFF LOCHAN=1 * LDR* A1,A6 CHANNEL PARAMETER ANK A1,/F CHANNEL INDEX SLL A1,1 ADK A1,2 LD A1,CHTAB,A1 GET CWT-ADDRESS IN A1 * XIF * * IFT LOCHAN=1 * LDKL A1,CWTLT1 * XIF * INH INHIBIT INTERRUPT LDR* A4,A1 IS UNIT FREE ? RF(E) OUL050 YES EJECT * * QUEUE OUTPUT * OUL005 LD A4,CWTEQ,A1 OUTPUT QUEUE RF(E) OUL020 OUL010 CWR A6,A4 RF(E) OUL060 THIS DWT IS ALREADY IN QUEUE LD A3,DWTOTQ,A4 RF(E) OUL030 END OF THREAD FOUND LDR A4,A3 FOLLOW THE THREAD RB OUL010 OUL020 ST A6,CWTEQ,A1 QUEUE DWT RF OUL040 OUL030 ST A6,DWTOTQ,A4 QUEUE DWT OUL040 CM DWTOTQ,A6 SET END OF THREAD RF OUL060 EJECT * * SEND CHARACTER * OUL050 LDR* A3,A6 GET CHANNEL PARAMETERS ANKL A3,/7F00 ANK A2,/FF ORR A2,A3 OUL055 EQU * EX CWTOTR,A1 EXECUTE OTR-INSTRUCTION RB(NA) OUL005 STR A6,A1 STORE LAST DWT IN CWT IFT LOGING=1 CF A15,LOGG ** LOGG OF OUTPUT CHARACTER ** XIF ST A2,CWTLOW,A1 STORE LAST OUTPUT IN CWT =6(=3) OUL060 SC A2,DWTOCH,A6 STORE OUTPUT CHARACTER IN DWT OUL070 EQU * IFT CPU852=1 ABL IHRET8 RESTORE A1-A8 AND RETURN XIF * IFT CPU852=0 MLR 8,A15 RESTORE A1-A8 FROM STACK... INH U =9 ADKL A15,2 ...AND =9 LDR* P,A15 RETURN =9 XIF * EJECT * * C H L T O N * * SUBROUTINE TO RESET CWT AND PERFORM CIO-START OF EVERY * CHLT IN SYSTEM. THE SUBROUTINE IS ENTERED FROM 'PFINIT' * CHLTON EQU * * IFF LOCHAN=1 * LD A1,CHTAB CON010 SUK A1,2 ALL TREATED ? RF(NZ) CON020 NO TAKE NEXT ABL RTNA15 RETURN AND ENB CON020 LD A5,CHTAB,A1 LOAD CWT-ADDRESS RB(Z) CON010 EX CWTCIS,A5 EXECUTE CIO-START LDR* A6,A5 GET LAST DWT RB(Z) CON010 CMR A5 RESET LAST OUTPUT LDK A2,0 CF A15,OUTLIN SEND CHARACTER RB CON010 * * XIF * * IFT LOCHAN=1 * CIO A2,1,DWA1 CIO-START LD A6,CWTLT1 GET LAST DWT RF(Z) CON010 CM CWTLT1 RESET LAST OUTPUT LDK A2,0 CF A15,OUTLIN SEND CHARACTER CON010 ABL RTNA15 RETURN AND ENB * XIF * EJECT * * O U T P U T * * SEND ONE CHARACTER VIA 'OUTLIN' INDICATE INTERRUPTS * ALLOWED AND SAVE A3-A5 IN DWT. * * OUTPUT EQU * ANK A2,/FF LDR A1,A2 SUK A1,/82 STX ? RF(E) LDRE10 SUK A1,/15 ETB ? RF(E) LDRE10 CF A15,OUTLIN SEND ONE CHARACTER VIA CHANNEL UNIT * * * S T R E G * * INDICATE INTERRUPTS ALLOWED AND SAVE A3-A5 IN DWT * * STREG EQU * INH LDKL A1,/100 ORS A1,DWTST,A6 INDICATE INTERRUPTS ALLOWED ST A3,DWTA3,A6 SAVE REGISTER A3 ST A4,DWTA4,A6 A4 ST A5,DWTA5,A6 A5 ABL EXIT =7 EJECT * * L D R E G * * IF INTERRUPT ALLOWED RESTORE A3-A5 FROM DWT AND RETURN * VIA A5. ELSE GO TO DISPATCHER. * * LDREG EQU * LD A3,DWTST,A6 ANKL A3,/100 ABL(Z) EXIT =4 XRS A3,DWTST,A6 * * * L D R E G E * * RESTORE A3-A5 FROM DWT AND RETURN TO USER VIA A5 * * LDREGF EQU * LD A5,DWTA5,A6 A5 LDREGE EQU * LD A3,DWTA3,A6 RELOAD REGISTER A3 LD A4,DWTA4,A6 A4 LDRE10 LD A7,DWTOR,A6 GET ORDER ANK A7,/FF LD A8,DWTECB,A6 RTN A5 RETURN VIA A5-STACK EJECT * * * G E T C H R * * SUBROUTINE TO GET ONE CHARACTER FROM ECB-BUFFER * * ON ENTRY: * * A3 = BUFFER INDEX * A8 = ECB-ADDRESS * * ON EXIT: * * A2 = CHARACTER * A1 = 0 IF LAST CHARACTER ELSE # 0 * * IF LAST CHARACTER IS REACHED A3 IS STORED IN ECB EFFECTIVE LENGTH * * GETCHR EQU * LD A1,4,A8 REQUESTED LENGTH SUR A1,A3 RF(NP) GCH010 LAST CHARACTER REACHED LD A2,2,A8 GET BUFFER ADDRESS ADR A2,A3 LCR A2,A2 CHAR. TO A2 ANK A2,/FF ADK A3,1 INCREMENT BUFFER INDEX RF GCH020 GCH010 ST A3,6,A8 STORE EFFECTIVE LENGTH GCH020 EQU * RTNA15 ADKL A15,2 RETURN AND ENABLE ENB LDR* P,A15 EJECT * * * L O G G * * IF CONDITIONALY ASSEMBLY IS SET EVERY INPUT AND * OUTPUT CHARACTER ARE LOGGED * * * IFT LOGING=1 * LOGG STR A1,A15 LD A1,POINT ADK A1,2 CWK A1,BUFE BUFE IS MAX LOGG AREA RF(NE) L1 LDKL A1,BUF SET FIRST LOGG ADDRESS L1 ST A1,POINT STR A2,A1 LOGG OF INR OR OTR INSTRUCTION LDR* A1,A15 ADKL A15,2 LDR* P,A15 RETURN * * POINT DATA BUF LOGG POINTER * BUF RES 63 LOGG AREA BUFE EQU * * XIF EJECT * * * E C H O , E C H E N D * * SUBROUTINE TO ECHO CHARACTER CONTAINING TWO PARTS, * ONE GENERAL AND ONE DEVICE-DEPENDENT * * PART ONE: FIND DWT-ADDRESS OF ECHO-DEVICE, * LOAD STACKBASE AND FIND ADDRESS * TO DEVICE-DEPENDENT ECHO-ROUTINE * * PART TWO: ECHO ONE OR MORE CHARACTERS * CORRESPONDING TO ONE CHARACTER * TO BE STORED IN INPUT ECB-BUFFER * * * PART ONE FOLLOWS AND PART TWO CAN BE FOUND * IN THE DRIVER MODULE CORRESPONDING TO ECHO * OUTPUT DEVICE * * RESTRICTIONS IN DEVICE DEPENDENT ECHO DRIVER * * A7 MUST NOT BE DESTROYED * THE ECHO-ROUTINE SHOULD BE TERMINATED WITH A * JUMP TO 'ECHRTN'. * ECHEND EQU * * IFT CECHO=1 * LDKL A7,/8000 INDICATE END I/O XIF ECHO EQU * IFT CECHO=1 ST A3,DWTA3,A6 SAVE A3-A5 IN DWT ST A4,DWTA4,A6 ST A5,DWTA5,A6 LD A1,DWTST,A6 STATUS SLL A1,2 RF(NN) RETUR NO ECHO REQUESTED LDR A4,A6 SAVE DWT-ADDRESS OF INPUT DEVICE LD A6,DWTECH,A6 DWT-ADDRESS OF OUTPUT DEVICE ST A4,DWTWAT,A6 SAVE DWT-ADDRESS OF INPUT DEVICE LDKL A5,DWTSB2 ADR A5,A6 STACKBASE-ADDRESS IN A5 LD A1,DWTADR,A6 ADDRESS TO ADDRESS-BLOCK ABI ECHADR,A1 GO TO ECHO-ROUTINE DEVICE-DEPENDENT XIF ECHRTN EQU * IFT CECHO=1 LDR A7,A7 END? RF(NN) ERETUR NO CF A15,TENDIO END I/O OUTPUT DEVICE ERETUR LD A6,DWTWAT,A6 RELOAD DWT-ADDRESS OF INPUT DEVICE RETUR ABL LDREGF RELOAD A3-A5 AND RETURN VIA A5 * END