|
|
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: 26834 (0x68d2)
Notes: pts_type(SC)
Names: »DMSUBR.SC«
└─⟦110b7ed5e⟧ Bits:30009664 Philips computer tape "600106"
└─⟦this⟧ »TOSSWORK/DMSUBR.SC«
└─⟦781e933ac⟧ Bits:30009686 Philips computer tape "600310"
└─⟦this⟧ »M:92T1/DMSUBR.SC«
IDENT DMSUBR REL 9.2 79-11-16 870105040920 =1 CLEAR ECB REL 9.1 79-04-06 * **************************************************** * * PHILIPS TERMINAL SYSTEM PTS * * DMSUBR = COMMON DM-ROUTINES * * * * * * **************************************************** ****THIS MODULE IS ACTIVATED FROM :***************** * * DMTASK,TIODM,DMTASS * *************** * ENTRIES * *************** * * ENTRY EATEST,EASETB,EARELB,CRNGET ENTRY CALSNO ENTRY GTBKBU,GTLGRN ENTRY DMTIOT ENTRY CHKIND,REQEND ENTRY DMTIOZ ENTRY MOV:US MOVE FROM USER TO SYSTEM AREA ENTRY MOV:SU MOVE FROM SYSTEM TO USER AREA * ***************** * EXTERNALS * ***************** * * EXTRN FDBEAL,FDBTNR,FDBCRL,FDBRLE,FDBSNR,FDBRRO EXTRN FDBCEX,FDBBLF,FDBEXT EXTRN FDBECB,DWTECB,DWTOR,EXTDMI,BUFSTA,BUFDMI,BUFOR EXTRN ECBRC,ECBFC,ECBCW,ECBBA EXTRN TTB:ID TASK ID EXTRN DWTTDM,DWTTQ EXTRN QTJOB EXTRN ECBRL,SECTLE EXTRN DIVMOD,MPYMOD EXTRN EXTELE EXTRN CRNTID EXTRN DMTGBU EXTRN EXTLEN,EXTBAS EXTRN CRNQUE,GETBLK,FREQUE EXTRN HALT EXTRN CRBUFL EXTRN IHRET2,IHRTN,FDBADF,DWTST EXTRN FDBDBR EXTRN QIRN,QIRR EXTRN TASHLT SYSTEM HALT ROUTINE EJECT DMSUBR TOSSIO * * ***************************************** * * CONDITIONAL ASSEMBLY * ***************************************** * * A PROGRAM VERSION USING TOSS MMU PAGING * IS OBTAINED BY SETTING MMUPAG EQU 1. * MMUPAG EQU 0 * EJECT DMSUBR * * CHKIND IS USED FROM FNDDWT TO SELECT DM-DWT * INDEX FILE (INDEX 0) SHALL BE SELECTED FOR * DX,IX,XR,XN, DATA FILE OTHERWISE * CHKIND EQU * STR A1,A15 STR A2,A15 LDK A2,1 INDEX FOR DATA FILE LDR A1,A7 ORDER ANK A1,/3F CWK A1,/20 RF(E) FND320 DELETE INDEX CWK A1,/1A RF(E) FND320 INDEXED READ ANK A1,/3E REMOVE BIT 15 SUK A1,/1E RF(E) FND320 INSERT INDEX OR INDEXED READ NEXT RF FND340 FND320 LDK A2,0 INDEX FOR INDEX FILE FND340 EQU * CCR A2,A6 INDEX RF(E) FND390 ENTRY FOUND LDK A1,2 ADS A1,8,A15 RETURN+2 WHEN NOT FOUND FND390 ABL IHRET2 EJECT DMSUBR * * REQEND IS USED IN TENDIO TO RESET REQUEST BUSY BIT * FOR ALL FILES * AND TO RESOLVE ALL QUEUES * REQEND EQU * LC A2,TTB:ID,A5 GET TASK ID CCK A2,'##' RF(E) TEN117 JUMP IF DMTASK CALLING * * RESET REQUEST BUSY BIT FOR ALL FILES * LDK A2,10 MAX NO OF FILES * 2 STR A4,A15 SAVE A4 (USED BY TENDIO!!) TEN112 EQU * SUK A2,2 RF(N) TEN115 NO MORE FILES LDR A3,A6 ADR A3,A2 LD A3,FDBADF,A3 FDB ADDR RB(Z) TEN112 CWR A3,A6 DWT ADDR RF(E) TEN114 MASTER DWT LD A5,DWTTQ,A3 RF(Z) TEN113 NO QUEUE LDR* A4,A5 ST A4,DWTTQ,A3 NEW ANCHOR CF A15,QTJOB REPEAT REQUEST TEN113 LD A5,DWTTDM,A6 RESTORE TEN114 EQU * LDKL A4,/BFFF REQUEST BUSY BIT ANS A4,DWTST,A3 RESET LDKL A4,/8000 ORS A4,DWTST,A3 DEVICE NOT BUSY RB TEN112 TEN115 EQU * LDR* A4,A15 RESTORE A4 * TEN117 EQU * ABL IHRTN 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 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 * IS REMOVED. * BIT 0=1,BIT 1=0 ALL BUFFERS ON FDB IS 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 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 EAR060 EQU * * * SEARCH TASK IDENT * LC A3,FDBTNR,A1 TAK ID 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 * RTN A14 EJECT DMSUBR ****DESCRIPTION************************************* * * CALSNO WILL CONVERT A LOGICAL RECORD NO TO * SECTOR AND OFFSET * ****ENTRY PARAMETERS******************************** * * A1,A2 = LOGICAL RECORD NO * A6 = FDB ADDR * * CF A14,CALSNO * ****EXIT PARAMETERS********************************* * * A1 = 0 OK * NE 0 , ERROR =/20=END OF MEDIUM * A4 = EXTENT ADDRESS * A6 = UNCHANGED * IN FDB : FDBSNR = SECTOR NR * FDBRRO = OFFSET IN SECTOR * FDBCEX = CURRENT EXTENT * ****USED REGISTERS********************************** * * A1 - A9 EJECT DMSUBR CALSNO EQU * * * FIND SECTOR 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) TIOD99 OVERFLOW LDR A3,A2 QUOTIENT LDR A6,A5 FDB ADDR LDR A2,A1 REMAINDER RF(Z) TIOD30 REST = 0 ADK A3,1 RECORD IN NEXT SECTOR RF TIOD40 TIOD30 LC A2,FDBBLF,A6 LAST REC IN SECTOR * * FIND FILE EXTENT * TIOD40 EQU * LDR A4,A6 ADKL A4,FDBEXT FIRST FILE EXTENT LD A9,EXTLEN,A4 LENGTH OF FIRST EXTENT LDK A5,4 NUMBER OF EXTENTS TIOD45 CWR A3,A9 RF(NG) TIOD55 SECTOR IN THIS EXTENT SUK A5,1 NO RF(NP) TIODMO EOF ERROR RETURN ADK A4,6 NEXT EXTENT BLOCK AD A9,EXTLEN,A4 ADD LENGTH OF NEXT EXTENT RB TIOD45 * * SAVE CURRENT EXTENT BLOCK POINTER * TIOD55 ST A4,FDBCEX,A6 * * FIND LOGICAL SECTOR NUMBER ON DISC * SU A9,EXTLEN,A4 NO OF SECTORS IN PREVIOUS EXTENTS SUR A3,A9 SECTOR NO WITHIN EXT SUK A3,1 START FROM ZERO RF(N) TIODMO BEFORE MEDIUM AD A3,EXTBAS,A4 SECTOR NO ON DISC ST A3,FDBSNR,A6 SAVE LOGICAL SECTOR NUMBER * FIND RELATIVE RECORD OFFSET WITHIN SECTOR * LDK A3,0 TIOD60 SUK A2,1 A2=RELATIVE REC NO RF(Z) TIOD65 REL REC OFFS IN A3 NOW AD A3,FDBRLE,A6 NO ADD RECORD LENGTH ADK A3,1 SKIP STATUS BYTE RB TIOD60 TIOD99 LDR A6,A5 FDB TIODMO LDK A1,/20 END OF MEDIUM RF TIODMF * * STORE RELATIVE REC OFFSET IN FBDRRO * TIOD65 EQU * LDK A1,0 OK ST A3,FDBRRO,A6 TIODMF EQU * 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 * LDR A6,A1 FDB ADDRESS LDKL A8,FDBECB ADR A8,A6 LD A9,DWTECB,A6 DM ECB ADDRESS DMTIT0 EQU * LD A1,ECBRC,A8 RF(Z) DMTIOX DISC I/O OK ANKL A1,/FEFF RF(NZ) DMTIT1 NOT ONLY RETRIES LDKL A2,/100 ORS A2,ECBRC,A9 USER RC RF DMTIOX DMTIT1 EQU * LD A2,FDBDBR,A6 ANKL A2,/C0FF ST A2,FDBDBR,A6 RELEASE BUFFER LD A2,ECBBA,A8 * GET BUFFER ADDR SUK A2,8 BUFSTA CM BUFDMI,A2 CLEAR VOL IDENT IN BUFFER LDK A1,/02 DISC IO ERROR LDKL A2,/FF7E NOT BIT 8 OR 15 AN A2,ECBRC,A8 RF(NZ) DMTIOX LD A1,ECBRC,A8 BIT 8 OR 15 DMTIOX RTN A14 EJECT * * DMTIOZ HAS ALMOST THE SAME FUNCTION AS DMTIOT BUT * ECB ADDR IS INPUT PARAM * * IN: A1 = FDB ADDR * A8 = ECB ADDR * OUT: * A1 = RET CODE * A2 = DESTROYED * A6 = FDB ADDR * A8 = ECB ADDR * A9 == USER ECB * DMTIOZ LDR A6,A1 LD A2,DWTOR,A6 ORDER ANK A2,/3F CWK A2,QIRN RF(E) DMTIZ1 INDEXED READ NEXT CWK A2,QIRR RF(E) DMTIZ1 INDEXED RANDOM READ LD A1,FDBADF,A6 FDB DATA FILE DMTIZ1 EQU * LD A9,DWTECB,A1 USER ECB RB DMTIT0 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 * FDB-CEX,ECB,SNR,RRO * ECB-FC,CW,BA,DWT-OR,ECB,EXTDMI * 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 LD A4,FDBCEX,A6 CURRENT EXTENT BLOCK POINTER LD A1,EXTDMI,A4 DMIDENT, FC LD A2,FDBSNR,A6 SECTOR NUMBER LD A9,DWTECB,A6 DM ECB ANK A1,/FF =1 STR A1,A8 DISC VOL FILE CODE =1 LDR A4,A2 SAVE LDKL A5,SECTLE ST A5,ECBRL,A8 SECTOR LENGTH CF A14,DMTGBU A3 := BUFFER ADDRESS RF GTB100 RETURN IF SECTOR FOUND IN BUFFER * RETURN IF SECTOR MUST BE READ FROM DISC LDKL A2,-1 RET CODE GTB040 EQU * ST A4,ECBCW,A8 SECTOR 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 * LD A2,FDBRRO,A6 REC OFFS IN BUFFER RB GTB040 STORE ORDER CODE EJECT DMSUBR ****DESCRIPTION************************************* * * GTLGRN WILL CONVERT FDBSNR AND FDBRRO TO A LOGICAL RECORD NO * ****ENTRY PARAMETERS******************************** * * A1 = FDB ADDRESS * FDBSNR,FDBRRO,FDBCEX * ****EXIT PARAMETERS********************************* * * A1=A5=A6= FDB ADDRESS * A2,A3 = LOG RECORD NO * ****USED REGISTERS********************************** * * A1 - A7 * ****************************************************** EJECT DMSUBR GTLGRN EQU * LDK A6,0 LDKL A3,FDBEXT ADKL A3,EXTLEN ADR A3,A1 ADDR FIRST EXT LENGTH LD A7,FDBCEX,A1 EXT ADDR ADKL A7,EXTLEN ADDR TO LAST LENGTH GTL050 EQU * CWR A3,A7 RF(E) GTL100 ALL PREVIOUS EXTENTS COUNTED * NOTE THAT ONLY (E) CAN BE TESTED ADR* A6,A3 NO OF SECT IN EXTENT ADKL A3,EXTELE EXT ENTRY LENGTH RB GTL050 NEXT EXTENT GTL100 EQU * LD A7,FDBCEX,A1 EXT ADDR SU A6,EXTBAS,A7 TOTAL NO OF SECTORS AD A6,FDBSNR,A1 TOTAL NR OF SECTORS * * CONVERT FDBRRO TO NO OF RECORDS * LDK A7,0 LC A7,FDBBLF,A1 BLOCK FACTOR LDR A5,A1 SAVE FDB ADDR CF A14,MPYMOD A1,A2=A6*A7 LD A4,FDBRLE,A5 ADK A4,1 RECORD LENGTH LDK A7,0 RECORD COUNTER LD A6,FDBRRO,A5 OFFSET IN SECTOR ADK A6,1 GTL150 EQU * ADK A7,1 RECORD COUNTER SUR A6,A4 RB(NN) GTL150 COUNT RECORDS IN SECTOR * * ADD SECT*BLOCFACT AND RECINCURRSECT * ADR A2,A7 RF(O) GTL160 OVERFLOW RF GTL170 GTL160 EQU * ANKL A2,/7FFF DELETE OVERFLOWBIT ADK A1,1 ADD CARRY GTL170 EQU * LDR A3,A2 LDR A2,A1 LDR A1,A5 FDB ADDR LDR A6,A5 RTN A14 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 * * OUTPUT: A1-A4 ARE DESTROYED * MOV:US 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 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 * * OUTPUT: A1-A4 ARE DESTROYED * MOV:SU 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 * ABL TASHLT HALT SYSTEM DUE TO SYSGEN ERROR XIF * * END