IDENT SDVCINT EJECT * * ECS READ AND WRITE MACROS * EXT E.ECS * RECS MACRO CNT RE CNT RJ E.ECS ENDM * WECS MACRO CNT WE CNT RJ E.ECS ENDM EJECT * * EXT I.LOCK * ENTRY I.SDVCP * I.SDVCP SA1 I.LOCK BX6 X1 SA6 =XI.WAIT NZ X1,0 SA1 E.ECS NZ X1,0 RJ SCANPPS RJ GETEVNT BX7 X7-X7 SA7 E.ECS JP 0 EJECT * * * ENTRY I.SDVC EXT S.MASTR * I.SDVC VFD 60/SDVCREQ VFD 60/SDVCRSP VFD 60/S.MASTR * VFD 60/TPBUF TAPE BUFFER VFD 60/SLOWP SLOW PERIPHS EJECT * * S DEVICE, PPU REQUEST SCAN * * SETS UP REGISTERS AS FOLLOWS * * X1 ACTION * B2 WORD COUNT * B3 POSITION IN CURRENT BUFFER * B4 DEVICE NUMBER * SCANPPS BSSZ 1 SX6 SBUFFST SA6 SBUFPNT INITIALIZE SCAN * SCANPPSA SA1 SBUFPNT SA2 X1-1 ZR X2,SCANPPSV NO REQUEST IN THIS BUFFER * MX0 60-12 BX1 -X0*X2 GET ACTION AX2 12 BX3 -X0*X2 SB2 X3 GET WORD COUNT AX2 12 BX3 -X0*X2 SB3 X3 GET POSITION IN CURRENT BUFFER AX2 12 BX3 -X0*X2 SB4 X3 GET DEVICE NUMBER RJ GETSDVC * LX1 59 PL X1,SCANPPSB NO COPY ECS TO CM RJ SETMOVE RECS B5 COPY ECS TO CM ( 2**0 ) * SCANPPSB LX1 59 PL X1,SCANPPSC NO COPY CM TO ECS RJ SETMOVE WECS B5 COPY CM TO ECS ( 2**1 ) * SCANPPSC LX1 59 PL X1,SCANPPSD NO SEND RESPONSE TO USER * SA2 REQDONE SEND RESPONSE TO USER SX6 X2+1 AND DO NOTHING MORE FOR PPU ( 2**2 ) SA6 A2 BUMP COMPLETED REQUEST COUNT SA2 REQLEFT SX6 X2-1 SA6 A2 DECREMENT REQUEST COUNT SA2 SDVCRSP+B4 PICK UP PPS RESPONSE TO REQUEST NG X2,SCANPPSW TERMINATE THIS REQUEST, FLIP ERROR BIT ZR X6,SCANPPSX TERMINATE THIS REQUEST * SA2 BUFPOS SA3 BUFSZ IX6 X2+X3 TENTATIVE NEW BUFFER POSTION IX3 X3+X6 FIRST POSITION BEYOND NEW BUFFER SA2 FILESZ IX2 X2-X3 COMPUTE SPACE IN FILE BEYOND NEW BUFFER + NG X2,*+1 DO NOT ADVANCE BUFFER IF NO ROOM SA6 BUFPOS ADVANCE BUFFER POSITION * SA2 ACTION BX6 X2 SA6 SDVCREQ+B4 REPEAT REQUEST TO PPU JP SCANPPSY * SCANPPSD LX1 59 PL X1,SCANPPSY NO INITIAL HANG * SB7 SCANPPSY SA1 PMOT DO INITIAL HANG ( 2**3 ) SA2 ECREQ SA3 SDVCADR JP HANG1 * SCANPPSW SA2 EFLAG MX6 1 BX6 X2-X1 FLIP E FLAG SA6 EFLAG * SCANPPSX RJ PUTSDVC PUT BACK P PROC MX0 60-12 SA2 SEQNUMB SA3 SDVCRSP+B4 BX2 -X0*X2 BX7 X2+X3 SA1 REQDONE BX1 -X0*X1 LX1 36 BX7 X1+X7 COMPLET RESPONSE TO BE SENT TO USER RJ RSPNSE SEND RESPONSE TO USER JP SCANPPSZ * SCANPPSY RJ PUTSDVC * SCANPPSZ SA1 SBUFPNT BX6 X6-X6 SA6 X1-1 SIGNAL COMPLETION OF REQUEST SCANPPSV SA1 X1-2 BX6 X1 SA6 SBUFPNT ZR X1,SCANPPS JP SCANPPSA EJECT * * S DEVICE, GET EVENTS * EXT DINTQ * GETEVNT BSSZ 1 GETEVNT1 SA1 SDVCQPT RJ DINTQ ZR X2,GETEVNT NO EVENTS, SO EXIT * BX0 X2 SA0 SDVCPROC RECS SDVCPSZ BX6 X2 SA6 SDVCADR SA1 EVNTW2 PICK UP 2 ND EVENT WD SA2 EFLAG BX2 X1-X2 NG X2,GETEVNT2 REFUSE REQUEST FOR BAD ERROR RECOVERY MX0 60-12 BIT BX6 -X0*X1 ZR X6,GETEVNT2 REFUSE REQUEST FOR ZERO ACTION * BX6 -X0*X6 BEGIN SPLITTING UP REQUEST AND SA6 ACTION SAVE DATA FROM REQUEST AX1 12 BX6 -X0*X1 SA6 BUFPOS AX1 12 BX6 -X0*X1 SA6 BUFSZ AX1 12 BX6 -X0*X1 NZ X6,GETEVNT3 SX6 1 ON COUNT OF ZERO ASSUME 1 GETEVNT3 MX7 60-6 MAX COUNT WILL BE 100B BX6 -X7*X6 SA6 REQLEFT AX1 12 MX0 60-11 BX6 -X0*X1 SA6 SEQNUMB BX6 X6-X6 SA6 REQDONE SA1 BUFPOS . GET BUFFER POSITION SA2 FILESZ . GET FILE SIZE IX3 X1-X2 . NG IF OK PL X3,GETEVNT2 . RETURN ERROR IF POS>=SIZE GETEVNT4 SA1 ACTION . RETREIVE ACTION BX6 X1 SA2 DVCNUMB . GET DEVICE NUMBER SA6 X2+SDVCREQ . SEND TO PROPER PPU RJ PUTSDVC JP GETEVNT1 * GETEVNT2 SA1 EVNTW2 . GET EVENT WORD AGAIN FOR ABOVE CODE MX0 11 REFUSE REQUEST FOR 0 ACT OR BAD ERR LX0 60-1 BX7 X0*X1 GET SEQ NUMBER LX7 12 POSITION SEQ NUMBER BX7 X0+X7 INSERT 37777B RJ RSPNSE JP GETEVNT1 EJECT * * GET PART 2 OF A PSEUDO PROCESS * * S DVC NUMB IN X3 * LEAVES ADDRESS P PROC IN SDVCADR * DESTROYS A0, X0, A2, X2, A3, X3 * GETSDVC BSSZ 1 SA2 SDVCPNT IX0 X2+X3 SA0 SDVCADR RECS 1 GET ADDRESS OF THE PSEUDO PROC SA2 SDVCADR SX0 SDVCPSZ1 IX0 X0+X2 COMPUTE ADDRESS OF PART 2 SA0 SDVCPT2 RECS SDVCPSZ2 READ IN THE DATA JP GETSDVC * * REPLACE PART 2 OF A PSEUDO PROCESS * ASSUMES ADDRESS OF THE P PROC IN SDVCADR * * DESTROYS A0, X0, A2, X2 * PUTSDVC BSSZ 1 SA2 SDVCADR SX0 SDVCPSZ1 IX0 X0+X2 SA0 SDVCPT2 WECS SDVCPSZ2 JP PUTSDVC EJECT * * SEND RESPONSE IN X7 TO USER AND REHANG * DESTROYS ALL REVISTERS * EXT EVENT1,HANG1 EXT INTSCR * RSPNSE BSSZ 1 SB7 RSPNSE1 SA5 PMOT BX6 X5 SA1 ECRSP SB6 -1 WHERE TO WTORE RETURNS SB1 INTSCR JP EVENT1 * RSPNSE1 SB7 RSPNSE SA1 PMOT SA2 ECREQ SA3 SDVCADR JP HANG1 EJECT * * PREPARE FOR ECS MOVE * * WILL SET B5 TO CORRECT COUNT * X0, A0 TO POSITIONS OF MOVE * * DESTROYS B5, A0, X0, A2, X2, A3, X3 * SETMOVE BSSZ 1 SA2 SBUFPNT SA0 X2 SET STARTING CM ADDRESS * SA2 BUFPOS GET POSITION WITHIN FILE OF CURRENT BUFFE SX0 X2+B3 COMPUTE POSITION WITHIN FILE OF MOVE SB5 B2 SET B5 TO NOMINAL COUNT * SA2 BUFSZ GET BUFFER SIZE SX3 B3+B5 NOMINAL NEW POSITION IN BUFFER IX3 X2-X3 SPACE LEFT IN BUFFER PL X3,SETMOVE1 SB5 B5+X3 REDUCE COUNT SO THAT BUFFER NOT OVERRUN * SETMOVE1 SX3 X0+B5 NOMINAL NEW POSITION IN FILE SA2 FILESZ IX3 X2-X3 COMPUTE SPACE LEFT IN FILE PL X3,SETMOVE2 SB5 B5+X3 REDUCE COUNT SO THAT FILE NOT OVERRUN * SETMOVE2 SA2 FILE GET FILE STARTING ADDRESS IX0 X0+X2 COMPUTE ECS STARTING ADDRESS JP SETMOVE EJECT * SDVCNMB EQU 10 ALLOWS FOR UP TO 10 S DEVICES * SDVCREQ BSSZ SDVCNMB SDVCRSP BSSZ SDVCNMB * * SDVCADR BSSZ 1 * * SDVCPROC BSSZ 4 EVNTW1 BSSZ 1 EVNTW2 BSSZ 1 * SDVCPSZ1 EQU *-SDVCPROC * SDVCPT2 BSS 0 * FILE BSSZ 1 FILESZ BSSZ 1 ECREQ BSSZ 1 ECRSP BSSZ 1 PMOT BSSZ 1 DVCNUMB BSSZ 1 * EFLAG BSSZ 1 REQLEFT BSSZ 1 REQDONE BSSZ 1 BUFPOS BSSZ 1 BUFSZ BSSZ 1 SEQNUMB BSSZ 1 ACTION BSSZ 1 * SDVCPSZ2 EQU *-SDVCPT2 SDVCPSZ EQU *-SDVCPROC * * * ENTRY SDVCQPT,SDVCPNT * SDVCQPT BSSZ 1 SDVCPNT BSSZ 1 EJECT * * FORM OF A PPU BUFFER FOR S DEVICES * * BSSZ 1 POINTER TO NEXT * BSSZ 1 PPU REQUEST WORD * BUF BSSZ N ACTUAL BUFFER, PLACE POINTED * SBUFPNT BSSZ 1 USED TO POINT TO CURRENT PPU BUFFER * * VFD 60/SLOWP BSSZ 1 TPBUF BSSZ 514 * VFD 60/0 BSSZ 1 SLOWP BSSZ 21B * * SBUFFST EQU TPBUF * END