|
|
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: 46288 (0xb4d0)
Notes: pts_type(SC)
Names: »SDMTSK.SC«
└─⟦f350e1b7a⟧ Bits:30009678 Philips computer tape "600219"
└─⟦this⟧ »MONGEN/SDMTSK.SC«
IDENT SDMTSK REL 11.0 81-05-13 870105041100 =B, REW. AND DEL. INDEXED,NO RELEASE OF KEY BLK BUF =B, REL 11.0 81-05-12 =A, CONDITION FOR CR,DE,EX =A, REL 11.0 81-04-15 =9, REWRITE WITH DUP KEY DIDN'T WORK =9, REL 11.0 81-03-09 =8, DELETE DIRECT INDEXED DIDN'T WORK =8, REL 11.0 81-03-09 =7, W.R.I. KEYS NOT CORRECT WRITTEN =7, REL 11.0 81-02-26 =6, DELETE,REWRITE DIRECT INDEXED REFORMED =6, REL 11.0 81-02-25 =5, CURRENCY NOT CORRECT WHEN START INDX =5, REL 11.0 81-02-24 =4, MOV:SU DON'T WORK WHEN TASK NOT IN TCTAB =4, REL 11.0 81-02-12 ,LIKE SDM TASK =3, COMPARE KEYS WRONG FDB ADDRESS =3, REL 11.0 81-02-06 =2, INTERN ORDER START N.L WRONG =2, REL 11.0 81-02-06 =1, REG. CRASH WHEN COMP. KEYS =1, REL 11.0 81-01-26 **************************************************** * * PHILIPS TERMINAL SYSTEM PTS * * SDMTSK = HANDLES DATAMANAGEMENT DISC I/O * * * * * **************************************************** * * THIS MODULE IS ACTIVATED FROM TIODM. * * INPUT PARAMETERS: * A1 = FDB ADDRESS * A2 = TID TASK IDENT OF SDMTSK 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 SDMTSK * * FOLLOWING ENTRIES ARE USED BY MODULE DMOPCL ENTRY SDMERX,ORDFLP EJECT * ***************** * EXTERNALS * ***************** * * * DEFINED IN TDISP EXTRN PRUN TTAB ADDRESS OF RUNNING TASK * DEFINED IN TOSSIO EXTRN TENDIO EXTRN ECBBA,ECBRL,ECBEL,ECBRC,ECBCW EXTRN DWTTAB,DWTOPT,DWTECB,DWTOR EXTRN TTB:PW =4 * DEFINED IN FMTASK EXTRN FWTFNR EXTRN FPB:EL * DEFINED IN TIODM EXTRN FDBADF,FDBAI1,FDBBLZ,FDBDBR EXTRN FDBECB,FDBENL,FDBKA,FDBKEY EXTRN FDBLRN,FDBMRO,FDBOMD,FDBRLE EXTRN FDBRRO,FDBSNR,FDBTNR EXTRN PROT,KEYERR,NXTKYS,EOFERR EXTRN EOFRC,NODERR,PROERR,EOMERR EXTRN CRNCDF EXTRN DMTTSB A14 STACK BASE EXTRN DMXACD EXIT RUNNING TASK AND ACTIVATE #D EXTRN SDMSTS STACK START EXTRN SDMBF1,SDMBF2 EJECT * DEFINED IN TIOSDM EXTRN SDMOOR,SDMLIM,SDMOEX,SDMOOS EXTRN SDMOIP,SDMIOP * DEFINED IN SDMSUB EXTRN CALSNO EXTRN EATEST,EASETB,CRNGET,GTBKBU EXTRN MOV:US,MOV:SU,MOVFW,MOVBW EXTRN RELPRO EXTRN FMIORD,FMIOWR,FMIORF,FMIOEX EXTRN FRMFIL EXTRN RLBLKB,CHKRCD EXTRN GTLGRN EXTRN CRNUPD,CRNCIF EXTRN CHKKEY EXTRN RDNXTR EXTRN RECECB MOVE RECORD NUMBER TO ECBCW1,ECBCW2 EXTRN FNDKEY * DEFINED IN DMBUF EXTRN BUFSNR,BUFOR,BUFSTA EXTRN SDMRBU RELEASE A DISC BUFFER EXTRN SDMRLB * DEFINED IN DMOPCL EXTRN SDMOPN,SDMCLO,SDMRFP EXTRN OPEFPB * DEFINED IN DSUMOD EXTRN DSUMOD EJECT * * * ************************ * CONDITIONAL ASSEMBLY * ************************ * X:A EQU 0 X:B EQU 0 =A * NOT SYSGEN SUPPORTED Y:A EQU 1 Y:B 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 INSLAS EQU Y:A INSERT SAME KEY LAST WHEN = 1 * A VERSION LEAVING OUT OPEN MODES: * OPEN OUTPUT,OPEN EXTEND AND DISCARD * IS OBTAINED BY SETTING Y:C=0 * CRDEEX EQU 00000 =A * * A PROGRAM VERSION USING TOSS MMU PAGING * IS OBTAINED BY SETTING MMUPAG EQU 1. * MMUPAG EQU 1 * * * KEYDUP=1 MEANS THAT PRIMARY INDEX (I1) DON'T * ALLOW DUPLICATE KEY WHEN READ OR WRITE * KEYDUP EQU Y:B EJECT *************** * CONSTANTS * *************** FMFPBL EQU 80 FILE PARAMETER BLOCK LENGTH EJECT * ************************ * DATA DEFINITIONS * ************************ * * THE FOLLOWING INTERNAL ORDER CODES ARE THE * RELATIVE POSITION IN ORDTAB * ORDER FROM TIOSDM IS CHANGED AS FOLLOWED * DWTOR TIOSDM DWTOR AFTER CHANGE A7 * 0<X<=7 NOT CHANGED 0 * X>7 ODD X=(X+17)/2 - * X>7 EVEN X=(X-8)/2 - * ORDERS EQU * OROPEN EQU *-ORDERS DATA SDMOPN OPEN ORDRM0 EQU *-ORDERS DATA RDRM00 READ RANDOM ORDSQ0 EQU *-ORDERS DATA RDSQ00 READ SEQUENTIAL OWRRM0 EQU *-ORDERS DATA WRRM00 WRITE RANDOM OWRSQ0 EQU *-ORDERS DATA WRSQ00 WRITE SEQUENTIAL OREWR0 EQU *-ORDERS DATA REWR00 REWRITE NOT INDEXED (DIRECT,CURRENT) EJECT ODELT0 EQU *-ORDERS DATA DELT00 DELETE NOT INDEXED (DIRECT,CURRENT) OSTRTD EQU *-ORDERS DATA STRTDI START DIRECT (EQUAL,GREATER,NOT LESS) OEXTND EQU *-ORDERS DATA EXTEND EXTEND FILE OCLOSE EQU *-ORDERS DATA SDMCLO CLOSE ORDFLP EQU *-ORDERS DATA SDMRFP READ FILE PARAMETERS IFT INDXAC=1 EJECT * * INDEX ORDERS * ORDRMX EQU *-ORDERS DATA RDRMIX READ RANDOM INDEXED ORDSQX EQU *-ORDERS DATA RDSQIX READ SEQUENTIAL INDEXED OWRRMX EQU *-ORDERS DATA WRRMIX WRITE RANDOM INDEXED OWRSQX EQU *-ORDERS DATA DMTERR WRITE SEQUENTIAL INDEXED (NOT ALLOWED) OREWRX EQU *-ORDERS DATA REWRIX REWRITE INDEXED (DIRECT,CURRENT) ODELTX EQU *-ORDERS DATA DELTIX DELETE INDEXED (DIRECT,CURRENT) OSTRTX EQU *-ORDERS DATA STRTIX START INDEXED (EQUAL,GREATER,NOT LESS) XIF EJECT * * ORDER INDEX TABLE * BYTE FORM 8,8 ORDTAB EQU * BYTE OCLOSE,ORDFLP CLOSE,READ FILE PARAMETERS BYTE OWRSQ0,OWRRM0 WRITE SEQUENTIAL,WRITE RANDOM BYTE OREWR0,OREWR0 REWRITE NOT INDEXED BYTE ODELT0,ODELT0 DELETE NOT INDEXED BYTE ORDSQ0,ORDRM0 READ SEQUENTIAL,READ RANDOM BYTE OSTRTD,OSTRTD START DIRECT BYTE OSTRTD,OCLOSE START DIRECT,CLOSE ORDTEX EQU *-ORDTAB IFT INDXAC=0 BYTE OEXTND,0 EXTEND XIF IFT INDXAC=1 BYTE OEXTND,OWRSQX EXTEND,WRITE SEQUENTIAL INDEXED BYTE OWRRMX,OREWRX WRITE RANDOM INDEXED,REWRITE INDEXED BYTE OREWRX,ODELTX REWRITE INDEXED,DELETE INDEXED BYTE ODELTX,ORDSQX DELETE INDEXED,READ SEQUENTIAL INDEXED BYTE ORDRMX,OSTRTX READ RANDOM INDEXED,START INDEXED BYTE OSTRTX,OSTRTX START INDEXED XIF ORDEXT EQU ORDTEX+ORDTEX-17 TIOSDM ORDER FOR EXTEND EJECT ************** * SDMTSK * ************** * SDMTSK EQU * * * SET UP A14 STACK * LD A14,PRUN ADKL A14,DMTTSB STACK BASE LDR A11,A1 FDB ADDR LDR A8,A11 ADKL A8,FDBECB FDB ECB ADDRESS LD A9,DWTECB,A11 USER ECB ADDRESS LDK A7,OROPEN LD A5,DWTOR,A11 ORDER CODE FROM TIOSDM ANK A5,/7F SUKL A5,SDMLIM LIMIT BETWEEN OPEN AND CLOSE RF(N) DMT100 OPEN ORDER LDK A7,2 MASK BIT TM A7,A5 RF(Z) DMT010 ORDER CODE EVEN ADK A5,50 CORRECT ORDER INDEX DMT010 EQU * SRL A5,2 INDEX IN ORDER TABLE LC A7,ORDTAB,A5 NEW ORDER INDEX SC A7,DWTOR+1,A11 SAVE NEW INTERN ORDER INDEX LD A5,FDBRRO,A11 EJECT * * READ RANDOM INDEXED,START INDEXED * DELETE DIRECT INDEXED,REWRITE DIRECT INDEXED * OPEN AND READ FILE PARAMETERS DON'T NEED ANY * BLOCK BUFFER YET RF(N) DMT090 NO BLOCK BUFFER YET DMT015 EQU * =8 LD A4,FDBADF,A11 DATA FILE CM FDBKA,A4 MARK 1ST PASS DELETE INDEXED DMT020 EQU * * * LOOP ENTRY FOR * READ RANDOM INDEXED,READ SEQUENTIAL INDEXED * DELETE INDEXED,START AND READ SEQUENTIAL * CF A14,FNDBLB FIND BLOCK BUFFER IFT CRDEEX=0 ABL(N) DMTERR I/O ERROR ABL(P) SDMERX EOF WHEN READ SEQUENTIAL EXTEND EQU * =A XIF IFT CRDEEX=1 RF(Z) DMT090 I/O OK ABL(P) SDMERX EOF WHEN READ SEQUENTIAL EJECT * * TEST IF EXTEND SHOULD BE DONE * LD A7,DWTOR,A11 ANK A7,/3F ORDER INDEX CWK A7,OEXTND RF(E) DMT030 ORDER EXTEND SUK A7,OWRSQ0 RF(NZ) DMTER NOT WRITE SEQUENTIAL DMT030 EQU * LDR A2,A1 SLL A2,2 RF(NN) DMTER NOT END OF FILE LD A2,FDBENL,A11 ENLARGE FACTOR RF(Z) DMTER NO ENLARGE FACTOR DECLARED ADK A7,0 RF(NZ) DMT090 ORDER EXTEND LDKL A1,SDMOEX TIOSDM ORDER FOR EXTEND SC A1,DWTOR+1,A11 CF A14,SDMRLB RELEASE BLOCK BUFFER LDKL A8,SDMTSK DISPATCH ENTRY LDR A6,A11 FDB ADDRESS ABL DMXACD EXIT AND ACTIVATE #D DMTER EQU * ABL DMTERR ERROR EJECT XIF DMT090 EQU * LD A7,DWTOR,A11 LDR A2,A7 OPTION AND ORDER CODE ANK A7,/3F A7=INTERNAL ORDER CODE DMT100 EQU * LDKL A12,OPEFPB FPB ADDRESS FOR OPEN CLOSE READ FILE PARAM. * (A4= BLOCK BUFFER ADDRESS ) * (A5 = BLOCK BUFFER DATA ADDRESS ) * A11= FDB ADDRESS ALL ORDERS * A7 = ORDER CODE ALL ORDERS * (A8 = FDBECB ADDRESS ) * (A9 = USER ECB ADDRESS ) ABI ORDERS,A7 SDMTSK FUNCTION EJECT *********************************************** * * * R E A D S E Q U E N T I A L * * R E A D R A N D O M * * S T A R T D I R E C T * * * *********************************************** RDSQ00 EQU * SEQUENTIAL READ RDRM00 EQU * RANDOM READ STRTDI EQU * START DIRECT * * CHECK STATUS * CF A14,CHKSTS CHECK STATUS RF(NZ) DMT200 STATUS=USED * * RECORD STATUS=NOT USED * SUK A7,ORDRM0 ABL(Z) DMERND READ RANDOM,NO DATA SUK A7,OSTRTD-ORDRM0 RF(NZ) DMT250 READ SEQUENTIAL * * START DIRECT * LC A3,DWTOPT,A11 ANK A3,7 OPTION RF(NZ) DMT250 OPTION DEFINED RF DMT230 NO OPTION EJECT * * RECORD STATUS=USED * DMT200 EQU * SUK A7,OSTRTD RF(Z) DMT230 START DIRECT LD A3,ECBRL,A9 REQ LGTH LD A2,FDBRLE,A11 RECORD LENGTH CWR A3,A2 RF(NG) DMT220 LDR A3,A2 MAX LENGTH DMT220 EQU * ST A3,ECBEL,A9 SET EFFECTIVE LENGTH * * MOVE THE RECORD * LD A1,FDBRRO,A11 ADR A1,A5 SOURCE ADDRESS LD A2,ECBBA,A9 DESTINATION ADDRESS IFT MMUPAG=0 CF A14,MOVFW MOVE RECORD TO USER XIF IFT MMUPAG=1 LD A4,DWTTAB,A11 TTAB ADDRESS LD A7,TTB:PW,A4 PSW FOR THIS TASK =4 ANK A7,1 SYSTEM,USER MODE BIT =4 RF(NZ) DMT225 USER MODE =4 CF A14,MOVFW MOVE RECORD =4 RF DMT230 =4 DMT225 EQU * =4 CF A14,MOV:SU MOVE RECORD TO USER XIF * * UPDATE CRN AND SET EXCLUSIVE ACCESS BIT * DMT230 EQU * ABL DMT400 PUT CRN AND EA EJECT * * STATUS BYTE = NOT USED AND ORDER IS SEQ. READ OR * START DIRECT WITH OPTION * DMT250 EQU * NO DATA AT SEQ READ * * GET NEXT RECORD * ADK A2,1 RF(P) DMT260 NOT OVERFLOW OR NEGATIVE LDK A2,0 ADK A1,1 DMT260 EQU * ST A1,ECBCW,A9 ST A2,ECBCW+2,A9 * * ENTRY ALSO FOR READ RANDOM INDEXED AND START INDEXED * DMT280 EQU * * * CHECK EA * LD A1,ECBCW,A9 LD A2,ECBCW+2,A9 REC NR CF A14,EATEST ABL(N) DMEAER PROTECT ERROR IFT INDXAC=1 LD A4,DWTOR,A11 ORDER ANK A4,/3F CWK A4,OSTRTX RB(E) DMT230 START INDEXED XIF EJECT CF A14,CALSNO PREP IO ABL(NZ) DMTERR OUT OF MEDIUM LC A3,FDBDBR,A11 DELAY ANK A3,/10 RF(NZ) DMT290 KEEP BUFFER * * RELEASE BLOCK BUFFER * CF A14,SDMRLB RELEASE BLOCK BUFFER * * TAKE NEXT RECORD * DMT290 EQU * RB DMT020 NEXT RECORD IFT CRDEEX=1 EJECT ***************************** * E X T E N D F I L E * ***************************** EXTEND EQU * LD A4,ECBBA,A8 BLOCK BUFFER ADDRESS LDKL A3,OPEFPB BUFFER FOR FILE PARAMETER BLOCK ST A3,ECBBA,A8 BUFFER ADDRESS IN ECB LDK A2,FMFPBL FILE PARAMETER BLOCK LENGTH ST A2,ECBRL,A8 CF A14,FMIORF READ FILE PARAMETERS LD A1,FDBENL,A11 ENLARGE FACTOR ST A1,FPB:EL,A3 FILL IN ENLARGE CF A14,FMIOEX EXTEND FILE ST A4,ECBBA,A8 SET BLOCK BUFFER ADDRESS RB(NZ) DMTER ERROR CF A14,FRMFIL FORMAT FILE RB(NZ) DMTER ERROR WHEN FORMATTING LDK A7,OWRSQ0 WRITE SEQUENTIAL ORDER SC A7,DWTOR+1,A11 ABL DMT020 TRY WRITE SEQUENTIAL AGAIN XIF EJECT *********************************************** * * * D E L E T E I N D E X E D * * R E W R I T E I N D E X E D * * * *********************************************** DELTIX EQU * DELETE INDEXED REWRIX EQU * REWRITE INDEXED IFT INDXAC=1 ANKL A2,/100 RF(Z) DELT00 NOT DIRECT CF A14,FNDKYP SET PARAM AND THEN FNDKEY ABL(NZ) DMIER2 KEY NOT FOUND LD A9,DWTECB,A11 ECB ADDRESS CF A14,RECECB MOVE RECORD NUMBER TO ECB CF A14,SDMRBU REALEASE BLOCK BUFFER =B LD A1,DWTOR,A11 INTERN ORDER INDEX =6 LD A11,FDBADF,A11 FDB ADDRESS DATA FILE =6 ANKL A1,/FEFF INDICATE CURRENT INSTEAD OF DIRECT =6 ST A1,DWTOR,A11 SAVE IN FDB DATA FILE =6 LD A1,ECBCW,A9 LD A2,ECBCW+2,A9 CF A14,EATEST ABL(N) DMEAER EA OTHER TASK CF A14,CALSNO GET SECTOR NUMBER AND OFFSET IN SECTOR ABL(NZ) SDMERX ERROR LDR A8,A11 =6 ADKL A8,FDBECB SDM ECB ADDRESS =6 ABL DMT015 GET BLOCK BUFFER =6 =8 XIF EJECT *********************************************** * * * W R I T E S E Q U E N T I A L * * W R I T E R A N D O M * * R E W R I T E N O T I N D E X E D * * D E L E T E N O T I N D E X E D * * W R I T E R A N D O M I N D E X E D * * * *********************************************** WRSQ00 EQU * WRITE SEQUENTIAL WRRM00 EQU * WRITE RANDOM WRRMIX EQU * WRITE RANDOM INDEXED REWR00 EQU * REWRITE NOT INDEXED DELT00 EQU * DELETE NOT INDEXED * * TEST IF OPENED OUTPUT SEQUENTIAL * CF A14,CHKSTS A10=POINTER TO RECORD STATUS LC A1,FDBOMD,A11 ANK A1,/FF CWK A1,SDMOOS RF(E) DMS110 OUTPUT SEQ.,DON'T CHECK STATUS * * CHECK STATUS * CF A14,CHKSTS CHECK RECORD STATUS RF(Z) DMS110 RECORD STATUS=NOT USED EJECT * * RECORD STATUS=USED * IFT INDXAC=1 LDR A4,A7 SUK A4,OWRRMX RF(Z) DMS100 WRITE RANDOM INDEXED XIF LDR A4,A7 SUK A4,OWRRM0 RF(Z) DMS100 WRITE RANDOM SUK A4,OWRSQ0-OWRRM0 RF(NZ) DMS120 NOT WRITE SEQUENTIAL DMS100 EQU * RF DMERPR PROTECTED EJECT * * RECORD STATUS=NOT USED * DMS110 EQU * IFT INDXAC=1 LDR A4,A7 SUK A4,OREWRX RF(Z) DMERND REWRITE INDEXED SUK A4,ODELTX-OREWRX RF(Z) DMERND DELETE INDEXED XIF LDR A4,A7 SUK A4,OREWR0 RF(Z) DMERND REWRITE NOT INDEXED SUK A4,ODELT0-OREWR0 RF(Z) DMERND DELETE NOT INDEXED DMS120 EQU * CF A14,EATEST RF(N) DMEAER EA OTHER TASK EJECT LDK A3,0 STATUS FREE IFT INDXAC=1 LDR A2,A7 SUK A2,OWRRMX RF(E) CHK010 WRITE RANDOM INDEXED SUK A2,OREWRX-OWRRMX RF(E) CHK010 REWRITE INDEXED LD A1,FDBKA,A11 RF(NZ) DMT350 DELETE INDEXED (SECOND PASS) SUK A2,ODELTX-OREWRX RF(E) CHK010 DELETE INDEXED XIF LDR A2,A7 SUK A2,ODELT0 RF(E) DMT350 DELETE NOT INDEXED IFT INDXAC=0 RF DMT320 XIF IFT INDXAC=1 RF DMT310 EJECT CHK010 EQU * * REWRITE INDEXED,WRITE RANDOM INDEXED AND DELETE INDEXED ENTERS HERE * * COMPARE KEYS IN FILE AND USER BUFFER * LDK A4,8 MAX 4 INDEX CHK040 EQU * SUK A4,2 RF(N) CHK100 ALL INDEX CHECKED LDR A2,A11 FDB ADD ADR A2,A4 LD A6,FDBAI1,A2 FDB ADDR INDEX FILE RB(Z) CHK040 NO INDEX LD A2,DWTOR,A11 ANK A2,/3F ORDER INDEX SUK A2,OWRRMX RB(Z) CHK040 NO CHECK ON INSERT SUK A2,OREWRX-OWRRMX RF(Z) CHK050 CHECK REWRITE LC A2,DWTOPT,A11 OPTION ANK A2,/4 RB(NZ) CHK040 NO CHECK ON DEL CURRENT EJECT * =3 * A6=FDB ADDRESS INDEX FILE =3 * =3 CHK050 EQU * LD A9,DWTECB,A11 GET USER ECB =9 IFT MMUPAG=1 LD A1,FDBKA,A6 GET KEY START ADDRESS =3 AD A1,ECBBA,A9 LDKL A2,FDBKEY GET KEY SAVE AREA DISPLACEMENT ADR A2,A6 GET KEY AREA POINTER =3 LD A3,FDBRLE,A6 RECORD LENGTH =3 SUK A3,6 KEY LENGTH LDR A9,A4 SAVE A4 =1 LD A4,DWTTAB,A11 GET TTAB ADDRESS CF A14,MOV:US MOVE KEY TO FDB KEY AREA LDR A4,A9 RESTORE A4 =1 LD A9,FDBKA,A6 GET KEY START DISPLACEMENT =3 XIF IFT INDXAC=1 IFT MMUPAG=0 LD A2,ECBBA,A9 USER BUFFER ADDRESS LD A9,FDBKA,A11 KEY START ADDRESS ADR A2,A9 XIF IFT INDXAC=1 EJECT LDR A1,A2 ENTRY KEY ADDRESS AD A9,FDBRRO,A11 ADR A9,A5 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 RF DMERPR PROTECTED * =3 * END OF CHECK KEY LOOP =3 * =3 CHK100 EQU * LD A7,DWTOR,A11 ANK A7,/3F ORDER INDEX XIF EJECT * * MOVE RECORD * DMT310 EQU * IFT INDXAC=1 SUK A7,ODELTX RF(NZ) DMT320 NOT DELETE INDEXED * * MOVE KEYS TO FDB KEY AREAS * LDK A4,8 IXINS3 EQU * LDR A3,A11 FDB DATA ADR A3,A4 LD A2,FDBADF,A3 FDB INDEX RF(Z) IXINS4 NO INDEX LD A1,FDBKA,A2 KEY ADDR AD A1,FDBRRO,A11 REC OFFS ADR A1,A5 BUFFERADDR GIVES KEY ADDR LD A3,FDBRLE,A2 RECORD LENGTH SUK A3,6 KEY LGTH ADKL A2,FDBKEY TO ADDR CF A14,MOVFW KEY TO FDB AREA IXINS4 EQU * SUK A4,2 RB(NZ) IXINS3 MORE INDEXS ABL DMXDEL DELETE INDEXED XIF EJECT ******************** * * * E R R O R * * * ******************** DMERPR EQU * LDKL A1,PROT PROTECTED RF DMERR DMERND LDKL A1,NODERR NO DATA RF DMERR DMEAER EQU * RELEASE EA FOR ALL FILES LC A3,FDBTNR,A11 USER TASK ID ANK A3,/FF CF A14,RELPRO RELEASE PROTECT LDKL A1,PROERR PROTECT ERR DMERR EQU * RF DMTERR EJECT * * MOVE RECORD FROM USER TO SYSTEM AREA * DMT320 EQU * LD A9,DWTECB,A11 USER ECB ADDRESS LD A3,FDBRLE,A11 RECORD LENGTH LD A2,FDBRRO,A11 ADR A2,A5 TO ADDRESS LD A1,ECBBA,A9 FROM ADDRESS IFT MMUPAG=0 CF A14,MOVFW XIF IFT MMUPAG=1 LD A4,DWTTAB,A11 GET TTAB ADDRESS CF A14,MOV:US MOVE RECORD FROM USER TO SYSTEM AREA XIF EJECT * * * SET STATUS USED * LDK A3,/FF DMT350 SCR A3,A10 LD A3,FDBDBR,A11 RF(NN) DMT390 NO DELAY * * DELAY * LDKL A2,/1000 ORS A2,FDBDBR,A11 KEEP BUFFER RF DMT400 * * WRITE BLOCK TO DISC * DMT390 EQU * CF A14,FMIOWR RF(NZ) DMTERR EJECT * * SET CURRENCY AND EXCLUSIVE ACCESS * DMT400 EQU * CF A14,CRNGET GET CURRENCY BUFFER LDR A10,A2 BUFFER ADDR LD A1,ECBCW,A9 LD A2,ECBCW+2,A9 LOG REC NR LD A7,DWTOR,A11 ANK A7,/3F ORDER INDEX LDR A4,A7 SUK A4,OWRRM0 RF(Z) DMT450 WRITE RANDOM SUK A4,OWRSQ0-OWRRM0 RF(Z) DMT440 WRITE SEQUENTIAL SUK A4,OREWR0-OWRSQ0 RF(Z) DMT450 REWRITE NOT INDEXED IFT INDXAC=1 SUK A4,OREWRX-OREWR0 RF(Z) DMT450 REWRITE INDEXED ADK A4,OREWRX-OWRRMX RF(Z) DMT440 WRITE RANDOM INDEXED SUK A4,OSTRTX-OWRRMX RF(Z) DMT410 START INDEXED XIF LDR A4,A7 ORDER INDEX SUK A4,OSTRTD RF(NZ) DMT430 NOT START DIRECT EJECT * * START A1,A2=LOGICAL RECORD NUMBER * * LRN=LRN-1 * DMT410 EQU * LDR A3,A1 LDR A4,A2 SUK A4,1 RF(NN) DMT420 ANKL A4,/7FFF SUK A3,1 * * SET NEW CURRENT RECORD NUMBER * DMT420 EQU * ST A3,CRNCDF,A10 NEW CURRENCY ST A4,CRNCDF+2,A10 RF DMT450 * * SET CURRENT RECORD NUMBER * DMT430 EQU * ST A1,CRNCDF,A10 ST A2,CRNCDF+2,A10 CRN DATA FILE RF DMT450 * * UPDATE LRN * DMT440 EQU * SC A1,FDBLRN,A11 ST A2,FDBLRN+1,A11 EJECT DMT450 EQU * * * CHECK PROTECT * LC A4,FDBOMD,A11 OPEN MODE ANK A4,/FF CWK A4,SDMOIP RF(E) DMT460 OPEN INPUT PROTECTED CWK A4,SDMIOP RF(NE) DMT470 NOT OPEN INPUT OUTPUT PROTECTED * * CHECK IF EA IS SET ALREADY * DMT460 EQU * CF A14,EATEST CHECK EA RF(NZ) DMT470 EA ALREADY SET * * SET EA * CF A14,EASETB DMT470 EQU * LDK A1,0 SET RETURN CODE IFT INDXAC=1 LDK A4,OWRRMX CWR A7,A4 ABL(E) DMINS2 WRITE RANDOM INDEXED XIF EJECT *************************************** * * * E X I T D M T A S K * * * *************************************** * DMTERR EQU * LC A4,FDBDBR,A11 ANK A4,/10 RF(NZ) SDMERX KEEP BUFFER CF A14,SDMRLB RELEASE BLOCK BUFFER SDMERX EQU * LD A6,FDBADF,A11 GET FDB DATA FILE INH * * A1 = RET CODE * A6 = DWT ADDR * CF A15,TENDIO ENB LKM DATA 3 IFT INDXAC=1 EJECT ************************************************ * * * R E A D R A N D O M I N D E X E D * * S T A R T I N D E X E D * * * ************************************************ RDRMIX EQU * READ RANDOM INDEXED STRTIX EQU * START INDEXED CF A14,FNDKYP SET PARAM AND THEN FNDKEY * * ENTRY ALSO FOR READ SEQUENTIAL INDEXED * DMR100 EQU * FROM READ SEQUENTIAL INDEXED LD A9,DWTECB,A11 LD A2,DWTOR,A11 ANK A2,/3F ORDER SUK A2,OSTRTX RF(NZ) DMR110 NOT START LC A2,DWTOPT,A11 ANK A2,7 OPTION RF(Z) DMR110 EQUAL ANKL A1,/FBFF IGNORE NOKEY DMR110 EQU * SUK A1,1 RF(Z) DMIER4 NOT OPERABLE ADK A1,1 RF(NZ) DMIER1 KEY NOT FOUND CF A14,RECECB MOVE RECORD NUMBER TO ECB EJECT * * SET CRN * LDR A13,A11 SAVE FDB INDEX FILE LD A11,FDBADF,A11 FDB DATA FILE LD A5,DWTOR,A13 GET INTERN ORDER INDEX =5 ANK A5,/3F ORDER INDEX LDR A12,A11 FDB DATA FILE CF A14,CRNGET GET CRN BUFFER ADDR LDR A10,A2 CRN BUFFER ADDR LDR A11,A13 FDB INDEX FILE CF A14,GTLGRN GET INDE X LOG REC NO LDK A7,ORDRM0 RANDOM READ SUK A5,OSTRTX RF(NE) DMR120 INDEXED READ LDK A7,OSTRTX START INDEXED SUK A2,1 RF(NN) DMR120 NOT UNDERFLOW ANKL A2,/7FFF SUK A1,1 DMR120 EQU * SC A1,CRNCIF+1,A10 ST A2,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,A11 FILE NR SC A2,CRNCIF,A10 LDR A11,A12 FDB DATA FILE SC A7,DWTOR+1,A11 NEW ORDER LDKL A2,/CFFF ANS A2,FDBDBR,A11 RELEASE INDEX BUFFERS ABL DMT280 EJECT ***************************************************** * * * R E A D S E Q U E N T I A L I N D E X E D * * * ***************************************************** RDSQIX EQU * READ SEQUENTIAL INDEXED LD A1,FDBRRO,A11 RECORD OFFSET LDR A4,A5 BUFFER ADDRESS SUKL A4,BUFSTA DMI100 EQU * CF A14,CHKRCD CHECK RECORD STATUS RF(E) DMI130 USED LD A3,FDBMRO,A11 ST A3,FDBRRO,A11 LAST RECORD IN BLOCK EJECT * * CHECK IF END OF FILE * CF A14,GTLGRN GET REC NR CC A1,FDBLRN,A11 RF(L) DMI120 NOT EOF RF(G) DMIER6 EOF CW A2,FDBLRN+1,A11 RF(NL) DMIER6 END OF FILE DMI120 EQU * CF A14,RDNXTR GET NEXT INDEX RECORD RB(NZ) DMI100 RECORD FOUND RF DMIER2 ERROR EJECT DMI130 EQU * * * INDEX RECORD IS FOUND * LD A9,DWTECB,A11 USER ECB * * KEY RECORD FOUND * CHECK IF NEXT RECORD HAS THE SAME KEY * LD A1,FDBRRO,A11 RECORD OFFSET ADKL A1,BUFSTA ADR A1,A4 REC ADDR LD A3,FDBRLE,A11 REC LENGTH SUK A3,6 KEY LENGTH ADR A1,A3 CC A3,2,A1 DUPLICATE KEY CHARACTER RF(NE) DMI140 NEXT KEY NOT SAME LDKL A1,NXTKYS BIT 6 ORS A1,ECBRC,A9 NEXT KEY SAME DMI140 EQU * LDK A1,0 MARK FOUND ABL DMR100 CONT AS FOR INDEXED RAND READ EJECT ******************** * * * E R R O R * * * ******************** DMIER1 LDKL A1,KEYERR KEY NOT FOUND RF DMIERR DMIER2 EQU * LDKL A1,NODERR NO IDENT DMIERR EQU * LDR A4,A4 BUFFER ADDR ABL(Z) SDMERX NO BUFFER ABL DMTERR ERROR AND BUFFER DMIER3 EQU * ANK A1,/27 RB(NZ) DMIERR BIT 10,13,14,15 LDKL A1,EOMERR GRAVE ERR ALSO RB DMIERR DMIER4 EQU * LDK A1,1 NOT OPERABLE RB DMIERR DMIER5 EQU * LDKL A1,PROT PROTECTED RB DMIERR DMIER6 EQU * LDKL A1,EOFERR RB DMIERR EJECT ***************************************************** * * * W R I T E R A N D O M I N D E X E D (P2) * * D E L E T E I N D E X E D * * * ***************************************************** DMINS2 EQU * WRITE RANDOM INDEXED PART 2 DMXDEL EQU * DELETE INDEXED LC A4,FDBDBR,A11 ANK A4,/10 RF(NZ) DXI010 KEEP BUFFER CF A14,SDMRLB RELEASE BLOCK BUFFER DXI010 EQU * LDK A5,10 LOOPER DXI020 EQU * NEXT INDEX LD A7,DWTOR,A11 ORDER ANK A7,/3F SUK A5,2 RF(Z) DXI100 ALL INDEXES LDR A1,A11 FDB DATA ADR A1,A5 LD A1,FDBADF,A1 FDB INDEX RB(Z) DXI020 NO INDEX LD A2,DWTOR,A11 ORDER ST A2,DWTOR,A1 LD A2,DWTECB,A11 USER ECB ADDR ST A2,DWTECB,A1 ST A5,FDBKA,A11 SAVE COUNTER LDR A11,A1 FDB ADDRESS INDEX FILE SUK A7,OWRRMX RF(E) DMINIX WRITE RANDOM INDEXED RF DMDELX DELETE INDEXED EJECT * * RETURN FROM UPDATING OF ONE INDEX * DMTAR5 EQU * LD A11,FDBADF,A11 FDB ADDRESS DATA FILE LD A5,FDBKA,A11 GET COUNTER OF INDEXES RB DXI020 TAKE NEXT INDEX * * END IF WRITE RANDOM INDEXED ELSE CONTINUE * DXI100 EQU * INDEXES READY LDK A1,0 RET CODE SUK A7,OWRRMX WRITE RANDOM INDEXED ABL(E) SDMERX READY ABL DMT020 RESTART SDMTSK EJECT ***************************************************** * * * W R I T E R A N D O M I N D E X E D * * D E L E T E I N D E X R E C O R D * * * ***************************************************** DMINIX EQU * WRITE RANDOM INDEXED IFT MMUPAG=0 * * GET KEY IN USER BUFFER * LD A9,FDBADF,A11 FDB ADDRESS DATA FILE LD A9,DWTECB,A9 USER ECB ADDRESS LD A9,ECBBA,A9 USER BUFFER AD A9,FDBKA,A11 KEY ADDRESS RF INS010 XIF IFT INDXAC=1 DMDELX EQU * DELETE INDEX RECORD LDR A9,A11 ADKL A9,FDBKEY KEY ADDR INS010 EQU * LDR A12,A9 LD A10,FDBRLE,A11 RECORD LENGTH SUKL A10,6 KEY LENGTH LDR A8,A14 ADKL A8,2 ECB ADDR TO RECORD BUFFER AREASS CF A14,FNDKEY GET INDEX RECORD ADK A4,0 RB(Z) DMIER3 NO SECTOR FOUND LDR A6,A7 NUMBER OF SAME CHARACTERS LD A9,DWTECB,A11 USER ECB ADDRESS LD A2,DWTOR,A11 ORDER CODE ANK A2,/3F SUK A2,ODELTX ABL(E) DEL000 DELETE INDEX RECORD EJECT * * SET RC BIT 6 TO USER IF NEXT KEY * IS SAME IN REQUESTED INDEX * ADK A1,0 RF(NZ) INS180 NEXT KEY NOT SAME IFT KEYDUP=1 CW A11,FDBAI1,A11 RB(E) DMIER5 FIRST INDEX XIF IFT INDXAC=1 LDKL A1,NXTKYS NEXT KEY SAME ORS A1,ECBRC,A9 SET RETURN CODE IFT INSLAS=1 EJECT * * INSERT SAME KEY LAST * LD A1,FDBRRO,A11 RECORD OFFSET RF INS100 INS080 EQU * CF A14,RDNXTR GET NEXT REC INS090 EQU * RB(Z) DMIER3 ERROR INS100 EQU * CF A14,CHKRCD CHECK RECORD STATUS RF(E) INS150 USED LD A3,FDBMRO,A11 ST A3,FDBRRO,A11 RB INS080 GET FIRST RE C IN NXT SECT INS150 EQU * LC A6,-4,A1 DUPLICATE KEY CHARACTER CWR A6,A10 CHECK KEY LENGTH RB(E) INS080 NEXT SAME GET NEXT EJECT * * UPDATE LAST SAME RECORD * SC A10,-4,A1 NEXT SAME LD A1,FDBRRO,A11 CW A1,FDBMRO,A11 RF(NE) INS160 SECT WRITTEN LATER * * WRITE BLOCK * CF A14,FMIOWR ABL(NZ) DMTERR * * GET NEXT RECORD * INS160 EQU * CF A14,RDNXTR GET NEXT RC INS170 EQU * RB(Z) INS090 GO TO DMIER3 IF ERROR XIF IFT INDXAC=1 EJECT INS180 EQU * * * CREATE AN INDEX RECORD IN AREA 1 * LDR A1,A12 FROM ADDR LDR A2,A14 ADKL A2,SDMBF1 TO ADDRESS LDR A3,A10 KEY LENGTH CF A14,MOVFW MOVE KEY SCR A3,A2 DUMMY ADK A2,1 SCR A3,A2 DUMMY ADK A2,1 SCR A6,A2 NR OF SAME CHAR ADK A2,1 LD A1,DWTECB,A11 USER ECB ADDRESS ADKL A1,ECBCW+1 SOURCE POINTER LDK A3,3 NUMBER OF CHARACTERS TO MOVE CF A14,MOVFW LDK A1,/FF USED SCR A1,A2 STATUS CHAR CF A14,GTLGRN GET REC NR INDEX * * SAVE RECORD NR FOR FIRST MOVED INDEX * LDR A12,A1 LDR A13,A2 EJECT * * BELOW IS A NEW INDEX RECORD INSERTED AND FOLLOWING * USED RECORDS ROLLED FORWARD * A4,A10,A11 IS USED AT ENTRY ADKL A10,7 RECORD LENGTH TOTAL * * USE D REGISTERS * A11 = FDB ADDR INDEX * A9 = AREA ADDR * A10 = RECORD LENGTH INDEX * A5 = AREA INDEX 0=BUFAR1,1=BUFAR2 * A4 = BUFFER ADDRESS BLOCK * LDK A5,1 BUF ADR2 INS200 EQU * LDKL A9,SDMBF1 BUFFER 1 ADK A5,0 RF(Z) INS210 BUFAR1 LDKL A9,SDMBF2 BUFFER 2 INS210 EQU * ADR A9,A14 RECORD BUFFER ADDRESS * * SAVE LAST RECORD * LDR A1,A4 ADKL A1,BUFSTA AD A1,FDBMRO,A11 ADDR OF LAST REC IN SECT LDR A3,A10 LDR A2,A9 CF A14,MOVFW SAVE LAST RECORD EJECT * * MOVE REST OF BLOCK DOWN ONE RECORD POSITION * LDR A1,A4 ADKL A1,BUFSTA AD A1,FDBRRO,A11 FROM ADDR LDR A6,A1 LD A3,FDBMRO,A11 SU A3,FDBRRO,A11 NR OF CHAR LDR A2,A1 ADR A2,A10 TO ADDR CF A14,MOVBW MOVE * * INSERT NEW RECORD * LDKL A1,SDMBF2 ADK A5,0 RF(Z) INS250 BUFAR1 LDKL A1,SDMBF1 INS250 EQU * ADR A1,A14 FROM ADDR LDR A3,A10 NR OF CHAR LDR A2,A6 TO ADDR CF A14,MOVFW MOVE EJECT * * WRITE BUFFER * LDR A8,A14 USE STACK AS ECB :=S SUKL A8,SDMSTS 7 WORDS NEEDED :=S LC A2,FWTFNR,A11 VOL DEV CODE ANK A2,/FF STR A2,A8 LDR A2,A4 ADKL A2,BUFSTA ST A2,ECBBA,A8 SECTOR ADDR LC A2,FDBBLZ,A11 BLOCK SIZE SLL A2,8 IN BYTE ST A2,ECBRL,A8 LD A2,FDBSNR,A11 SECTOR NR ST A2,ECBCW,A8 SECTOR NR LD A3,FDBSNR+2,A11 ST A3,ECBCW+2,A8 SECT NR CF A14,FMIOWR ABL(NZ) DMTERR * * IF SPILLED RECORD IS FREE, OPERATION IS READY * LDR A2,A9 RECORD AREA ADDR ADR A2,A10 REC LGTH SUK A2,1 ADDR OF STATUS CHAR LD A3,FDBMRO,A11 ST A3,FDBRRO,A11 MAX OFFSET IN SECT CCR A1,A2 RF(Z) INS400 FREE RECORD EJECT * * GET NEXT BLOCK * LDR A9,A5 SAVE A5 =7 CF A14,RDNXTR GET RECORD (7 WORDS ON STACK) :=S LDR A5,A9 RESTORE REGISTER =7 ADK A4,0 SET CR =7 INS260 EQU * RB(Z) INS170 GO TO DMIER3 IF ERROR XRK A5,1 SWITCH KEY RECORD BUFFERS =7 RB INS200 INS400 EQU * * * UPDATE LRN IF EOF IS ENCOUNTERED * CF A14,GTLGRN CC A1,FDBLRN,A11 RF(L) INS430 NO EOF RF(G) INS410 EOF CW A2,FDBLRN+1,A11 RF(NG) INS430 NO EOF INS410 EQU * SC A1,FDBLRN,A11 LAST RECORD NUMBER ST A2,FDBLRN+1,A11 LD A9,DWTECB,A11 USER ECB ADDRESS LDKL A3,EOFRC END OF FILE ORS A3,ECBRC,A9 TO USER EJECT INS430 EQU * * * UPDATE CRN-LINK FOR MOVED INDEX RECORDS * LDK A7,1 ADD ONE TO CRN CF A14,CRNUPD ADD 1 TO RECORD NUMBERS INS440 EQU * CF A14,SDMRBU REL BUFFER ABL DMTAR5 ONE INDEX READY TAKE NEXT EJECT DEL000 EQU * DELETE INDEX RECORD CONT ADK A1,0 DEL010 EQU * ABL(NZ) DMIER3 KEY NOT FOUND * * CHECK RECORD NR DATA REC * DEL020 EQU * LD A1,FDBRRO,A11 ADR A1,A4 AD A1,FDBRLE,A11 ADK A1,7 BUFSTA-3=ADDR REC NR LCR A2,A1 CC A2,ECBCW+1,A9 REC NR RF(NE) DEL030 WRONG RECORD LC A2,1,A1 ECR A2,A2 LC A2,2,A1 REC NR CW A2,ECBCW+2,A9 RF(E) DEL200 RECORD FOUND DEL030 EQU * EJECT * * CHECK IF NEXT KEY SAME * CC A10,-1,A1 KEY LENGTH RB(NE) DEL010 NEXT KEY NOT SAME DEL040 EQU * CF A14,RDNXTR GET NEXT INDEX RECORD DEL045 EQU * RB(Z) INS260 GO TO DMIER3 IF ERROR * * CHECK IF RECORD IS USED * CF A14,CHKRCD CHECK RECORD STATUS RB(E) DEL020 USED LD A1,FDBMRO,A11 ST A1,FDBRRO,A11 LAST RECORD IN SECTOR RB DEL040 NEXT REC EJECT DEL200 EQU * RECORD FOUND * * SET RC BIT 6 IF NEXT KEY SAME * LC A7,-1,A1 NR OF SAME CHAR ANK A7,/FF ST A7,16,A14 SAVE IN RECORD BUFFER AFTER ECB CWR A10,A7 KEY LENGTH RF(NE) DEL220 NEXT KEY NOT SAME LDKL A2,NXTKYS ORS A2,ECBRC,A9 NEXT KEY SAME DEL220 EQU * * * MOVE UP RECORDS OVER DELETED * ADKL A10,7 TOTAL RECORD LENGTH LDR A2,A4 ADKL A2,BUFSTA AD A2,FDBRRO,A11 TO ADDR LDR A1,A2 ADR A1,A10 FROM ADDR LD A3,FDBMRO,A11 SU A3,FDBRRO,A11 NR OF CHAR CF A14,MOVFW MOVE * * SET LAST RECORD FREE * ADR A2,A10 SUK A2,1 SCR A3,A2 STATUS FREE EJECT * * UPDATE CRN FOR MOVED RECORDS * CF A14,GTLGRN GET REC NR LDR A12,A1 LDR A13,A2 FIRST REC NR MOVED LD A3,FDBRRO,A11 SAVE RELATIVE RECORD OFFSET LD A6,FDBMRO,A11 ST A6,FDBRRO,A11 MAX OFFSET CF A14,GTLGRN LAST REC NR MOVED ST A3,FDBRRO,A11 RESET OFFSET LDKL A7,-1 CF A14,CRNUPD UPDATE CRN BUFFERS LDK A5,1 MARK BUFFER CHANGED EJECT DEL240 EQU * LD A1,FDBRRO,A11 RF(NZ) DEL290 NOT FIRST RECORD CF A14,GTLGRN GET REC NR LDK A6,0 LDK A7,1 CF A14,DSUMOD A1,A2 = A1,A2 - 1 RF(Z) DEL600 FILE START CF A14,CALSNO GET SECTOR NR RF(NZ) DEL600 FILE START ADK A5,0 RF(Z) DEL245 BUFFER NOT CHANGED EJECT * * WRITE SECTOR * CF A14,FMIOWR ABL(NZ) DMTERR LDK A5,0 BUFFER NOT CHANGED YET DEL245 EQU * CF A14,SDMRBU RELEASE BUFFER * * GET PREVIOUS SECTOR * LDK A4,0 CF A14,RDNXTR GET SECTOR RB(Z) DEL045 GO TO DMIER3 IF ERROR DEL250 EQU * LD A1,FDBMRO,A11 RF DEL300 DEL290 EQU * SU A1,FDBRLE,A11 SUK A1,1 DEL300 EQU * ST A1,FDBRRO,A11 PREVIOS RECORD OFFSET CF A14,CHKRCD CHECK RECORD STATUS RB(NE) DEL240 FREE EJECT * * SET CURRENCY * LDR A9,A3 STATUS ADDR LDR A12,A11 FDB ADDRESS INDEX FILE LD A11,FDBADF,A11 FDB ADDRESS DATA FILE CF A14,CRNGET GET CRN BUFFER LDR A11,A12 FDB ADDRESS INDEX FILE LC A1,FWTFNR,A11 INDEX FILE NR CC A1,CRNCIF,A2 LAST REF INDEX RF(NE) DEL350 NOT THIS IND * * UPDATE CURRENCY * LDR A3,A2 CRN ADDR CF A14,GTLGRN GET REC NR SC A1,CRNCIF+1,A3 ST A2,CRNCIF+2,A3 RECORD NUMBER 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 * ADK A5,0 RF(Z) DEL900 BUFFER NOT CHANGED EJECT * * WRITE SECTOR * DEL700 EQU * CF A14,FMIOWR ABL(NZ) DMTERR DEL900 EQU * ABL INS440 XIF EJECT * * FNDBLB=FIND BLOCK BUFFER * FNDBLB EQU * LD A7,DWTOR,A11 ORDER ANK A7,/3F SUK A7,ORDSQ0 RF(NZ) FBL110 NOT READ SEQUENTIAL * LD A2,ECBCW,A9 LD A3,ECBCW+2,A9 REC NR CC A2,FDBLRN,A11 RF(L) FBL110 NO EOF RF(G) FBL100 EOF CW A3,FDBLRN+1,A11 RF(NG) FBL110 NO EOF FBL100 EQU * LDK A2,1 INDICATE ERROR LDKL A1,EOFERR EOF RF FBL170 RETURN FBL110 EQU * LDKL A2,/CFFF ANS A2,FDBDBR,A11 RELEASE BUFFER CF A14,GTBKBU GET BLOCK BUFFER RF(N) FBL120 NO DATA IN BUFFER EJECT * * DELAYED BUFFER IS WRITTEN * IF IT IS NOT THE WANTED BLOCK * LC A7,BUFOR,A4 DELAY FLAG ANK A7,/3 RF(Z) FBL150 NO DELAY CM BUFOR,A4 RESET ANK A7,1 RF(NZ) FBL130 RIGHT SECTOR LD A7,BUFSNR,A4 SECT NR ST A7,ECBCW,A8 LD A7,BUFSNR+2,A4 ST A7,ECBCW+2,A8 CF A14,FMIOWR RF(NZ) FBL160 ERROR CF A14,SDMRBU RELEASE BUFFER RB FNDBLB GET NEW BUFFER EJECT FBL120 EQU * * * READ BLOCK INTO BUFFER * CF A14,FMIORD PHYSICAL READW RF(NZ) FBL160 ERROR LD A5,ECBBA,A8 RF FBL150 FBL130 EQU * RIGHT DELAYED BUFFER IS FOUND LDKL A2,/1000 ORS A2,FDBDBR,A11 KEEP BUFFER FBL150 EQU * LDK A2,0 INDICATE OK RF FBL170 FBL160 EQU * LDKL A2,-1 INDICATE ERROR FBL170 EQU * ADKL A14,4 ADK A2,0 SET CR ABR* A14 EJECT * * CHKSTS=CHECK RECORD STATUS AND LOAD LOGICAL RECORD NUMBER * * ENTRY : A11=FWT ADDRESS * A5=BLOCK ADDRESS * A9=USER ECB ADDRESS * * EXIT : A1,A2=LOGICAL RECORD NUMBER * A10=RECORD STATUS POINTER * A4=DESTROYED * CR=0 IF RECORD NOT USED * CHKSTS EQU * LD A10,FDBRRO,A11 AD A10,FDBRLE,A11 ADR A10,A5 LD A1,ECBCW,A9 LD A2,ECBCW+2,A9 LDK A4,0 ADKL A14,4 CCR A4,A10 ABR* A14 EJECT * * FNDKYP=SET PARAMETERS AND THEN GO TO FNDKEY SUBROUTINE * IFT INDXAC=1 FNDKYP EQU * LDR A9,A11 ADKL A9,FDBKEY KEY AREA ADDRESS LD A10,FDBRLE,A11 RECORD LENGTH INDEX SUKL A10,6 KEY LENGTH ABL FNDKEY XIF END