|
|
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: 40706 (0x9f02)
Notes: pts_type(SC)
Names: »FMCDEF.SC«
└─⟦13e5fd45a⟧ Bits:30009699 Philips computer tape "600507"
└─⟦this⟧ »TOSSWORK/FMCDEF.SC«
└─⟦bc20f3abf⟧ Bits:30009670 Philips computer tape "600126"
└─⟦this⟧ »TOSSWORK/FMCDEF.SC«
IDENT FMCDEF REL 11.0 81-05-13 870105041100 * * ************************************************** * * PHILIPS TERMINAL SYSTEM PTS * * * FMCDEF = FILE MANAGEMENT SUBMODULE * * * * * ************************************************** * * * FMCDEF CONTAINS THE FOLLOWING MODULES * * - CREATE CREATE FILE * - DELETE DELETE FILE * - EXTEND EXTEND FILE * * EJECT FMCDEF * * *********** * ENTRIES * *********** * * ENTRY CREATE CREATE FILE ENTRY DELETE DELETE FILE ENTRY EXTEND EXTEND FILE ENTRY SEXTNO FILE EXTENT NUMBER ENTRY DV3RST * EJECT FMCDEF * * ************* * EXTERNALS * ************* * * EXTRN FPB:BF BLOCK FACTOR EXTRN FPB:FN FILE NAME EXTRN FPB:EL ENLARGE EXTRN FPB:S1 SIZE 1 EXTRN FPB:IF NUMBER OF INDEX FILES EXTRN FPB:MN MONITOR NUMBER EXTRN FPB:SN SOP SWITCH NUMBER EXTRN FPB:KA KEY ADDRESS IN RECORD EXTRN FPB:CD CREATION DATE EXTRN ECBFC ECB FILE CODE (FILE NUMBER) EXTRN FILCOD FILE CODE SAVE AREA EXTRN FM:RQE FM REQUEST ERROR COMMON EXIT EXTRN FMEXIT FM COMMON EXIT EXTRN FM:BUF FM COMMON READ/WRITE BUFFER EXTRN FM:IO FM COMMON IO ROUTINE EXTRN FM:ECB FM COMMON ECB * EJECT FMCDEF * * EXTRN VTC:EN EXTENT NUMBER EXTRN VOL:EL VOL.LABEL DISPL. VTOC EXTENT LENGTH EXTRN VTC:FS FILE SECTION NUMBER EXTRN VTC:EB EXTENT BASE EXTRN VOL:EB VTOC EXTENT BASE EXTRN VOL:FS FSAT LENGTH EXTRN VTC:EL FILE EXTENT LENGTH EXTRN VTC:RL RECORD LENGTH EXTRN VTC:BF BLOCK FACTOR EXTRN VTC:FO FILE ORGANISATION EXTRN VTC:CD CREATION DATE EXTRN VTC:IF NUMBER OF INDEX FILES EXTRN VTC:LR LAST RECORD NUMBER EXTRN VTC:KA KEY ADDRESS IN RECORD EXTRN VTC:ST STATUS BYTE EXTRN VTC:NE MAX EXTENT NUMBER EXTRN VTC:MN MONITOR NUMBER EXTRN VTC:FN FILE NUMBER EXTRN VOLUME POINTER IN FILCOD TO ACTUAL FILE CODE * EJECT FMCDEF * * EXTRN FNDVTC VTOC ENTRY FROM FILE NAME EXTRN DSUMOD DOUBLE SUBTRACT EXTRN ADDMOD DOUBLE ADD EXTRN FWTNAM FWT DISPLACEMENT FOR VOLUME NAME EXTRN RDVTO2 READ VTOC SECTOR EXTRN FMREAD FM READ SUBROUTINE EXTRN FM:MOV MOVE SYSTEM-SYSTEM EXTRN CMPDWD COMPARES TWO STRINGES EXTRN RETCOD RETURN CODE AREA IN FMTASK EXTRN DLCLO1 CLOSE AFTER DELETE EXTRN DLCLO2 CLOSE WITHOUT DELETE EXTRN FWTPAR FWT PARAMETER DISPLACEMENT EXTRN FWTEW1 EWT POINTER IN FWT EXTRN EWTVOL FILE CODE DISPLACEMENT IN EWT EXTRN EWTSEX FSN,FEN DISPLACEMENT IN EWT EXTRN FCHEC2 GET FWT ADDRESS FROM FILE NUMBER EXTRN OPEN OPEN ENTRY IN FM TASK EXTRN FM:MV4 MOVE FOUR CHARACTERS EXTRN FM:MV8 MOVE EIGHT CHARACTERS EXTRN VTOCRL VTOC RECORD LENGTH EXTRN VTOCBF VTOC BLOCKING FACTOR EXTRN OPEXT OPEN EXTENDED FILE EXTRN FM:INE ILLEGAL NAME IN FM EXTRN CMPSTR COMPARE STRINGS EXTRN FEXTNO FILE EXTENT NUMBER EXTRN FNDVT2 FIND VTOC ENTRY * EJECT FMCDEF * * ****************************************** * * CONDITIONAL ASSEMBLY * ****************************************** * * * A FULL INTRUCTION SET MAY BE INCLUDED * BY SETTING CPU852 EQU 0 * * CPU852 EQU 1 * * * THE EXTEND FILE FUNCTION IS * OBTAINED BY SETTING XTEND EQU 1. * XTEND EQU 1 X:A EQU XTEND * EJECT FMCDEF * * ************* * CONSTANTS * ************* * * SPACES EQU /2020 ASCII SPACE MAXEXT EQU 63 MAX NUMBERS OF EXTENTS/FILE SECTION FSATRL EQU 8 SIZE OF EACH ENTRY IN FSAT * * **************** * RETURN CODES * **************** * * RC:NVL EQU /20 NEW VOLUME LOADED RC:DAB EQU /4000 DELETE ABORTED RC:OFL EQU /10 OVER FLOW RC:SEO EQU /200+RC:OFL SECTION /EXTENT OVER FLOW * EJECT FMCDEF * * ************* * WORK AREA * ************* * * SEXTNO DATA 0 FILE SECTION AND EXTENT NUMBER SAVEA9 DATA 0 SAVE AREA FOR USER ECB ADDRESS * * * A9 IS USED AS BASE REGISTER FOR WRKARE * * WRKARE EQU * DATA 0,0,0,0,0 VTOC RECORD DATA 0,0,0,0,0 DATA 0,0,0,0,0 DATA 0,0,0,0,0 DATA /00FF NO OF EXTENTS,VTOC OCCUPIED * EJECT FMCDEF * * FILLEN EQU *-WRKARE FILE SECTION LENGTH TO BE CREATED DATA 0,0 VTCSEC EQU *-WRKARE VTOC BASE SECTOR DATA 0 FSATLE EQU *-WRKARE FSAT LENGTH IN BYTES DATA 0 VTCEND EQU *-WRKARE VTOC LAST SECTOR DATA 0 FSATBA EQU *-WRKARE FSAT BASE SECTOR DATA 0 EXTLEN EQU *-WRKARE REMAINING EXT LENGTH DATA 0,0 FWTSAV EQU *-WRKARE FWT ADDRESS SAVE AREA DATA 0 EXTZER EQU *-WRKARE 1ST VTOC ENTRY SECTOR DATA 0 WRKALE EQU *-WRKARE LENGTH OF WORK AREA * EJECT FMCDEF * * ****************************************** * * * CREATE ENTRY * * * ****************************************** * * PARAMETERS FROM FMTASK: * * A1 = 0 * A5 = TTAB ADDRESS OF CALLING TASK * A8 = FM ECB ADDRESS * A9 = USER ECB ADDRESS * A10 = FILE PARAMETER BLOCK ADDRESS * * CREATE EQU * CF A14,CENTRY CLEAR WORK AREA AND SAVE PARAMETERS LDK A5,3 VOLUME COUNTER CRE:02 EQU * LC A1,FILCOD,A5 FILE CODE ANK A1,/FF RF(Z) CRE:04 NO VOLUME SPECYFIED LDR A2,A5 FILE SECTION NUMBER CF A14,GETFIL REQUESTED LENGTH RF(NZ) CRE:06 LENGTH SPECYFIED CRE:04 EQU * SUK A5,1 RB(NN) CRE:02 NEXT VOLUME ABL CDERQE REQUEST ERROR NO LENGTH SPECYFIED * EJECT FMCDEF * * * PREPARE VTOC RECORD * * CRE:06 EQU * IFT CPU852=1 LDR A1,A10 GET FPB ADDRESS ADKL A1,FPB:FN FILE NAME DISPLACEMENT LDR A3,A9 VTOC ADDRESS CF A14,FM:MV8 FILE NAME XIF * IFT CPU852=0 ML 4,FPB:FN,A10 FILE NAME MS 4,VTC:FN,A9 XIF * LDR* A1,A10 GET RECORD LENGTH ST A1,VTC:RL,A9 LD A1,FPB:BF,A10 BLOCKING FACTOR, FILE ORG ST A1,VTC:BF,A9 * EJECT FMCDEF * * LDR A1,A10 ADKL A1,FPB:CD CRD LDR A3,A9 ADKL A3,VTC:CD LDK A2,9 CF A14,FM:MOV CRD,RET PERIOD LDK A7,6 NUMBER OF CHARACTERTS SUK A3,3 ADDRESS TO CHAR CRE:10 EQU * SUK A3,2 NEXT CHARACTERS LDR* A1,A3 RF(Z) CRE:20 BINARY ZERO CWK A1,/3030 NUMERICAL ZERO RF(NE) CRE:30 CRE:20 EQU * SUK A7,2 COUNTER RB(NZ) CRE:10 LDR A8,A3 ADDRESS TO CRD LKM DATA 11 LDKL A8,FM:ECB ECB ADDRESS CRE:30 EQU * LC A2,FPB:IF,A10 NUMBER OF INDEX FILES LD A1,FPB:KA,A10 KEY ADDRESS SC A2,VTC:IF,A9 ST A1,VTC:KA,A9 CF A14,CHKFIL CHECK FROM FIRST FILE CODE (A5=0) RF(NZ) CDEINE FILE ALREADY IN ONE OF VOLUMES LDR A6,A10 FPB ADDRESS ADKL A6,FPB:FN SUKL A6,FWTNAM ST A6,FWTSAV,A9 INTO SAVE AREA * EJECT FMCDEF * * * CREATE FILE SECTIONS * * CRE:40 EQU * CF A14,CREFIL CREATE FILE SECTION RF(NZ) CREDEL ERROR CWK A2,3 RB(NG) CRE:40 NEXT SECTION LD A5,VOLUME FILE SECTION OF FIRST SPECYFIED VOLUME LCR A7,A5 FILE CODE ANK A7,/FF LDKL A3,OPEN RF EXIT10 OPEN CREATED FILE * EJECT FMCDEF * * * DELETE CREATED PARTS OF FILE IN CASE OF ERROR * INPUT A4 = RETURN CODE * * CREDEL EQU * SUK A4,RC:NVL RF(Z) CRED80 NEW VOLUME LOADED CM VTC:FS,A9 FIRST VOLUME CF A14,DELFIL DELETE CREATED FILE CRED80 EQU * RF CDEXIT END REQUEST * EJECT FMCDEF * * ****************************************** * * * DELETE ENTRY * * * ****************************************** * * PARAMETERS FROM FMTASK SEE CREATE ENTRY * * DELETE EQU * CF A14,EDENTR CLEAR WORK AREA AND SAVE PARAM. RF(NZ) DEL:90 ERROR END REQUEST LC A1,FWTPAR,A6 LDR A2,A1 ANK A2,/3F NUMBER OF USERS SUK A2,1 RF(Z) DEL:00 ONE USER LDKL A4,RC:DAB RC:DELETE ABORTED LDKL A3,DLCLO2 CLOSE FILE FOR THIS USER RF EXIT10 * EJECT FMCDEF * * * COLLECT FILE CODES AND DELETE FILE SECTIONS * * DEL:00 EQU * CM FILCOD CLEAR FILE CODE AREA CM FILCOD+2 ADKL A6,FWTEW1 DEL:10 EQU * LDR* A6,A6 LDKL A1,-4 LC A2,EWTVOL,A6 GET FILE CODE DEL:20 EQU * ADK A1,1 RF(P) DEL:40 NEXT EWT LC A3,FILCOD+3,A1 COLLECTED FILE CODE ANK A3,/FF RF(Z) DEL:30 NO MORE COLLECTED FILE CODES CWR A3,A2 RB(NE) DEL:20 CHECK NEXT DEL:30 EQU * SC A2,FILCOD+3,A1 SAVE FILE CODE DEL:40 EQU * LDR* A6,A6 RB(NZ) DEL:10 NEXT ENTRY IN EWT CF A14,DELFIL DELETE FILE DEL:60 EQU * LDKL A3,DLCLO1 CLOSE FILE * EJECT FMCDEF * * EXIT00 EQU * LD A6,FWTSAV,A9 GET FWT ADDRESS EXIT10 EQU * ORS A4,RETCOD SAVE RETURN CODE LDK A4,0 EXIT20 EQU * LD A9,SAVEA9 ABR A3 BACK TO FMTASK DEL:90 EQU * LDR A1,A4 RETURN CODE SUK A1,RC:NVL NEW VOLUME LOADED RB(Z) DEL:60 CLOSE FILE CDEXIT EQU * LDKL A3,FMEXIT RB EXIT10 END REQUEST * CDERQE EQU * LDKL A3,FM:RQE REQUEST ERROR RB EXIT20 CDEINE EQU * LDKL A3,FM:INE ILLEGAL VOLUME/FILE NAME RB EXIT20 * EJECT FMCDEF * * ********************************************* * * * EXTEND ENTRY * * * ********************************************* * * PARAMETERS FROM FMTASK SEE CREATE ENTRY * * EXTEND EQU * IFT XTEND=1 CF A14,EDENTR CLEAR WORK AREA MAKE PREPARATIONS RB(NZ) CDEXIT ERROR LDKL A5,FWTEW1 EXTENT POINTER ADR A5,A6 EXT:00 EQU * LDR A2,A5 SAVE LAST POINTER LD* A5,0,A5 RB(NZ) EXT:00 NEXT ENTRY LC A5,EWTSEX,A2 ST A5,SEXTNO SAVE FSN,FEN * EJECT FMCDEF * * LD A2,FPB:EL,A10 GET ENLARGE RB(Z) CDERQE NO SPECYFIED LENGTH ST A2,EXTLEN+2,A9 LDR A2,A5 FSN,FEN ADK A2,1 NEXT EXTENT ANK A2,/FF RF(NZ) EXT:15 NOT SECTION OVERFLOW LDKL A4,RC:SEO RC: SECTION OVERFLOW RB CDEXIT EXT:15 EQU * SRL A2,6 FSN LC A2,FILCOD,A2 FILE CODE CF A14,FNDVTC GET 1ST VTOC ENTRY ADK A4,0 RB(NZ) CDEXIT READ ERROR CF A14,RDVTO2 GET 1ST VTOC ENTRY ADK A4,0 RB(NZ) CDEXIT READ ERROR ST A2,EXTZER,A9 SAVE SECTOR NUMBER OF 1ST EXT LC A4,VTC:FO,A13 FILE ORGANISATION SUK A4,'L' RB(E) CDERQE L FILE * EJECT FMCDEF * * LDR A1,A13 LDKL A2,VTOCRL-2 LDR A3,A9 VTOC RECORD ADDRESS CF A14,FM:MOV MOVE VTOC TO WORK AREA LDR A2,A5 FEN ADK A2,1 ANK A2,/3F ST A2,VTC:EN,A9 NEXT FILE EXTENT TO CREATE CM VTC:LR,A9 CLEAR LAST RECORD NUMBER CM VTC:LR+2,A9 SRL A5,6 FILE SECTION NUMBER ADK A5,1 CF A14,CHKFIL CHECK IF FILE ALREADY IN SYSTEM RB(NZ) CDEINE EXT:20 EQU * CF A14,EXTFIL EXTEND FILE SECTION RB(NZ) CDEXIT RETURN CODE FROM EXTFIL SUK A2,3 RB(NP) EXT:20 NEXT FILE SECTION LD A5,SEXTNO FSN,FEN SRL A5,6 FILE SECTION NUMBER LC A2,FILCOD,A5 GET CORRESPONDING FILE CODE ADKL A5,FILCOD ADDRESS TO FC ST A5,VOLUME LDK A5,/3F ANS A5,SEXTNO FEN LDKL A3,OPEXT OPEN EXTENDED FILE RB EXIT00 XIF * IFT XTEND=0 RB CDERQE FUNCTION NOT INCLUDED, ERROR XIF * EJECT FMCDEF * * ********** * CREFIL * * EXTFIL * ********** * * * CREATES FILE SECTION IF FILE CODE SPECIFIED IN FILCOD * * INPUT : A2 = FILE SECTION NUMBER * A8 = FM ECB ADDRESS * A9 = WRKARE BASE ADDRESS * A10 = FPB ADDRESS * EXTLEN = REST LENGTH FROM PREVIOUS SECTIONS * * OUTPUT : A4 = RETCOD = RETURN CODE * A2 = INCREMENTED FILE SECTION NUMBER * CR SET ACCORDING TO A4 * CREFIL EQU * CF A14,GETFIL GET FILE SECTION LENGTH RF(NZ) CEF010 DEMANDED FILE SECTION LENGTH * EJECT FMCDEF * * EXTFIL EQU * EXTEND FILE * IFT CPU852=1 LD A1,EXTLEN,A9 REST LENGTH FROM PREVIUS SECTIONS LD A2,EXTLEN+2,A9 XIF * IFT CPU852=0 ML 2,EXTLEN,A9 REST LENGTH FROM PREVIUS SECTIONS XIF * CM EXTLEN,A9 CM EXTLEN+2,A9 * EJECT FMCDEF * * CEF000 EQU * LDK A4,0 RESET RETURN CODE CF A14,DBLX00 SET CR ACCORDING TO A1,A2 ABL(Z) CEFOUT NO LENGTH TO BE CREATED CEF010 EQU * * IFT CPU852=1 ST A1,FILLEN,A9 FILE SECTION LENGTH TO CREATE ST A2,FILLEN+2,A9 CF A14,DV3RST MAKE FILE SECTION LENGTH MULT OF 3 LDR A6,A9 ADK A6,FILLEN LDR A3,A6 CF A14,DBLADR XIF * IFT CPU852=0 MS 2,FILLEN,A9 FILE SECTION LENGTH TO CREATE CF A14,DV3RST MAKE FILE SECTION MULT OF 3 DA FILLEN,A9 MS 2,FILLEN,A9 XIF * CF A14,GET:FC GET FILE CODE RF(Z) CEFOUT NOT SPECIFIED VOLUME CF A14,VTCPAR GET VTOC PARAMETERS RF(NZ) CEFOUT * EJECT FMCDEF * * * SCAN FSAT TO FIND FITTING EXTENTS * * INPUT : A8=ECB ADDRESS * FSATBA = FSAT BASE SECTOR * FILLEN = WANTED EXTENT LENGTH * * CEF100 EQU * SUR A12,A12 FLAG INDICATING FITTING EXTENT FOUND CM VTC:EL,A9 RESET MOST FIT EXTENT LENGTH CM VTC:EL+2,A9 LDK A5,0 1ST POSITION IN FSAT CEF110 EQU * CF A14,FSREAD READ FSAT RF(NZ) CEFOUT DISC ERROR * IFT CPU852=1 ADKL A2,FM:BUF ADDRESS TO N:TH EXTLEN IN FSAT LDR A13,A2 SAVE LDK A1,FILLEN ADDRESS TO WANTED EXTENT LENGTH ADR A1,A9 CF A14,CMPDWD XIF * IFT CPU852=0 LDR A13,A2 SAVE DISPLACEMENT ADKL A13,FM:BUF ML 2,FILLEN,A9 WANTED EXTENT LENGTH DSR* A13 EXTENTION LENGTH XIF * RF(E) CEF120 EXTENT FOUND RF(L) CEF130 FOUND EXTENT GREATER THAN WANTED LDR A12,A12 RF(NZ) CEF160 GREATER FREE EXTENT ALREADY FOUND * EJECT FMCDEF * * IFT CPU852=1 LDKL A1,VTC:EL ADDRESS TO PRESENT MOST FIT ADR A1,A9 LDR A2,A13 CF A14,CMPDWD XIF * IFT CPU852=0 ML 2,VTC:EL,A9 PRESENT MOST FIT DSR* A13 EXTENT LENGTH XIF * RF(NL) CEF160 NOT GREATER THAN LAST FOUND MOST FIT RF CEF150 * EJECT FMCDEF * * CEF120 EQU * LDKL A12,-1 INDICATE EQUAL FOUND RF CEF150 CEF130 EQU * LDR A12,A12 RF(Z) CEF140 1ST GREATER EXTENT FOUND * IFT CPU852=1 LDKL A1,VTC:EL ADDRESS TO PRESENT MOST FIT ADR A1,A9 LDR A2,A13 CF A14,CMPDWD XIF * IFT CPU852=0 ML 2,VTC:EL,A9 PRESENT MOST FIT DSR* A13 EXTENT LENGTH XIF * RF(NG) CEF160 NOT MOST FIT CEF140 EQU * LDKL A12,1 INDICATE GREATER FOUND CEF150 EQU * * IFT CPU852=1 LDR A1,A13 MOVE FROM BUFFER LDKL A3,VTC:EL TO WORK AREA ADR A3,A9 CF A14,FM:MV8 XIF * IFT CPU852=0 MLR 4,A13 FROM FM:BUF TO WORK AREA MS 4,VTC:EL,A9 XIF * LDK A4,0 RESET RC LDR A6,A5 SAVE MOST FIT DISPLACEMENT LDR A12,A12 RF(N) CEF170 EQUAL FOUND * EJECT FMCDEF * * CEF160 EQU * ADK A5,FSATRL NEXT ENTRY IN FSAT CW A5,FSATLE,A9 RB(L) CEF110 SCAN MORE ENTRIES IN FSAT CEF170 EQU * * IFT CPU852=1 LD A1,VTC:EL,A9 RF(NZ) CEF200 SPACE ON DISC LD A2,VTC:EL+2,A9 SUK A2,2 XIF * IFT CPU852=0 ML 2,VTC:EL,A9 RF(NZ) CEF200 SPACE ON DISC SUK A2,2 XIF * ABL(NP) CEF500 NO SPACE ON DISC * EJECT FMCDEF * * * UPDATE FSAT * * INPUT : A6 = DISPLACEMENT IN FSAT TO BE UPDATED * A12 = 0 ,IF EXTENT SMALLER THAN REQUESTED * = 1 ,IF GREATER * FM:BUF = FILE MANAGEMENT BUFFER * VTC:EL = FILE EXTENT LENGTH * VTC:EB = FILE EXTENT BASE * CEF200 EQU * LDR A5,A6 GET ENTRY IN FSAT CF A14,FTREAD RF(NZ) CEFOUT READ ERROR ANK A5,/F8 DISPLACEMENT IN FSAT SECTOR LDR A12,A12 RF(NZ) CEF210 DELETE FSAT ENTRY * IFT CPU852=1 LD A1,VTC:EL,A9 EXTENT LENGTH LD A2,VTC:EL+2,A9 XIF * IFT CPU852=0 ML 2,VTC:EL,A9 EXTENT LENGTH XIF * CF A14,DV3RST RF(Z) CEF220 NO REST * EJECT FMCDEF * * IFT CPU852=1 LDKL A3,VTC:EL GET ADDRESS TO EXTENT LENGTH ADR A3,A9 LDR A6,A3 SUK A2,3 SUK A1,1 A1=/FFFF CF A14,DBLADR MAKE EXTENT MULTIPLE OF 3 XIF * IFT CPU852=0 SUK A2,3 -REST SUK A1,1 /FFFF ANKL A2,/7FFF DA VTC:EL,A9 MS 2,VTC:EL,A9 EXTENT LENGTH MULT OF 3 XIF * RF CEF220 CEF210 EQU * * IFT CPU852=1 LDKL A3,VTC:EL GET FILE EXTENT LENGTH ADR A3,A9 LDK A1,FILLEN ADR A1,A9 CF A14,FM:MV4 XIF * IFT CPU852=0 ML 2,FILLEN,A9 FILE EXTENT LENGTH MS 2,VTC:EL,A9 XIF * EJECT FMCDEF * * CEF220 EQU * LDKL A3,FM:BUF FSAT EXTENT LENGTH ADR A3,A5 CF A14,DBLSU1 NEW EXTENT LENGTH=OLD LENGTH-CREATED LENGTH RF(NZ) CEF230 REST EXTENT LENGTH GREATER CF A14,CLFSAT CLEAR FSAT ENTRY RF CEF240 CEF230 EQU * * IFT CPU852=1 LDKL A3,FM:BUF+4 ADR A3,A5 LDKL A6,VTC:EL EXTENT BASE+LENGTH ADR A6,A9 CF A14,DBLADD NEW EXTENTBASE=EXTBASE+CREATED EXTBASE XIF * IFT CPU852=0 ML 2,FM:BUF+4,A5 DA VTC:EL,A9 MS 2,FM:BUF+4,A5 NEW EXT BASE=EXTBAS+CREATED EXTBASE XIF * CEF240 EQU * CF A14,CDEWRI WRITE RF(Z) CEF350 WRITE OK CEFOUT EQU * CM EXTZER,A9 1ST VTOC POINTER IM VTC:FS,A9 NEXT SECTION LD A2,VTC:FS,A9 CM VTC:EN,A9 EXTENT ZERO ORS A4,RETCOD SAVE RETURN CODE ABL SET:CR SET CONDITION REGISTER * EJECT FMCDEF * * * SEARCH FOR FREE VTOC ENTRIES * * * INPUT : VTCSEC = VTOC BASE SECTOR * VTCEND = VTOC LAST SECTOR * FM:BUF = FM BUFFER * CEF300 EQU * CF A14,FMREAD READ VTOC RB(NZ) CEFOUT DISC ERROR LDKL A7,VTOCBF VTOC BLOCK FACTOR LDKL A13,FM:BUF BUFFER ADDRESS * EJECT FMCDEF * * CEF320 EQU * LD A4,VTC:ST,A13 VTOC STATUS BYTE ANK A4,/FF RF(Z) CEF400 FREE VTOC ENTRY FOUND LDKL A1,VTC:FN ADDRESS TO FILE NAME ADR A1,A9 LDR A2,A13 VTOC FILE NAME LDK A3,8 CF A14,CMPSTR RF(NE) CEF340 NOT SAME NAME LD A1,VTC:EN,A13 EXTENT NUMBER RF(NZ) CEF340 NOT 1ST LD A1,VTCSEC,A9 VTOC SECTOR NUMBER ST A1,EXTZER,A9 CEF340 EQU * ADKL A13,VTOCRL NEXT VTOC ADDRESS SUK A7,1 RB(P) CEF320 MORE VTOC:S ON THIS SECTOR IM VTCSEC,A9 NEXT VTOC SECTOR CEF350 EQU * LD A2,VTCSEC,A9 VTOC SECTOR CW A2,VTCEND,A9 RB(NE) CEF300 MORE VTOC SECTORS LDK A4,RC:OFL RC: NO MORE VOLUMES RB CEFOUT * EJECT FMCDEF * * * CREATE A VTOC * * INPUT : A10 = FPB ADDRESS * A13 = VTOC ENTRY ADDRESS * A8 = FM:ECB ADDRESS * CEF400 EQU * LC A4,VTC:FO,A9 FILE ORGANISATION SUK A4,'L' RF(NZ) CEF450 NOT L FILE LC A1,FPB:MN,A10 MONITOR NUMBER ECR A1,A1 LC A1,FPB:SN,A10 START SWITCH ST A1,VTC:MN,A9 VTOC CM VTC:KA,A9 KEY ADDRESS CEF450 EQU * LDR A3,A13 MOVE VTOC LDKL A2,VTOCRL LDR A1,A9 VTOC RECORD ADDRESS CF A14,FM:MOV CF A14,CDEWRI WRITE RB(NZ) CEFOUT WRITE ERROR * EJECT FMCDEF * * IM VTC:EN,A9 NEXT FILE EXTENT LDK A3,FILLEN ADDRESS TO FILE SECTION LENGTH TO BE CREATED ADR A3,A9 CF A14,DBLSU1 SUBTRACT RF(Z) CEF600 FILE SECTION READY LC A4,VTC:FO,A9 FILE ORGANISATION SUK A4,'L' RF(Z) CEF470 TOO MANY EXTENTS LD A1,VTC:EN,A9 SUK A1,MAXEXT ABL(NP) CEF100 NEXT EXTENT OF FILE SECTION CEF470 EQU * LDKL A4,RC:SEO RC: TOO MANY FILE EXTENTS RF CEF510 TOO MANY FILE EXTENTS * EJECT FMCDEF * * CEF500 EQU * LDK A4,RC:OFL RC: NO MORE VOLUMES CEF510 EQU * LD A5,VTC:FS,A9 GET FILE SECTION NUMBER CEF520 EQU * ADK A5,1 NEXT VOLUME CWK A5,3 RB(G) CEFOUT NO MORE VOLUMES LC A1,FILCOD,A5 GET FILE CODE ANK A1,/FF RB(Z) CEF520 NEXT VOLUME LDR A2,A5 CF A14,GETFIL FILE SECTION LENGTH RB(NZ) CEF520 NO REST PILE CEF530 EQU * LDK A4,0 RESET CR * IFT CPU852=1 LDK A3,EXTLEN SAVE REST FOR LATER ADR A3,A9 LDK A6,FILLEN ADR A6,A9 CF A14,DBLADD XIF * IFT CPU852=0 ML 2,EXTLEN,A9 SAVE REST DA FILLEN,A9 MS 2,EXTLEN,A9 XIF * EJECT FMCDEF * * CEF600 EQU * LD A2,EXTZER,A9 1ST EXTENT VTOC SECTOR NO RF(NZ) CEF650 VTOC ENTRY FOUND LD A2,VTCSEC,A9 LAST SEARCHED SECTOR CEF650 EQU * LD A12,VTCEND,A9 VTOC END LD A6,FWTSAV,A9 GET FILE NAME BASE CF A14,RDVTO2 SCAN FOR FIRST VTOC ADK A4,0 RF(NZ) CEF900 READ ERROR LD A1,VTC:EN,A9 LAST EXTENT NUMBER SC A1,VTC:NE,A13 UPDATE NUMBER OF EXTENTS CF A14,CDEWRI CEF900 EQU * ABL CEFOUT * EJECT FMCDEF * * ********** * DELFIL * ********** * * COLLECT ADJECENT EXTENDS AND CREATE ONE NEW * * INPUT : FWTSAV = FWT ADDRESS OR ADJUSTED FPB ADDRESS * THAT IS (FILENAME)=(FWTSAV)+FWTNAM * A8 = FM:ECB ADDRESS * FILCOD = AREA CONTAINING FILE CODES * VTC:FS SHOULD BE ZERO * DELFIL EQU * CM FEXTNO CF A14,GET:FC GET FILE CODE RF(Z) DELF03 NO SPECIFIED FILE CODE CF A14,VTCPAR GET VTOC PARAMETERS RF(NZ) DELF03 ERROR DELF00 EQU * LD A6,FWTSAV,A9 GET FWT ADDRESS LD A12,VTCEND,A9 VTOC END SECTOR LD A2,VTCSEC,A9 PRESENT VTOC SECTOR CF A14,FNDVT2 NEXT VTOC ST A2,VTCSEC,A9 UPDATE POINTER ADK A2,0 RF(Z) DELF03 NO ENTRY IN VTOC ADK A4,0 RF(Z) DELF05 NEXT VTOC ENTRY * EJECT FMCDEF * * DELF03 EQU * ORS A4,RETCOD IM VTC:FS,A9 NEXT FILE SECTION LD A1,VTC:FS,A9 SUK A1,4 RB(N) DELFIL NEXT FILE SECTION RTN A14 * EJECT FMCDEF * * * VTC:EB = BASE SECTOR OF CREATED FREE SPACE * VTC:EL = END SECTOR OF CREATED FREE SPACE * * DELF05 EQU * LDKL A1,SPACES STR A1,A13 SPACES IN FILE NAME ST A1,2,A13 ST A1,4,A13 ST A1,6,A13 CM VTC:ST,A13 FREE ENTRY LD A1,VTC:EN,A13 EXTENT NUMBER RF(NZ) DELF08 NOT 1ST LC A1,VTC:NE,A13 NUMBER OF EXTENTS NGR A1,A1 ADS A1,FEXTNO * EJECT FMCDEF * * DELF08 EQU * * IFT CPU852=1 LDKL A1,VTC:EL GET EXTENT LENGTH ADR A1,A13 MOVE EXT LEN AND EXT BASE TO WORK AREA LDKL A3,VTC:EL ADR A3,A9 CF A14,FM:MV8 LDKL A3,VTC:EL ADDRESS TO EXTENT LENGTH ADR A3,A9 LDKL A6,VTC:EB ADDRESS TO EXTENT BASE ADR A6,A9 CF A14,DBLADD VTC:EL=EXTENT BASE + EXTENT LENGTH XIF * IFT CPU852=0 ML 4,VTC:EL,A13 DAR A3 VTC:EL=EXT BASE+EXT LENGTH MS 4,VTC:EL,A9 XIF * CF A14,CDEWRI WRITE RB(NZ) DELF03 ERROR * EJECT FMCDEF * * * SCAN FOR ADJACENT FREE SPACE * * SUR A12,A12 POINTER IN FSAT DELF10 EQU * LDR A5,A12 DISPLACEMENT IN FSAT CF A14,FSREAD RB(NZ) DELF03 READ ERROR * EJECT FMCDEF * * * EXTLEN = FSAT EXTENT BASE+LENGTH * * ANK A5,/F8 DISPLACEMENT IN BUFFER * IFT CPU852=1 LDK A3,EXTLEN ADDRESS TO SAVE AREA ADR A3,A9 LDKL A1,FM:BUF+4 MOVE EXTENT BASE FROM FSAT ADR A1,A5 CF A14,FM:MV4 LDK A3,EXTLEN ADDRESS TO SAVE AREA ADR A3,A9 CF A14,DBLAD1 FSAT EXTENT BASE+LENGTH XIF * IFT CPU852=0 ML 2,FM:BUF+4,A5 DA FM:BUF,A5 MS 2,EXTLEN,A9 XIF * EJECT FMCDEF * * * CHECK IF ANY LOWER ADJACENT FREE SPACE * * IFT CPU852=1 LDR A1,A3 ADDRESS TO FSAT BASE+LENGTH LDKL A2,VTC:EB EXTENT BASE ADR A2,A9 CF A14,CMPDWD CHECK IF FSAT EXTBASE = EXTBASE+EXTLEN XIF * IFT CPU852=0 DS VTC:EB,A9 CHECK IF FSAT EXTBASE=EXTBASE + EXTLEN XIF * RF(NE) DELF30 NOT ADJECENT * IFT CPU852=1 LDKL A3,VTC:EB ADR A3,A9 LDKL A1,FM:BUF+4 MOVE EXTENT BASE TO VTC:EB ADR A1,A5 CF A14,FM:MV4 XIF * IFT CPU852=0 ML 2,FM:BUF+4,A5 MS 2,VTC:EB,A9 XIF * RF DELF35 UPDATE FSAT SECTOR * EJECT FMCDEF * * * CHECK IF ANY UPPER ADJACENT FREE SPACE * * DELF30 EQU * * IFT CPU852=1 LDKL A1,FM:BUF+4 FSAT EXTENT BASE ENTRY ADR A1,A5 DISPLACEMENT LDKL A2,VTC:EL EXTENTBASE + EXTENT LENGTH ADR A2,A9 CF A14,CMPDWD CHECK IF ADJECENT XIF * IFT CPU852=0 ML 2,FM:BUF+4,A5 FSAT EXTENT BASE DS VTC:EL,A9 EXTENT BASE + EXTENT LENGTH XIF * RF(NE) DELF40 NOT ADJECENT * IFT CPU852=1 LDKL A3,VTC:EL EXPAND EXTLEN ADR A3,A9 CF A14,DBLAD1 XIF * IFT CPU852=0 ML 2,VTC:EL,A9 DA FM:BUF,A5 MS 2,VTC:EL,A9 XIF * DELF35 EQU * CF A14,CLFSAT FREE FSAT ENTRY CF A14,CDEWRI WRITE RB(NZ) DELF03 WRITE ERROR DELF40 EQU * ADKL A12,FSATRL NEXT ENTRY IN FSAT CW A12,FSATLE,A9 RB(L) DELF10 CONTINUE SEARCH OF FSAT * EJECT FMCDEF * * * PUT FREE SPACE IN FSAT SEARCH FOR FREE FSAT ENTRY * * LDK A5,0 DELF50 EQU * CF A14,FSREAD GET FSAT ENTRY RB(NZ) DELF03 READ ERROR LDR A12,A2 DISPLACEMENT IN BUFFER ADKL A12,FM:BUF ADDRESS LDR A1,A12 CF A14,GETPAR GET EXT LEN RF(Z) DELF60 FREE FSAT ENTRY ADK A5,FSATRL CW A5,FSATLE,A9 RB(NG) DELF50 LDK A4,RC:OFL RC: NO FSAT ENTRIES AVAILIBLE ORS A4,RETCOD RF DELF70 DELETE NEXT VTOC ENTRY OF FILE SECTION * EJECT FMCDEF * * DELF60 EQU * * IFT CPU852=1 LDKL A3,VTC:EL EXTENT END ADR A3,A9 LDKL A6,VTC:EB ADDRESS TO EXTENT BASE ADR A6,A9 CF A14,DBLSUB GET EXTENT LENGTH LDR A3,A12 ADDRESS TO FREE FSAT ENTRY LDKL A1,VTC:EL ADDRESS TO EXT BASE AND EXT LENGTH ADR A1,A9 CF A14,FM:MV8 FILL IN FSAT ENTRY XIF * IFT CPU852=0 ML 4,VTC:EL,A9 DSR A3 MSR 4,A12 UPDATE FSAT XIF * CF A14,CDEWRI WRITE RF(NZ) DELF80 ERROR IM FEXTNO DELF70 EQU * ABL(NZ) DELF00 NEXT EXTENT DELF80 EQU * ABL DELF03 NEXT SECTION * EJECT FMCDEF * * *************** * SUBROUTINES * *************** * * ********** * DV3RST * ********** * * * CALCULATES REST WHEN DIVIDE BY 3 * * INPUT : A1,A2 = DIVIDENT * * OUTPUT : A2 = 3-REST OR IF REST=0 A2=0 * A1=0 * DV3RST EQU * SLL A1,1 ADR A2,A1 DV3R10 EQU * LDR A1,A2 ANK A1,3 ONE FIGURE IN BASE 4 SRL A2,2 ADR A2,A1 ADDED TO REST OF FIGURES IN BASE 4 RF(Z) SET2CR REST = 0 SUK A2,3 RB(P) DV3R10 CONTINUE TO ADD NGR A2,A2 RF SET2CR * EJECT FMCDEF * * ********** * GETFIL * * GETPAR * ********** * * * GET FILE SECTION LENGTH * * INPUT : A2 = FILE SECTION NUMBER * A10 = FPB ADDRESS * * OUTPUT: A1,A2 = FILE SECTION LENGTH * CR SET ACCORDING TO FILE SECTION LENGTH * * GETFIL EQU * LDR A1,A2 MULTIPLY BY 10 SLL A1,2 ADR A1,A2 SLL A1,1 ADR A1,A10 ADDRESS TO FILE SECTION LENGTH ADKL A1,FPB:S1 SIZE DISPLACEMENT IN FPB GETPAR EQU * LD A2,2,A1 LEAST SIGNIFICANT PART LDR* A1,A1 MOST SIGNIFICANT PART RF DBLX00 SET CR * IFT CPU852=1 EJECT FMCDEF * * ********** * DBLADD * * DBLADR * * DBLAD1 * ********** * * * DOUBLE ADD ON MEMORY LOCATIONS * DOUBLE ADD ON MEMORY BY REGISTERS A1,A2 * * INPUT : A3 = ADDRESS TO ARG1 * A6 = ADDRESS TO ARG2 * * OUTPUT: A3 = ADDRESS TO ARG1 + ARG2 * A1,A2 = ARG1+ARG2 * A6,A7 ARE DESTOYED * DBLAD1 EQU * SPECIAL ENTRY LDR A6,A5 ADKL A6,FM:BUF DBLADD EQU * LDR* A1,A3 GET ARG1 LD A2,2,A3 DBLADR EQU * LD A7,2,A6 GET ARG2 LDR* A6,A6 CF A14,ADDMOD ARG1+ARG2 RF DBLXIT XIF * EJECT FMCDEF * * ********** * DBLSUB * * DBLSU1 * ********** * * DOUBLE SUBTRACT ON MEMORY LOCATIONS * * INPUT : A3 = ADDRESS TO ARG1 * A6 = ADDRESS TO ARG2 * * OUTPUT: A3 = ADDRESS TO ARG1-ARG2 * A1,A2 = ARG1-ARG2 * A6,A7 ARE DESTOIED * IF A1=A2=0 THEN A3=0 * DBLSU1 EQU * SPECIAL ENTRY LDR A6,A9 ADKL A6,VTC:EL DBLSUB EQU * * IFT CPU852=1 LDR* A1,A3 ARG1 LD A2,2,A3 LD A7,2,A6 ARG2 LDR* A6,A6 CF A14,DSUMOD ARG1-ARG2 XIF * IFT CPU852=0 MLR 2,A3 DSR* A6 XIF * EJECT FMCDEF * * DBLXIT EQU * * IFT CPU852=1 STR A1,A3 SAVE RESULT ST A2,2,A3 XIF * IFT CPU852=0 MSR 2,A3 XIF * DBLX00 EQU * ADKL A14,4 ADK A1,0 RF(NZ) DBLX10 ADK A2,0 DBLX10 EQU * ABR* A14 * EJECT FMCDEF * * ********** * GET:FC * ********** * * GET FILECODE FROM FILECODE AREA * * INPUT : VTC:FS = FILE SECTION NUMBER * * OUTPUT : A2 = FILE CODE * CR SET ACCORDING TO FILECODE * * GET:FC EQU * LD A2,VTC:FS,A9 GET FILE SECTION NUMBER LC A2,FILCOD,A2 FILE CODE SET2CR EQU * LDK A1,0 RB DBLX00 SET CR ACCORDING TO A2 * EJECT FMCDEF * * ********** * CDEWRI * ********** * * PERFORM WRITE * * INPUT: A8=ECB ADDRESS * A7 USED * OUTPUT: A4=RETURN CODE * CR SET ACCORDING TO RETURN CODE * * CDEWRI EQU * LDK A7,/95 CF A14,FM:IO RF SET:CR EJECT FMCDEF * * ********** * CLFSAT * ********** * * CLEAR 4 WORDS IN FM:BUF SPECIFIED BY A5 * * INPUT : A5 = DISPLACEMENT IN FM:BUF * CLFSAT EQU * CM FM:BUF,A5 CM FM:BUF+2,A5 CM FM:BUF+4,A5 CM FM:BUF+6,A5 RTN A14 * EJECT FMCDEF * * ********** * CENTRY * * EDENTR * ********** * * CREATE,DELETE AND EXTEND PREPARATION ROUTINE * CLEAR WORK AREA AND SAVES TTAB ADDRESS * * INPUT : A5 = TTAB ADDRESS OF CALLING TASK * REGISTER A3 USED * * OUTPUT : A4=RC FROM FCHEC2 * CR SET ACCORDING TO A4 * EDENTR EQU * ENTRY USED BY EXTEND AND DELETE INH CF A15,FCHEC2 ENB CENTRY EQU * ENTRY USED BY CREATE LDK A3,WRKALE-2 CDEE05 EQU * CM WRKARE,A3 SUK A3,2 RB(NN) CDEE05 ST A9,SAVEA9 SAVE USER ECB ADDRESS LDKL A9,WRKARE BASE ADDRESS ST A6,FWTSAV,A9 SAVE FWT ADDRESS LDK A3,/FF ST A3,VTC:ST-1,A9 INDICATE USED ENTRY RF SET:CR * EJECT FMCDEF * * ********** * FSREAD * * FTREAD * ********** * * FSREAD: READ FSAT SECTOR IF 1ST ENTRY IN SECTOR REQUESTED * FTREAD: READ FSAT SECTOR * * INPUT : A5 = FSAT DISPLACEMENT * FSATBA = FSAT BASE SECTOR * * OUTPUT: A2 = DISPLACEMENT IN FM:BUF * A4 = RTETURN CODE FROM READ OPERATION * CR IS SET TO ZERO IF A4=0 * FSREAD EQU * LDK A4,0 RESET RETURN CODE LDR A2,A5 DISPLACEMENT ANK A2,/F8 RF(NZ) SET:CR NOT FIRST IN SECTOR FTREAD EQU * ECR A2,A5 SECTOR NUMBER ANK A2,/FF AD A2,FSATBA,A9 BASE SECTOR CF A14,FMREAD LDK A2,0 DISPLACEMENT IN BUFFER SET:CR EQU * ADKL A14,4 UPDATE STACK POINTER ADK A4,0 SET CR ABR* A14 RETURN * EJECT FMCDEF * * ********** * VTCPAR * ********** * * GET FSAT LENGTH IN BYTES TO WORK AREA * FSAT BASE SECTOR TO WORK AREA * VTOC BASE SECT * LAST VTOC SECTOR NUMBER TO WORK AREA * * INPUT : A8 = FM:ECB ADDRESS * A2 = FILE CODE * OUTPUT: A4 = 0 IF READ OK * A4<> 0 IF READ NOT OK * CR SET ACCORDING TO A4 * USED REGISTERS A1, A2, A3, A4, A7 * VTCPAR EQU * SC A2,ECBFC,A8 PREPARE ECB LDK A2,0 READ SECTOR ZERO = VOLUME LABEL CF A14,FMREAD RB(NZ) SET:CR READ ERROR LDKL A2,FM:BUF BUFFER ADDRESS LD A1,VOL:EB,A2 VTOC BASE ST A1,FSATBA,A9 FSAT BASE SECTOR LD A3,VOL:EL,A2 VTOC LENGTH LD A2,VOL:FS,A2 FSAT LENGTH ADR A3,A1 ADR A1,A2 ECR A2,A2 * EJECT FMCDEF * * IFT CPU852=1 ST A1,VTCSEC,A9 VTOC ENTRIES BASE ST A2,FSATLE,A9 FSAT LENGTH IN BYTES ST A3,VTCEND,A9 VTOC END SECTOR XIF * IFT CPU852=0 MS 3,VTCSEC,A9 XIF * RB SET:CR * EJECT FMCDEF * * ********** * CHKFIL * ********** * * * CHECKS IF FILE EXISTS IN VOLUMES SPECYFIED BY FPB * * INPUT : A5 = START VOLUME IN FILCOD * FILCOD - AREA WITH FILE CODES * OUTPUT: A2 = 0 IF NO FILE FOUND * A2 <> 0 IF FILE FOUND * CR SET ACCORDING TO A2 * A1-A7 AND A11-A13 ARE USED * * CHKFIL EQU * SUK A5,3 FILE CODE POINTER CHKF10 EQU * LC A2,FILCOD+3,A5 GET FILE CODE ANK A2,/FF RF(Z) CHKF20 NEXT FILE CODE LDR A6,A9 SUKL A6,FWTNAM CF A14,FNDVTC ADK A4,0 ABL(NZ) CDEXIT DISC ERROR ADK A2,0 RB(NZ) SET2CR FILE IN ONE OF VOLUMES CHKF20 EQU * ADK A5,1 RB(NP) CHKF10 NEXT ENTRY IN FILCOD RB SET2CR * END