|
|
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: 58784 (0xe5a0)
Notes: pts_type(SC)
Names: »DMTASK.SC«
└─⟦7e2393f80⟧ Bits:30009710 Philips computer tape "M_KONV"
└─⟦this⟧ »M:KONV/DMTASK.SC«
IDENT DMTASK REL 9.2 79-11-16 870105040920 =5, PR5649 REL 9.1 79-11-01 =4,CURRENCY INSERT REL 9.1 79-07-02 =3,TEST KEY REL 9.1 79-07-02 =2,CH REQ REL 8.2 =1,PR 790116 REL 8.2 **************************************************** * * PHILIPS TERMINAL SYSTEM PTS * * DMTASK = HANDLES DATAMANAGEMENT DISC I/O * * * * * **************************************************** * * THIS MODULE IS ACTIVATED FROM TIODM. * * INPUT PARAMETERS: * A1 = FDB ADDRESS * A2 = TID TASK IDENT OF DMTASK AT PRESENT NOT USED * * THE SECTOR TO BE ACCESSED IS DEFINED IN FDB (FDBDMI, -FC, -SNR). * ALL BUFFERS ARE CHECKED TO FIND OUT IF THIS SECTOR * IS ALREADY PRESENT IN A BUFFER. IF SO THE BUFFER STATUS IS SET * TO USED AND ACTIONS ACCORDING TO THE ORDER ARE TAKEN. IF NOT * THE SECTOR MUST FIRST BE READ INTO A FREE BUFFER. * * ALL I/O LKM REQUESTS IN THIS MODULE ARE WITH ACTIVATION AND ARE * FOLLOWED BY AN EXIT LKM REQUEST. * INDEX FILES ARE HANDLED IN SUBROUTINE RDNXTR WHERE * ALL I/O ARE MADE IN WAIT MODE * * BY MEANS OF CONDITIONAL ASSEMBLY THE EXCLUSIVE ACCESS CHECK * FOR INDEXED DELETE AND FOR INDEXED REWRITE AND * FOR RANDOM WRITE AND RANDOM DELETE CAN BE EXCLUDED. * * QNOEXA=1 EXCLUSIVE ACCESS CHECK INCLUDED * QNOEXA=0 EXCLUSIVE ACCESS CHECK EXCLUDED EJECT * *************** * ENTRIES * *************** * * ENTRY DMTASK ENTRY SQR EXTERNAL CODE SEQ READ ENTRY QSW ENTRY DMTWM ENTRY QIRN,QIRR EJECT * ***************** * EXTERNALS * ***************** * * EXTRN SCTTCT,SCTCDT EXTRN TTB:ID TASK IDENTIFICATION EXTRN TTB:TD,FDBSTA EXTRN FNDTID EXTRN TENDIO EXTRN FDBECB EXTRN FDBSNR EXTRN FDBRRO EXTRN FDBRLE EXTRN FDBBLF EXTRN FDBTNR EXTRN FDBVTO EXTRN FDBCEX EXTRN FDBEXT EXTRN EXTDMI EXTRN EXTFC EXTRN EXTLEN EXTRN EXTBAS EXTRN EXTELE EXTRN FDBLRN EXTRN FDBMIA EXTRN FDBEAL EXTRN FDBADF EXTRN FDBAI1 EXTRN FDBCRL EXTRN FDBDBR,FDBMRN,FDBMRO EXTRN ECBFC EXTRN ECBBA EXTRN ECBRL EXTRN ECBEL EXTRN ECBRC EXTRN ECBCW EXTRN CLRBUF EXTRN BUFLNK EXTRN BUFDMI EXTRN BUFFC EXTRN BUFSNR EXTRN BUFOR EXTRN BUFSTA EXTRN CURBUF EXTRN DWTECB EXTRN DWTUEC EXTRN DWTOR EXTRN DWTST,DWTTDM,DWTTQ EXTRN DWTWAT EXTRN DMTRBU RELEASE A DISC BUFFER EXTRN VTLRN EXTRN VLVBA EXTRN VLVRL EXTRN DMTIOT,DIVMOD EXTRN MPYMOD,CHKKEY EXTRN CALSNO EXTRN DSUMOD EXTRN EATEST,EASETB,CRNGET,EARELB,GTBKBU EXTRN QTJOB,GTLGRN EXTRN FNDKEY EXTRN CRNCIF,CRNCDF,CRNQUE EXTRN MXIND EXTRN FDBKA,FDBNIF,RDNXTR EXTRN FDBKEY SAVE AREA FOR KEY IN INDEXED ACCESS EXTRN BUFAR1,BUFAR2,SECTLE,DMTIOZ,CRNUPD EXTRN MOV:US MOVE FROM USER TO SYSTEM AREA EXTRN MOV:SU MOVE FROM SYSTEM TO USER AREA EXTRN MONMMU EXTRN PRUN TTAB ADDRESS OF RUNNING TASK EXTRN TTB:MT MMU TABLE EXTRN SCTPLD PROGRAM LOADING DEVICE EJECT * * * ************************ * CONDITIONAL ASSEMBLY * ************************ * * CHECK OF EXCLUSIVE ACCESS BIT CAN BE EXCLUDED AT * RANDOM WRITE AND RANDOM DELETE BY SETTING X:A=0. * * X:A EQU 1 X:B EQU 0 X:C EQU 0 X:D EQU 1 X:E EQU 0 * QNOEXA EQU 00000 * INDEXED ACCEXSS FUNCTIONS CAN BE OMITTED WITH * INDXAC EQU 1 = INDEX ACCESS INCLUDED * INDXAC EQU 0 = INDEX ACCESS FUNCTIONS OMITTED INDXAC EQU 00000 RECBFZ EQU 00004 INDEX RECORD BUFFER SIZE IN WORDS FLXDSC EQU X:D FLEXIBLE DISC INCLUDED WHEN EQU 1 INSLAS EQU X:E INSERT SAME KEY LAST WHEN = 1 * EJECT DMTASK * * * A PROGRAM VERSION USING TOSS MMU PAGING * IS OBTAINED BY SETTING MMUPAG EQU 1. * MMUPAG EQU 0 * * * A PROGRAM VERSION USING TOSS DISC PAGING * IS OBTAINED BY SETTING DSKPAG EQU 1. * DSKPAG EQU 0 * * * A PROGRAM VERSION INCLUDING TOSS SWAPPABLE WORK * BLOCKS IS OBTAINED BY SETTING SWPBLK EQU 1. * SWPBLK EQU 0 * EJECT * ************************ * DATA DEFINITIONS * ************************ * * EABIT EQU /20 EA-BIT IN DWT STATUS BYTE * VTOBLK EQU 9 VTOC BLOCKING FACTOR * * THE FOLLOWING INTERNAL ORDER CODES IS THE RELATIVE * POSITION IN TIODM-TABLE TIODMF * QCL EQU 0 DMTAFU DATA DMCLOSE CLOSE QRV EQU 2 DATA DMREVT READ VTOC RECORD QIRN EQU 4 IFT INDXAC=1 DATA DMIRN INDEXED READ NEXT QINS EQU 6 DATA DMINS INDEXED INSERT QDEL EQU 8 DATA DMDEL INDEXED DELETE QIRW EQU 10 DATA DMIRW INDEXED REWRITE DATA DMIRR INDEXED RANDOM RESAD XIF QIRR EQU 12 IFF INDXAC=1 DATA DMTERR,DMTERR,DMTERR,DMTERR,DMTERR XIF QRD EQU 14 DATA DMRDDE RANDOM DELETE QRW EQU 16 DATA DMRDWR RANDOM WRITE QRR EQU 18 DATA DMRDRE RANDOM READ QREA EQU 20 DATA DMTERR RELEASE EXCLUSIVE ACCESS QSW EQU 22 DATA DMSQWR SEQUENTIAL WRITE SQR EQU 2 EXTERNAL ORDER CODE SEQ READ QSR EQU 24 DATA DMSQRE SEQUENTIAL READ QGCUR EQU 26 DATA DMTERR GET CURRENCY IFT INDXAC=1 QINIX EQU 28 DATA DMINIX INSERT INDEX QDELX EQU 30 DATA DMDELX DELETE INDEX XIF IFF INDXAC=1 DATA DMTERR,DMTERR XIF QGCURX EQU 32 DATA DMTERR GET CURRENT INDEX QRWD EQU 34 DATA DMRDWD DELAYED RANDOM WRITE QRDD EQU 36 DATA DMRDDD DELAYED RANDOM DELETE QRRRB EQU 38 DATA DMRRRB RAND READ REL BUFF * VTOCRL DATA 0 VTOC RECORD LENGTH EJECT * ************** * DMTFRL * ************** * * ENTRY DMTFRL FIND RECORD LENGTH * * INPUT A1 = RETURN CODE IF INCORRECT LENGTH * A6 = FDB ADDRESS * A9 = USER ECB ADDRESS * * OUTPUT A2 = RECORD LENGTH TO BE USED * A1 IS ORED INTO ECBRC IF ECBRL < REC LENGTH * A2 IS STORED IN ECBEL * DMTFRL EQU * LD A2,ECBRL,A9 CW A2,FDBRLE,A6 RF(E) DMTF20 ECBRL = REC LENGTH RF(L) DMTF10 ECBRL < REC LENGTH LD A2,FDBRLE,A6 ECBRL > REC LENGTH RF DMTF20 DMTF10 ORS A1,ECBRC,A9 SET RETURN CODE DMTF20 ST A2,ECBEL,A9 SET EFFECTIVE LENGTH RTN A14 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 =1 ADR A4,A3 CWR* A2,A4 =1 RB(NE) FND030 * =1 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 =1 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,DWTTDM,A6 GET TTAB ADDRESS LC A3,TTB:ID,A4 ID CALLING TASK CCK A3,'##' RF(NE) DMTREN NOT DMTASK LDK A3,QRR CC A3,DWTOR+1,A6 RF(NE) DMTREQ NOT RANDOM READ LD A4,DWTWAT,A6 PAR BLOCK ADDRESS LD A4,4,A4 FDB ADDR INDEX FILE LD A4,DWTTDM,A4 USER TTAB DMTREN EQU * INH TL TTB:MT,A4 LOAD MMU REGISTERS DMTREP EQU * LD A4,PRUN GET DM TTAB ADDRESS TS TTB:MT,A4 STORE USER MMU IN DM MMU TABLE ENB 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 IFT MMUPAG=1 DMTREQ INH TL MONMMU SYSTEM MMU RB DMTREP XIF 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 * ************** * DMTASK * ************** * * DMTASK EQU * * * SET UP A14 STACK * CF A15,GETA14 LDR A6,A1 FDB ADDR LDKL A5,-1 CW A5,FDBRRO,A6 SPECIAL PARAMETER -1 RF(E) DMT090 FOR ORDERS XR,DX,IX (SEE TIODM) DMT020 EQU * LD A4,FDBDBR,A1 RF(NN) DMT025 NO DELAY ANKL A4,/C0FF LD A2,DWTOR,A1 ANK A2,/3F CWK A2,QCL RF(E) DMT024 CLOSE CWK A2,QRV RF(E) DMT024 READ VTOC SUK A2,QRRRB RF(E) DMT024 RAND READ REL BUFFER ORKL A4,/100 DMT024 EQU * ST A4,FDBDBR,A1 DMT025 EQU * LDR A8,A1 ADKL A8,FDBECB ECB ADDR CF A14,GTBKBU GET BLOCK BUFFER LDR A2,A2 RF(NN) DMT080 BUFFER WAS BEFORE * * READ SECTOR INTO BUFFER AND EXIT * SUK A5,QCL RF(Z) DMT030 CLOSE LDK A7,/11 PHYSICAL READ LKM DATA -1 I/O AND ACTIVATION DATA DMTAR1 DMTASK RESTART #1 LKM DATA 3 EXIT * DMT030 EQU * I/O WITH WAIT FOR CLOSE LDK A7,/91 LKM DATA 1 RF DMT050 CHECK RETURN CODES EJECT ************** * DMTAR1 * ************** * RESTART POINT AFTER READ * DMTAR1 EQU * * * SET UP A14 STACK * CF A15,GETA14 DMT050 EQU * CF A14,DMTIOT CHECK RETURN CODES FROM DISC I/O LDR A1,A1 ABL(NE) DMTERR LD A5,ECBBA,A8 RF DMT090 DMT080 EQU * ENTRY IF SECT ALREADY IN BUFFER LDR A5,A3 ADK A5,8 SKIP BUFFER HEADER ST A5,ECBBA,A8 PUT BUFFER ADDR IN ECB DMT090 EQU * * * HANDLE ACTUAL ORDER ORDER INDEX IN DWTOR * ADK A5,2 SKIP CYLID WORD LD A7,DWTOR,A6 * A7 = INTERNAL ORDER CODE ANK A7,/3F ABI DMTAFU,A7 DMTASK FUNCTION TABLE EJECT DMRRRB EQU * RAND READ REL BUFF * DMSQRE EQU * SEQUENTIAL READ * DMRDRE EQU * RANDOM READ * * CHECK STATUS IF NOT USED THEN ERROR RETURN * LD A2,FDBRRO,A6 AD A2,FDBRLE,A6 ADR A2,A5 LDK A1,0 CCR A1,A2 STATUS BYTE IN A1 RF(NE) DMT200 USED LDKL A1,/800 NO DATA ABL DMTERR DMT200 LDK A1,/8 INCORRECT LENGTH CF A14,DMTFRL A2 := RECORD LENGTH * * MOVE THE RECORD * CF A14,DMTREM * * UPDATE CRN AND SET EXCLUSIVE ACCESS BIT * DMT230 EQU * ABL DMT400 PUT CRN AND EA EJECT DMREVT EQU * READ VTOC RECORD * DMCLOSE EQU * CLOSE A FILE * LD A2,FDBSNR,A6 RF(NZ) DMT270 VTOC SECTOR IN BUFFER * * VOLUME LABEL IN BUFFER * FIND VTOC SECTOR NUMBER AND RELATIVE RECORD OFFSET WITHIN SECTOR * FOR VTOC RECORD AND READ THIS SECTOR INTO BUFFER * LDR A10,A6 SAVE FDB ADDR LDR A9,A8 SAVE ECB ADDR LD A3,VLVRL-2,A5 ST A3,VTOCRL LDK A6,VTOBLK VTOC BLOCKING FACTIOR LD A2,FDBVTO,A10 VTOC RECORD NUMBER LDK A1,0 CF A14,DIVMOD A2=A1,A2/A6.A1=REMAINDRER LDR A3,A2 QUOTIENT LDR A6,A10 FDB ADDR LDR A2,A1 REST RF(Z) DMT240 REST = 0 ADK A3,1 RECORD IN NEXT SECTOR RF DMT250 DMT240 LDK A2,VTOBLK LAST RECORD IN SECTOR DMT250 AD A3,VLVBA-2,A5 VTOC BASE ST A3,FDBSNR,A6 LDK A3,0 DMT255 SUK A2,1 RF(Z) DMT260 AD A3,VLVRL-2,A5 ADK A3,1 SKIP STATUS BYTE RB DMT255 DMT260 ST A3,FDBRRO,A6 * * RELEASE BUFFER * LD A3,ECBBA,A9 SUK A3,8 CF A14,DMTRBU RELEASE BUFFER CF A14,CLRBUF CLEAR FREE BUFFERS ENB ENB LDR A1,A6 FDB ADDR RB DMT020 READ VTOC SECTOR EJECT DMT270 EQU * SUK A7,QRV ABL(Z) DMT500 READ VTOC RECORD * CLOSE FILE * UPDATE VTOC LAST RECORD NUMBER * AND WRITE SECTOR BACK ON DISC AD A5,FDBRRO,A6 LDK A2,0 LC A2,FDBLRN,A6 SC A2,VTLRN,A5 LD A2,FDBLRN+1,A6 ST A2,VTLRN+1,A5 * CLOSE FILE. WRITE VTOC * LDK A7,/95 LKM DATA 1 * LDR A1,A6 FDBADDRESS IN A1 CF A14,DMTIOT CHECK RETURN CODES LDR A1,A1 RF(NZ) DMT724 ERROR DMT720 EQU * LD A1,DWTTDM,A6 TTAB ADDR * =1 START LD A2,FDBMIA,A6 MASTER INDEX ADDR RF(Z) DMT721 DATA FILE LDK A2,/FF -1 DMT721 ADK A2,1 0 OR 1 ECR A2,A2 =1 END LC A2,ECBFC,A9 FILE CODE LDK A5,0 TRY LOCAL AND GLOBAL CF A14,FNDFDB GET ENTRY IN TTAB CDTADTAB LDR A13,A5 LOCAL/GLOBAL INDICATOR LDR A2,A2 RF(NZ) DMT725 FC FOUND LDKL A1,/8000 REQ ERR DMT724 ABL DMTERR DMT725 EQU * LD A5,2,A4 FDB ADDRESS LDR A11,A4 SAVE TABLE ENTRY ADDR LDR A12,A1 SAVE TTEAB ADDR SUR A10,A10 MARK THAT FDB NOT SHALL BE RELEASED EJECT * CHECK IF THIS FDB ADDR IS USED ELEWHERE * * SEARCH ALL TTABS * LD* A2,SCTTCT DMT730 EQU * SUK A2,2 RF(NP) DMT780 NOT FOUND IN ANY TTAB LD A3,SCTTCT ADR A3,A2 LDR* A1,A3 LC A3,TTB:ID,A1 TASK ID CCK A3,'##' RB(E) DMT730 JUMP IF MONITOR TASK LD A3,TTB:TD,A1 ADKL A1,TTB:TD+2 DEV DESCR TABLE +2 DMT770 EQU * SUK A3,4 RB(NP) DMT730 NOT IN THIS TTAB LDR A4,A1 ADR A4,A3 CWR* A5,A4 RB(NE) DMT770 LDR A7,A11 TTAB ENTRY ADK A7,2 FDB OFFSET CWR A4,A7 RB(E) DMT770 SAME ENTRY RF DMT895 MORE USERS ON THIS FDB * * NOW SEARCH SCTCDT * DMT780 EQU * LD* A4,SCTCDT DMT790 EQU * SUK A4,4 RF(NP) DMT800 THIS FDB HAS NO OTHER USER LD A2,SCTCDT ADR A2,A4 CW A5,2,A2 RB(NE) DMT790 LDR A7,A4 AD A7,SCTCDT CWR A7,A11 RB(E) DMT790 SAME ENTRY RF DMT895 THIS FDB HAS MORE USERS EJECT * * NOW RELEASE THIS FDB * DMT800 EQU * * * RELEASE EA-BUFFERS * LDKL A2,/8000 ALL EA-BUFFERS ARE RELEASED LDR A1,A6 FDB ADDR CF A14,EARELB * * RELEASE CRN BUFFERS * LDKL A5,FDBCRL ADR A5,A6 LINK ROOT LDR* A4,A5 CMR A5 CLEAR FDB RF DMT830 DMT820 EQU * LDR A4,A5 BUFFER ADDRESS DMT830 EQU * RF(Z) DMT840 ALL BUFFER S REMOVED LDR* A5,A4 NEXT BUFFER ADDRESS * * RETIURN BUFFER TO POOL * INH LD A3,CRNQUE STR A3,A4 ST A4,CRNQUE ENB RB DMT820 DMT840 EQU * IFT FLXDSC=1 * * NOW CHECK DEVICE CODES. WHEN LAST FILE IS CLOSED ON * A FLEXIBLE DISC UNIT, AN UNLOC IS MADE FOR THIS VOLUME * LDK A1,4 EXTENT COUNTER LDR A5,A6 FDB ADDR ADKL A5,FDBEXT+1 ZADDR OF FIRST VOL CODE SUKL A5,EXTELE EXT LENGTH IN FDB LDK A4,0 FOR VOL CODE DMT880 EQU * ENB SEE LABEL 910 ENB SUK A1,1 LOOP ABL(NN) DMT900 CHECK THIS EXTENT XIF IFT INDXAC=1 EJECT * * ALL EXTENTS CHECKED * RELEASE MASRTER INDEX * INH LD A1,FDBMIA,A6 MASTER INDEX ADDR RF(Z) DMT894 NO MATER IX LD A5,MXIND LENTH SUK A5,2 DMT885 EQU * SUK A5,4 RF(Z) DMT890 FIRST INDEX RF(N) DMT894 NO MATER IX CW A1,MXIND+2,A5 RB(NE) DMT885 LD A4,MXIND,A5 RF(N) DMT890 PREVIOUS ENTRY USED LD A4,MXIND+4,A5 NO OF WORDS ANKL A4,/7FFF REMOV USE BIT ADS A4,MXIND,A5 NR OF WORDS * * MOVE UP REST OF MXIND * LDKL A1,MXIND+6 ADR A1,A5 FROM ADDR LDR A3,A1 SUK A3,4 TO ADDR LD A2,MXIND SUR A2,A5 SUK A2,2 NO OF CHAR CF A14,DMTWM MOVE UOP RF DMT894 DMT890 EQU * LDKL A4,/7FFF ANS A4,MXIND+4,A5 REMOVE USE BIT XIF EJECT DMT894 EQU * LDKL A10,1 MARK THAT FDB SHALL BE RELEASED DMT895 EQU * INH INH * * DELETE TTAB/SCTCDT ENTRY * CMR A11 FILE CODE CM 2,A11 FDB ADDR * * RELEASE DWT-QUEUQ IN THIS FDB-DWT * LDR A1,A6 FDBADDR ADKL A1,DWTTQ ADDR QUEUE START LDR* A5,A1 NEXT TTAB ADDR RF(Z) DMTA20 NO Q CMR A1 KILL ROOT DMTA10 LDR* A1,A5 NEXT IN QUEUE CF A15,QTJOB DISPATCH Q LDR A5,A1 NEXT RB(NZ) DMTA10 MORE DMTA20 EQU * * * NEXT ENTRY IN TTAB/CDATAB * LDR A1,A12 TTAB ADDR LDK A2,0 LC A2,ECBFC,A9 FILE CODE USERT ECB LDR A5,A13 LOCAL/GLOBAL INDICATOR CF A14,FNDFDB SEARCH TTAB SCTCDT LDK A7,0 INDICATES A2 = 0 IFT INDXAC=1 LDR A2,A2 RF(Z) DMTA30 * * MOV DWT TO NEXT FDB * AN INDEX FILE SHALL ALSO BE RELEASED * LD A7,2,A4 NEXT FDB ADDR TO CLOSE LDK A1,2 ADR A1,A6 FROM ADDR LDK A3,2 ADR A3,A7 TO ADDR LDK A2,12 NO OF BYTES CF A14,DMTWM MOVE DWT IFT MMUPAG=1 LD A3,DWTUEC,A6 ST A3,DWTUEC,A7 MMU USER ECB ADDR XIF IFT INDXAC=1 LD A3,DWTTDM,A6 ST A3,DWTTDM,A7 MOVE CM FDBSNR,A7 SECTOR NR LDKL A3,FDBEXT ADR A3,A7 ST A3,FDBCEX,A7 1ST EXTENT LDR A10,A10 =1 RF(Z) DMTA30 NO RELEASE =1 LDKL A3,/8000 ST A3,DWTST,A6 NOT BUSY DMTA30 EQU * XIF ENB ENB * * RELEASE BUFFER * LD A3,ECBBA,A8 SUK A3,8 CF A14,DMTRBU * * RELEASE FDB * LDR A10,A10 RF(Z) DMTA40 NO RELEASE IFT INDXAC=1 * * REMOVE ALL OTHER REFERAENCES TO THIS FDB * LDK A1,10 2*MAX NR OF FDBS DMTA50 SUK A1,2 RF(N) DMTA70 ALL FDBS CHECKED LDR A2,A6 ADR A2,A1 LD A3,FDBADF,A2 OTHER FDB ADDR RB(Z) DMTA50 LDK A4,10 2*MAX NR OF FDBS DMTA60 SUK A4,2 RB(N) DMTA50 ALL ADDR CHECKED IN OTHER FDB LDR A5,A3 ADR A5,A4 CW A6,FDBADF,A5 RB(NE) DMTA60 * * DELETE THIS REFERENCE TO THE FDB THAT SHALL BE RELEASED * CM FDBADF,A5 RB DMTA50 XIF EJECT DMTA70 EQU * LDKL A3,/FFFE INH INH ANRS A3,A6 SET FDB FREE DMTA40 EQU * CF A14,CLRBUF REMOVE ALL FREE BUFFERS LDR A1,A7 NEW FDB ADDR ABL(Z) DMTERX NO MORE FDBS IFT INDXAC=1 ENB ENB * * FIND WHICH DMTASK IS NEXT AND ACTIVATE THAT * LDK A7,0 LC A7,FDBEXT,A1 TASK 1ST EXT ADKL A7,'#D' TASK ID LKM DATA -4 DATA DMTASK LKM DATA 3 EXIT XIF IFT FLXDSC=1 EJECT DMT900 EQU * * UNLOCK FLEXDISC IN THIS LOOP * * REGISTERS * A1 = EXTENT COUNTER * A4 = LAST VOL CODE FLEXDOISC A5 = EXT ADDR * A6 = FDB ADDR * A8 = ECB ADDR A9 = DM ECB ADDR * A10-A12 USED * ADKL A5,EXTELE EXT LENGTH IN FDB LCR A7,A5 VOLUME CODE ANK A7,/FF ABL(Z) DMT880 NO CODE * * FLEXDICSC IF BIT 8-13 = 111110 * ANK A7,/F8 SUK A7,/F8 ABL(NE) DMT880 NO FLEXDISC * * IF SAME FLEXDISC AS LAST, DO NOT SCHECK AGAIN * CCR A4,A5 ABL(E) DMT880 SAME * * NOW SEARCH ALL FDBS FOR THOIS FLEXIBLE DISC VOL CODE * DMT910 EQU * LCR A4,A5 SAVE VOL CODE LDKL A3,FDBSTA FDB LINK ROOT INH INH RF DMT925 DMT920 EQU * LDR* A3,A3 FDB ADDR DMT925 EQU * ANKL A3,/FFFE FDB ADDR RF(Z) DMT980 ALL FDBS CHECKED LDR* A7,A3 ANK A7,1 RB(Z) DMT920 FREE CWR A6,A3 RB(E) DMT920 CURRENT FDB LDK A7,4 EXTENT COUNTER LDR A2,A3 FDB ADDR ADKL A2,FDBEXT+1 * ADDR OF 1ST VOL CODE SUKL A2,EXTELE EXT LENGTH IN FDB DMT930 EQU * SUK A7,1 RB(N) DMT920 ALL EXTENTS CHECKED ADKL A2,EXTELE CCR A4,A2 VOLUME CODE ABL(E) DMT880 CODE USED. NO UNLOCK RB DMT930 NEXT EXTENT * * ALL FSDBS CHECKED. MAKE UNLOAD * DMT980 EQU * ENB ENB * * NOTE THAT ECBBUF IS ASSUMED NOT TO BE CHANGED * WITH THIS REQUEST * SC A4,ECBFC,A8 VOL CODE * IFF DSKPAG+SWPBLK=0 LDK A1,0 CC A4,SCTPLD+1 CHECK FILE CODE ABL(E) DMT880 PROGRAM LOADING DEVICE? XIF * IFT FLXDSC=1 LDK A7,/B8 UNLOAD WAIT LKM DATA 1 LD A1,ECBRC,A8 ANK A1,1 INOPER ABL(NZ) DMTERR ABL DMT880 CHECK NEXT EXT XIF EJECT DMT500 EQU * READ VTOC RECORD * LD A2,VTOCRL VTOC REC LENGTH CW A2,ECBRL,A9 RF(NG) DMT510 MOVE THE WHOLE VTOC REC LDK A1,/8 INCORRECT LENGTH ORS A1,ECBRC,A9 SET RC BUT CONTINUE LD A2,ECBRL,A9 MOVE WHAT USER TOLD YOU DMT510 EQU * ST A2,ECBEL,A9 CF A14,DMTREM MOVE RECORD DMAEX EQU * ABL DMTAEX EXIT EJECT DMSQWR EQU * SEQUENTIAL WRITE * DMRDWR EQU * RANDOM WRITE * DMRDDE EQU * RANDOM DELETE * DMINS EQU * INDEXED INSERT * DMDEL EQU * INDEXED DELETE * DMIRW EQU * INDEXED REWRITE * DMRDWD EQU * DELAYED RANDOM WRITE * DMRDDD EQU * DELAYED RANDOM DELETE * * TEST STATUS LD A10,FDBRRO,A6 AD A10,FDBRLE,A6 ADR A10,A5 STATUS BYTE ADDRESS LDR A11,A5 BUFFER ADDR LDR A1,A6 FDB ADDR LD A2,ECBCW+2,A9 ANK A2,/FF LD A3,ECBCW,A9 LOG REC NR LDK A4,0 CCR A4,A10 RF(E) DMS010 FREE IFT INDXAC=1 LDR A4,A7 SUK A4,QINS RF(E) DMEAER INDEXED INSERT XIF LDR A4,A7 SUK A4,QSW RF(E) DMEAER SEQ WRITE IFT QNOEXA=1 * NO EA-CHECK IF EA-BIT = 1 * LC A4,DWTST,A6 ANK A4,EABIT RF(NZ) DMS020 EA=1, NO CHECK * EA MUST BE SET * CF A14,EATEST LDR A4,A4 RTN CODE RF(NP) DMEAER NO EA THIS TASK XIF RF DMS100 DMS010 EQU * IFT INDXAC=1 LDR A4,A7 SUK A4,QIRW RF(Z) DMERND INDEXED REWRITE LDR A4,A7 SUK A4,QDEL RF(Z) DMERND INDEXED DELETE XIF DMS020 EQU * CF A14,EATEST LDR A4,A4 RTN CODE RF(N) DMEAER EA OTHER TASK DMS100 EQU * LDK A1,0 SET STATUS FREE IFT INDXAC=1 LDR A2,A7 SUK A2,QIRW RF(E) CHK010 INDEXED REWRITE LDR A2,A7 SUK A2,QINS RF(E) CHK010 INDEXED INSERT LDR A2,A7 SUK A2,QDEL RF(E) CHK010 INDEXED DELETE XIF LDR A2,A7 SUK A2,QRD RF(E) DMT350 RANDOM DELETE LDR A2,A7 SUK A2,QRDD RF(E) DMT350 DELAYED RANDOM DELETE RF DMT310 RW,RWD,SW IFT INDXAC=1 EJECT CHK010 EQU * * INDEXED REWRITE,INDEXED INSERT AND INDEXED DELETE ENTERS HERE * * COUNT NR OF INDEXES AND * COMPARE KEYS IN FILE AND USER BUFFER * LDR A1,A6 FDB ADDR LDK A5,8 MAX 4 INDEX SUR A12,A12 INDEX COUNTER CHK040 EQU * SUK A5,2 RF(N) CHK100 ALL INDEX CHECKED LDR A2,A1 FDB ADD ADR A2,A5 LD A6,FDBAI1,A2 FDB ADDR INDEX FILE RB(Z) CHK040 NO INDEX ADKL A12,1 COUNT INDEX FILES LD A2,DWTOR,A1 ORDER =3 ANK A2,/3F ORDER INDEX SUK A2,QIRW RB(NE) CHK040 NOT INDEXED REWRITE * IFT MMUPAG=1 LDR A7,A1 SAVE A1 LD A1,FDBKA,A6 GET KEY START ADDRESS AD A1,ECBBA,A9 LDKL A2,FDBKEY GET KEY SAVE AREA DISPLACEMENT ADR A2,A6 ADD FDB ADDRESS LDR A13,A2 SAVE A2 LD A3,FDBRLE,A6 RECORD LENGTH SUK A3,6 KEY LENGTH INH LD A4,DWTTDM,A7 GET TTAB ADDRESS TL TTB:MT,A4 LOAD MMU REGISTERS LD A4,PRUN GET DM TTAB ADDRESS TS TTB:MT,A4 STORE USER MMU IN DM MMU TABLE ENB CF A14,MOV:US MOVE KEY TO FDB KEY AREA LDR A1,A7 RESTORE A1 LDR A2,A13 RESTORE A2 LD A3,FDBKA,A6 GET KEY START ADDRESS XIF * IFT INDXAC=1 IFT MMUPAG=0 LD A2,FDBKA,A6 KEY START ADDR LDR A3,A2 AD A2,ECBBA,A9 KEY IN BUFFER XIF * IFT INDXAC=1 AD A3,FDBRRO,A1 ADR A3,A11 KEY IN FILE LDK A7,0 LD A6,FDBRLE,A6 RECORD LENGTH SUK A6,6 KEY LENGTH CF A14,CHKKEY COMPARE KEYS CWR A6,A7 RB(E) CHK040 KEY UNCHANGED CHECK NEXT LDR A6,A1 FDB ADDR LDKL A1,/4000 KEY NOT FOUND RF DMERR CHK100 EQU * LDR A6,A1 FDB ADDR LD A7,DWTOR,A6 ANK A7,/3F ORDER INDEX LDK A2,0 LC A2,FDBNIF,A6 CWR A2,A12 RF(E) DMT310 ALL INDEX IS EXISTING LDKL A1,/8000 REQ ERR RF DMERR DMERND LDKL A1,/800 NO DATA RF DMERR XIF DMEAER LDKL A1,/2000 EA PROTECT DMERR ABL DMTERR EJECT * * MOVE RECORD * DMT310 EQU * IFT INDXAC=1 LDR A2,A7 SUK A2,QDEL ABL(E) DMXDEL INDEXED DELETE XIF LD A2,FDBRLE,A6 RECORD LENGTH LD A3,FDBRRO,A6 ADR A3,A11 TO ADDRESS LDR A4,A3 LD A1,ECBBA,A9 FROM ADDRESS * IFT MMUPAG=0 XRR A4,A1 ANK A4,/01 RF(E) DMT320 BOTH ODD OR BOTH EVEN CF A14,DMTBM ONE ODD AND ONE EVEN RF DMT340 * DMT320 LDR A4,A3 ANK A4,/01 RF(E) DMT330 BOTH EVEN SUK A2,1 BOTH ODD LCR A4,A1 SCR A4,A3 ADK A1,1 ADK A3,1 DMT330 CF A14,DMTWM WORD MOVE * XIF * IFT MMUPAG=1 LDR A3,A2 GET LENGTH LDR A2,A4 GET RECEIVING BUFFER ADDRESS INH LD A4,DWTTDM,A6 GET TTAB ADDRESS TL TTB:MT,A4 LOAD MMU REGISTERS LD A4,PRUN GET DM TTAB ADDRESS TS TTB:MT,A4 STORE USER MMU IN DM MMU TABLE ENB CF A14,MOV:US MOVE RECORD FROM USER TO SYSTEM AREA XIF * DMT340 EQU * * * SET STATUS USED * LDK A1,/FF DMT350 SCR A1,A10 LD A3,FDBDBR,A6 RF(NN) DMT394 NO DELAY LDR A2,A7 SUK A2,QSW RF(E) DMT360 SEQUENTIAL WRITE LDR A2,A7 SUK A2,QRWD RF(E) DMT400 DELAYED RANDOM WRITE SUK A7,QRDD RF(E) DMT400 DELAYED RANDOM DELETE RF DMT390 * WRITE IF LAST REC IN SECTOR * DMT360 LD A4,FDBRRO,A6 CW A4,FDBMRO,A6 RF(NE) DMT400 NOT LAST RECORD DMT390 LDK A7,/05 BASIC WRITE SLL A3,1 RF(N) DMT395 BASIC WANTED DMT394 LDK A7,/15 PHYSICAL WRITE DMT395 EQU * * * WRITE SECTOR ONTO DISC AND EXIT * LDR A1,A6 FDB ADDRESS AS PARAMETER LKM DATA -1 I/O AND ACTIVATION DATA DMTAR2 DMTASK RESTART #2 LKM DATA 3 EXIT EJECT * ************** * DMTAR2 * ************** * * DMTAR2 EQU * DMTASK RESTART AFTER WRITE * * SET UP A14 STACK * CF A15,GETA14 * CF A14,DMTIOT CHECK DISC I/O LDR A1,A1 RF(NZ) DMTERR LDKL A1,/C0FF ANS A1,FDBDBR,A6 RELEASE BUFFER DMT400 EQU * LDR A1,A6 FDB ADDR DATA FILE LD A2,ECBCW+2,A9 ANK A2,/FF LD A3,ECBCW,A9 LOG REC NR LC A11,ECBFC,A9 FILE CODE LD A7,DWTOR,A1 ANK A7,/3F ORDER INDEX LDK A4,QSW CWR A7,A4 RF(E) DMT460 SEQ WRITE LDK A4,QRD CWR A7,A4 RF(E) DMT420 RAND DEL LDK A4,QRDD CWR A7,A4 RF(E) DMT420 DELAYED RANDEOM DELETE IFT INDXAC=1 LDK A4,QDEL CWR A7,A4 RF(E) DMT420 INDEXED DELETE XIF LDR A5,A2 SAVE REC NO PART 1 LDR A9,A3 * * UPDATE CRN * CF A14,CRNGET GET CRN BUFFER LDR A10,A2 BUFFER ADDR IFT INDXAC=1 =2 START LDK A3,QIRW CWR A7,A3 RF(E) DMT410 INDEXED REWRITE XIF =2 END CM CRNCIF,A2 * CLEAR INDEX CRN CM CRNCIF+2,A2 DMT410 EQU * =2 LDR A2,A5 LDR A3,A9 ST A2,CRNCDF,A10 ST A3,CRNCDF+2,A10 CRN DATA FILE SC A11,CRNCDF,A10 CRN FIL E CODE IFT INDXAC=1 LDK A4,QINS CWR A7,A4 RF(E) DMT460 INDEXED INSERT XIF DMT420 EQU * LDK A4,QSR CWR A7,A4 RF(E) DMT450 SEQ READ LDK A4,QRR CWR A7,A4 RF(E) DMT450 RANDOM READ LDK A4,QRRRB CWR A7,A4 RF(E) DMT450 RAND READ REL BUFFER DMT440 EQU * * * RELEASE EA * CF A14,EARELB REL EA RF DMTAEX DMT450 EQU * LC A4,DWTST,A1 DWTSTATUS ANK A4,EABIT EA-BIT RF(NZ) DMTAEX EA=1. NO EA WANTED * * CHECK IF EA IS SET ALREADY * CF A14,EATEST CHECK EA LDR A4,A4 RF(NZ) DMTAEX EA ALREADY SET * * SET EA * CF A14,EASETB RF DMTAEX DMT460 EQU * * * UPDATE LRN * SC A2,FDBLRN,A1 ST A3,FDBLRN+1,A1 IFT INDXAC=1 LDK A4,QINS CWR A7,A4 ABL(E) DMINS2 INDEXED INSERT XIF EJECT DMTAEX LDK A1,0 CORRECT RETURN * DMTERR LD A3,FDBDBR,A6 RF(NN) DMTEX1 NOT DELAY ANKL A3,/3F00 RF(NZ) DMTERX NO RELEASE OF BUFFER DMTEX1 LD A3,ECBBA,A8 SUK A3,8 DMTEX2 EQU * CF A14,DMTRBU RELEASE BUFFER AT A3 DMTERX EQU * INH * A1 = RET CODE * A6 = DWT ADDR CF A15,TENDIO ENB EXIT EQU * LKM DATA 3 IFT INDXAC=1 EJECT DMIRR EQU * * INDEXED RANDOM READ ********************************************* LD A9,DWTECB,A1 USER ECB ADDR IFT MMUPAG=0 LD A8,ECBCW,A9 ADDR OF KEY XIF IFT INDXAC=1 IFT MMUPAG=1 LDR A8,A1 FDB ADDR ADKL A8,FDBKEY KEY AREA ADDR XIF IFT INDXAC=1 SUR A11,A11 LC A11,ECBCW+3,A9 NO OF CHAR * =5 LDR A13,A1 ADKL A13,FDBECB ECB ADDR CF A14,FNDKEY GET INDEX RECORD DMR006 EQU * FROM INDEXED READ NEXT LD A9,DWTECB,A1 LDR A6,A1 FDB ADR LDKL A8,FDBECB ADR A8,A6 ECB ADDRESS LDR A2,A2 RETURN CODE RF(NZ) DMI030 KEY NOT FOUND * * KEY RECORD FOUN * CHECK IF NEXT RECORD HAS THE SAME KEY * LD A2,FDBRRO,A1 RECORD OFFSET ADK A2,10 BUFFER HEADER ADR A2,A3 REC ADDR LD A4,FDBRLE,A1 REC LENGTH SUK A4,6 KEY LENGTH ADR A2,A4 CC A4,2,A2 DUPLICATE KEY CHAR RF(NE) DMR020 NEXT KEY NOT SAME LDKL A5,/200 BIT 6 ORS A5,ECBRC,A9 NEXT KEY SAME DMR020 EQU * * * MOVE LOG REC NO TO ECB * LDK A5,0 LC A5,3,A2 SC A5,ECBCW+3,A8 LC A5,4,A2 ECR A5,A5 LC A5,5,A2 ST A5,ECBCW,A8 * * RELEASE BLOCK BUFFER * CF A14,DMTRBU EJECT * * PERFORM RANDOM READ ON THOIS DATA RECORD * LDR A6,A1 FDB ADDR LC A2,DWTST,A6 USER REQUESRT ANK A2,EABIT GET EA BIT SLL A2,1 LDK A7,/A RANDOM READ NO WAIT ORR A7,A2 EA BIT * * MOVE USER ECB * LDR A1,A9 FROM ECB ADDR LDR A3,A8 TO ECB ADDR LDK A2,6 NO OF CHAR CF A14,DMTWM MOVE ECB LDR A1,A6 FDB ADDR LKM DATA -1 DATA DMTAR4 LD A7,ECBRC,A8 RF(N) DMTAR4 REQ ERR LKM DATA 3 EXIT DMTAR4 EQU * * * SET UP A14 STACK * CF A15,GETA14 LDR A6,A1 LDKL A8,FDBECB ADR A8,A6 RR ECB LD A9,DWTECB,A6 USER ECB LD A1,ECBRC,A8 ORS A1,ECBRC,A9 RET CODE TO USER ANKL A1,/EEF7 BIT 3,7 AND 12 NOT GRAVE ERROR RB(NZ) DMTERX NOT OK * * SET CRN FOR INDEX FILE * LD A1,FDBADF,A6 FDB ADDR DATA FILEP CF A14,CRNGET GET CRN BUFFER ADDR LDR A10,A2 CRN BUFFER ADDR LDR A1,A6 FDB ADDR INDEX FILE CF A14,GTLGRN GET INDE X LOG REC NO SC A2,CRNCIF+1,A10 ST A3,CRNCIF+2,A10 CRN INDEX FILE LC A2,ECBFC,A9 SC A2,CRNCIF,A10 * THAT WAS FILE CODE CRN * * SET RERTURN CODEXS * LD A2,ECBEL,A8 EFFECTIVE LENGTH ST A2,ECBEL,A9 LDK A1,0 RETURN CODE ABL DMTERX TENDIO EJECT DMIRN EQU * INDEXED READ NEXT ********************************************* LDR A1,A6 FDB INDEX LD A2,FDBRRO,A1 RECORD OFFSET LDR A3,A5 SUK A3,10 BUFFER ADDR DMI100 EQU * ADR A2,A3 BUFFADR ADK A2,10 RECORD ADDR AD A2,FDBRLE,A1 ADDR OF STATUS CHAR LDK A5,/FF USED MARK CCR A5,A2 STATUS RF(E) DMI120 USED LD A4,FDBMRO,A1 ST A4,FDBRRO,A1 LAST REC IN SECT * * CHECK IF END OF FILE * LDR A9,A3 SAVE CF A14,GTLGRN GET REC NR CC A2,FDBLRN,A1 RF(L) DMI106 NOT EOF RF(G) DMI105 EOF CW A3,FDBLRN+1,A1 RF(L) DMI106 NOT EOF DMI105 LDR A3,A9 RF DMI030 EOF DMI106 LDR A3,A9 RESTORE RF DMI010 NEXT REC DMI120 EQU * * INDEX RECORD IS FOUND * LDK A2,0 MARK FOUND ABL DMR006 CONT AS FOR INDEXED RAND READ DMI010 EQU * CF A14,RDNXTR GET NEXT INDEX RECORD RB DMI100 RECORD FOUND LDR A6,A1 FDB ADDR DMI030 LDKL A1,/4000 KEY NOT FOUND DMI035 EQU * LDR A3,A3 BUFFER ADDR ABL(Z) DMTERX NO BUFFER ABL DMTERR ERROR AND BUFFER EJECT * DMINS2 EQU * INDEXED INSERT PART 2 * ********************************************* ENB ENB LD A3,ECBBA,A8 SUK A3,8 BUFSTA CF A14,DMTRBU RELEASE BUFFER DMXDEL EQU * INDEXED DELETE ************************************************* LDR A11,A7 ORDER CODE LDR A12,A8 PHYS ECB ADDR LDK A5,0 SC A5,FDBDBR,A1 ZEROE INDEX FILE COUNTER LDK A5,8 NR OF INDEX * 2 LDR A10,A1 FDB DATA DXI020 SUK A5,2 RF(N) DXI100 ALL INDEXES LDR A6,A10 ADR A6,A5 LD A1,FDBAI1,A6 FDB ADDR INDEX FILE RB(Z) DXI020 NO INDEX * * GET FILE CODE FOR THIS FDB ADDR * LD* A6,SCTCDT DXI030 SUK A6,4 LD A7,SCTCDT ADR A7,A6 CW A1,2,A7 RB(NE) DXI030 SEARCH NEXT LDR A8,A1 FDB INDEX ADKL A8,FDBECB ECB ADDR LC A6,1,A7 SC A6,ECBFC,A8 INDEX FILE LDR A6,A11 SUK A6,QINS RF(E) DXI080 INDEXED DELETE * * GET ADDRESSS OF DATA RECORD * LD A6,ECBBA,A12 SECTOR ADDR ADK A6,2 CYLID AD A6,FDBRRO,A10 ADDR DATA REC AD A6,FDBKA,A1 KEY OFFSET LDK A7,/20 DELETE INDEX NOWAIT RF DXI090 DXI080 EQU * LD A9,DWTECB,A10 USER ECB ADDR LD A6,ECBBA,A9 USER BUFFER ADDR AD A6,FDBKA,A1 KEY OFFSET IFT MMUPAG=1 LDR A6,A1 ADKL A6,FDBKEY ADDR KEY AREA XIF IFT INDXAC=1 LDK A7,/1F INSERT INDEX NOWAIT DXI090 EQU * * * A6 = KEY ADDRESS * ST A6,ECBBA,A8 * A1 = FDB ADDR IN DE XFILE LKM DATA -1 DATA DMTAR5 LD A7,ECBRC,A8 RF(N) DMTAR5 REQ ERR RB DXI020 NEXT INDEX DIRECT DXI100 LKM DATA 3 EXIT DMTAR5 EQU * LD A6,FDBADF,A1 FDB DATA FILE LD A9,DWTECB,A6 USER ECB LDKL A8,FDBECB ADR A1,A8 ECB INSERT INDEX ADR A8,A6 ECB DISC IO LD A1,ECBRC,A1 RET CODE BIT 10 AND 14 POSSIBLE ORS A1,ECBRC,A9 RC TO USER LDK A1,0 RETURN CODE LC A2,FDBDBR,A6 NR OF READY INDEX ADK A2,1 COUNT INDEXES CC A2,FDBNIF,A6 TOT NR OF INDEX RF(NE) DXI200 LD A7,DWTOR,A6 ANK A7,/3F ORDER CODE SUK A7,QINS INDEXED INSERT ABL(E) DMTERX READY * RESTORE REGISTERS FOR INDEXED DELETE * LD A10,FDBECB+2,A6 SECTOR ADDR ADKL A10,2 CYLID AD A10,FDBRRO,A6 AD A10,FDBRLE,A6 ADDR STATUS CHAR LDK A1,0 STATUS FREE ABL DMT350 CONTINUE AS FOR RANDOM DELETE DXI200 EQU * SC A2,FDBDBR,A6 LKM DATA 3 EXIT. MORE INDEX LEFT EJECT DMINIX EQU * INSERT INDEX * DMDELX EQU * DELETE INDEX RECORD ********************************************* LD A9,DWTECB,A1 USER ECB ADDR LD A8,ECBBA,A9 BUFFER ADDR USER LDR A12,A8 LD A11,FDBRLE,A1 RECORD LENGTH SUKL A11,6 KEY LENGTH LDR A13,A14 ADKL A13,2 ECB ADDR TO RECORD BUFFER AREASS CF A14,FNDKEY GET INDEX RECORD LDR A6,A1 FDB ADDR LDR A1,A2 RET CODE LDR A3,A3 ABL(Z) DMI035 NO SECTOR FOUND LDR A13,A3 BUFFER ADDR LD A4,FDBADF,A6 FDB DATA FILE LD A5,DWTECB,A4 USER ECB LD A1,DWTOR,A6 ANK A1,/3F SUK A1,QDELX ABL(E) DEL000 DELETE INDEX RECORD * * SET RC BIT 6 TO USER IF NEXT KEY * IS SAME IN REQUESTED INDEX * LDR A2,A2 RF(NZ) INS050 NEXT KEY NOT SAME * (SHORT KEY NOT ALLOWED IN FILE) * LC A4,ECBFC,A5 FILE CODE CC A4,FDBECB+1,A6 RF(NE) INS049 NOT REQUESTED FILE CODE LDKL A4,/200 BIT 6 ORS A4,ECBRC,A5 NEXT KEY SAME INS049 EQU * IFT INSLAS=1 * * INSERT SAME KEY LAST * LDR A1,A6 FDB LD A2,FDBRRO,A1 REC OFFS RF INS100 INS080 EQU * CF A14,RDNXTR GET NEXT REC RF INS100 OK ABL DEL045 ERROR INS100 EQU * ADR A2,A3 ADK A2,10 REC ADDR AD A2,FDBRLE,A1 ADDR STATUS LDK A5,/FF CCR A5,A2 RF(E) INS150 USED LD A5,FDBMRO,A1 ST A5,FDBRRO,A1 RB INS080 GET FIRST RE C IN NXT SECT INS150 EQU * LC A5,-4,A2 DUPL KEY CHAR CWR A5,A11 KEY LENGTH RB(E) INS080 NEXT SAME GET NEXT * * UPDATE LAST SAME RECORD * SC A11,-4,A2 NEXT SAME LD A7,FDBRRO,A1 CW A7,FDBMRO,A1 RF(NE) INS160 SECT WRITTEN LATER * * WRITE SECTOR * LDK A7,/95 WRITE,WAIT LKM DATA 1 CF A14,DMTIOZ IO CHECK LDR A1,A1 ABL(NZ) DMTERR * * GET NEXT RECORD * INS160 EQU * LDR A7,A5 NR OF SAME IN NEXT LDR A1,A6 FDB CF A14,RDNXTR GET NEXT RC RF INS170 OK ABL DEL045 ERROR INS170 EQU * LDR A13,A3 BUFFER ADDR LD A5,FDBADF,A6 LD A5,DWTECB,A5 USER ECB ADDR XIF IFT INDXAC=1 INS050 EQU * * * CREATE AN INDE XRECORD IN AREA 1 * LDR A1,A12 FROM ADDR * LDR A3,A14 ADK A3,2 TO ADDR LDR A2,A11 KEY LENGTH CF A14,DMTBM MOVE KEY LDK A2,0 SCR A2,A3 DUMMY ADK A3,1 SCR A2,A3 DUMMY ADK A3,1 SCR A7,A3 NR OF SAME CHAR ADK A3,1 LDR A7,A3 ADDR OF LOG REC NR LD A2,ECBCW+2,A5 LD A3,ECBCW,A5 REC NR DATA FILE REC SCR A2,A7 ADK A7,2 SCR A3,A7 ECR A3,A3 SUK A7,1 SCR A3,A7 LOG REC NR ADK A7,2 LDK A1,/FF USED SCR A1,A7 STATUS CHAR LDR A1,A6 FDB INDEX CF A14,GTLGRN GET REC NR INDEX * * SAVE RECORD NR FOR FIRST MOVED INDEX * ST A2,-28,A14 ST A3,-26,A14 EJECT * * BELOW IS A NEW INDEX RECORD INSERTED AND FOLLOWING * USED RECORDS ROLLED FORWARD * A6,A11,A13 IS USED AT ENTRY ADKL A11,7 RECORD LENGTH TOTAL * * USE D REGISTERS * A6 = FDB ADDR INDEX * A10 = AREA ADDR * A11 = RECORD LENGTH INDEX * A12 = AREA INDEX 0=BUFAR1,1=BUFAR2 * A13 = BUFFER ADDRESS SECTOR * INS190 EQU * LDKL A12,1 BUFADR2 INS200 EQU * LDK A1,0 LDR A12,A12 RF(Z) INS210 BUFAR1 LDKL A1,RECBFZ RECORD BUUFFER SIZE SLL A1,1 BYTE INS210 LDR A10,A14 ADK A1,2 ADR A10,A1 RECORD BUFFER AREA ADDR * * SAVE LAST RECORD * LDR A1,A13 ADK A1,10 BUFSTA+2 AD A1,FDBMRO,A6 ADDR OF LAST REC IN SECT LDR A2,A11 LDR A3,A10 CF A14,DMTBM SAVE LAST RECORD * MOVE REST OF SECTOR * LDR A1,A13 ADK A1,10 BUFSTA+2 AD A1,FDBRRO,A6 FROM ADDR LDR A5,A1 LD A2,FDBMRO,A6 SU A2,FDBRRO,A6 NR OF CHAR LDR A3,A1 ADR A3,A11 TO ADDR CF A14,DMTBMR MOVE * INSERT NEW RECORD * LDKL A1,RECBFZ BUFFER SIZE SLL A1,1 BYTE NO LDR A12,A12 RF(Z) INS250 BUFAR1 LDK A1,0 SELECT OTHER BUFFER INS250 EQU * ADR A1,A14 FROM ADDR ADK A1,2 FROM ADDR LDR A2,A11 NR OF CHAR LDR A3,A5 TO ADDR CF A14,DMTBM MOVE * WRITE BUFFER * LDR A8,A14 USE STACK AS ECB SUKL A8,24 LC A2,FDBEXT+1,A6 VOL DEV CODE ANK A2,/FF STR A2,A8 LDR A2,A13 ADK A2,8 BUFSTA ST A2,ECBBA,A8 SECTOR ADDR LDKL A2,SECTLE SECTOR LGTH ST A2,ECBRL,A8 LD A2,FDBSNR,A6 SECTOR NR ST A2,ECBCW,A8 SECTOR NR LDK A7,/95 WRITE , WAIT LKM DATA 1 LDR A1,A6 FDB INDEX CF A14,DMTIOZ IO CHECK LDR A1,A1 ABL(NZ) DMTERR * * IF SPILLED RECORD IS FREE, OPERATION IS READY * LDR A2,A10 RECORD AREA ADDR ADR A2,A11 REC LGTH SUK A2,1 ADDR OF STATUS CHAR LD A4,FDBMRO,A6 ST A4,FDBRRO,A6 MAX OFFSET IN SECT CCR A1,A2 RF(Z) INS400 FREE RECORD * * GET NEXT SECTOR * LDR A1,A6 FDB ADDR LDR A3,A13 BUFFER ADDR CF A14,RDNXTR GET FIRST RECORD IN NEXT SECTOR RF INS260 OK LDR A1,A5 ABL DMI035 ERROR INS260 EQU * LDR A13,A3 NEW BUFFER ADDR LDR A12,A12 RB(Z) INS190 SWITCH RECORD BUFFERS SUR A12,A12 RB INS200 EJECT INS400 EQU * * * UPDATE LRN IF EOF IS ENCOUNTERED * LDR A1,A6 FDB INDEX CF A14,GTLGRN CC A2,FDBLRN,A1 RF(L) INS430 NO EOF RF(G) INS410 EOF CW A3,FDBLRN+1,A1 RF(NG) INS430 NO EOF INS410 EQU * SC A2,FDBLRN,A6 LLAST REC NR ST A3,FDBLRN+1,A6 LDKL A1,/1000 EOF ORS A1,ECBRC,A9 EOF TO USER INS430 EQU * * * UPDATE CRN-LINK FOR MOVED INDEX RECORDS * LDKL A12,1 ADD ON E TO CRN LDR A8,A2 LDR A9,A3 LAST REC NR MOVED LD A10,-28,A14 LD A11,-26,A14 FIRST REC NR MOVED CF A14,CRNUPD ADD 1 TO RECORD NUMBERS * * UPDATE CRN IF SAME FILE CODE * LD A1,FDBADF,A5 FDB DATA F CF A14,CRNGET GET CRN BUFFER LD A9,DWTECB,A1 USER ECB ADDR =4 LC A4,ECBFC,A9 USER FILE CODE CC A4,FDBECB+1,A5 RF(NE) INS440 OTHRER FILE ST A10,CRNCIF,A2 ST A11,CRNCIF+2,A2 REC NR SC A4,CRNCIF,A2 FILE CODE INS440 EQU * LDR A6,A5 FDB INDEX LDK A1,0 OK RET CODE LDR A3,A13 BUFFER ADDR ABL DMTEX2 EJECT DEL000 EQU * DELETE INDEX RECORD CONT LDR A12,A5 USER ECB ADDR LDR A2,A2 DEL010 EQU * ABL(NZ) DMI030 KEY NOT FOUND * * CHECK RECORD NR DATA REC * DEL020 EQU * LD A1,FDBRRO,A6 ADR A1,A3 AD A1,FDBRLE,A6 ADK A1,7 BUFSTA+2-3=ADDR REC NR LCR A2,A1 CC A2,ECBCW+3,A12 REC NR RF(NE) DEL030 WRONG RECORD LC A2,1,A1 ECR A2,A2 LC A2,2,A1 REC NR CW A2,ECBCW,A12 RF(E) DEL200 RECORD FOUND DEL030 EQU * * * CHECK IF NEXT KEY SAME * CC A11,-1,A1 KEY LENGTH RB(NE) DEL010 NEXT KEY NOT SAME LDR A1,A6 FDB INDEX DEL040 EQU * CF A14,RDNXTR GET NEXT INDEX RECORD RF DEL050 OK DEL045 LDR A1,A5 ERROR CODE ABL DMI035 ERROR DEL050 EQU * * * CHECK IF RECORD IS USED * LDR A13,A3 NEW BUFFER ADDR ADR A2,A3 ADK A2,10 BUFSTA + 2 AD A2,FDBRLE,A1 ADDR OF STATUS LDK A5,/FF CCR A5,A2 RB(E) DEL020 USED LD A4,FDBMRO,A1 ST A4,FDBRRO,A1 LAST REC IN SECTOR RB DEL040 NEXT REC EJECT DEL200 EQU * RECORD FOUND * * SET RC BIT 6 IF NEXT KEY SAME * LC A2,ECBFC,A12 USER FILE CODE LDK A7,0 LC A7,-1,A1 NR OF SAME CHAR ST A7,16,A14 SAVE IN RECORD BUFFER AFTER ECB CC A2,FDBECB+1,A6 RF(NE) DEL220 NOT REQUESTED FILE CODE CWR A11,A7 KEY LENGTH RF(NE) DEL220 NEXT KEY NOT SAME LDKL A4,/200 ORS A4,ECBRC,A12 NEXT KEY SAME DEL220 EQU * * * MOVE UP RECORDS OVER DELETED * ADKL A11,7 TOTAL RECORD LENGTH LDR A3,A13 ADK A3,10 BUFSTA+2 AD A3,FDBRRO,A6 TO ADDR LDR A1,A3 ADR A1,A11 FROM ADDR LD A2,FDBMRO,A6 SU A2,FDBRRO,A6 NR OF CHAR CF A14,DMTBM MOVE * * SET LAST RECORD FREE * ADR A3,A11 SUK A3,1 LDK A1,0 SCR A1,A3 STATUS FREE * * UPDATE CRN FOR MOVED RECORDS * LDR A1,A6 FDB ADDR CF A14,GTLGRN GET REC NR LDR A10,A2 LDR A11,A3 FIRST REC NR MOVED LD A12,FDBRRO,A6 OLD OFFSET LD A4,FDBMRO,A6 ST A4,FDBRRO,A6 MAX OFFSET CF A14,GTLGRN LAST REC NR MOVED LDR A8,A2 LDR A9,A3 REC NR ST A12,FDBRRO,A6 RESET OFFSET LDKL A12,-1 CF A14,CRNUPD UPDATE CRN BUFFERS LDKL A12,1 MARK BUFFER CHANGED DEL240 EQU * LD A4,FDBRRO,A5 RF(NZ) DEL290 NOT FIRST RECORD LDR A1,A5 FDB CF A14,GTLGRN GET REC NR LDR A1,A2 LDR A2,A3 LDK A6,0 LDK A7,1 CF A14,DSUMOD A1,A2 = A1,A2 - 1 RF(Z) DEL600 FILE START LDR A6,A5 FDB ADDR CF A14,CALSNO GET SECTOR NR LDR A5,A6 FDB ADDR LDR A1,A1 RF(NZ) DEL600 FILE START LDR A8,A14 ADKL A8,2 ECB ADDR LDR A12,A12 RF(Z) DEL245 BUFFER NOT CHANGED * * WRITE SECTOR * LDK A7,/95 WRITE WAIT LKM DATA 1 LDR A1,A5 FDB CF A14,DMTIOZ IO CHECK LDR A1,A1 ABL(NZ) DMTERR SUR A12,A12 BUFFER NOT CHANGED YET DEL245 EQU * LDR A3,A13 CF A14,DMTRBU RELEASE BUFFER * * GET PREVIOUS SECTOR * LDR A1,A5 FDB ADDR LDK A3,0 CF A14,RDNXTR GET SECTOR RF DEL250 OK LDR A6,A1 FDB ADDR RB DEL045 DEL250 EQU * LDR A5,A1 FDB LDR A13,A3 NEW BUFFER ADDR LD A4,FDBMRO,A5 RF DEL300 DEL290 EQU * SU A4,FDBRLE,A5 SUK A4,1 DEL300 EQU * ST A4,FDBRRO,A5 PREVIOS RECORD OFFSET ADK A4,10 BUFSTA+2 ADR A4,A13 RECORD ADDR AD A4,FDBRLE,A5 STATUS CHAR ADDR LDK A2,/FF CCR A2,A4 RB(NE) DEL240 FREE LC A2,17,A14 NR OF SAME IN DELETED RECORD CC A2,-4,A4 RF(NL) DEL600 SC A2,-4,A4 MAKE NR OF SAME SMALLER RF DEL700 WRITE SECTOR DEL600 EQU * LDR A12,A12 RF(Z) DEL900 BUFFER NOT CHANGED * * WRITE SECTOR * DEL700 EQU * LDR A8,A14 ADKL A8,2 ECB ADDR LDK A7,/95 WRITE WAIT LKM DATA 1 LDR A1,A5 FDB ADDR CF A14,DMTIOZ IO CHECK LDR A1,A1 ABL(NZ) DMTERR DEL900 EQU * ABL INS440 XIF END