|
|
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: 14026 (0x36ca)
Notes: pts_type(SC)
Names: »DRIC01.SC«
└─⟦13e5fd45a⟧ Bits:30009699 Philips computer tape "600507"
└─⟦this⟧ »TOSSWORK/DRIC01.SC«
IDENT DRIC01 REL 11.0 81-05-05 870105041100 =2, CMP ECBRL/MMUBUF SIZE REL 11.0 81-04-02 =1, ADDR.WR.REQ.IN WRONG QUEUE REL 11.0 81-01-26 * * ********************************************** * * PHILIPS TERMINAL SYSTEM PTS * * * DRIC01 = INTERTASK COMMUNICATION DRIVER * * * * * * * ********************************************** * * THIS MODULE HANDLES THE INTERTASK COMMUNICATION * EJECT DRIC01 * * *********** * ENTRIES * *********** * * ENTRY ITAD ADDRESS BLOCK ENTRY IT:BUF INTERTASK DRIVER BUFFER (MMU) EJECT DRIC01 * * ************* * EXTERNALS * ************* * * EXTRN TDISP DISPATCHER EXTRN TENDIO ENDIO EXTRN DISIOE REQUEST ERROR EXTRN DISEND TENDIO AND DISPATCH EXTRN DWTST DWT STATUS EXTRN DWTECB ECB ADDRESS EXTRN DWTADR DRIVER ADDRESS BLOCK EXTRN DWTTAB DWT TTAB ADDRESS EXTRN BUFLEN DRIVER BUFFER LENGTH EXTRN SETIMP TIMER EXTRN FNDTID FIND TTAB ADDRESS FROM TID EXTRN TTB:ID TASK IDENTIFICATION EXTRN TTB:ST TASK STATUS EXTRN TTB:TD TERMINAL DEVICES EXTRN IHRTN RTN A15 WITHOUT ENABLING INTERRUPTS EXTRN ECBBA ECB BUFFER ADDRESS EXTRN ECBRL ECB REQUESTED LENGTH EXTRN ECBEL ECB EFFECTIVE LENGTH EXTRN ECBCW ECB CONTROL WORD EJECT DRIC01 TOSSIO * * ***************************************** * * CONDITIONAL ASSEMBLY * ***************************************** * * A PROGRAM VERSION USING TOSS MMU PAGING * IS OBTAINED BY SETTING MMUPAG EQU 1. * MMUPAG EQU 0 * * * A PROGRAM VERSION USING THE EXTENDED INSTRUCTION * SET IS OBTAINED BY SETTING CPU852 EQU 0. * CPU852 EQU 1 * * MMU BUFFER SIZE (WORDS) * X:A EQU 50 DVBLEN EQU X:A * * INTERTASK DEVICE INDEX * DEVIND EQU 8 * EJECT DRIC01 * * ********************* * DWT DISPLACEMENTS * ********************* * * DWTDRD EQU /10 START OF DRIVER DEFINED PART * IFT MMUPAG=0 START EQU DWTDRD XIF * IFT MMUPAG=1 START EQU DWTDRD+4 XIF * DWTTP EQU START+/00 TIMER POINTER DWTIME EQU START+/02 TIME DWTANC EQU START+/04 POINTER TO FIRST DWT IN QUEUE DWTQUE EQU START+/06 QUEUE ANCHOR ADDRESS * EJECT DRIC01 * * ***************** * ADDRESS BLOCK * ***************** * * DATA DVBLEN+DVBLEN MMU BUFFER SIZE DATA DEVIND INTERTASK DEVICE INDEX ITAD DATA ICAD ACTIVATION ADDRESS DATA ITABRT ABORT ADDRESS * * RD:QUE DATA 0 QUEUE ANCHOR NOT-ADDRESSED READ REQ. WR:QUE DATA 0 QUEUE ANCHOR NOT-ADDRESSED WRITE REQ. * * INTERTASK DRIVER BUFFER (MMU) * IT:BUF EQU * IFT MMUPAG=1 RES DVBLEN+1 MMU BUFFER XIF * EJECT DRIC01 * * A C T I V A T I O N * * ORDERS: * * /02 READ * /06 WRITE * /39 SET TIMEOUT * * ENTRY PARAMETERS: * * A5 = STACK BASE 2 IN DWT * A6 = DWT ADDRESS * A7 = ORDER CODE * A8 = ECB ADDRESS * A12= ADDRESS TO DRIVER ADDRESS BLOCK * ICAD EQU * LDR A1,A7 ORDER CODE LD A7,ECBCW,A8 TASK ID OR TIME VALUE SUK A1,/02 RF(Z) READ READ REQUEST SUK A1,/06-/02 RF(Z) WRITE WRITE REQUEST SUK A1,/39-/06 RF(NZ) DIS:OE REQUEST ERROR * EJECT DRIC01 * * S E T T I M E O U T * ST A7,DWTIME,A6 RF END:IO * * REQUEST ERROR EXIT * DIS:OE ABL DISIOE REQUEST ERROR * EJECT DRIC01 * * READ REQUEST ENTRY * READ EQU * CHECK IF ADDRESSED REQUEST OR NOT ADK A7,0 CHECK ADDRESS MODE ABL(Z) RD:NAD NOT-ADDRESSED READ REQUEST * * WRITE REQUEST ENTRY * WRITE EQU * CHECK IF ADDRESSED WRITE REQUEST OR NOT ADK A7,0 CHECK ADDRESS MODE ABL(Z) WR:NAD NOT-ADDRESSED WRITE REQUEST * EJECT DRIC01 * * R E A D, A D D R E S S E D * * W R I T E, A D D R E S S E D * * FIND TTAB OF ADDRESSED TASK * CF A15,FNDTID TTAB ADDRESS TO A2 ADK A2,0 SET CR RB(Z) DIS:OE NOT FOUND ADKL A2,TTB:TD ADDRESS TO TERMINAL DEVICE TABLE LDR* A1,A2 TABLE LENGTH LDR A7,A12 DRIVER ADDRESS BLOCK XRK A7,1 IF INPUT, POINT TO OUTPUT BLOCK AND V.V. * EJECT DRIC01 * * FIND DWT OF ADDRESSED TASK * ITC:00 ADK A2,4 ADDRESS TO NEXT DWT ADDRESS SUK A1,4 RB(N) DIS:OE NOT FOUND * LDR* A4,A2 DWT ADDRESS CW A7,DWTADR,A4 SEARCHED DWT RB(NE) ITC:00 NO, TRY NEXT * LDR A2,A4 LD A1,DWTST,A2 ANY REQUEST RF(N) ITC:50 NO * LD A1,DWTQUE,A2 QUEUE ANCHOR ADDRESS CWR A1,A6 CHECK QUEUE ANCHOR RF(E) ITC:05 REQUEST ISSUED FOR THIS TASK * ANK A7,1 RF(Z) ITC:45 READ CWK A1,RD:QUE RF(NE) ITC:50 NO READ REQUEST IN READ QUEUE =1 * * ABORT TIMER IF ANY * ITC:05 CF A15,ABREQ ABORT TIMER AND REMOVE DWT FROM QUEUE ANK A7,1 RF(Z) RD:N05 READ * EJECT DRIC01 * * CHECK SEND/RECEIVE LENGTHS =2 * ITC:10 EQU * LD A8,DWTECB,A6 SENDING ECB LDK A1,0 LD A9,DWTECB,A2 RECEIVING ECB LD A3,ECBRL,A8 SENDING REQUESTED LENGTH LD A4,ECBRL,A9 RECEIVING REQUESTED LENGTH TNM A3,A4 CHECK SIGNS RF(NN) ITC:15 BOTH WITH SAME SIGN CWR A4,A3 RF ITC:18 * ITC:15 EQU * CWR A3,A4 * ITC:18 EQU * RF(NG) ITC:20 LDR A3,A4 RECEIVE LENGTH MANDATORY LDK A1,8 RETURN CODE (INCORRECT LENGTH) * EJECT DRIC01 * ITC:20 EQU * IFT MMUPAG=1 LDKL A4,ITAD ADDRESS TO DRIVER ADDRESS BLOCK LD A4,BUFLEN,A4 MMU BUFFER SIZE TNM A3,A4 CHECK SIGNS RF(NN) ITC:22 BOTH WITH SAME SIGN CWR A4,A3 RF ITC:24 * ITC:22 EQU * CWR A3,A4 * ITC:24 EQU * RF(NG) ITC:25 MMU BUFFER LARGE ENOUGH LDKL A1,/8008 NO, INDICATE ERROR LDR A3,A4 MMU BUFFER LENGTH MANDATORY * ITC:25 EQU * XIF * ST A3,ECBEL,A8 EFFECTIVE LENGTH ST A3,ECBEL,A9 EFFECTIVE LENGTH * * MOVE BUFFER * IFT MMUPAG=0 ADK A3,0 CHECK LENGTH RF(Z) ITC:32 NOTHING TO MOVE ENB LD A4,ECBBA,A8 SENDING BUFFER ADDRESS LD A7,ECBBA,A9 RECEIVING BUFFER ADDRESS * ITC:30 LCR A5,A4 MOVE ONE CHARACTER SCR A5,A7 ADK A4,1 ADK A7,1 SUK A3,1 RB(NZ) ITC:30 * ITC:32 EQU * XIF * EJECT DRIC01 * * TRANSFER SENDING TASK ID TO RECEIVING ECB AND VICE VERSA * LD A3,DWTTAB,A2 TTAB RECEIVING TASK LD A3,TTB:ID,A3 TASK ID ST A3,ECBCW,A8 RETURN TASK ID TO SENDING TASK LD A3,DWTTAB,A6 TTAB SENDING TASK LD A3,TTB:ID,A3 TASK ID ST A3,ECBCW,A9 RETURN TASK ID TO RECEIVING TASK CF A15,TENDIO END WRITE LDR A6,A2 * IFT MMUPAG=1 LD A3,ECBBA,A8 DRIVER BUFFER ADDRESS (EVEN/UNEVEN) ST A3,ECBBA,A9 SET IN OTHER DWT XIF * END:IO EQU * ABL DISEND END REQUEST VIA TENDIO AND TDISP * ITC:35 EQU * CMR A6 RESET QUEUE LINK * ITC:40 EQU * LDK A1,/40 RETURN CODE RB END:IO * EJECT DRIC01 * * ITC:45 EQU * CWK A1,WR:QUE RB(E) ITC:05 COMPLEMENTARY REQUEST * ITC:50 LDK A7,0 INDICATE ADDRESSED REQUEST * * CHECK TIMER VALUE AND SET TIMER IF REQUESTED * ITC:60 EQU * LD A3,DWTIME,A6 TIME RB(Z) ITC:35 TIME IS ZERO, RETURN RF(N) ITC:70 NO TIMING REQUESTED LDR A1,A6 PARAM = DWTOUT IF WRITE, ELSE DWTIN LDK A4,DWTTP ADR A4,A6 TIMER POINTER ST A3,TIME CF A15,SETIMP SET TIMER DATA TIMOUT TIMEOUT ADDRESS TIME DATA 0 * EJECT DRIC01 * * INSERT IN QUEUE WITHIN PRIORITY * ITC:70 EQU * ST A2,DWTQUE,A6 STORE QUEUE ANCHOR IN DWT LD A5,DWTTAB,A6 TTAB ADDRESS LD A1,TTB:ST+1,A5 LEVEL SUK A7,1 RF(Z) ITC:80 NOT-ADDRESSED REQUEST ADK A2,DWTANC POINT TO ADDRESS OF FIRST DWT IN QUEUE * ITC:80 LDR A4,A2 SAVE LDR* A2,A2 NEXT IN QUEUE RF(Z) ITC:90 END FOUND LD A5,DWTTAB,A2 TTAB ADDRESS CC A1,TTB:ST+1,A5 COMPARE LEVELS RB(NL) ITC:80 * ITC:90 STR A2,A6 INSERT IN QUEUE STR A6,A4 ABL TDISP GO TO DISPATCHER * EJECT DRIC01 * * W R I T E, N O T A D D R E S S E D * WR:NAD EQU * WRITE, NOT-ADDRESSED LD A2,DWTANC,A6 CHECK QUEUE OF ADDRESSED READ REQUESTS RF(NZ) WR:N10 ANYTHING IN QUEUE LD A2,RD:QUE CHECK QUEUE OF NOT-ADDRESSED READ REQ. RF(Z) WR:N20 QUEUE EMPTY LDR* A3,A2 NO, REMOVE FROM QUEUE ST A3,RD:QUE UPDATE QUEUE ANCHOR * WR:N05 CF A15,ABTIM2 ABORT TIMER IF ANY RB ITC:10 * WR:N10 LDR* A3,A2 REMOVE FROM QUEUE ST A3,DWTANC,A6 UPDATE QUEUE ANCHOR RB WR:N05 * WR:N20 LDKL A2,WR:QUE WR:QUE ADDRESS * WR:N30 EQU * LDK A7,1 INDICATE NOT-ADDRESSED REQUEST RB ITC:60 INSERT IN QUEUE * EJECT DRIC01 * * R E A D, N O T A D D R E S S E D * RD:NAD EQU * READ, NOT-ADDRESSED LD A2,DWTANC,A6 CHECK QUEUE OF ADDRESSED WRITE REQUESTS RF(NZ) RD:N10 ANYTHING IN QUEUE LD A2,WR:QUE CHECK QUEUE OF NOT-ADDRESSED WRITE REQ. RF(Z) RD:N20 QUEUE EMPTY LDR* A3,A2 NO, REMOVE FROM QUEUE ST A3,WR:QUE UPDATE QUEUE ANCHOR * RD:N00 EQU * CF A15,ABTIM2 ABORT TIMER IF ANY * RD:N05 EQU * XRR A2,A6 EXCHANGE A2 AND A6 XRR A6,A2 XRR A2,A6 ABL ITC:10 * RD:N10 LDR* A3,A2 REMOVE FROM QUEUE ST A3,DWTANC,A6 UPDATE QUEUE ANCHOR RB RD:N00 * RD:N20 LDKL A2,RD:QUE RD:QUE ADDRESS RB WR:N30 INSERT IN QUEUE * EJECT DRIC01 * * T I M E O U T * * THIS ENTRY IS CALLED AT TIMEOUT. IT WILL * RESET TIMER POINTER AND REMOVE DWT FROM QUEUE * BEFORE TERMINATING THE REQUEST VIA TENDIO. * * INPUT: A1 = DWT ADDRESS * A2 = ADDRESS TO 2ND TIMER BLOCK * TIMOUT EQU * CM* 0,A2 RESET TIMER POINTER LDR A2,A1 CF A15,ABR:10 REMOVE DWT FROM QUEUE LDR A6,A2 DWT ADDRESS RB ITC:40 END REQUEST VIA TENDIO AND TDISP * EJECT DRIC01 * * I T A B R T * * THIS SUBROUTINE IS CALLED FROM TABORT. * IT WILL UPDATE QUEUE AND ABORT TIMER (IF ANY), * AND TERMINATE THE REQUEST VIA TENDIO. * * INPUT: A6 = DWT ADDRESS * A8 = ECB ADDRESS * ITABRT EQU * LDR A2,A6 CF A15,ABREQ ABORT TIMER AND REMOVE DWT FROM QUEUE LDK A1,0 RETURN CODE RB END:IO END REQUEST VIA TENDIO AND TDISP * EJECT DRIC01 * * A B R E Q * * ABORT TIMER AND REMOVE DWT FROM QUEUE. * * INPUT: A2 = DWT ADDRESS * * OUTPUT: A1, A3 ARE DESTROYED * ABREQ EQU * CF A15,ABTIM ABORT TIMER * * REMOVE DWT FROM QUEUE * ABR:10 EQU * LD A1,DWTQUE,A2 QUEUE ACHHOR CWK A1,RD:QUE RF(E) ABR:20 NOT-ADDRESSED READ REQUEST CWK A1,WR:QUE RF(E) ABR:20 NOT-ADDRESSED WRITE REQUEST ADK A1,DWTANC POINT TO ADDRESS OF FIRST DWT IN QUEUE * ABR:20 LDR A3,A1 SAVE LDR* A1,A1 NEXT IN QUEUE CWR A1,A2 SEARCHED DWT RB(NE) ABR:20 NO LDR* A1,A1 REMOVE FROM QUEUE STR A1,A3 UPDATE QUEUE LINKS CMR A2 RESET QUEUE LINK RF IH:RTN RETURN * EJECT DRIC01 * * A B T I M * * SUBROUTINE FOR ABORTING TIMER (IF ANY). * * INPUT: A2 = DWT ADDRESS * * OUTPUT: A1, A3 ARE DESTROYED * ABTIM2 EQU * CMR A2 RESET QUEUE LINK * ABTIM LDK A1,DWTTP ADR A1,A2 TIMER POINTER ADDRESS LDR* A3,A1 RF(Z) IH:RTN NO TIMER ACTIVE CM* 0,A1 CMR A1 INDICATE NO TIMER SET * IFT CPU852=1 IH:RTN ABL IHRTN XIF * IFT CPU852=0 IH:RTN RTN A15 XIF * * * END