|
|
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: 36614 (0x8f06)
Notes: pts_type(SC)
Names: »DMTASK.SC«
└─⟦35fda6e03⟧ Bits:30009701 Philips computer tape "BARCLAY"
└─⟦this⟧ »M:DEMO/DMTASK.SC«
IDENT DMTASK REL 10.0 80-05-28 870105041000 =4 , PR 6249 80-03-14 =3 ,DUPL KEY ONLY SEQ 79-11-28 =2 , START NOT USED OK 79-11-22 =1 , INDEXED START NOT LESS 79-11-02 **************************************************** * * 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 BLOCK TO BE ACCESSED IS DEFINED IN FDB (FDBDMI, , -SNR). * ALL BUFFERS ARE CHECKED TO FIND OUT IF THIS BLOCK * 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 BLOCK MUST FIRST BE READ INTO A FREE BUFFER. * EJECT * *************** * ENTRIES * *************** * * ENTRY DMTASK * * FOLLOWING ENTRIES ARE USED BY MODULE DMOPCL ENTRY DMTERX,QOPEN,QRFP,QCL ENTRY RECBFZ 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 FDBLRN EXTRN FDBMIA EXTRN FDBEAL EXTRN FDBADF EXTRN FDBAI1 EXTRN FDBMEC,FWTVOL,FWTPAR EXTRN FWTFNR EXTRN FDBCRL EXTRN FDBDBR,FDBMRO,FDBDMI,FDBBLZ EXTRN ECBFC EXTRN ECBBA EXTRN ECBRL EXTRN ECBEL EXTRN ECBRC EXTRN ECBCW EXTRN BUFLNK EXTRN BUFDMI EXTRN BUFFC EXTRN BUFSNR EXTRN BUFOR EXTRN BUFSTA EXTRN DWTECB EXTRN DWTOR EXTRN DWTTAB,DWTOPT EXTRN DMTRBU RELEASE A DISC BUFFER EXTRN DMTIOT,CHKKEY EXTRN CALSNO EXTRN DSUMOD EXTRN EATEST,EASETB,CRNGET,EARELB,GTBKBU EXTRN FNDKEY EXTRN CRNCIF,CRNCDF,CRNQUE EXTRN MXIND EXTRN FDBKA,FDBNIF,RDNXTR EXTRN FDBKEY SAVE AREA FOR KEY IN INDEXED ACCESS EXTRN GTLGRN,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 SCTPLD PROGRAM LOADING DEVICE EXTRN DMOPEN,DMCLOS,DMRFP EXTRN RELPRO EXTRN EOFRC,REQERR,NODERR,PROERR EXTRN PROT,KEYERR,NXTKYS EXTRN EOFERR EXTRN EOMERR EXTRN NOKEY EXTRN DMTWM,DMTBM,DMTBMR,FNDFDB EXTRN GETA14,DMTFRL,DMTREM EJECT * * * ************************ * CONDITIONAL ASSEMBLY * ************************ * * * X:B EQU 0 X:C EQU 0 X:E EQU 1 * * INDEXED ACCEXSS FUNCTIONS CAN BE OMITTED WITH * INDXAC EQU 1 = INDEX ACCESS INCLUDED * INDXAC EQU 0 = INDEX ACCESS FUNCTIONS OMITTED INDXAC EQU 00001 RECBFZ EQU 00007 INDEX RECORD BUFFER SIZE IN WORDS INSLAS EQU X:E INSERT SAME KEY LAST WHEN = 1 * * * * A PROGRAM VERSION USING TOSS MMU PAGING * IS OBTAINED BY SETTING MMUPAG EQU 1. * MMUPAG EQU 1 * EJECT * ************************ * DATA DEFINITIONS * ************************ * * THE FOLLOWING INTERNAL ORDER CODES IS THE RELATIVE * POSITION IN TIODM-TABLE TIODMF * ORDERS EQU * QRR EQU *-ORDERS DATA DMRDRE RANDOM READ QSR EQU *-ORDERS DATA DMSQRE SEQUENTIAL READ IFT INDXAC=1 QIRR EQU *-ORDERS DATA DMIRR INDEXED READ QIRN EQU *-ORDERS DATA DMIRN INDEXED READ NEXT XIF IFT INDXAC=0 DATA DMTERR,DMTERR XIF QRW EQU *-ORDERS DATA DMRDWR RANDOM WRITE QSW EQU *-ORDERS DATA DMSQWR SEQUENTIAL WRITE IFT INDXAC=1 QINS EQU *-ORDERS DATA DMINS INDEXED INSERT XIF IFT INDXAC=0 DATA DMTERR XIF DATA DMTERR RESERVED QREWR EQU *-ORDERS DATA DMREWR RANDOM REWRITE IFT INDXAC=1 QIRW EQU *-ORDERS DATA DMIRW INDEXED REWRITE XIF IFT INDXAC=0 DATA DMTERR XIF QRD EQU *-ORDERS DATA DMRDDE RANDOM DELETE IFT INDXAC=1 QDEL EQU *-ORDERS DATA DMDEL INDEXED DELETE XIF IFT INDXAC=0 DATA DMTERR XIF QSTDIR EQU *-ORDERS DATA DMSTDI START DIRECT IFT INDXAC=1 QSTIND EQU *-ORDERS DATA DMSTIN START INDEXED XIF IFT INDXAC=0 DATA DMTERR XIF * * FOLLOWING LABELS ARE FOUND IN MODULE DMOPCL * QOPEN EQU *-ORDERS DATA DMOPEN OPEN QCL EQU *-ORDERS DATA DMCLOS CLOSE DATA DMTERR READ STATUS DONE IN TIODM QRFP EQU *-ORDERS DATA DMRFP READ FILE PARAMETERS EJECT ************** * DMTASK * ************** * DMTASK EQU * * * SET UP A14 STACK * INH CF A15,GETA14 ENB LDR A6,A1 FDB ADDR LD A5,FDBRRO,A6 RF(N) DMT090 FOR ORDERS XR (SEE TIODM) * AND RFP,OPEN,STARTINDEXED LD A4,FDBADF,A6 DATA FILE CM FDBKA,A4 MARK 1ST PASS INDEXED DEL DMT020 EQU * * * LOOP ENTRY FOR INDEXED READ,INDEXED NEXT,INDEXED DEL * START, AND SEQ READ * LD A7,DWTOR,A1 ORDER ANK A7,/3F SUK A7,QSR RF(NZ) SQR430 NOT SEQUENTIAL READ LD A9,DWTECB,A1 USER ECB ADDR * LD A2,ECBCW,A9 LD A3,ECBCW+2,A9 REC NR CC A2,FDBLRN,A1 RF(L) SQR430 NO EOF RF(G) SQR410 EOF CW A3,FDBLRN+1,A1 RF(NG) SQR430 NO EOF SQR410 EQU * LDKL A1,EOFERR EOF ABL DMTERX ERR SQR430 EQU * LDKL A2,/CFFF ANS A2,FDBDBR,A6 RELEASE BUFFER LDR A8,A1 ADKL A8,FDBECB ECB ADDR CF A14,GTBKBU GET BLOCK BUFFER LDR A2,A2 RF(N) DMT030 NO DATA IN BUFFER EJECT * * DELAYED BUFFER IS WRITTEN * IF IT IS NOT THE WANTED BLOCK * LC A7,BUFOR,A3 DELAY FLAG ANK A7,/3 RF(Z) DMT080 NO DELAY CM BUFOR,A3 RESET ANK A7,1 RF(NZ) DMT070 RIGHT SECTOR LD A7,BUFSNR,A3 SECT NR ST A7,ECBCW,A8 LD A7,BUFSNR+2,A3 ST A7,ECBCW+2,A8 LDK A7,/95 WRITE WAIT LKM DATA 15 CF A14,DMTIOT RET CODE CHECK AND RESET SECT NR LDR A1,A1 ABL(NZ) DMTERR ERR CF A14,DMTRBU RELEASE BUFFER LDR A1,A6 FDB ADDR RB DMT020 GET NEW BUFFER EJECT DMT030 EQU * * READ BLOCK INTO BUFFER * LDK A7,/91 PHYSICAL READ LKM DATA 15 FM READ BLOCK CF A14,DMTIOT CHECK RETURN CODES FROM DISC I/O LDR A1,A1 ABL(NZ) DMTERR LD A5,ECBBA,A8 RF DMT090 DMT070 EQU * RIGHT DELAYED BUFFER IS FOUND LDKL A5,/1000 ORS A5,FDBDBR,A6 KEEP BUFFER DMT080 EQU * ENTRY IF SECT ALREADY IN BUFFER LDR A5,A3 ADKL A5,BUFSTA SKIP BUFFER HEADER ST A5,ECBBA,A8 PUT BUFFER ADDR IN ECB DMT090 EQU * LDR A1,A6 LD A7,DWTOR,A6 * A7 = INTERNAL ORDER CODE ANK A7,/3F ABI ORDERS,A7 DMTASK FUNCTION TABLE * A1 = A6 * (A3= BLOCK BUFFER ADDRESS ) * (A5 = BLOCK ADDRESS ) * A6 = FDB ADDRESS ALL ORDERS * A7 = ORDER CODE ALL ORDERS * (A8 = FDBECB ADDRESS ) * (A9 = USER ECB ADDRESS ) EJECT DMSQRE EQU * SEQUENTIAL READ * DMRDRE EQU * RANDOM READ * DMSTDI EQU * START DIRECT * * CHECK STATUS * 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 CWK A7,QRR RF(E) DMT190 RANDOM READ CWK A7,QSTDIR RF(NE) DMT250 NOT START LC A1,DWTOPT,A6 ANK A1,7 OPTION RF(NZ) DMT250 NOT EQUAL RF DMT230 EQUAL =2 DMT190 EQU * LDKL A1,NODERR NO DATA ABL DMTERR EJECT DMT200 EQU * SUK A7,QSTDIR RF(Z) DMT230 START LD A2,ECBRL,A9 REQ LGTH CW A2,FDBRLE,A6 RECORD LGTH RF(NG) DMT220 LD A2,FDBRLE,A6 MAX LGTH DMT220 ST A2,ECBEL,A9 SET EFF LGTH * * MOVE THE RECORD * CF A14,DMTREM * * UPDATE CRN AND SET EXCLUSIVE ACCESS BIT DMT230 EQU * ABL DMT400 PUT CRN AND EA EJECT DMT250 EQU * NO DATA AT SEQ READ * * GET NEXT RECORD * LD A2,ECBCW+2,A9 REC NR ADK A2,1 RF(O) DMT260 OVERFLOW RF DMT270 DMT260 ANKL A2,/7FFF IM ECBCW,A9 CARRY DMT270 ST A2,ECBCW+2,A9 DMT280 EQU * * * CHECK EA * LDR A1,A6 FDB ADDR LD A2,ECBCW,A9 LD A3,ECBCW+2,A9 REC NR CF A14,EATEST LDR A4,A4 ABL(N) DMEAER PROTECT ERROR IFT INDXAC=1 LD A4,DWTOR,A6 ORDER ANK A4,/3F CWK A4,QSTIND ABL(E) DMT400 START INDEXED XIF LDR A1,A2 LDR A2,A3 REC NR EJECT LDR A10,A8 CF A14,CALSNO PREP IO LDR A8,A10 LDR A1,A1 ABL(NZ) DMTERR OUT OF MEDIUM LDR A1,A6 FDB ADDRESS LC A3,FDBDBR,A6 DELAY ANK A3,/10 RF(NZ) DMT295 KEEP BUFFER LD A3,ECBBA,A8 SUKL A3,BUFSTA BUFFER ADDR * * RELEASE BLOCK BUFFER * CF A14,DMTRBU DMT295 EQU * ABL DMT020 NEXT RECORD EJECT DMSQWR EQU * SEQUENTIAL WRITE * DMRDWR EQU * RANDOM WRITE * DMREWR EQU * RANDOM REWRITE * DMRDDE EQU * RANDOM DELETE * DMINS EQU * INDEXED INSERT * DMDEL EQU * INDEXED DELETE * DMIRW EQU * INDEXED REWRITE * * TEST STATUS LD A10,FDBRRO,A6 AD A10,FDBRLE,A6 ADR A10,A5 STATUS BYTE ADDRESS LDR A11,A5 BUFFER ADDR LD A2,ECBCW,A9 LD A3,ECBCW+2,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) DMS008 INDEXED INSERT XIF LDR A4,A7 SUK A4,QRW RF(E) DMS008 DIRECT WRITE LDR A4,A7 SUK A4,QSW RF(NE) DMS020 NOT SEQ WRITE DMS008 EQU * LDKL A1,PROT PROTECTED RF DMERR 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 LDR A4,A7 SUK A4,QREWR RF(Z) DMERND RANDOM REWRITE LDR A4,A7 SUK A4,QRD RF(Z) DMERND RANDOM DELETE DMS020 EQU * CF A14,EATEST LDR A4,A4 RTN CODE RF(N) DMEAER EA OTHER TASK DMS100 EQU * LDK A3,0 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 LD A2,FDBKA,A6 ABL(NZ) DMT350 SECOND PASS INDEXED DEL LDR A2,A7 SUK A2,QDEL RF(E) CHK010 INDEXED DELETE XIF LDR A2,A7 SUK A2,QRD ABL(E) DMT350 RANDOM DELETE RF DMT310 IFT INDXAC=1 EJECT CHK010 EQU * * INDEXED REWRITE,INDEXED INSERT AND INDEXED DELETE ENTERS HERE * * COMPARE KEYS IN FILE AND USER BUFFER * LDK A5,8 MAX 4 INDEX 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 LD A2,DWTOR,A1 ANK A2,/3F ORDER INDEX CWK A2,QINS RB(E) CHK040 NO CHECK ON INSERT SUK A2,QIRW RF(Z) CHK050 CHECK REWRITE LC A2,DWTOPT,A1 OPTION ANK A2,/4 RB(NZ) CHK040 NO CHECK ON DEL CURRENT CHK050 EQU * * 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 LD A4,DWTTAB,A7 GET TTAB ADDRESS 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,PROT KEY NOT FOUND RF DMERR CHK100 EQU * LDR A6,A1 FDB ADDR LD A7,DWTOR,A6 ANK A7,/3F ORDER INDEX RF DMT310 XIF EJECT DMERND LDKL A1,NODERR NO DATA RF DMERR DMEAER EQU * RELEASE EA FOR ALL FILES SUR A9,A9 LC A9,FDBTNR,A6 USER TASK ID CF A14,RELPRO RELEASE PROTECT LDKL A1,PROERR PROTECT ERR DMERR ABL DMTERR EJECT * * MOVE RECORD * DMT310 EQU * IFT INDXAC=1 CWK A7,QDEL RF(NE) DMT313 NOT INDEX DEL * * MOVE KEYS TO FDB KEY AREAS * LDK A5,8 IXINS3 EQU * LDR A2,A6 FDB DATA ADR A2,A5 LD A3,FDBADF,A2 FDB INDEX RF(Z) IXINS4 NO INDEX LD A1,FDBKA,A3 KEY ADDR AD A1,FDBRRO,A6 REC OFFS ADR A1,A11 BUFFERADDR GIVES KEY ADDR LD A2,FDBRLE,A3 REC LGTH SUK A2,6 KEY LGTH ADKL A3,FDBKEY TO ADDR CF A14,DMTBM KEY TO FDB AREA IXINS4 EQU * SUK A5,2 RB(NZ) IXINS3 MORE INDEXS ABL DMXDEL INDEXED DEL DMT313 EQU * 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 LD A4,DWTTAB,A6 GET TTAB ADDRESS CF A14,MOV:US MOVE RECORD FROM USER TO SYSTEM AREA XIF EJECT * DMT340 EQU * * * SET STATUS USED * LDK A3,/FF DMT350 SCR A3,A10 LD A3,FDBDBR,A6 RF(N) DMT390 DELAY NO WRITE LDK A7,/95 PHYSICAL WRITE * * WRITE BLOCK TO DISC * LDR A1,A6 FDB ADDRESS AS PARAMETER LKM DATA 15 FM WRITE CF A14,DMTIOT CHECK DISC I/O LDR A1,A1 RF(NZ) DMTERR RF DMT400 EJECT DMT390 EQU * LDKL A2,/1000 ORS A2,FDBDBR,A6 KEEP BUFFER DMT400 EQU * LDR A1,A6 FDB ADDR DATA FILE CF A14,CRNGET GET CURRENCY BUFFER LDR A10,A2 BUFFER ADDR LD A2,ECBCW,A9 LD A3,ECBCW+2,A9 LOG REC NR LD A7,DWTOR,A1 ANK A7,/3F ORDER INDEX LDK A4,QRW CWR A7,A4 RF(E) DMT420 RANDOM WRITE LDK A4,QREWR CWR A7,A4 RF(E) DMT420 REWRITE LDK A4,QSW CWR A7,A4 RF(E) DMT460 SEQ WRITE IFT INDXAC=1 LDK A4,QIRW CWR A7,A4 RF(E) DMT420 IND REWR LDK A4,QINS CWR A7,A4 RF(E) DMT460 INDEXED INSERT CWK A7,QSTIND RF(E) DMT406 START INDEXED XIF LDK A4,QSTDIR CWR A7,A4 RF(NE) DMT409 NOT START DMT406 EQU * LDR A4,A2 LDR A5,A3 SUK A5,1 RF(NN) DMT408 ANKL A5,/7FFF SUK A4,1 DMT408 EQU * ST A4,CRNCDF,A10 NEW CURRENCY ST A5,CRNCDF+2,A10 RF DMT420 DMT409 EQU * ST A2,CRNCDF,A10 ST A3,CRNCDF+2,A10 CRN DATA FILE DMT420 EQU * * * CHECK PROTECT * LC A4,FDBDBR,A1 ANK A4,/1 RF(Z) DMT470 NOT PROTECT * * CHECK IF EA IS SET ALREADY * CF A14,EATEST CHECK EA LDR A4,A4 RF(NZ) DMT470 EA ALREADY SET * * SET EA * CF A14,EASETB RF DMT470 DMT460 EQU * * * UPDATE LRN * SC A2,FDBLRN,A1 ST A3,FDBLRN+1,A1 RB DMT420 DMT470 EQU * IFT INDXAC=1 LDK A4,QINS CWR A7,A4 ABL(E) DMINS2 INDEXED INSERT XIF EJECT DMTAEX LDK A1,0 CORRECT RETURN * DMTERR LC A3,FDBDBR,A6 ANK A3,/10 RF(NZ) DMTERX KEEP BUFFER LD A3,ECBBA,A8 SUKL A3,BUFSTA CF A14,DMTRBU RELEASE BUFFER AT A3 DMTERX EQU * LD A6,FDBADF,A6 GET FDB DATA FILE INH * A1 = RET CODE * A6 = DWT ADDR CF A15,TENDIO ENB LKM DATA 3 IFT INDXAC=1 EJECT DMIRR EQU * INDEXED RANDOM READ * DMSTIN EQU * START INDEXED ********************************************* LDR A8,A1 FDB ADDR ADKL A8,FDBKEY KEY AREA ADDR LD A11,FDBRLE,A1 REC LGTH INDEX SUKL A11,6 KEY LENGTH 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 LD A4,DWTOR,A6 ANK A4,/3F ORDER SUK A4,QSTIND RF(NZ) DMR007 NOT START LC A4,DWTOPT,A6 ANK A4,7 OPTION RF(Z) DMR007 EQUAL ANKL A2,/FBFF IGNORE NOKEY =1 DMR007 EQU * LDR A2,A2 RET CODE RF(NZ) DMI037 KEY NOT FOUND =4 LD A2,FDBRRO,A1 RECORD ADDR =3 ADKL A2,BUFSTA =3 ADR A2,A3 REC ADDR =3 LD A4,FDBRLE,A1 RECORD LENGTH =3 SUK A4,6 =3 ADR A2,A4 =3 * * MOVE LOG REC NO TO ECB * LDK A5,0 LC A5,3,A2 ST A5,ECBCW,A9 LC A5,4,A2 ECR A5,A5 LC A5,5,A2 ST A5,ECBCW+2,A9 * SET CRN * LD A11,FDBADF,A6 FDB DATA FILE LDR A1,A11 DATA FILE FDB 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 LDK A5,QRR RANDOM READ LD A7,DWTOR,A11 ANK A7,/3F ORDER SUK A7,QSTIND RF(NE) DMR025 INDEXED READ LDK A5,QSTIND START INDEXED SUK A3,1 RF(NN) DMR025 NOT UNDERFLOW ANKL A3,/7FFF SUK A2,1 DMR025 EQU * SC A2,CRNCIF+1,A10 ST A3,CRNCIF+2,A10 CRN INDEX FILE LD A2,ECBCW,A9 REC NR DATA ST A2,CRNCDF,A10 LD A2,ECBCW+2,A9 ST A2,CRNCDF+2,A10 LC A2,FWTFNR,A6 FILE NR SC A2,CRNCIF,A10 LDR A6,A11 FDB DATA SC A5,DWTOR+1,A6 NEW ORDER LDKL A2,/CFFF ANS A2,FDBDBR,A6 RELEASE INDEX BUFFERS ABL DMT280 EJECT DMIRN EQU * INDEXED READ NEXT ********************************************* LD A2,FDBRRO,A1 RECORD OFFSET LDR A3,A5 SUKL A3,BUFSTA DMI100 EQU * ADR A2,A3 BUFFADR ADKL A2,BUFSTA 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 LDKL A1,EOFERR RF DMI035 EOF DMI106 LDR A3,A9 RESTORE RF DMI010 NEXT REC EJECT DMI120 EQU * * INDEX RECORD IS FOUND * LD A9,DWTECB,A1 USER ECB * * KEY RECORD FOUN * CHECK IF NEXT RECORD HAS THE SAME KEY * LD A2,FDBRRO,A1 RECORD OFFSET ADKL A2,BUFSTA 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,NXTKYS BIT 6 ORS A5,ECBRC,A9 NEXT KEY SAME DMR020 EQU * LDK A2,0 MARK FOUND ABL DMR006 CONT AS FOR INDEXED RAND READ DMI037 LDKL A1,KEYERR KEY NOT FOUND =4 RF DMI035 =4 DMI010 EQU * CF A14,RDNXTR GET NEXT INDEX RECORD RB DMI100 RECORD FOUND LDR A6,A1 FDB ADDR DMI031 EQU * LDKL A1,NODERR NO IDENT DMI035 EQU * LDR A3,A3 BUFFER ADDR ABL(Z) DMTERX NO BUFFER ABL DMTERR ERROR AND BUFFER DMI036 EQU * ANK A1,/27 RB(NZ) DMI035 BIT 10,13,14,15 LDKL A1,EOMERR GRAVE ERR ALSO RB DMI035 EJECT DMINS2 EQU * INDEXED INSERT PART 2 DMXDEL EQU * INDEXED DELETE * ********************************************* LC A3,FDBDBR,A6 ANK A3,/10 RF(NZ) DXI010 KEEP BUFFER LD A3,ECBBA,A8 SUKL A3,BUFSTA CF A14,DMTRBU RELEASE BUFFER DXI010 EQU * LDK A5,10 LOOPER DXI020 EQU * NEXT INDEX LD A7,DWTOR,A6 ORDER ANK A7,/3F SUK A5,2 RF(Z) DXI100 ALL INDEXES LDR A4,A6 FDB DATA ADR A4,A5 LD A1,FDBADF,A4 FDB INDEX RB(Z) DXI020 NO INDEX LD A2,DWTOR,A6 ORDER ST A2,DWTOR,A1 LD A2,DWTECB,A6 USER ECB ADDR ST A2,DWTECB,A1 ST A5,FDBKA,A6 SAVE COUNTER SUK A7,QINS RF(E) DMINIX INSERT INDEX RF DMDELX DELETE INDEX EJECT * RETURN FROM UPDATING OF ONE INDEX * DMTAR5 EQU * LD A6,FDBADF,A1 FDB DATA FILE LD A5,FDBKA,A6 GET COUNTER OF INDEXES RB DXI020 TAKE NEXT INDEX DXI100 EQU * INDEXES READY LDK A1,0 RET CODE SUK A7,QINS INDEXED INSERT ABL(E) DMTERX READY LDR A1,A6 ABL DMT020 RESTART DMTASK EJECT DMINIX EQU * INSERT INDEX IFT MMUPAG=0 * * GET KEY IN USER BUFFER * LD A4,FDBADF,A1 DATA FDB LD A4,DWTECB,A4 USER ECB LD A8,ECBBA,A4 USER BUFFER AD A8,FDBKA,A1 KEY ADDR RF INS010 XIF IFT INDXAC=1 * DMDELX EQU * DELETE INDEX RECORD ********************************************* LDR A8,A1 ADKL A8,FDBKEY KEY ADDR INS010 EQU * 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) DMI036 NO SECTOR FOUND LDR A13,A3 BUFFER ADDR LD A5,DWTECB,A6 USER ECB LD A1,DWTOR,A6 ANK A1,/3F SUK A1,QDEL 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 LDKL A4,NXTKYS NEXT KEY SAME ORS A4,ECBRC,A5 NEXT KEY SAME 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 ADKL A2,BUFSTA 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 BLOCK * LDK A7,/95 WRITE,WAIT LKM DATA 15 FM 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,DWTECB,A6 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,A5 LD A3,ECBCW+2,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 BLOCK * 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 ADKL A1,BUFSTA 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 ADKL A1,BUFSTA 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,FWTFNR,A6 VOL DEV CODE ANK A2,/FF STR A2,A8 LDR A2,A13 ADKL A2,BUFSTA ST A2,ECBBA,A8 SECTOR ADDR LC A2,FDBBLZ,A6 BLOCK SIZE SLL A2,8 IN BYTE ST A2,ECBRL,A8 LD A2,FDBSNR,A6 SECTOR NR ST A2,ECBCW,A8 SECTOR NR LD A3,FDBSNR+2,A6 ST A3,ECBCW+2,A8 SECT NR LDK A7,/95 WRITE , WAIT LKM DATA 15 FM 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 BLOCK * LDR A1,A6 FDB ADDR LDR A3,A13 BUFFER ADDR CF A14,RDNXTR GET FIRST RECORD IN NEXT SECTOR RF INS260 OK RF DEL045 ERR 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,EOFRC END OF FILE ORS A1,ECBRC,A9 TO USER EJECT 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 INS440 EQU * LDR A1,A5 FDB INDEX LDR A3,A13 BUFFER ADDR CF A14,DMTRBU REL BUFFER ABL DMTAR5 ONE INDEX READY TAKE NEXT EJECT DEL000 EQU * DELETE INDEX RECORD CONT LDR A12,A5 USER ECB ADDR LDR A2,A2 DEL010 EQU * ABL(NZ) DMI036 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-3=ADDR REC NR LCR A2,A1 CC A2,ECBCW+1,A12 REC NR RF(NE) DEL030 WRONG RECORD LC A2,1,A1 ECR A2,A2 LC A2,2,A1 REC NR CW A2,ECBCW+2,A12 RF(E) DEL200 RECORD FOUND DEL030 EQU * EJECT * * 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 DMI036 ERROR DEL050 EQU * * * CHECK IF RECORD IS USED * LDR A13,A3 NEW BUFFER ADDR ADR A2,A3 ADKL A2,BUFSTA 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 * LDK A7,0 LC A7,-1,A1 NR OF SAME CHAR ST A7,16,A14 SAVE IN RECORD BUFFER AFTER ECB CWR A11,A7 KEY LENGTH RF(NE) DEL220 NEXT KEY NOT SAME LDKL A4,NXTKYS ORS A4,ECBRC,A12 NEXT KEY SAME DEL220 EQU * * * MOVE UP RECORDS OVER DELETED * ADKL A11,7 TOTAL RECORD LENGTH LDR A3,A13 ADKL A3,BUFSTA 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 15 FM 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 ADKL A4,BUFSTA ADR A4,A13 RECORD ADDR AD A4,FDBRLE,A5 STATUS CHAR ADDR LDK A2,/FF CCR A2,A4 RB(NE) DEL240 FREE * * SET CURRENCY * LDR A9,A4 STATUS ADDR LD A1,FDBADF,A5 FDB DATA F CF A14,CRNGET GET CRN BUFFER LC A1,FWTFNR,A5 INDEX FILE NR CC A1,CRNCIF,A2 LAST REF INDEX RF(NE) DEL350 NOT THIS IND * * UPDATE CURRENCY * LDR A8,A2 CRN ADDR LDR A1,A5 INDEX CF A14,GTLGRN GET REC NR SC A2,CRNCIF+1,A8 ST A3,CRNCIF+2,A8 REC NR DEL350 EQU * LC A2,17,A14 NR OF SAME IN DELETED RECORD * WAS SAVED AT LABEL DEL200 CC A2,-4,A9 RF(NL) DEL600 SC A2,-4,A9 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 15 FM LDR A1,A5 FDB ADDR CF A14,DMTIOZ IO CHECK LDR A1,A1 ABL(NZ) DMTERR DEL900 EQU * ABL INS440 XIF END