|
|
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: 30214 (0x7606)
Notes: pts_type(SC)
Names: »DMSUBR.SC«
└─⟦173d42e04⟧ Bits:30009663 Philips computer tape "600105"
└─⟦this⟧ »TOSSWORK/DMSUBR.SC«
└─⟦48601905a⟧ Bits:30009668 Philips computer tape "600121"
└─⟦this⟧ »M:TU10/DMSUBR.SC«
└─⟦d2a299635⟧ Bits:30009698 Philips computer tape "600415"
└─⟦this⟧ »M:TU10/DMSUBR.SC«
IDENT DMSUBR REL 10.0 80-03-14 870105041000 =2 , COMMIT CHECK 79-11-22 =1 , PARAM TEST COMMIT 79-11-05 **************************************************** * * PHILIPS TERMINAL SYSTEM PTS * * DMSUBR = COMMON DM-ROUTINES * * * * * * **************************************************** ****THIS MODULE IS ACTIVATED FROM :***************** * * DMTASK,TIODM,DMTASS * *************** * ENTRIES * *************** * * ENTRY DMTEND,RELPRO ENTRY DMTWM,DMTBM,DMTBMR,FNDFDB ENTRY GETA14,DMTREM ENTRY EATEST,EASETB,EARELB,CRNGET ENTRY CALSNO ENTRY GTBKBU ENTRY DMTIOT ENTRY DMTIOZ ENTRY MOV:US MOVE FROM USER TO SYSTEM AREA ENTRY MOV:SU MOVE FROM SYSTEM TO USER AREA ENTRY MOVZUS,MOVZSU * ***************** * EXTERNALS * ***************** * * EXTRN FDBEAL,FDBTNR,FDBCRL,FDBRLE,FDBSNR,FDBRRO EXTRN FDBBLF,FDBADF EXTRN FDBBLZ,FWTFNR EXTRN FDBSTA,SCTTCT,TTB:SA,ECBEL EXTRN TTB:TD,SCTCDT,PRUN EXTRN FDBECB,DWTECB,DWTOR,BUFSTA,BUFDMI,BUFOR EXTRN ECBRC,ECBFC,ECBCW,ECBBA EXTRN DIVMOD,MPYMOD EXTRN CRNTID EXTRN DMTGBU EXTRN CRNQUE,GETBLK,FREQUE EXTRN CRBUFL EXTRN FDBDBR EXTRN TASHLT SYSTEM HALT ROUTINE EXTRN HALT,DSUMOD,ECBRL EXTRN EOMERR,RETRIE EXTRN REQER2,QTJOB,TDISP EXTRN DWTTAB,MONMMU,TTB:ID,TTB:MT EXTRN QCL EJECT DMSUBR TOSSIO * * ***************************************** * * CONDITIONAL ASSEMBLY * ***************************************** * * A PROGRAM VERSION USING TOSS MMU PAGING * IS OBTAINED BY SETTING MMUPAG EQU 1. * MMUPAG EQU 0 * EJECT * * THIS ROUTINE RELEASES PROTECTION AT END OF TRANSACTION * * ENTRY : A9 = DM INTERNAL USER ID * * USED REGS A1 - A5 , A9 * * RELPRO EQU * RELEASE PROTECTION LDKL A1,FDBSTA FIRST FWT ADDR REL050 EQU * LDR* A2,A1 ANK A2,/1 RF(Z) REL053 NOT USED LDKL A2,/C000 REMOVE BUFFERS FOR THIS TASK LDKL A5,/FF00 =2 ANS A5,FDBBLZ,A1 COMMIT CHECK =2 CF A14,EARELB ENB REL053 EQU * LDR* A1,A1 ANKL A1,/FFFE SKIP USE BIT RB(NZ) REL050 MORE FDBS RTN A14 EJECT * HERE WE ENTERS FOM LKM DATA 16 , COMMIT * DMTEND EQU * COMMIT LDR A6,A5 TTAB USER ANK A7,/7F =1 RF(Z) DMTE10 OK ORDER LDKL A7,REQER2 REQUES ERR RF DMTE40 ERR DMTE10 EQU * * * DECIDE USER TASK ID * LDK A2,0 DMTE20 LD A1,SCTTCT TCTAB ADDR ADR A1,A2 CW A5,2,A1 RF(E) DMTE30 FOUND ADK A2,2 RB DMTE20 TRY NEXT DMTE30 LDR A9,A2 LDKL A14,STACK STACK BASE CF A14,RELPRO RELEASE PROTECT DMTE40 EQU * LDR A5,A6 TTAB USER ST A7,TTB:SA+14,A5 RET CODE IN A7 INH CF A15,QTJOB RESTART USER ABL TDISP DATA 0,0,0 STACK DATA 0 4 WORDS EJECT * ************ * DMTWM * ************ * * ENTRY DMTWM WORD MOVE * * INPUT A1 = FROM ADDRESS * A2 = NO OF BYTES TO BE MOVED * A3 = TO ADDRESS * * A4 WILL BE DESTROYED * * DMTWM EQU * SUK A2,2 RF(N) DMTW10 LAST WORD MOVED LDR* A4,A1 STR A4,A3 ADK A1,2 ADK A3,2 RB DMTWM DMTW10 ANK A2,/01 RF(E) DMTW20 LCR A4,A1 MOVE LAST CHAR SCR A4,A3 DMTW20 RTN A14 EJECT * ************* * DMTBM * ************* * * ENTRY DMTBM BYTE MOVE * * INPUT A1 = FROM ADDRESS * A2 = NO OF BYTES TO BE MOVED * A3 = TO ADDRESS * * A4 WILL BE DESTROYED * * OUTPUT A3 = NEXT CHAR * * DMTBM EQU * SUK A2,1 RF(N) DMTB10 LAST BYTE MOVED LCR A4,A1 SCR A4,A3 ADK A1,1 ADK A3,1 RB DMTBM DMTB10 RTN A14 * * DMTBMR HAS THE SAME FUNCTION AS DMTBM BUT * MOVES FROM THE END * DMTBMR ADR A1,A2 ADR A3,A2 DMTB20 SUK A2,1 RB(N) DMTB10 SUK A1,1 SUK A3,1 LCR A4,A1 SCR A4,A3 RB DMTB20 EJECT ****DESCRIPTION************************************* * * FNDFDB WILL SEARCH TTAB AND SCTCDT FOR A FILE CODE * ****ENTRY PARAMETERS******************************** * * A1 = TTAB ADDR * A2 = FILE CODE TO SEARCH FOR * A5 NOT= 0 WHEN ONLY TTAB SHALL BE SEARCHED * ****EXIT PARAMETERS********************************* * * A1 = UNCHANGED * A2 = FILE CODE. = 0 WHEN NO CODE IS FOUND * A4 = TTAB/SCTCDT ENTRY ADDR WHEN CODE IS FOUND * A5 = 0 WHEN FOUND IN SCTCDT = 1 WHEN TTAB * ****USED REGISTERS********************************** * * A1-A5 * ****************************************************** * * LOOK FOR FILE CODE IN TTAB * FNDFDB EQU * LD A3,TTB:TD,A1 LENGTH DEV DESCR FND030 EQU * SUK A3,4 RF(NP) FND040 FILE CODE NOT IN TTAB LDR A4,A1 ADKL A4,TTB:TD ADR A4,A3 CWR* A2,A4 RB(NE) FND030 LDK A5,1 RF FND080 CODE FOUND IN TTAB * * SEARCH FILE CODE IN SCTCDT * FND040 EQU * LDR A5,A5 RF(NZ) FND060 ONLY TTAB IS SEACHED LD* A4,SCTCDT FND050 EQU * SUK A4,4 RF(NP) FND060 CODE NOT FOUND AT ALL LD A3,SCTCDT ADR A3,A4 CWR* A2,A3 RB(NE) FND050 AD A4,SCTCDT RF FND080 CODE FOUND FND060 EQU * LDK A2,0 NO CODE FND080 EQU * RTN A14 EJECT * ************** * DMTREM * ************** * * ENTRY DMTREM MOVE RECORD FROM BUFFER TO USER RECORD AREA * * INPUT RELATIVE REC OFFSET IN FDBRRO,A6 * BUFFER ADDRESS IN A5 * USER REC AREA IN ECBBA,A9 * RECORD LENGTH IN A2 * * * * MOVE THE RECORD * IF (FROM) AND (TO) ADDRESSES BOTH EVEN THEN WORD MOVE * IF (FROM AND (TO) ADDRESSES BOTH ODD THEN MOVE FIRST BYTE * WITH BYTE INSTRUCTIONS AND THE REST WITH WORD MOVE * ELSE USE BYTE MOVE INSTRUCTIONS FOR THE WHOLE REC * DMTREM EQU * LD A1,FDBRRO,A6 ADR A1,A5 FROM ADDRESS * IFT MMUPAG=0 LDR A4,A1 LD A3,ECBBA,A9 TO ADDRESS XRR A4,A3 ANK A4,/01 RF(Z) DMT210 BOTH ODD OR BOTH EVEN CF A14,DMTBM ONE ODD AND ONE EVEN RF DMT225 * DMT210 LDR A4,A1 ANK A4,/01 RF(E) DMT220 BOTH EVEN SUK A2,1 BOTH ODD LCR A4,A1 SCR A4,A3 ADK A1,1 ADK A3,1 DMT220 CF A14,DMTWM WORD MOVE DMT225 EQU * XIF * IFT MMUPAG=1 LD A4,DWTTAB,A6 GET TTAB ADDRESS LDR A3,A2 GET LENGTH LD A2,ECBBA,A9 GET RECEIVING BUFFER ADDRESS CF A14,MOV:SU MOVE RECORD FROM SYSTEM TO USER AREA XIF * RTN A14 EJECT * * SET UP A14 STACK * GETA14 EQU * LD A14,PRUN GET DM TTAB ADDRESS AD A14,TTB:TD,A14 LENGTH DEVICE DESCR ADKL A14,TTB:TD+32 STACK RTN A15 RETURN AND ENABLE * EJECT DMSUBR ****DESCRIPTION************************************* * * EATEST WILL SEARCH THE EA-LINK FOR A LOG RECORD NO. * ****ENTRY PARAMETERS******************************** * * A1 = FDB ADRESS * A2,A3 = LOG RECORD NO * * CF A14,EATEST * ****EXIT PARAMETERS********************************* * * A1-A3 = UNCHANGED * A4 = 0 NO EA AT ALL * = +1 EA FOUND FOR ACTUAL TASK * = -1 EA FOUND FO R OTHER TASK * ****USED REGISTERS********************************** * * A1 - A4 EJECT DMSUBR EATEST EQU * LD A4,FDBEAL,A1 BUFFER QUEUE RF EAT030 EAT020 EQU * LDR* A4,A4 NEXT BUFFER ADR EAT030 EQU * RF(Z) EAT100 EMPTY QUEUE,NO EA * * SEARCH LOG REC NO * CC A2,3,A4 FIRST CHAR RB(NE) EAT020 CW A3,4,A4 2 AND 3 CHAR RB(NE) EAT020 * * RECORD NO FOUND * LC A4,2,A4 CC A4,FDBTNR,A1 TASK ID RF(E) EAT060 LDKL A4,-1 EA OTHER TASK RF EAT100 EAT060 EQU * LDK A4,1 EA SAME ATASK EAT100 EQU * RTN A14 EJECT DMSUBR ****DESCRIPTION************************************* * * EASETB WILL UNCONDITIONALLY PUT A NEW EA BUFFER IN EA-LINK * IF NO BUFFERS ARE AVAILABLE THE SYSTEM WILL HALT AND LITE SOP-LAMPS * ****ENTRY PARAMETERS******************************** * * A6 = FDB ADDR * A2,A3 = LOGICAL RECORD NO * * CF A14,EASETB * ****EXIT PARAMETERS********************************* * * A6 = FDB ADDR * ****USED REGISTERS********************************** * * A1-A4,A6 * ******************************************************* EJECT DMSUBR EASETB EQU * ECR A2,A2 LC A2,FDBTNR,A6 TASK ID ECR A2,A2 LDR A1,A3 LOG REC NO INH CF A15,GETBLK GET BUFF AND STORE A1,A2 * * LINK BUFFER TO FDB * LD A2,FDBEAL,A6 LINK ROOT STR A2,A4 THREAD ST A4,FDBEAL,A6 NEW ROOT ENB RTN A14 EJECT DMSUBR ****DESCRIPTION************************************* * * EARELB WILL RELEASE EA BUFFERS AND CONNRECT THEM * TIO THE FREE LINK. * ****ENTRY PARAMETERS******************************** * * A1 = FDB-ADDRESS * A2,A3 = LOGICAL RECORD NO * A2: BIT 0=1,BIT 1=1 ALL BUFFERS WITH TASK ID SAME AS FDB * AND A9 = 0 * ARE REMOVED. * A2: BIT 0=1,BIT 1=1 * AND A9 NOT EQ 0 ALL BUFFERS ON FDB WITH * TASK ID AS SPEC IN A3 ARE RELEASED * BIT 0=1,BIT 1=0 ALL BUFFERS ON FDB ARE REMOVED. * BIT 0=0 THE FIRST BUFFER WITH TASK ID AND LOG REC NO * AS SPEC IS REMOVED. * ****EXIT PARAMETERS********************************* * * A1 = UNCHANGED * ****USED REGISTERS********************************** * * A1 - A5,A9 * ************************************************* * * THE ROUTINE SETS INHIBIT EJECT DMSUBR EARELB EQU * LDR A5,A1 ADKL A5,FDBEAL ROOT ADR LDR* A4,A5 EA ROOT RF EAR030 EAR020 EQU * LDR A5,A4 SAVE OLD ROOT LDR* A4,A4 NEXT BUFFER ADR EAR030 EQU * RF(Z) EAR100 EA LINK END LDR A2,A2 REC NO RF(N) EAR050 RELEASE MANY BUFFERS * * SEARCH LOG REC NO * CC A2,3,A4 RB(NE) EAR020 CW A3,4,A4 RB(NE) EAR020 RF EAR060 EAR050 EQU * CWK A2,/A000 CHECK BIT 1 RF(L) EAR080 BIT 1 ZERO,ALL BUFFERS REMOVED LDR A3,A9 REQ TASK ID RF(NZ) EAR065 TASK ID IN A3 EAR060 EQU * * * SEARCH TASK IDENT * LC A3,FDBTNR,A1 TAK ID EAR065 EQU * CC A3,2,A4 RB(NE) EAR020 * * EA BUFFER FOUND * EAR080 EQU * LDR* A3,A4 NEXT BUFADR STR A3,A5 REMOVE BUFFER FROM LINK * * RETURN BUFFER TO POOL * INH LD A3,FREQUE STR A3,A4 NEXT FREE ST A4,FREQUE NEW ROOT LDR A4,A5 BUFFER ROOT LDR A2,A2 RB(N) EAR020 RELEASE MORE EAR100 EQU * RTN A14 EJECT DMSUBR ****DESCRIPTION************************************* * * CRNGET WILL SEARCH THE CRN-LINK FOR TASK ID. IF NO BUFFER IS * FOUND A NEW IS FETCHED FROM THE FREE LINK AND B FILLED WITH * ZEROES AND PUT ON THE CRN LINK. IF NO FREE BUFFERS ARE AVAILABLE * THE SYSTEM WILL HALT AND LITE SOP-LAMPS. * TASK ID IS PLACED IN THE BUFFER * ****ENTRY PARAMETERS******************************** * * A1 = FDB ADDRESS DATA FILE * ****EXIT PARAMETERS********************************* * * A1 = UNCHANGED * A2 = ADDRESS OF FOUND CRN-BUFFER * ****USED REGISTERS********************************** * * A1 - A4 * ************************************************** * EJECT DMSUBR CRNGET EQU * LD A2,FDBCRL,A1 CRN ROOT RF CRN030 CRN020 EQU * LDR* A2,A2 NEXT BUFFER CRN030 EQU * RF(Z) CRN100 LINK END * * CHECK ATASK IDENT * LC A3,FDBTNR,A1 TASK ID CC A3,CRNTID,A2 RB(NE) CRN020 OTHER TASK RF CRN200 BUFFER FOUND * * GET NEW BUFFER * CRN100 EQU * INH LD A2,CRNQUE FREE LINK ROOT RF(NZ) CRN120 LDK A1,3 LAMP 10 AND 11 CF A15,HALT NO MORE BUFFERS CRN120 EQU * LDR* A3,A2 NEXT FREE ST A3,CRNQUE UPD ROOT * * FILL BUFFER WITH ZEROES * LDKL A3,CRBUFL BUFFER LENGTH IN BYTES CRN140 EQU * SUK A3,2 ZEROE WORDS 2 - N RF(NP) CRN160 BUFFER ZEROED LDR A4,A2 BUFFER ADR ADR A4,A3 OFFSET IN BUFFER CMR A4 RB CRN140 MORE WORDS * * CONNECT NEW BUFFER TO LINK * CRN160 EQU * LC A3,FDBTNR,A1 SC A3,CRNTID,A2 TASK ID LD A3,FDBCRL,A1 LINK ROOT STR A3,A2 THREAD ST A2,FDBCRL,A1 NEW ROOT CRN200 EQU * ENB RTN A14 EJECT DMSUBR ****DESCRIPTION************************************* * * CALSNO WILL CONVERT A LOGICAL RECORD NO TO * RELATIVE * SECTOR AND OFFSET * ****ENTRY PARAMETERS******************************** * * A1,A2 = LOGICAL RECORD NO * A6 = FDB ADDR * * CF A14,CALSNO * ****EXIT PARAMETERS********************************* * * A1 = 0 OK * NE 0 , ERROR =/A000=END OF MEDIUM * A6 = UNCHANGED * IN FDB : FDBSNR = SECTOR NR * FDBRRO = OFFSET IN BLOCK * ****USED REGISTERS********************************** * * A1 - A9 EJECT DMSUBR CALSNO EQU * * * FIND BLOCK NO WITHIN FILE * LDR A5,A6 SAVE FDB ADDR LDK A6,0 LC A6,FDBBLF,A5 BLOCKING FACTOR CF A14,DIVMOD A2=A1,A2//A6,A1=REMAINDER RF(O) CALERR OVERFLOW LDR A3,A2 QUOTIENT LDR A9,A1 REMAINDER RF(Z) TIOD30 REST = 0 ADK A3,1 RECORD IN NEXT BLOCK RF TIOD40 TIOD30 LC A9,FDBBLF,A5 LAST REC IN BLOCK TIOD40 EQU * * FIND LOGICAL SECTOR NUMBER ON DISC * LDR A6,A3 BLOCK NR RF(NP) CALERR SUK A6,1 LDK A7,0 LC A7,FDBBLZ,A5 NR OF SECT IN BLOCK CF A14,MPYMOD ADK A2,1 RF(O) CAL050 RF CAL090 CAL050 EQU * ANKL A2,/7FFF ADK A1,1 CARRY CAL090 EQU * ST A1,FDBSNR,A5 ST A2,FDBSNR+2,A5 SECT NR * FIND RELATIVE RECORD OFFSET WITHIN BLOCK * LDK A3,0 LDR A2,A9 REL REC NR IN BLOCK TIOD60 EQU * SUK A2,1 A2=REL REC NR RF(Z) TIOD65 REL REC OFFS IN A3 NOW AD A3,FDBRLE,A5 NO ADD RECORD LENGTH ADK A3,1 SKIP STATUS BYTE RB TIOD60 CALERR LDKL A1,EOMERR OUT OF MEDIUM RF TIODMF * * STORE RELATIVE REC OFFSET IN FBDRRO * TIOD65 EQU * LDK A1,0 OK ST A3,FDBRRO,A5 TIODMF EQU * LDR A6,A5 FDB ADDR RTN A14 EJECT DMSUBR * ************** * DMTIOT ************** * * ENTRY DMTIOT CHECK RETURN CODES FROM PHYS DISC I/O * * INPUT A1 = FDB ADDRESS * * OUTPUT A6 = FDB ADDRESS * A1 = 0 WHEN OK * = ERROR CODE ELSE * A9 = DM ECB ADDRESS * A8 = PHYS I/O ECB ADDRESS * A2 WILL BE DESTROYED * * USED REGISTERS : A1,A2,A6,A8,A9 * * DMTIOT EQU * LDKL A8,FDBECB ADR A8,A1 * * DMTIOZ IS THE SAME AS DMTIOT WITH DIFFERENCE THAT ECB ADDR IS INPUT PAR * DMTIOZ EQU * * * RESTORE SECTOR NUMBER * LD A6,FDBSNR,A1 ST A6,ECBCW,A8 LD A6,FDBSNR+2,A1 ST A6,ECBCW+2,A8 LDR A6,A1 LD A9,DWTECB,A6 DM ECB ADDRESS LD A1,ECBRC,A8 RF(Z) DMTIOX DISC I/O OK ANKL A1,/FEFF RF(NZ) DMTIT1 NOT ONLY RETRIES LDKL A2,RETRIE DMTIOC EQU * ORS A2,ECBRC,A9 USER RC RF DMTIOX DMTIT1 EQU * LD A2,ECBBA,A8 * GET BUFFER ADDR SUKL A2,BUFSTA BUFSTA CM BUFDMI,A2 CLEAR FILE NR IN BUFFER LD A2,DWTOR,A6 ANK A2,/3F ORDER SUKL A2,QCL RF(NZ) DMTIOX NOT CLOSE LDR A2,A1 LDK A1,0 RB DMTIOC DMTIOX RTN A14 EJECT DMSUBR ****DESCRIPTION************************************* * * GTBKBU WILL GET A BLOCK BUFFER FOR DISC I/O AND * PREPARE IT. ECB IS PREPARED FOR PHYS I/O. * ****ENTRY PARAMETERS******************************** * * A1 = FDB ADDRESS * A8 = ECB ADDR * ****EXIT PARAMETERS********************************* * * A1 = A6 = FDB ADDR * A2 = FDBRRO WHEN SECTOR IS FOUND IN CORE * = -1 WHEN NO DATA IS FOUND IN * THE FOUND CORE BUFFER * A3 = BUFFER ADDRESS * A5 = ORDE R CODE * A8 = ECB ADDR * A9 = DM ECB ADDR * ****USED REGISTERS********************************** * * A1 - A9 * ****************************************************** GTBKBU EQU * LDR A6,A1 A6 = FDB ADDRESS LC A1,FWTFNR,A6 FILE NR LD A2,FDBSNR,A6 SECTOR NUMBER LD A4,FDBSNR+2,A6 LD A9,DWTECB,A6 DM ECB ANK A1,/FF STR A1,A8 FILE NR LC A5,FDBBLZ,A6 SLL A5,8 BLOCK SIZE IN BYTYE ST A5,ECBRL,A8 BLOCK LENGTH CF A14,DMTGBU A3 := BUFFER ADDRESS RF GTB100 RETURN IF SECTOR FOUND IN BUFFER * RETURN IF SECTOR MUST BE READ FROM DISC ST A2,ECBCW,A8 SECT NR LDKL A2,-1 RET CODE GTB040 EQU * ST A4,ECBCW+2,A8 SECT NR LDR A5,A3 ADKL A5,BUFSTA A5 = DATA BUFFER START ADDRESS ST A5,ECBBA,A8 LD A5,DWTOR,A6 ANK A5,/3F LDR A1,A6 FDB ADDRESS AS PARAMETER RTN A14 GTB100 EQU * ST A2,ECBCW,A8 SECT NR LD A2,FDBRRO,A6 REC OFFS IN BUFFER RB GTB040 STORE ORDER CODE EJECT DMSUBR * * IFT MMUPAG=1 * * M O V : U S * * THIS ROUTINE MOVES DATA FROM THE USER AREA (SENDING BUFFER) TO * THE SYSTEM AREA (RECEIVING BUFFER). DIFFERENT WAYS OF MOVING THE DATA * ARE USED, DEPENDING ON WHETHER THE BUFFER ADDRESSES ARE EVEN OR NOT. * * INPUT: A1 = ADDRESS OF SENDING BUFFER (USER AREA) * A2 = ADDRESS OF RECEIVING BUFFER (SYSTEM AREA) * A3 = NUMBER OF BYTES TO BE MOVED * A4 = USER TTAB ADDRESS * * OUTPUT: A1-A4 ARE DESTROYED * MOV:US EQU * INH TL TTB:MT,A4 SET USER MMU LD A4,PRUN TS TTB:MT,A4 ENB CF A14,MOVZUS INH TL MONMMU SET SYSTEM MMU LD A4,PRUN TS TTB:MT,A4 ENB RTN A14 MOVZUS EQU * LDR A3,A3 CHECK REQUESTED LENGTH RF(NP) MVUS35 NO MOVE IF REQUESTED LENGTH <= 0 STR A5,A14 SAVE A5 LDR A4,A1 CHECK USER BUFFER ADDRESS ANK A4,1 RF(NZ) MVUS40 USER BUFFER ADDRESS UNEVEN? LDR A4,A2 NO, CHECK SYSTEM BUFFER ADDRESS ANK A4,1 RF(NZ) MVUS55 SYSTEM BUFFER ADDRESS UNEVEN? * MVUS10 LDR A4,A3 CHECK REQUESTED LENGTH ANK A4,1 RF(NZ) MVUS60 REQUESTED LENGTH UNEVEN? * MVUS20 MVUS A3 * MVUS30 LDR* A5,A14 RESTORE A5 * MVUS35 EQU * RTN A14 * EJECT DMSUBR * * MVUS40 EQU * USER BUFFER ADDRESS WAS UNEVEN LDR A4,A2 CHECK SYSTEM BUFFER ADDRESS ANK A4,1 RF(NZ) MVUS80 SYSTEM BUFFER ADDRESS UNEVEN? ELR A4,A1 NO, GET FIRST CHAR. FROM USER BUFFER * MVUS50 SCR A4,A2 STORE CHAR. IN SYSTEM BUFFER ADK A2,1 UPDATE SYSTEM BUFFER ADDRESS SUK A3,1 DECREMENT REQUESTED LENGTH RB(NP) MVUS30 LAST CHAR. MOVED? ADK A1,2 NO, UPDATE USER BUFFER ADDRESS * MVUS55 ELR A4,A1 GET NEXT TWO CHAR. FROM USER BUFFER ECR A5,A4 SCR A5,A2 STORE ONE CHAR. IN SYSTEM BUFFER ADK A2,1 UPDATE SYSTEM BUFFER ADDRESS SUK A3,1 DECREMENT REQUESTED LENGTH RB(P) MVUS50 MORE CHAR. TO MOVE? RB MVUS30 NO, RETURN * EJECT DMSUBR * * MVUS60 EQU * REQUESTED LENGTH WAS UNEVEN SUK A3,1 MAKE REQUESTED LENGTH EVEN RF(NP) MVUS70 ONLY ONE CHAR. TO MOVE? LDR A4,A1 NO, SAVE A1 LDR A5,A3 SAVE A3 MVUS A3 ADR A4,A5 UPDATE USER BUFFER ADDRESS ELR A5,A4 GET LAST CHAR. FROM USER BUFFER * MVUS65 ECR A5,A5 SCR A5,A2 STORE LAST CHAR. IN SYSTEM BUFFER RB MVUS30 RETURN * MVUS70 ELR A5,A1 GET LAST CHAR. FROM USER BUFFER RB MVUS65 * MVUS80 EQU * BOTH BUFFER ADDRESSES WERE UNEVEN ELR A4,A1 GET FIRST CHAR. FROM USER BUFFER SCR A4,A2 STORE FIRST CHAR. IN SYSTEM BUFFER ADK A1,1 UPDATE BUFFER ADDRESSES ADK A2,1 SUK A3,1 DECREMENT REQUESTED LENGTH RB(P) MVUS10 MORE CHAR. TO MOVE? RB MVUS30 NO, RETURN * EJECT DMSUBR * * M O V : S U * * THIS ROUTINE MOVES DATA FROM THE SYSTEM AREA (SENDING BUFFER) TO * THE USER AREA (RECEIVING BUFFER). DIFFERENT WAYS OF MOVING THE DATA * ARE USED, DEPENDING ON WHETHER THE BUFFER ADDRESSES ARE EVEN OR NOT. * * INPUT: A1 = ADDRESS OF SENDING BUFFER (SYSTEM AREA) * A2 = ADDRESS OF RECEIVING BUFFER (USER AREA) * A3 = NUMBER OF BYTES TO BE MOVED * A4 = USER TTAB ADDRESS * * OUTPUT: A1-A4 ARE DESTROYED * MOV:SU EQU * INH TL TTB:MT,A4 SET USER MMU LD A4,PRUN TS TTB:MT,A4 ENB CF A14,MOVZSU INH TL MONMMU SET SYSTEM MMU LD A4,PRUN TS TTB:MT,A4 ENB RTN A14 MOVZSU EQU * LDR A3,A3 CHECK REQUESTED LENGTH RF(NP) MVSU35 NO MOVE IF REQUESTED LENGTH <= 0 STR A5,A14 SAVE A5 LDR A4,A2 CHECK USER BUFFER ADDRESS ANK A4,1 RF(NZ) MVSU40 USER BUFFER ADDRESS UNEVEN? LDR A4,A1 NO, CHECK SYSTEM BUFFER ADDRESS ANK A4,1 RF(NZ) MVSU60 SYSTEM BUFFER ADDRESS UNEVEN? * MVSU10 LDR A4,A3 CHECK REQUESTED LENGTH ANK A4,1 RF(NZ) MVSU90 REQUESTED LENGTH UNEVEN? * MVSU20 MVSU A3 * MVSU30 LDR* A5,A14 RESTORE A5 * MVSU35 RTN A14 * EJECT DMSUBR * * MVSU40 EQU * USER BUFFER ADDRESS WAS UNEVEN LDR A4,A1 CHECK SYSTEM BUFFER ADDRESS ANK A4,1 RF(NZ) MVSU80 SYSTEM BUFFER ADDRESS UNEVEN? ELR A4,A2 NO, GET FIRST CHAR. FROM USER BUFFER RF MVSU65 * MVSU60 EQU * SYSTEM BUFFER ADDRESS WAS UNEVEN LCR A4,A1 GET ONE CHAR. FROM SYSTEM BUFFER ECR A4,A4 ADK A1,1 UPDATE SYSTEM BUFFER ADDRESS SUK A3,1 DECREMENT REQUESTED LENGTH RF(NP) MVSU70 IS THIS LAST CHARACTER? * MVSU65 LCR A4,A1 NO, GET NEXT CHAR. FROM SYSTEM BUFFER ESR A4,A2 STORE TWO CHAR. IN USER BUFFER ADK A1,1 UPDATE BUFFER ADDRESSES ADK A2,2 SUK A3,1 DECREMENT REQUESTED LENGTH RB(P) MVSU60 MORE CHAR. TO MOVE? RB MVSU30 NO, RETURN * MVSU70 ELR A3,A2 GET LAST CHAR. FROM USER BUFFER ANK A3,/FF SKIP LEFT CHARACTER ANKL A4,/FF00 SKIP RIGHT CHARACTER ORR A3,A4 ESR A3,A2 STORE LAST CHAR. IN USER BUFFER RB MVSU30 RETURN * EJECT DMSUBR * * MVSU80 EQU * BOTH BUFFER ADDRESSES WERE UNEVEN LDR* A4,A1 GET FIRST CHAR. FROM SYSTEM BUFFER ELR A5,A2 GET FIRST CHAR. FROM USER BUFFER ANK A4,/FF SKIP LEFT CHARACTER ANKL A5,/FF00 SKIP RIGHT CHARACTER ORR A4,A5 ESR A4,A2 STORE FIRST CHAR. IN USER BUFFER ADK A1,1 UPDATE BUFFER ADDRESSES ADK A2,1 SUK A3,1 DECREMENT REQUESTED LENGTH RB(P) MVSU10 MORE CHARACTERS TO MOVE? RB MVSU30 NO, RETURN * MVSU90 EQU * REQUESTED LENGTH WAS UNEVEN SUK A3,1 MAKE REQUESTED LENGTH EVEN RF(NP) MVSU95 ONLY ONE CHAR. TO MOVE? LDR A4,A1 NO, SAVE A1 LDR A5,A3 SAVE A3 MVSU A3 ADR A4,A5 UPDATE BUFFER ADDRESSES ADR A2,A5 LDR* A4,A4 GET LAST CHAR. FROM SYSTEM BUFFER RB MVSU70 * MVSU95 LDR* A4,A1 GET LAST CHAR. FROM SYSTEM BUFFER RB MVSU70 XIF * IFT MMUPAG=0 MOV:US EQU * DUMMY LABELS FOR NON-MMU SYSTEMS MOV:SU EQU * MOVZSU EQU * MOVZUS EQU * ABL TASHLT HALT SYSTEM DUE TO SYSGEN ERROR XIF * * END