|
|
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: 38970 (0x983a)
Notes: pts_type(SC)
Names: »SDMSUB.SC«
└─⟦13e5fd45a⟧ Bits:30009699 Philips computer tape "600507"
└─⟦this⟧ »TOSSWORK/SDMSUB.SC«
└─⟦bc20f3abf⟧ Bits:30009670 Philips computer tape "600126"
└─⟦this⟧ »TOSSWORK/SDMSUB.SC«
IDENT SDMSUB REL 11.0 81-05-22 870105041100 =6,FORMATTING ERROR =6,REL 11.0 81-05-12 =5,CONDITION FOR CR,DE,EX =5,REL 11.0 81-03-20 =4,BLOCK BUFFER CHAIN DESTR. WHEN FORM. WITH LEN=0 =4,REL 11.0 81-03-17 =3,NBR. OF SAME CHAR. IN KEY WRONG =3,REL 11.0 81-03-13 =2,ADDRESS COMPARE WHEN FORMAT BLOCK,BAD =1 =2,REL 11.0 81-02-04 =1 =1,SUB. TO FORMAT BLOCK BUFFER CHNG. =1,REL 11.0 81-01-26 **************************************************** * * PHILIPS TERMINAL SYSTEM PTS * * SDMSUB = COMMON SDM-ROUTINES * * * * * * **************************************************** ****THIS MODULE IS ACTIVATED FROM :***************** * * DMTASK,TIODM,DMTASS * *************** * ENTRIES * *************** * ENTRY RELPRO ENTRY MOVBW ENTRY EATEST,EASETB,EARELB,CRNGET ENTRY CALSNO ENTRY GTBKBU ENTRY CARRBL,CRRBL ENTRY FMIOOP,FMIOCL,FMIORD ENTRY FMIORF,FMIOWR,FMIODL ENTRY FMIOCR,FMIOEX ENTRY FRMFIL,FORMAT,FORMER =1 ENTRY RLBLKB,CHKRCD ENTRY CASZEN EJECT * * E N T R I E S F O R I N D E X S U B R O U T I N E S * * *************** * ENTRIES * *************** * ENTRY CHKKEY ENTRY RDNXTR ENTRY FNDKEY ENTRY CRNUPD ENTRY GTLGRN ENTRY CRNCIF ENTRY RECECB EJECT * ***************** * EXTERNALS * ***************** * * EXTRN FDBEAL,FDBTNR,FDBCRL,FDBRLE,FDBSNR,FDBRRO EXTRN FDBBLF,FDBADF EXTRN FDBBLZ,FWTFNR EXTRN FDBSTA,SCTTCT,TTB:SA,ECBEL EXTRN FDBECB,DWTECB,DWTOR,BUFSTA,BUFDMI,BUFOR EXTRN FDBLRN,FDBMIA,FDBMRO EXTRN ECBRC,ECBFC,ECBCW,ECBBA EXTRN DIVMOD,MPYMOD EXTRN CRNTID EXTRN SDMGBU EXTRN CRNQUE,GETBLK,FREQUE EXTRN CRBUFL EXTRN FDBDBR EXTRN HALT,DSUMOD,ECBRL EXTRN EOMERR,RETRIE EXTRN REQER2,QTJOB,TDISP EXTRN DWTTAB,MONMMU,TTB:MT EXTRN FDBOMD EXTRN MOVFW EXTRN ADDMOD EXTRN SDMRBU,CLRBUF EXTRN BLKMXL MAX BLOCK LENGTH EXTRN EOFRC,NOKEY EXTRN RTNA14 EXTRN FPB:RL,FPB:BF,FPB:S1,SIZDIF EJECT SDMSUB TOSSIO * * ***************************************** * * CONDITIONAL ASSEMBLY * ***************************************** * * A PROGRAM VERSION USING TOSS MMU PAGING * IS OBTAINED BY SETTING MMUPAG EQU 1. * MMUPAG EQU 0 X:A EQU 0 INDXAC EQU X:A * * A VERSION LEAVING OUT OPEN MODES: * OPEN OUTPUT,OPEN EXTEND AND DISCARD * IS OBTAINED BY SETTING Y:C=0 * X:B EQU 0 =5 CRDEEX EQU X:B =5 EJECT * * THIS ROUTINE RELEASES PROTECTION AT END OF TRANSACTION * * ENTRY : A3 = DM INTERNAL USER ID * * USED REGS A1 - A5 , A9 * * NUMBER OF A14 LEVELS = 4 (WORDS) * RELPRO EQU * RELEASE PROTECTION LDR A9,A11 SAVE FDB ADDRESS LDKL A11,FDBSTA FIRST FWT ADDR REL050 EQU * LDR* A1,A11 ANK A1,/1 RF(Z) REL053 NOT USED LDKL A1,/C000 REMOVE BUFFERS FOR THIS TASK CF A14,EARELB ENB REL053 EQU * LDR* A11,A11 ANKL A11,/FFFE SKIP USE BIT RB(NZ) REL050 MORE FDBS LDR A11,A9 FDB ADDRESS RTN A14 EJECT * ************* * MOVBW * ************* * * ENTRY DMTBM BYTE MOVE * * INPUT A1 = FROM ADDRESS * A3 = NO OF BYTES TO BE MOVED * A2 = TO ADDRESS * * * OUTPUT A3 = NEXT CHAR * * NUMBER OF A14 LEVELS = 2 (WORDS) * DMTB10 EQU * LDR* A4,A14 RTN A14 * * MOVBW HAS THE SAME FUNCTION AS DMTBM BUT * MOVES FROM THE END * MOVBW EQU * STR A4,A14 ADR A1,A3 ADR A2,A3 DMTB20 EQU * SUK A3,1 RB(N) DMTB10 SUK A1,1 SUK A2,1 LCR A4,A1 SCR A4,A2 RB DMTB20 EJECT SDMSUB ****DESCRIPTION************************************* * * EATEST WILL SEARCH THE EA-LINK FOR A LOG RECORD NO. * ****ENTRY PARAMETERS******************************** * * A11= FDB ADRESS * A1,A2 = LOG RECORD NO * * CF A14,EATEST * ****EXIT PARAMETERS********************************* * * A1,A2,A11 = UNCHANGED * A3 = 0 NO EA AT ALL * = +1 EA FOUND FOR ACTUAL TASK * = -1 EA FOUND FO R OTHER TASK * NUMBER OF A14 LEVELS = 2 (WORDS) * ****USED REGISTERS********************************** * BLKTID EQU 4 TASK ID BLKRNM EQU 5 RECORD NUMBER MOST SIGNIFICANT BLKRNL EQU 2 RECORD NUMBER LEAST SIGNIFICANT EJECT SDMSUB EATEST EQU * LD A3,FDBEAL,A11 BUFFER QUEUE RF EAT030 EAT020 EQU * LDR* A3,A3 NEXT BUFFER ADR EAT030 EQU * RF(Z) EAT100 EMPTY QUEUE,NO EA * * SEARCH LOG REC NO * CC A1,BLKRNM,A3 FIRST CHARACTER RB(NE) EAT020 CW A2,BLKRNL,A3 2 AND 3 CHARACTER RB(NE) EAT020 * * RECORD NO FOUND * LC A3,BLKTID,A3 CC A3,FDBTNR,A11 TASK ID RF(E) EAT060 LDKL A3,-1 EA OTHER TASK RF EAT100 EAT060 EQU * LDK A3,1 EA SAME ATASK EAT100 EQU * ADKL A14,4 ADK A3,0 ABR* A14 EJECT SDMSUB ****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******************************** * * A11= FDB ADDR * A1,A2 = LOGICAL RECORD NO * * CF A14,EASETB * ****EXIT PARAMETERS********************************* * * A11= FDB ADDR * NUMBER OF A14 LEVELS = 2 (WORDS) * ****USED REGISTERS********************************** * * A1,A4 * ******************************************************* EJECT SDMSUB EASETB EQU * ECR A1,A1 LC A1,FDBTNR,A11 TASK ID ECR A1,A1 INH CF A15,GETBLK GET BUFF AND STORE A1,A2 * * LINK BUFFER TO FDB * LD A1,FDBEAL,A11 LINK ROOT STR A1,A4 THREAD ST A4,FDBEAL,A11 NEW ROOT ENB RTN A14 EJECT SDMSUB ****DESCRIPTION************************************* * * EARELB WILL RELEASE EA BUFFERS AND CONNECT THEM * TO THE FREE LINK. * ****ENTRY PARAMETERS******************************** * * A11= FDB-ADDRESS * A1,A2 = LOGICAL RECORD NO * A1: BIT 0=1,BIT 1=1 ALL BUFFERS WITH TASK ID SAME AS FDB * AND A3 = 0 * ARE REMOVED. * A1: BIT 0=1,BIT 1=1 * AND A3 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********************************* * * A11,A3,A1 = UNCHANGED * NUMBER OF A14 LEVELS = 2 (WORDS) * ****USED REGISTERS********************************** * * A2,A4,A5 * ************************************************* * * THE ROUTINE SETS INHIBIT EJECT SDMSUB EARELB EQU * LDR A4,A11 ADKL A4,FDBEAL ROOT ADR EAR020 EQU * LDR A5,A4 SAVE OLD ROOT LDR* A4,A4 NEXT BUFFER ADR RF(Z) EAR100 EA LINK END LDR A1,A1 REC NO RF(N) EAR050 RELEASE MANY BUFFERS * * SEARCH LOG REC NO * CC A1,BLKRNM,A4 RB(NE) EAR020 CW A2,BLKRNL,A4 RB(NE) EAR020 RF EAR060 EAR050 EQU * CWK A1,/A000 CHECK BIT 1 RF(L) EAR080 BIT 1 ZERO,ALL BUFFERS REMOVED LDR A2,A3 REQ TASK ID RF(NZ) EAR065 TASK ID IN A3 EAR060 EQU * * * SEARCH TASK IDENT * LC A2,FDBTNR,A11 TASK ID EAR065 EQU * CC A2,BLKTID,A4 RB(NE) EAR020 EJECT * * EA BUFFER FOUND * EAR080 EQU * LDR* A2,A4 NEXT BUFADR STR A2,A5 REMOVE BUFFER FROM LINK * * RETURN BUFFER TO POOL * INH LD A2,FREQUE STR A2,A4 NEXT FREE ST A4,FREQUE NEW ROOT LDR A4,A5 BUFFER ROOT LDR A1,A1 RB(N) EAR020 RELEASE MORE EAR100 EQU * RTN A14 EJECT SDMSUB ****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******************************** * * A11= FDB ADDRESS DATA FILE * FDBTNR,A11 = TASK NUMBER * FDBTNR,A11=CALLING TASK NUMBER * FDBCRL,A11=CURRENCY LINK * ****EXIT PARAMETERS********************************* * * A11= UNCHANGED * A2 = ADDRESS OF FOUND CRN-BUFFER * NUMBER OF A14 LEVELS = 2 (WORDS) * ****USED REGISTERS********************************** * * A1,A3 * ************************************************** * EJECT SDMSUB CRNGET EQU * LDKL A2,FDBCRL ADR A2,A11 CRN ROOT CRN020 EQU * LDR* A2,A2 NEXT BUFFER RF(Z) CRN100 LINK END * * CHECK ATASK IDENT * LC A3,FDBTNR,A11 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 EJECT * * 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 A1,A2 BUFFER ADR ADR A1,A3 OFFSET IN BUFFER CMR A1 RB CRN140 MORE WORDS * * CONNECT NEW BUFFER TO LINK * CRN160 EQU * LC A3,FDBTNR,A11 SC A3,CRNTID,A2 TASK ID LD A3,FDBCRL,A11 LINK ROOT STR A3,A2 THREAD ST A2,FDBCRL,A11 NEW ROOT CRN200 EQU * ENB RTN A14 EJECT SDMSUB ****DESCRIPTION************************************* * * CALSNO WILL CONVERT A LOGICAL RECORD NO TO * RELATIVE * SECTOR AND OFFSET * ****ENTRY PARAMETERS******************************** * * A1,A2 = LOGICAL RECORD NO * A11= FDB ADDR * * CF A14,CALSNO * ****EXIT PARAMETERS********************************* * * A1 = 0 OK * NE 0 , ERROR =/A000=END OF MEDIUM * A11= UNCHANGED * IN FDB : FDBSNR = SECTOR NR * FDBRRO = OFFSET IN BLOCK * NUMBER OF A14 LEVELS = 5 (WORDS) * ****USED REGISTERS********************************** * * A2-A3,A6-A7 EJECT SDMSUB CALSNO EQU * ST A4,-4,A14 SAVE A4 * * FIND BLOCK NO WITHIN FILE * LDK A6,0 LC A6,FDBBLF,A11 BLOCKING FACTOR CF A14,DIVMOD A2=A1,A2//A6,A1=REMAINDER RF(O) CALERR OVERFLOW LDR A3,A2 QUOTIENT LDR A4,A1 REMAINDER RF(Z) TIOD30 REST = 0 ADK A3,1 RECORD IN NEXT BLOCK RF TIOD40 TIOD30 EQU * LC A4,FDBBLF,A11 BLOCK FACTOR * * FIND LOGICAL SECTOR NUMBER ON DISC * TIOD40 EQU * LDR A6,A3 BLOCK NR RF(NP) CALERR SUK A6,1 LDK A7,0 LC A7,FDBBLZ,A11 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,A11 ST A2,FDBSNR+2,A11 SECT NR EJECT * * FIND RELATIVE RECORD OFFSET WITHIN BLOCK * LDK A3,0 LDR A2,A4 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,A11 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,A11 TIODMF EQU * LD A4,-4,A14 SAVED REGISTER RF RETURN RETURN AND SET CONDITION EJECT ********************** * FM I/O HANDLER * ********************** * ENTRY: A11=FDB ADDRESS * A8=ECB ADDRESS * * EXIT : A1=RETURN CODE * A11,A8=SAME AS ENTRY * A2=USED * * NUMBER OF A14 LEVELS = 2 (WORDS) * * FMIO=FILE MANAGEMENT I/O HANDLER * FMIOWR EQU * WRITE,DMTIOT LDK A7,/95 RF FMIO10 FMIOCL EQU * CLOSE LDK A7,/A2 RF FMIO10 FMIODL EQU * DELETE LDKL A7,/2A2 RF FMIO10 FMIOOP EQU * OPEN FILE LDK A7,/A1 RF FMIO10 FMIOEX EQU * EXTEND LDKL A7,/1A1 RF FMIO10 FMIOCR EQU * CREATE LDKL A7,/2A1 RF FMIO10 EJECT FMIORF EQU * READ FILE PARAMETERS LDK A7,/83 RF FMIO10 FMIORD EQU * READ LDK A7,/91 FMIO10 EQU * LKM DATA 15 EJECT SDMSUB * * RESTORE SECTOR NUMBER * LD A1,FDBSNR,A11 ST A1,ECBCW,A8 LD A1,FDBSNR+2,A11 ST A1,ECBCW+2,A8 LD A2,DWTECB,A11 DM ECB ADDRESS LD A1,ECBRC,A8 RF(Z) RETURN DISC I/O OK ANKL A1,/FEFF RF(NZ) DMTIT1 NOT ONLY RETRIES LDKL A1,RETRIE ORS A1,ECBRC,A2 USER RETURN CODE LDK A1,0 SET RETURN CODE OK RF RETURN DMTIT1 EQU * LD A2,ECBBA,A8 SUKL A2,BUFSTA BUFSTA CM BUFDMI,A2 CLEAR FILE NR IN BUFFER RETURN EQU * ABL RTNA14 EJECT SDMSUB ****DESCRIPTION************************************* * * GTBKBU WILL GET A BLOCK BUFFER FOR DISC I/O AND * PREPARE IT. ECB IS PREPARED FOR PHYS I/O. * ****ENTRY PARAMETERS******************************** * * A11= FDB ADDRESS * A8 = ECB ADDR * ****EXIT PARAMETERS********************************* * * A11=FDB ADDRESS * A1 = FDBRRO WHEN SECTOR IS FOUND IN CORE * = -1 WHEN NO DATA IS FOUND IN * THE FOUND CORE BUFFER * A4 = BLOCK BUFFER ADDRESS * A5 = BLOCK DATA BUFFER ADDRESS * A8 = ECB ADDR * NUMBER OF A14 LEVELS = 5 (WORDS) * ****USED REGISTERS********************************** * * A2-A3 * ****************************************************** GTBKBU EQU * LC A3,FWTFNR,A11 FILE NUMBER ANK A3,/FF STR A3,A8 FILE NR LC A5,FDBBLZ,A11 SLL A5,8 BLOCK SIZE IN BYTYE ST A5,ECBRL,A8 BLOCK LENGTH LD A1,FDBSNR,A11 SECTOR NUMBER LD A2,FDBSNR+2,A11 CF A14,SDMGBU A4 := BUFFER ADDRESS ST A1,ECBCW,A8 SECT NR ST A2,ECBCW+2,A8 SECT NR LDR A5,A4 ADKL A5,BUFSTA A5 = DATA BUFFER START ADDRESS ST A5,ECBBA,A8 LDKL A1,-1 SET DEFAULT RETURN CODE ADK A3,0 RF(NZ) GTB100 BUFFER NOT IN MEMORY LD A1,FDBRRO,A11 RELATIV RECORD OFFSET GTB100 EQU * RB RETURN RETURN AND SET CONDITION IFT CRDEEX=0 =5 EJECT FRMFIL EQU * =5 FORMAT EQU * =5 FORMER EQU * =5 RLBLKB EQU * =5 CASZEN EQU * =5 RTN A14 =5 XIF =5 IFT CRDEEX=1 =5 EJECT * * FRMFIL=FORMAT FILE * * ENTRY: A4=BLOCK BUFFER ADDRESS * A8=FDB ECB ADDRESS * A11=FDB ADDRESS * * EXIT : A1-A7 * * NUMBER OF A14 LEVELS = 4 (WORDS) * FRMFIL EQU * LC A1,FDBBLZ,A11 SLL A1,8 BLOCK SIZE IN BYTES ST A1,ECBRL,A8 REQUESTED LENGTH * * MAKE FORMAT BUFFER * CF A14,FORMAT MAKE FORMATED BUFFER ST A4,ECBBA,A8 BLOCK BUFFER ADDRESS LD A1,FDBSNR,A11 SECTOR NUMBER MOST SIGN. LD A2,FDBSNR+2,A11 SECTOR NUMBER LEAST SIGN. FRM130 EQU * ST A1,ECBCW,A8 ST A2,ECBCW+2,A8 LDR A3,A1 SAVE A1 LDR A5,A2 SAVE A2 CF A14,FMIOWR WRITE SECTOR RF(NZ) FRM140 ERROR OR EOF LDR A1,A3 SAVED REGISTER LDR A2,A5 SAVED REGISTER LDK A6,0 LC A7,FDBBLZ,A11 BLOCK SIZE IN SECTORS CF A14,ADDMOD RB FRM130 EJECT FRM140 EQU * LDR A2,A1 RETURN CODE SLL A2,2 RF(NN) FRM160 NOT END OF FILE RLBLKB EQU * LDK A1,0 SET RETURN CODE FRM160 EQU * SUKL A4,BUFSTA BUFFER WITH HEADER CF A14,SDMRBU RELEASE BUFFER CF A14,CLRBUF CLEAR ALL BUFFERS RB RETURN RETURN AND SET CONDITION EJECT * * FORMAT=FORMAT BUFFER IN RECORD SIZE * * ENTRY :A4 = BLOCK BUFFER ADDRESS * A1 = BUFFER LENGTH * * EXIT :A4 = NOT CHANGED * A1,A2,A3,A5 = USED * * NUMBER OF A14 LEVELS = 2 (WORDS) * FORMAT EQU * LDR A3,A4 BLOCK BUFFER ADDRESS FORMER EQU * =1 LDR A5,A1 LENGTH IN BLOCK BUFFER =2 =1 RF(NP) FRM120 NOTHING TO FORMAT =4 LDK A2,' ' FILL BUFFER WITH SPACES =1 FRM100 EQU * SCR A2,A3 =1 ADK A3,1 UPDATE BUFFER POINTER =1 SUK A1,1 REST LENGTH =1 RB(P) FRM100 CONTINUE FILL BUFFER SUR A3,A5 POINTER TO START OF BUFFER =2 =1 SUK A3,1 POINTER TO RECORD STATUS =2 =1 LDK A2,0 RECORD STATUS=FREE LD A1,FDBRLE,A11 RECORD LENGTH WITHOUT STATUS ADK A1,1 LENGTH WITH STATUS FRM110 EQU * ADR A3,A1 POINTER TO RECORD STATUS =2 =1 SUR A5,A1 LENGTH LEFT =2 =1 RF(N) FRM120 ALL DONE IN BUFFER =6 =2 =1 SCR A2,A3 UPDATE STATUS =2 =1 RB FRM110 FRM120 EQU * RTN A14 XIF =5 EJECT * * CARRBL=CALCULATE MAX FDBRRO AND BLOCK SIZE IN NBR OF SECTORS * * ENTRY: A11=FDB ADDRESS * * EXIT : A1=MAX FDBRRO * A2=BLOCK SIZE IN NUMBER OF SECTORS * CR=GREATER IF BLOCK SIZE TOO LARGE * A3,A6,A7=USED * * NUMBER OF A14 LEVELS = 4 (WORDS) * CARRBL EQU * LD A6,FDBRLE,A11 RECORD LENGTH (BYTES) LC A7,FDBBLF,A11 BLOCK FACTOR (NBR OF RECORDS/BLOCK) * * CRRBL=SAME AS CARRBL EXCEPT ENTRY PARAMETERS * * ENTRY: A6=RECORD LENGTH * A7=BLOCK FACTOR * CRRBL EQU * ADK A6,1 RECORD STATUS BYTE LDR A3,A6 SAVE RECORD LENGTH ANK A7,/FF SUK A7,1 CF A14,MPYMOD LDR A1,A2 MAX FDBRRO EJECT * * CALCULATE BLOCK SIZE IN NBR OF SECTORS * ADR A2,A3 ADD ONE RECORD LDR A3,A2 SRL A2,8 SECTOR NBR ANK A3,/FF RF(Z) CAR100 EXACT ADK A2,1 ONE MORE SECTOR CAR100 EQU * ADKL A14,4 UPADTE STACK POINTER LDR A3,A2 SLL A3,7 BLOCK SIZE IN WORDS CWK A3,BLKMXL CHECK WITH MAX BLOCK SIZE ABR* A14 RETURN IFT CRDEEX=1 =5 EJECT ********** * CASZEN * ********** * * CASZEN=CALCULATE SIZE 1-4 IN NBR OF SECTORS * * ENTRY: A12=FPB ADDRESS * * EXIT : A3=ENLARGE IN NUMBER OF SECTORS * A2,A5,A6,A7,A13=USED * A1=RETURN CODE * CR=O IF OVERFLOW * CASZEN EQU * LD A6,FPB:RL,A12 RECORD LENGTH LC A7,FPB:BF,A12 BLOCK FACTOR ANK A7,/FF CF A14,CRRBL CALCULATE BLOCK SIZE (SECTORS/BLOCK IN A2) LDR A4,A2 BLOCK SIZE LDR A13,A12 FPB ADDRESS ADKL A13,FPB:S1 POINTER TO SIZE 1 LDK A5,4 NUMBER OF VOLUMES CAS100 EQU * LC A6,FPB:BF,A12 BLOCK FACTOR (RECORDS/BLOCK) ANK A6,/FF LDR* A1,A13 LD A2,2,A13 A1,A2=SIZE (NBR OF RECORDS) CF A14,DIVMOD A1,A2/A6=A2 REST IN A1 ADK A1,0 RF(Z) CAS110 NO REST ADK A2,1 TAKE CARE OF REST EJECT CAS110 EQU * LDR A6,A2 LDR A7,A4 CF A14,MPYMOD A6*A7=A1,A2 STR A1,A13 ST A2,2,A13 A1,A2=SIZE IN SECTORS ADKL A13,SIZDIF SUK A5,1 RB(P) CAS100 NEXT VOLUME RTN A14 XIF =5 EJECT * CHKRCD=CHECK RECORD STATUS * * ENTRY: A11=FDB ADDRESS * A1=RECORD OFFSET * A4=BLOCK BUFFER ADDRESS * * EXIT : A11,A4=NOT CHANGED * A1=POINTER AT STATUS * A3=/FF * * NUMBER OF A14 LEVELS = 2 (WORDS) * CHKRCD EQU * ADR A1,A4 ADKL A1,BUFSTA AD A1,FDBRLE,A11 STATUS POINTER LDK A3,/FF ADKL A14,4 CCR A3,A1 ABR* A14 IFT INDXAC=0 EJECT CHKKEY EQU * RDNXTR EQU * FNDKEY EQU * CRNUPD EQU * GTLGRN EQU * CRNCIF EQU * RECECB EQU * RTN A14 XIF IFT INDXAC=1 EJECT ****DESCRIPTION************************************* * * FNDKMX SEARCH GFOR A WYMBOLIC KEY IN A MASTER INDEX. * A BINARY SEARCH IS USED. REF : KNUTH PAGE 411 ALG. U. * THE FIRST TWO WORDS IN MASTER INDEX IS : * - NO OF ENTRIES N * - NO OF CHARACTERS PER ENTRY * ****ENTRY PARAMETERS******************************** * * A5 = MASTER INDEX ADRESS * A9 = SEARCH KEY ADDRESS * A10 = NR OF CHAR IN KEY * A11=FDB ADDRESS * * CF A14,FNDKMX * ****EXIT PARAMETERS********************************* * * A1,A2 = LOGICAL RECORD NO IN INDEX FILE * A9,A10= UNCHANGED * NUMBER OF A14 LEVELS = 5 (WORDS) * ****USED REGISTERS********************************** * * A3-A7,A12-A13 * ************************************************* * CRNCIF EQU 8 INDEX CURRENCY OFFSET EJECT FNDKMX EQU * LDR* A2,A5 NO OF ENTRIES N RF(NP) FND045 NO MASTER INDEX LDR A13,A2 ANKL A13,/1 GET BIT 15 SRA A2,1 LDR A12,A2 M=N/2 FLOOR ADR A13,A2 I=N/2 CEILING ADK A5,2 TABLE BASE - 2 FND020 EQU * LDK A4,0 LDR* A7,A5 ENTRY LENGTH LDR A6,A13 I SUK A6,1 RF(NP) FND025 HANDLES ALSO I=0 CF A14,MPYMOD A1,A2=(I-1)*EL SRC A1,1 ORR A2,A1 GET MOST SIGN BIT LDR A4,A2 FND025 EQU * ADR A4,A5 ADD MI BASE ADR - 2 ADK A4,2 ENTRY KEY ADR LDR A1,A4 ADDRESS OF ENTRY KEY LDR A6,A10 MAX KEY LENGTH LDK A7,0 CHAR ADR CF A14,CHKKEY COMPARE KEYS LDR A7,A12 M LDR A6,A7 ANK A6,/1 BIT 15 SRA A7,1 M/2 FLOOR ADR A6,A7 M/2 CEILING LDR A1,A1 CHKKEY RTN INF RF(NG) FND040 SEARCHED KEY LESS OR EQUAL EJECT * * SEARCHED KEY GREATER * LDR A12,A12 M RF(Z) FND050 SEARCH READY ADR A13,A6 I=I+(M/2 CEIL) FND030 EQU * LDR A12,A7 M=M/2 FLOOR RB FND020 FND040 EQU * LDR A12,A12 M RF(Z) FND060 SEARCH READY SUR A13,A6 I=I-(M/2 CEIL) RB FND030 FND045 EQU * NO MASTER INDEX LDK A1,0 LDK A2,1 REC NR 1 RF FND070 FND050 EQU * ADR* A4,A5 NEXT ADDRESS OF ENTRY KEY FND060 EQU * LDR A3,A4 ENTRY ADR SUK A3,3 ADR* A3,A5 ADR REC NO * * MOVE LOG REC NO TO A1,A2 * LDK A1,0 LCR A1,A3 ADK A3,1 LCR A2,A3 ADK A3,1 ECR A2,A2 LCR A2,A3 FND070 EQU * ABL CALSNO EJECT ****DESCRIPTION************************************* * * CHKKEY COMPARES TWO CHARACTER STRINGS * ****ENTRY PARAMETERS******************************** * * A1 = ADR OF ENTRY KEY * A9 = ADR OF SEARCH KEY * A6 = MAX NO OF CAHARACTERS IN KEY * A7 = REL NO OF FIRST CHAR TO CHECK IN KEY * * CF A14,CHKKEY * ****EXIT PARAMETERS********************************* * * A1 = 0 WHEN SEARCED KEY IS CONTAINED IN ENTRY KEY * = + 1 WHEN SEARCH KYEY IS GREATER * = -1 WHEN SEARCH KEY IS LESS * A7 = REL NO OF NEXT CHAR TO CHECK = NO OF SAME CHARACTERS IN WHOLE KEY * A6 = MAX NO OF CHAR IN KEY * CR=0 WHEN KEY IS FOUND * P WHEN KEY IS GREATER * N WHEN KEY IS LESS * NUMBER OF A14 LEVELS = 2 (WORDS) * ****USED REGISTERS********************************** * * A2,A3 ******************************************************** EJECT CHKKEY EQU * LDR A3,A9 SEARCH KEY ADDRESS ADR A3,A7 FIRST SC CHAR TO TEST ADR A1,A7 FIRST EC CHAR TO TEST CHK020 EQU * LCR A2,A3 SEARCED KEY CHAR CCR A2,A1 SC=EC? RF(G) CHK100 SC GT TH EC RF(L) CHK120 SC LESS THAN EC ADK A7,1 NO OF SAME CHAR CWR A7,A6 NO OF CHAR RF(NL) CHK060 ALL CHAR CHECKED ADK A3,1 NXT SC TO TEST ADK A1,1 NXT EC TO TEST RB CHK020 CHK060 EQU * LDK A1,0 FOUND RF CHK140 CHK120 EQU * LDKL A1,-1 SEARCHED KEY SMALLER RF CHK140 CHK100 EQU * LDK A1,1 SEARCHED KEY SGREATER CHK140 EQU * ABL RETURN RETURN AND SET CONDITION EJECT ****DESCRIPTION************************************* * * RDNXTR WILL MAKWE NEXT RECORD IN AN INDEX FILE AVAILABLE * IN A CORE BUFFER * WHEN NO RECORD IS READ BEFORE, THE FIRST RECORD IN SPECIFIED * SECTOR WILL BE MADE AVAILABLE * ****ENTRY PARAMETERS******************************** * * A11= FDB ADDRESS FOR CURRENT RECORD (BEFORE NEXT) * FDBCEX,FDBSNR * FDBRRO = RECORD OFFSET IN BUFFER, WHEN = -1 THE FIRST * RECORD IN CURRENT SECTOR IS WANTED * A4 = ADDRESS OF BLOCK BUFFER FROM PREVIOUS CALL IN * SAME DM-REQUEST. =0 WHEN NO BYUFFER IS ALLOCATED * A8 = ECB ADDRESS * ****EXIT PARAMETERS********************************* * * A11= FDB ADDRESS * A4 = BUFFER ADDRESS * = 0 WHEN NO BUFFER IS ALLOCATED * A8 = ECB ADDRESS * CR=0 WHEN PHYSICAL I/O FAILED * IF CR=0 * THEN A1=I/O RETURN CODE * ELSE A1=FDBRR0=RECORD OFFSET * NUMBER OF A14 LEVELS = 7 (WORDS) * ****USED REGISTERS********************************** * * A2,A3,A5 * ****************************************************** EJECT RDNXTR EQU * ADK A4,0 RF(NZ) RDN200 BUFFER EXIST * * GET A BUFFER * RDN040 EQU * CF A14,GTBKBU GET BLOCKBUFFERADDR RF(NN) RDN080 DATA ALREADY IN CORE * * READ BLOCK FROM DISC * LDR A3,A7 SAVE A7 CF A14,FMIORD READ LDR A7,A3 ADK A1,0 RETURN CODE RF(NZ) RDN900 ERROR RDN080 EQU * LDK A1,0 ST A1,FDBRRO,A11 OFFSET FIRST RECORD RF RDN940 RETURN EJECT * * BUFFER WAS BEFORE * RDN200 EQU * LD A1,FDBRRO,A11 RECORD OFFSET RB(N) RDN080 FIRST RECORD WANTED * * CHECK IF THIS OFFSET POINTS TO LAST REC IN BUFFER * RDN220 EQU * CW A1,FDBMRO,A11 MAX OFFSET RF(NL) RDN300 THIS REC LAST IN BUFFER * * GET NEXT REC IN CURRENT BLOCKBUFFER * AD A1,FDBRLE,A11 RECORD LENGTH ADK A1,1 STATUS CHAR ST A1,FDBRRO,A11 NEW OFFSET RF RDN940 RETURN EJECT * * GET NEW BLOCK * RDN300 EQU * LD A1,FDBSNR+2,A11 LDK A3,0 LC A3,FDBBLZ,A11 BLOCK SIZE (SECTORS/BLOCK) ADR A1,A3 NEXT SECT RF(O) RDN380 RF RDN390 RDN380 ANKL A1,/7FFF IM FDBSNR,A11 RDN390 EQU * ST A1,FDBSNR+2,A11 * * GET NEXT BLOCK * RDN500 EQU * CF A14,SDMRBU RELEASE BUFFER RB RDN040 NEXT SECTOR * * ERROR EXIT * RDN900 EQU * ADK A4,0 RF(Z) RDN960 NO BUFFER CF A14,SDMRBU RELEASE BUFFER RDN960 EQU * LDK A4,0 INDICATE NO BUFFER * * EXIT * RDN940 EQU * ADKL A14,4 ADK A4,0 SET CONDITION ABR* A14 RETURN EJECT ****DESCRIPTION************************************* * * FNDKEY WILL READ THE FIRST USED INDEX RECORD WITH THE * SPECIFIED KEY OR NEXT HIGHER KEY * IF END OF FILE, THE FIRST FREE RECORD IS FOUND * ****ENTRY PARAMETERS******************************** * * A11= FDB ADDRESS * A9 = SEARCH KEY ADDR * A10 = NO OF CHARACTERS IN KEY * A8 = PHYSICAL ECB ADDRESS * ****EXIT PARAMETERS********************************* * * A11= FDB ADDRESS * FDBSNR,FDBRRO = FOUND INDEX RECORD * A1 = 0 WHEN KEY ISS FOUND * = /400 WHEN NEXT HIGHER KEY IS FOUND * = RETURN CODE WHEN KEY IS NOT FOUND * BIT 1 CAN NEVBER BE SET BY DISC DRIVER * A4 = BUFFER ADDRESS * = 0 WHEN NO RECORD IS FOUND * A7 = NO OF SAME CHARACTERS * A8 = PHYSICAL ECB ADDRESS * A10 = UNCHANGED * CR=0 WHEN KEY IS FOUND * NUMBER OF A14 LEVELS = 9 (WORDS) * ****USED REGISTERS********************************** * * A2-A3,A5-A7,A12-A13 * ****************************************************** EJECT FNDKEY EQU * * * FIRST SEARCH THE NMASTER INDEX * LD A5,FDBMIA,A11 ADDR OF MASTER INDEX CF A14,FNDKMX GET KEY ENTRY IN MASTER INDEX RF(NZ) FKY900 ERROR LDR A6,A10 NO OF CHAR IN KEY LDK A7,0 START CHAR KEY SEARCH LDK A4,0 NO BUFFER TO STYART WITH FKY100 EQU * CF A14,RDNXTR GET INDEX RECORD RF(Z) FKY900 I/O FAILED ,NO BUFFER * * BUFFER AND ADATA IS FOUND * FKY150 EQU * ADR A1,A4 BUFFER ADR ADKL A1,BUFSTA LDR A5,A1 AD A5,FDBRLE,A11 ADDRESS TO STATUS CHARACTER LCR A2,A5 =3 ANK A2,/FF STATUS CHARACTER =3 SUK A2,/FF =3 RF(Z) FKY200 USED RECORD EJECT * * NO MORE RECORDS IN THIS SECTOR * LD A13,FDBRRO,A11 SAVE CURRENT OFFSET LD A5,FDBMRO,A11 ST A5,FDBRRO,A11 LAST RECORD IN BLOCK * * * CHECK IF END OF FILE * LDR A5,A7 CHAR ADDR CF A14,GTLGRN GET LOG REC NR LDR A6,A10 NR OF CHAR LDR A7,A5 CHAR ADDR CC A1,FDBLRN,A11 RB(L) FKY100 NOT EOF RF(G) FKY180 EOF CW A2,FDBLRN+1,A11 RB(L) FKY100 NOT EOF * * EOF IS IN THIS SECTOR * FKY180 EQU * ST A13,FDBRRO,A11 OFFSET TO FIRST FREE RECORD LDKL A1,EOFRC EOF RF FKY900 EJECT * * CHECK KEY IN THIS RECODRD * FKY200 EQU * CF A14,CHKKEY COMPARE KEYS RF(Z) FKY870 KEY FOUND RF(N) FKY850 SEARCH KEY LESS * * SEARCH KEY GREATER * FKY840 EQU * CC A7,-4,A5 NEXT KEY FLAG =3 RB(NG) FKY100 START OF KEY:S IDENTICAL LC A7,-4,A5 REDUCE NUMBER OF SAME CHARACTERS =3 RB FKY100 NEXT KEY EJECT * * SEARCH KEY LESS * FKY850 EQU * LDKL A1,NOKEY KEY NOT FOUND RF FKY950 * * KEY FOUND * FKY870 EQU * LDK A1,0 KEY FOUND RF FKY950 FKY900 EQU * LDK A7,0 NO OF SAME LEAD CHARS FKY950 EQU * ABL RETURN RETURN AND SET CONDITION EJECT * * CRNUPD UPDATES CRN-BUFFERS SO THAT RECORD NUMBERS FOR MOVED INDEX * RECORDS ARE UPDATED * * IN: * A1,A2 = LAST RECORD NR MOVED * A12,A13= FIRST RECORD NR MOVED * A11 = FDB ADDR INDEX * A7 = ADD PARAMETER +1, -1 * * USED REGISTERS: * A1-A3,A6-A7 * * OUT: * A11= FDB ADDR INDEX * A12,A13 = UNCHANGED * NUMBER OF A14 LEVELS = 4 (WORDS) * CRNUPD EQU * LD A3,FDBADF,A11 FDB DATA FILE INH ADKL A3,FDBCRL CRN LINK ROOT CRU100 EQU * LDR* A3,A3 RF(Z) CRU900 END OF LINK LC A6,FWTFNR,A11 FILE CODE CC A6,CRNCIF,A3 RB(NE) CRU100 WRONG FC CC A12,CRNCIF+1,A3 RB(G) CRU100 RF(L) CRU200 CW A13,CRNCIF+2,A3 RB(G) CRU100 CRU200 EQU * CC A1,CRNCIF+1,A3 RF(G) CRU300 RB(L) CRU100 CW A2,CRNCIF+2,A3 RB(L) CRU100 CRU300 EQU * * * UPDATE CRN * LDR A6,A7 RF(N) CRU230 -1 LDK A6,0 CRU230 EQU * ANKL A7,/7FFF LDK A1,0 LC A1,CRNCIF+1,A3 LD A2,CRNCIF+2,A3 CF A14,ADDMOD SC A1,CRNCIF+1,A3 ST A2,CRNCIF+2,A3 RB CRU100 CRU900 EQU * ENB RTN A14 EJECT DMSUBR ****DESCRIPTION************************************* * * GTLGRN WILL CONVERT FDBSNR AND FDBRRO TO A LOGICAL RECORD NO * ****ENTRY PARAMETERS******************************** * * A11= FDB ADDRESS * FDBSNR,FDBRRO,FDBCEX * ****EXIT PARAMETERS********************************* * * A1,A2 = LOG RECORD NO * NUMBER OF A14 LEVELS = 4 (WORDS) * ****USED REGISTERS********************************** * * A6,A7 * ****************************************************** EJECT DMSUBR GTLGRN EQU * ST A4,-4,A14 SAVE A4 LD A1,FDBSNR,A11 LD A2,FDBSNR+2,A11 REL SECT NR LDK A6,0 LDK A7,1 CF A14,DSUMOD LDK A6,0 LC A6,FDBBLZ,A11 BLOCK SIZE CF A14,DIVMOD LDR A6,A2 BLOCKS - 1 * * CONVERT FDBRRO TO NO OF RECORDS * LDK A7,0 LC A7,FDBBLF,A11 BLOCK FACTOR CF A14,MPYMOD A1,A2=A6*A7 LD A4,FDBRLE,A11 ADK A4,1 RECORD LENGTH LDK A7,0 RECORD COUNTER LD A6,FDBRRO,A11 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 * LD A4,-4,A14 SAVED REGISTER RTN A14 EJECT * * RECECB=MOVE RECORD NUMBER TO ECBCW1,ECBCW2 * * ENTRY: A11=FDB ADDRESS * A4=BUFFER ADDRESS FROM SUB FNDKEY * A9=ECB ADDRESS * * EXIT: A11,A4,A9=NOT CHANGED * A1,A2 =USED REGISTERS * NUMBER OF A14 LEVELS = 2 (WORDS) * RECECB EQU * LD A2,FDBRRO,A11 RECORD ADDR ADKL A2,BUFSTA ADR A2,A4 REC ADDR LD A1,FDBRLE,A11 RECORD LENGTH SUK A1,6 ADR A2,A1 * * MOVE LOG REC NO TO ECB * LDK A1,0 LC A1,3,A2 ST A1,ECBCW,A9 LC A1,4,A2 ECR A1,A1 LC A1,5,A2 ST A1,ECBCW+2,A9 RTN A14 XIF END