|
|
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: 14220 (0x378c)
Notes: pts_type(SC)
Names: »DRIC01.SC«
└─⟦470bcbfc6⟧ Bits:30009709 Philips computer tape "M_92LP"
└─⟦this⟧ »M:92LP/DRIC01.SC«
└─⟦9af60a727⟧ Bits:30009707 Philips computer tape "M_173"
└─⟦this⟧ »M:173/DRIC01.SC«
└─⟦this⟧ »M:173/DRIC01.SC«
IDENT DRIC01 9.2DK 0 80-01-02 870105040920 =DK0, MMU BUF SIZE 80-03-11 * * ********************************************** * * PHILIPS TERMINAL SYSTEM PTS * * DRIC01 = INTERTASK COMMUNICATION HANDLER * * * * * * ********************************************** * * THIS MODULE HANDLES THE INTERTASK COMMUNICATION * EJECT DRIC01 * * ORDERS: * * /02 READ, NOT ADDRESSED * /06 WRITE, NOT ADDRESSED * /0A READ, ADDRESSED * /0B WRITE, ADDRESSED * /39 SET TIMEOUT * * ENTRY PARAMETERS: * * A5 STACK BASE 2 * A6 DWT ADDRESS * A7 ORDER CODE * A8 ECB ADDRESS * A12 ADDRESS TO DRIVER ADDRESS BLOCK * EJECT DRIC01 * * *********** * ENTRIES * *********** * * ENTRY ITAD ADDRESS BLOCK ENTRY ITABRT ABORT INTERTASK REQUEST 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 DWTSB1 STACK BASE 1 IN DWT EXTRN BUFLEN DRIVER BUFFER LENGTH EXTRN SETIMP TIMER EXTRN FNDTID FIND TTAB ADDRESS FROM TID 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 ECBRC ECB RETURN CODE 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 1 * * A PROGRAM VERSION USING THE EXTENDED INSTRUCTION * SET IS OBTAINED BY SETTING CPU852 EQU 0. * CPU852 EQU 0 * * MMU BUFFER SIZE * X:A EQU 50 X:Q EQU 575 DK0 DVBLEN EQU 575+X:Q DK0 * * INTERTASK DEVICE INDEX * X:B EQU 8 DEVIND EQU X:B * 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 * ICAD EQU * LDR A1,A7 ORDER CODE TO A1 SUK A1,2 RF(Z) RD:NAD READ NOT ADDRESSED? SUK A1,4 ABL(Z) WR:NAD WRITE NOT ADDRESSED? SUK A1,4 RF(Z) RD:ADR READ ADDRESSED? SUK A1,1 RF(Z) WR:ADR WRITE ADDRESSED? SUK A1,/2E RF(NZ) DIS:OE REQUEST ERROR? * * S E T T I M E O U T * LD A2,ECBCW,A8 GET TIME ST A2,DWTIME,A6 RF END:IO * 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 * RD:ADR EQU * READ, ADDRESSED WR:ADR EQU * WRITE, ADDRESSED * * FIND TTAB OF ADDRESSED TASK * LD A7,ECBCW,A8 TID CF A15,FNDTID TTAB ADDRESS TO A2 ADK A2,0 SET CR RF(Z) DIS:OE NOT FOUND? CW A2,DWTTAB,A6 RF(E) DIS:OE ILLEGAL TID? 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 * ADR:20 ADK A2,4 ADDRESS TO NEXT DWT ADDRESS SUK A1,4 RF(N) DIS:OE NOT FOUND? * LDR* A4,A2 DWT ADDRESS CW A7,DWTADR,A4 SEARCHED DWT? RB(NE) ADR:20 NO, TRY NEXT * LDR A2,A4 LD A1,DWTST,A2 ANY REQUEST? RF(N) ADR:40 NO! * LD A1,DWTQUE,A2 GET QUEUE ANCHOR ADDRESS CWR A1,A6 CHECK QUEUE ANCHOR RF(E) ADR:30 REQUEST ISSUED FOR THIS TASK? * ANK A7,1 RF(Z) ADR:25 READ? CWK A1,RD:QUE RF(E) ADR:30 COMPLEMENTARY REQUEST? RF ADR:50 NO * EJECT DRIC01 * * ADR:25 CWK A1,WR:QUE RF(NE) ADR:50 NO COMPLEMENTARY REQUEST? * * ABORT TIMER IF ANY * ADR:30 CF A15,ITAB05 ABORT TIMER AND REMOVE DWT FROM QUEUE ANK A7,1 RF(Z) RD:N05 READ? * * MOVE BUFFER * ADR:35 EQU * LDKL A5,DWTSB1 GET STACK BASE ADR A5,A6 CF A5,MOVBUF CF A15,TENDIO END WRITE LDR A6,A2 * IFT MMUPAG=1 LD A3,ECBBA,A8 GET SENDING BUFFER ADDRESS ANK A3,1 RF(Z) ADR:38 BUFFER ADDRESS EVEN? ORS A3,ECBBA,A9 MAKE RECEIVING BUFFER ADDRESS UNEVEN RF END:IO * ADR:38 EQU * SUK A3,2 A3 := /FFFE ANS A3,ECBBA,A9 MAKE RECEIVING BUFFER ADDRESS EVEN XIF * END:IO CF A15,TENDIO END READ * T:DISP ABL TDISP * EJECT DRIC01 * * OUEUE REQUEST * ADR:40 LDK A7,0 INDICATE ADDRESSED REQUEST * ADR:50 EQU * LD A3,DWTIME,A6 TIME RF(Z) TWR:30 ADK A3,1 RF(Z) ADR:70 NO TIMING WANTED? SUK A3,1 RF(N) DIS:OE NEGATIVE TIME? LDR A1,A6 DWTOUT = PARAM. WHEN 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 * ADR: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(P) ADR:80 NOT-ADDRESSED REQUEST? ADK A2,DWTANC POINT TO ADDRESS OF FIRST DWT IN QUEUE * ADR:80 LDR A4,A2 SAVE LDR* A2,A2 NEXT IN QUEUE RF(Z) ADR:90 END FOUND? LD A5,DWTTAB,A2 TTAB ADDRESS CC A1,TTB:ST+1,A5 COMPARE LEVELS RB(NL) ADR:80 * ADR:90 STR A2,A6 INSERT IN QUEUE STR A6,A4 RB T:DISP * DIS:OE ABL DISIOE REQUEST ERROR * 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 * LDR A4,A6 EXCHANGE A2 AND A6 LDR A6,A2 LDR A2,A4 RB ADR:35 * RD:N10 LDR* A3,A2 REMOVE FROM QUEUE ST A3,DWTANC,A6 UPDATE QUEUE ANCHOR RB RD:N00 * RD:N20 LDKL A2,RD:QUE GET RD:QUE ADDRESS RB ADR:50 INSERT IN QUEUE * 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 ADR:35 * WR:N10 LDR* A3,A2 REMOVE FROM QUEUE ST A3,DWTANC,A6 UPDATE QUEUE ANCHOR RB WR:N05 * WR:N20 LDKL A2,WR:QUE GET WR:QUE ADDRESS RB ADR:50 * EJECT DRIC01 * * T I M E O U T * TIMOUT LDR A6,A1 DWT ADDRESS CM* 0,A2 RESET TIMER POINTER LDR A2,A6 CF A15,ITAB10 REMOVE FROM QUEUE * TWR:30 EQU * CMR A6 RESET QUEUE LINK LDK A1,/40 RETURN CODE RB END:IO * EJECT DRIC01 * * I T A B R T * * THIS SUBROUTINE IS CALLED FROM TABORT. * IT WILL UPDATE QUEUE AND ABORT TIMER (IF ANY). * * INPUT: A6 = DWT ADDRESS * * OUTPUT: A1-A4 ARE DESTROYED * ITABRT EQU * LDR A2,A6 * ITAB05 EQU * CF A15,ABTIM ABORT TIMER * * REMOVE DWT FROM QUEUE * ITAB10 EQU * LD A1,DWTQUE,A2 GET QUEUE ACHHOR CWK A1,RD:QUE RF(E) ITAB20 NOT-ADDRESSED READ REQUEST? CWK A1,WR:QUE RF(E) ITAB20 NOT-ADDRESSED WRITE REQUEST? ADK A1,DWTANC POINT TO ADDRESS OF FIRST DWT IN QUEUE * EJECT DRIC01 * * ITAB20 LDR A4,A1 SAVE LDR* A1,A1 NEXT IN QUEUE CWR A1,A2 SEARCHED DWT? RB(NE) ITAB20 NO! LDR* A3,A1 REMOVE FROM QUEUE STR A3,A4 UPDATE QUEUE LINKS CMR A2 RESET QUEUE LINK * IFT CPU852=1 RF IH:RTN XIF * IFT CPU852=0 RTN A15 XIF * 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 * EJECT DRIC01 * * M O V B U F * * SUBROUTINE TO MOVE BUFFER FROM SENDING TASK * TO ADDRESSED TASK. * EFFECTIVE LENGTH IN BOTH INPUT AND OUTPUT ECB ARE SET. * A1 WILL CONTAIN RETURN CODE /8 IF SENDING REQUESTED LENGTH * WAS GREATER THAN RECEIVING REQUESTED LENGTH. * TENDIO WILL PERFORM THE MOVE IN SYSTEMS WITH MMU. * * INPUT PARAMETERS: * A2 RECEIVING DWT * A5 STACK POINTER * A6 SENDING DWT * * REGISTER USAGE: * A1 RETURN CODE * A2 DWT RECEIVING TASK * A3 WORKING REGISTER * A4 BUFFER POINTER * A5 STACKPOINTER * A6 DWT SENDING TASK * A7 RECEIVING BUFFER POINTER * A8 ECB ADDRESS SENDING TASK * A9 ECB ADDRESS RECEIVING TASK * MOVBUF EQU * LD A8,DWTECB,A6 SENDING ECB ENB GIVE OTHER TASKS A CHANCE * EJECT DRIC01 * * LDK A1,0 LD A9,DWTECB,A2 RECEIVING ECB LD A3,ECBRL,A8 SENDING REQUESTED LENGTH RB(N) DIS:OE CW A3,ECBRL,A9 RF(NG) MOV:05 LDK A1,8 RETURN CODE (INCORRECT LENGTH) LD A3,ECBRL,A9 RB(N) DIS:OE * MOV:05 EQU * IFT MMUPAG=1 LDKL A4,ITAD GET ADDRESS TO DRIVER ADDRESS BLOCK CW A3,BUFLEN,A4 CHECK MMU BUFFER SIZE RF(NG) MOV:10 MMU BUFFER LARGE ENOUGH? LDKL A1,/8008 NO, INDICATE ERROR ABL DISEND BRANCH TO DISPATCHER VIA TENDIO * MOV:10 EQU * XIF * ST A3,ECBEL,A8 EFFECTIVE LENGTH ST A3,ECBEL,A9 EFFECTIVE LENGTH * EJECT DRIC01 * * IFT MMUPAG=0 LD A4,ECBBA,A8 SENDING BUFFER ADDRESS LD A7,ECBBA,A9 RECEIVING BUFFER ADDRESS * MOV:15 EQU * SUK A3,1 RF(N) MOV:20 ALL CHARACTERS MOVED? LCR A9,A4 SCR A9,A7 ADK A4,1 ADK A7,1 RB MOV:15 * MOV:20 EQU * XIF * INH RTN A5 * * * END