|
|
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: 62004 (0xf234)
Notes: pts_type(SC)
Names: »FMTASK.SC«
└─⟦13e5fd45a⟧ Bits:30009699 Philips computer tape "600507"
└─⟦this⟧ »TOSSWORK/FMTASK.SC«
└─⟦bc20f3abf⟧ Bits:30009670 Philips computer tape "600126"
└─⟦this⟧ »TOSSWORK/FMTASK.SC«
IDENT FMTASK REL 11.0 81-05-13 870105041100 =7, FDBMEC NOT SET IN SYSTEMS WITHOUT DM =7, REL 11.0 81-02-04 =6,EDM INITIALIZATION 3 DISCS =6, REL 11.0 81-02-03 =5, ADM INITIALIZATION REL 11.0 81-01-21 =4, NO NVL BITS FOR DM TASKS PRR 11.0 80-11-27 CHLO =3, SPLIT EXTENT HANDELING NOT WORKING PRR 11.0 80-11-20 CHLO =2, EDM INITIALIZATION ALLWAYS HALTED PRR 11.0 80-11-19 CHLO =1, HALT IF TTAB NOT FOUND PRR 11.0 80-11-19 POHO * * ************************************************** * * PHILIPS TERMINAL SYSTEM PTS * * * FMTASK = TOSS FILE MANAGEMENT TASK * * * * * ************************************************** * * * TOSS FILE MANAGEMENT TASK CONTAINS THE * FOLLOWING FILE ADMINISTRATION MODULES: * * - FMOPEN OPEN FILE * - FMCLOS CLOSE FILE * - FMRPAR READ FILE PARAMETERS * - FMSPLI READ/WRITE (SPLIT I/O) * * FMTASK ALSO CONTAINS THE FILE MANAGEMENT * SYSTEM INITIALIZATION ROUTINE, FMINIT. * FMINIT ALSO HOLDS THE EDM INITIALIZATION ROUTINE. * * EJECT FMTASK * * *********** * ENTRIES * *********** * * ENTRY OPEN OPEN FILE ENTRY OPEXT OPEN EXTENDED FILE (CALLED FROM EXTEND) ENTRY DLCLO1 CLOSE FILE (CALLED FROM DELETE) ENTRY DLCLO2 CLOSE FILE (CALLED FROM DELETE) ENTRY FMTASK FMTASK ACTIVATION ADDRESS ENTRY FMINIT FILE MANAGEMENT INITIALIZATION ENTRY FMREAD FMTASK READ DISC SECTOR ROUTINE ENTRY FM:PWR FMTASK WRITE DISC SECTOR ROUTINE ENTRY FM:IO FMTASK I/O ROUTINE ENTRY FM:ECB FM ECB ADDRESS ENTRY FMEXIT FMTASK SET RETURN CODE EXIT ENTRY FM:INE FMTASK ILLEGAL NAME EXIT ENTRY FM:RQE FMTASK REQUEST ERROR EXIT ENTRY FNDNAM FIND VOLUME NAME ADDRESS IN DISC DWT ENTRY FNDVTC FIND ONE FILE EXTENT (VTOC) ENTRY FNDVT2 FNDVTC 2ND ENTRY ENTRY RDVTO2 READ VTOC, FIRST EXTENT ENTRY FM:MOV MOVE STRING ENTRY FM:MV4 MOVE 4 CHARACTERS ENTRY FM:MV8 MOVE 8 CHARACTERS ENTRY CMPSTR COMPARE STRINGS ENTRY CMPDWD COMPARE TWO DOUBLE WORDS ENTRY FILCOD FILE CODE TABLE ENTRY VOLUME CURRENT VOLUME FILE CODE POINTER ENTRY FM:BUF FMTASK DISC SECTOR BUFFER ENTRY TTABFM FMTASK TTAB ENTRY FEXTNO NO OF FILE EXTENTS ENTRY RETCOD ACKUMULATED RETURN CODE EJECT FMTASK * ENTRY FWTVTC VTOC SECTOR NUMBER (FIRST EXTENT) ENTRY FWTPAR FILE ACCESS PARAMETERS ENTRY FWTFNR FILE NUMBER ENTRY FWTTAB TTAB FOR TASK WITH EXCLUSIVE ACCESS ENTRY FWTEW1 POINTER TO 2ND EWT BLOCK IN FWT ENTRY FWTVOL VOLUME FILE CODE ENTRY FWTEXB EXTENT BASE (FIRST EXTENT) ENTRY FWTNAM FILE NAME ENTRY FWTQUE QUEUE ANCHOR FOR FILE I/O REQUESTS ENTRY FWTSEX FILE SECTION AND EXTENT NUMBER ENTRY FPB:RL RECORD LENGTH ENTRY FPB:BF BLOCK FACTOR ENTRY FPB:FO FILE ORGANIZATION ENTRY FPB:DT DEVICE TYPE =1 ENTRY FPB:BO BASIC ORDERS ENTRY FPB:NO FILE NUMBER =1 ENTRY FPB:FN FILE NAME ENTRY FPB:EL ENLARGE ENTRY FPB:V1 VOLUME NAME 1 ENTRY FPB:S1 SIZE 1 ENTRY FPB:V2 VOLUME NAME 2 ENTRY FPB:S2 SIZE 2 ENTRY FPB:V3 VOLUME NAME 3 ENTRY FPB:S3 SIZE 3 ENTRY FPB:V4 VOLUME NAME 4 ENTRY FPB:S4 SIZE 4 ENTRY FPB:FR FILE RECORD NUMBER ENTRY FPB:US NUMBER OF USERS ENTRY FPB:SH SHAREABILITY ENTRY FPB:MN MONITOR NUMBER ENTRY FPB:SN SOP SWITCH NUMBER ENTRY FPB:IF NUMBER OF INDEX FILES ENTRY FPB:KA KEY ADDRESS IN RECORD ENTRY FPB:CD CREATION DATE ENTRY FPB:RP RETENTION PERIOD EJECT FMTASK * * ENTRY EWTEXL EXTENT LENGTH ENTRY EWTEXB EXTENT BASE ENTRY EWTVOL VOLUME FILE CODE ENTRY EWTSEX FILE SECTION AND EXTENT NUMBER ENTRY VOL:VN VOLUME NAME ENTRY VOL:EL VTOC EXTENT LENGTH ENTRY VOL:EB VTOC EXTENT BASE ENTRY VOL:RL VTOC RECORD LENGTH ENTRY VOL:FS FSAT LENGTH ENTRY VTOCRL VTOC RECORD LENGTH ENTRY VTOCBF VTOC BLOCK FACTOR ENTRY VTC:FN FILE NAME ENTRY VTC:MN MONITOR NUMBER (L-FILE) ENTRY VTC:FS FILE SECTION NUMBER (S-FILE) ENTRY VTC:SN SOP SWITCH NUMBER ENTRY VTC:EN FILE EXTENT NUMBER ENTRY VTC:EL FILE EXTENT LENGTH ENTRY VTC:EB FILE EXTENT BASE ENTRY VTC:LR LAST RECORD NUMBER ENTRY VTC:RL RECORD LENGTH ENTRY VTC:BF BLOCK FACTOR ENTRY VTC:FO FILE ORGANIZATION ENTRY VTC:CD CREATION DATE ENTRY VTC:RP RETENTION PERIOD ENTRY VTC:IF NUMBER OF INDEX FILES ENTRY VTC:KA KEY ADDRESS IN RECORD ENTRY VTC:NE NO OF FILE EXTENTS ENTRY VTC:ST STATUS BYTE EJECT FMTASK * * ************* * EXTERNALS * ************* * * EXTRN CREATE FM CREATE FILE EXTRN EXTEND FM EXTEND FILE EXTRN DELETE FM DELETE FILE EXTRN QMEXIT QUEUE TASK AND EXIT MONITOR TASK EXTRN GETBLK STORE PARAMETERS IN MONITOR BLOCK EXTRN FREBLK GET PARAMETERS FROM MONITOR BLOCK EXTRN FNDTID FIND TTAB ADDRESS FROM TASK ID EXTRN FINDTT FIND DATA MANAGEMENT TASK =1 EXTRN FNDDWD FIND DISC DWT ADDRESS EXTRN ACTOT ACTIVATE TASK EXTRN SDMINI DM INITIALIZATION ROUTINE EXTRN TIOMXI CONVERT LOGICAL ADDRESS TO PHYSICAL EXTRN DET:FM FILE MANAGEMENT DETACH EXTRN FCHEC2 CHECK ACCESS PAR. AND RETURN FWT ADDRESS EXTRN TIODM (E)DM ADDRESS BLOCK EXTRN SEXTNO START EXTENT NUMBER (EXTEND) EXTRN DFTAB DISC FILE CODE TABLE EXTRN DFTABE END OF DFTAB EXTRN SCTNOF NUMBER OF FILES EXTRN SCTFWT FWT CHAIN START ADDRESS EXTRN SCTFWL FILE WORK TABLE LENGTH EXTRN SCTDMT (E)DM TASKS IN SYSTEM EXTRN SCTMOX DISPATCH ADDRESS TABLE POINTER EXTRN DWDM01 (E)DM SYSTEM DWT/FWT EXTRN NVLTAB NVL TABLE EXTRN NVLEND END OF NVLTAB EXTRN NVLBIT NVL BIT MASK EJECT FMTASK * * EXTRN DWTST DWT STATUS EXTRN DWTADR ADDRESS TO ADDRESS BLOCK EXTRN DWTMEC MMU ECB ADDRESS EXTRN DWTVOL VOLUME NAME EXTRN DWTNVL NVL INDICATOR EXTRN DWTPAB PARAMETER BLOCK ADDRESS EXTRN FDBMEC FDB MMU ECB DISPLACEMENT IN FWT EXTRN TTB:MT MMU TABLE EXTRN TTB:SA DISPATCH ADDRESS EXTRN ECBFC ECB FILE CODE EXTRN ECBFN ECB FILE NUMBER EXTRN ECBBA ECB BUFFER ADDRESS (FPB ADDRESS) EXTRN ECBRL ECB REQUESTED LENGTH EXTRN ECBEL ECB EFFECTIVE LENGTH EXTRN ECBRC ECB RETURN CODE EXTRN ECBCW1 CONTROL WORD 1 EXTRN ECBCW2 CONTROL WORD 2 EXTRN HALT EJECT FMTASK * * *************************************** * * CONDITIONAL ASSEMBLY * *************************************** * * A PROGRAM VERSION USING TOSS MMU PAGING * IS OBTAINED BY SETTING MMUPAG EQU 1. * MMUPAG EQU 0 * * * A PROGRAM VERSION USING THE EXTENDED INSTRUCTION * SET IS OBTAINED BY SETTING CPU852 EQU 0. * CPU852 EQU 1 * * * A PROGRAM VERSION USING TOSS DISC PAGING * IS OBTAINED BY SETTING DSKPAG EQU 1. * DSKPAG EQU 0 * * * A PROGRAM VERSION INCLUDING CREATE/DELETE FILE * IS OBTAINED BY SETTING FMCDEF (X:A) EQU 1. * X:A EQU 0 FMCDEF EQU X:A * EJECT FMTASK * * * A PROGRAM VERSION SUPPORTING DATA MANAGEMENT * IS OBTAINED BY SETTING DM (X:B) EQU 1. * X:B EQU 0 SDM EQU X:B * * * A PROGRAM VERSION SUPPORTING EXTENDED DATA MANAGEMENT * IS OBTAINED BY SETTING EDM (X:C) EQU 1. * X:C EQU 0 EDM EQU X:C * * * A PROGRAM VERSION SUPPORTING ABRIDGED DATA MANAGEMENT =5 * IS OBTAINED BY SETTING X:D EQU 1 =5 * * X:D EQU 0 ADM EQU X:D * * * COMBINED CONDITION ADMEDM =5 IFF ADM+EDM=0 =5 ADMEDM EQU 1 =5 XIF =5 IFT ADM+EDM=0 =5 ADMEDM EQU 0 =5 XIF =5 * EJECT FMTASK * * * THE ATTACH/DETACH FILE FUNCTION * IS OBTAINED BY SETTING ATTDET EQU 1. * ATTDET EQU 1 X:E EQU ATTDET * * * THE MULTIPLE EXTENT I/O FUNCTION * IS OBTAINED BY SETTING MULEXT EQU 1. * MULEXT EQU 1 X:F EQU MULEXT * EJECT FMTASK * * ******************** * VL DISPLACEMENTS * ******************** * * VOLUME LABEL DISPLACEMENTS * VOL:VN EQU 0 VOLUME NAME VOL:EL EQU 6 VTOC EXTENT LENGTH VOL:EB EQU 10 VTOC EXTENT BASE VOL:RL EQU 12 VTOC RECORD LENGTH VOL:FS EQU 46 FSAT LENGTH * * ****************** * VTOC CONSTANTS * ****************** * * VTOCRL EQU 42 VTOC RECORD LENGTH VTOCBF EQU 6 VTOC BLOCK FACTOR * EJECT FMTASK * * ********************** * VTOC DISPLACEMENTS * ********************** * * VOLUME TABLE OF CONTENTS DISPLACEMENTS * VTC:FN EQU 0 FILE NAME VTC:MN EQU 8 MONITOR NUMBER (L-FILE) VTC:FS EQU 8 FILE SECTION NUMBER (S-FILE) VTC:SN EQU 9 SOP SWITCH NUMBER VTC:EN EQU 10 FILE EXTENT NUMBER VTC:EL EQU 12 FILE EXTENT LENGTH VTC:EB EQU 16 FILE EXTENT BASE VTC:LR EQU 20 LAST RECORD NUMBER VTC:RL EQU 24 RECORD LENGTH VTC:BF EQU 26 BLOCK FACTOR VTC:FO EQU 27 FILE ORGANIZATION VTC:CD EQU 28 CREATION DATE VTC:RP EQU 34 RETENTION PERIOD VTC:IF EQU 37 NUMBER OF INDEX FILES VTC:KA EQU 38 KEY ADDRESS IN RECORD VTC:NE EQU 40 NO OF FILE EXTENTS VTC:ST EQU 41 STATUS BYTE * EJECT FMTASK * * ********************* * FWT DISPLACEMENTS * ********************* * * FILE WORK TABLE DISPLACEMENTS * FWTLNK EQU /00 LINK NEXT FWT * IFT MMUPAG=0 FWTBAS EQU FWTLNK+/10 XIF * IFT MMUPAG=1 FWTBAS EQU FWTLNK+/14 XIF * FWTVTC EQU FWTBAS+/00 VTOC SECTOR NUMBER (FIRST EXTENT) FWTPAR EQU FWTBAS+/02 FILE ACCESS PARAMETERS FWTFNR EQU FWTBAS+/03 FILE NUMBER FWTTAB EQU FWTBAS+/04 TTAB FOR TASK WITH EXCLUSIVE ACCESS FWTEW1 EQU FWTBAS+/06 POINTER TO 2ND EWT BLOCK IN FWT FWTSEX EQU FWTBAS+/08 FILE SECTION/EXTENT NUMBER FWTEXL EQU FWTBAS+/0A EXTENT LENGTH IN SECTORS (FIRST EXTENT) FWTEW2 EQU FWTBAS+/0C POINTER TO NEXT EWT STRUCTURE FWTVOL EQU FWTBAS+/0E VOLUME FILE CODE (FIRST EXTENT) FWTEXB EQU FWTBAS+/10 EXTENT BASE (FIRST EXTENT) FWTNAM EQU FWTBAS+/12 FILE NAME FWTQUE EQU FWTBAS+/1A QUEUE ANCHOR FOR FILE I/O REQUESTS * EJECT FMTASK * * ********************* * EWT DISPLACEMENTS * ********************* * * EXTENT WORK TABLE DISPLACEMENTS * EWTLNK EQU 0 LINK NEXT EWT BLOCK * * BLOCK 1 * EWTSEX EQU 2 FILE SECTION/EXTENT NUMBER EWTEXL EQU 4 EXTENT LENGTH IN SECTORS * * BLOCK 2 * EWTVOL EQU 2 VOLUME FILE CODE EWTEXB EQU 4 EXTENT BASE * EWTLEN EQU 6 EXTENT WORK TABLE BLOCK LENGTH * EJECT FMTASK * * ********************* * FPB DISPLACEMENTS * ********************* * * FILE PARAMETER BLOCK DISPLACEMENTS * FPB:RL EQU 0 RECORD LENGTH FPB:BF EQU 2 BLOCK FACTOR FPB:FO EQU 3 FILE ORGANIZATION FPB:DT EQU 4 DEVICE TYPE =1 FPB:BO EQU 5 BASIC ORDERS FPB:NO EQU 6 FILE NUMBER =1 FPB:FN EQU 8 FILE NAME FPB:EL EQU 17 ENLARGE FPB:V1 EQU 18 VOLUME NAME 1 FPB:S1 EQU 24 SIZE 1 FPB:V2 EQU 28 VOLUME NAME 2 FPB:S2 EQU 34 SIZE 2 FPB:V3 EQU 38 VOLUME NAME 3 FPB:S3 EQU 44 SIZE 3 FPB:V4 EQU 48 VOLUME NAME 4 FPB:S4 EQU 54 SIZE 4 FPB:FR EQU 58 FILE RECORD NUMBER FPB:US EQU 62 NUMBER OF USERS FPB:SH EQU 64 SHAREABILITY FPB:MN EQU 65 MONITOR NUMBER FPB:SN EQU 66 SOP SWITCH NUMBER FPB:IF EQU 67 NUMBER OF INDEX FILES FPB:KA EQU 68 KEY ADDRESS IN RECORD FPB:CD EQU 70 CREATION DATE FPB:RP EQU 76 RETENTION PERIOD * FPBLEN EQU 80 FILE PARAMETER BLOCK LENGTH * EJECT FMTASK * * ********** * TTABFM * ********** * * FMTASK TTAB * IFT MMUPAG=1 RES 16 FMTASK MMU TABLE XIF * IFF MMUPAG+DSKPAG=0 DATA 0 CURRENT SEGMENT BASE (DUMMY) DATA 0 SEGMENT TABLE ADDRESS (DUMMY) DATA 0 SEGMENT BLOCK ADDRESS (DUMMY) XIF * DATA 0 ACB ADDRESS (DUMMY) * TTABFM EQU * TTABFM ENTRY DATA 0 DISPATCHER QUEUE LINK DATA '#A' TASK IDENTIFICATION DATA 49 PRIORITY LEVEL DATA 0 PENDING POINTER DATA /C4C0 PSW (PROGRAM STATUS WORD) DATA 0 DISPATCH ADDRESS DATA 0,0,0,0,0,0,0 REGISTER SAVE AREA, A1-A14 DATA FM:ECB A8 = FM:ECB ADDRESS DATA 0,0,0,0,0,0 DATA 2 TASK DEVICE TABLE (DUMMY) * EJECT FMTASK * * ***************************** * ECB, STACK AND DATA AREAS * ***************************** * * FM:ECB DATA /8000,0,0 FMTASK ECB AREA DATA 0,0,0,0 * DATA 0,0 FMTASK STACK (5 LEVELS) DATA 0,0 DATA 0,0 DATA 0,0 DATA 0,0 FM:STB EQU *-2 FMTASK STACK BASE * FEXTNO DATA 0 NO OF FILE EXTENTS FILCOD DATA 0,0 FILE CODE TABLE RETCOD DATA 0 ACKUMULATED RETURN CODE TTAB DATA 0 TTAB ADDRESS CALLING TASK VOLUME DATA 0 CURRENT VOLUME FILE CODE POINTER * IFT MMUPAG=1 FM:FPB RES 40 FILE PARAMETER BLOCK AREA XIF * EJECT FMTASK * * ********** * FMINIT * ********** * * * FMINIT IS THE FILE MANAGEMENT INITIALIZATION ROUTINE. * IT IS CALLED FROM PFINIT AFTER IPL AND AT POWER ON. * WHEN CALLED AT POWER ON, AN IMMEDIATE RETURN IS MADE. * * FMINIT WILL ZEROIZE THE FWT AREA, AND LINK THE FWT:S * TOGETHER. THE POINTER FWTEW1 IS ALSO INITIALIZED, AS * WELL AS FWTFNR (FILE NUMBER). * FMINIT ALSO HOLDS INITIALIZATION ROUTINES FOR * (EXTENDED) DATA MANAGEMENT. * THE PART OF FMINIT THAT IS NOT EXECUTED AT POWER ON * WILL BE USED AS THE INTERNAL BUFFER FOR THE FMTASK. * FMINIT EQU * FMINIT ENTRY LDKL A1,/F03E RTNA15 INSTRUCTION CODE ST A1,FMINIT CLOSE THE DOOR * * FMTASK DISC SECTOR BUFFER * FM:BUF EQU FMINIT+2 INITIALIZATION ROUTINE USED AS BUFFER * FMINI2 EQU * INITIALIZATION ROUTINE ENTRY RES 125 * EJECT FMTASK * * PERFORM INITIALIZATION * FMI:00 EQU * RORG FMINI2 PUT THE CODE BELOW INTO FM:BUF LD A1,SCTFWT FWT CHAIN START ADDRESS LD A4,SCTNOF NUMBER OF FILES LDK A5,0 LDKL A6,/8000 DWT BUSY BIT * FMI:30 EQU * * IFF ADMEDM+SDM=0 =7 IFT MMUPAG=1 LDKL A8,FDBMEC FDB MMU ECB DISPLACEMENT IN FWT ADR A8,A1 MMU ECB ADDRESS XIF * LDR A2,A1 CURRENT FWT ADDRESS LDR A3,A1 AD A3,SCTFWL NEXT FWT ADDRESS ADK A5,1 NEXT FILE NUMBER SUK A4,1 RF(N) FMI:50 INITIALIZATION COMPLETED RF(Z) FMI:40 ONE FWT LEFT TO INITIALIZE STR A3,A1 LINK CURRENT FWT TO THE NEXT FWT ADK A1,2 INCREMENT FWT POINTER * EJECT FMTASK * * FMI:40 EQU * CMR A1 ADK A1,2 INCREMENT FWT POINTER CWR A1,A3 CHECK IF END OF THIS FWT RB(NE) FMI:40 NOT END OF THE FWT SU A3,SCTFWL ADK A3,FWTEW2 FWTEW2 ADDRESS ST A3,FWTEW1,A2 INITIALIZE FWTEW1 POINTER ST A5,FWTFNR,A2 SET FILE NUMBER IN FWT ST A6,DWTST,A2 INDICATE FWT NOT BUSY * IFF ADMEDM+SDM=0 =7 IFT MMUPAG=1 ST A8,DWTMEC,A2 SET MMU ECB ADDRESS XIF * IFF ADMEDM+SDM=0 LDKL A7,TIODM =5 ST A7,DWTADR,A2 =5 XIF =5 RB FMI:30 CONTINUE WITH NEXT FWT * =4 EJECT FMTASK * * COMPUTE NVL BIT MASK * FMI:50 EQU * LDK A1,0 =4 LDK A2,1 LDKL A3,NVLTAB NVLTAB ADDRESS * FMI:80 EQU * LDR* A4,A3 GET ONE ENTRY FROM NVLTAB RF(Z) FMI:85 THIS ENTRY NOT USED ORR A1,A2 INDICATE TTAB PRESENT * FMI:85 EQU * ADR A2,A2 ADK A3,2 INCREMENT NVLTAB POINTER CWK A3,NVLEND CHECK IF END OF NVLTAB RB(NE) FMI:80 NOT END OF NVLTAB ORR A1,A2 ADD ONE BIT FOR USER TASKS ST A1,NVLBIT SET NVL BIT MASK * IFT SDM=1 ABL SDMINI PERFORM DM INITIALIZATION AND RETURN XIF * =2 EJECT FMTASK * * IFT EDM=1 * * INITIALIZE ALL EDM TASKS * LDKL A1,DWDM01 PARAMETER BLOCK ADDRESS ADKL A1,DWTPAB LDK A2,2 INDICATE INITIALIZATION SCR A2,A1 LDKL A7,'$D' TASK ID,FIRST EDM TASK LD A3,SCTDMT EDM TASKS IN SYSTEM * FMI:90 EQU * SRC A3,1 RF(NN) FMI:99 NEXT TASK CF A15,FNDTID FIND (E)DM TASK TTAB ADDRESS LDR A5,A2 RF(Z) FMIHLT TTAB NOT FOUND =2 * EJECT FMTASK * * LD A4,SCTMOX ADDRESS OF DISPATCH ADDRESS TABLE LDR A2,A4 ADR* A2,A4 END ADDRESS SUK A4,2 ADJUST POINTER * FMI:95 EQU * ADK A4,4 NEXT ENTRY CWR* A7,A4 RB(NE) FMI:95 NOT SAME ID LD A2,2,A4 DISPATCH ADDRESS CF A15,ACTOT ACTIVATE EDM TASK * FMI:99 EQU * ADK A7,1 NEXT EDM TASK ANK A3,/FF =6 RB(NZ) FMI:90 MORE TASKS TO ACTIVATE XIF * RTN A15 FM/EDM INITIALIZATION COMPLETED, RETURN * * TTAB NOT FOUND =2 * FMIHLT EQU * =2 LDK A1,/11 DM ERROR =2 CF A15,HALT =2 RORG FMI:00 END OF RELOCATION * EJECT FMTASK * * ********** * FMTASK * ********** * * * THE FILE MANAGEMENT TASK PERFORMS * FILE ADMINISTRATION FUNCTIONS. IT * IS ACTIVATED BY THE FILE MANAGEMENT * LKM PROCESSOR 'TIOFM' AT ENTRY FMTASK BELOW. * AFTER SOME HOUSEKEEPING THE FOLLOWING * MODULES WILL PERFORM THE FILE ADMINISTRATION: * * - FMOPEN OPEN/CREATE/EXTEND FILE (OPTIONS: 0, 2, 1) * - FMCLOS CLOSE/DELETE FILE ( " : 0, 2) * - FMRPAR READ FILE PARAMETERS ( " : 0) * * NOTICE THAT FUNCTIONS CREATE/EXTEND/DELETE ARE SITUATED * IN MODULE 'FMCDEF' BUT LOGICALLY BELONG TO OPEN/CLOSE. * * A SPECIAL ENTRY IS USED FOR I/O * FUNCTIONS WHERE REQUESTED SECTORS ARE * SPLIT OVER TWO OR MORE FILE EXTENTS: * * - FMSPLI READ/WRITE (SPLIT I/O) (OPTIONS: 0) * * * ENTRY PARAMETERS: * * A1 = ORDER OPTION AND CODE (RFP/OPEN/CLOSE) * = PARAMETER BLOCK ADDRESS (SPLIT I/O) * A3 = TTAB ADDRESS OF CALLING TASK * A4 = FUNCTION INDEX (0 = RFP, 2 = OPEN, 4 = CLOSE, 6 = SPLIT I/O) * A8 = FM:ECB ADDRESS * EJECT FMTASK * * FMTASK EQU * FMTASK ACTIVATION ENTRY * * PERFORM SOME HOUSEKEEPING * CM ECBCW1,A8 CLEAR 1ST CW LDR A5,A3 TTAB ADDRESS OF CALLING TASK ST A5,TTAB SAVE TTAB ADDRESS CALLING TASK LDR A7,A1 SAVE PARAMETER * IFT CPU852=1 LDKL A2,FM:BUF FMTASK DISC SECTOR BUFFER ST A2,ECBBA,A8 SET BUFFER ADDRESS IN ECB LDKL A2,256 ST A2,ECBRL,A8 SET REQUESTED LENGTH IN ECB XIF * IFT CPU852=0 MLK 3 DATA /8000,FM:BUF,256 MSR 3,A8 INITIALIZE FM:ECB LDR A1,A7 RESTORE PARAMETER XIF * CM RETCOD RESET RETURN CODE LD A9,TTB:SA+16,A5 USER ECB ADDRESS LDKL A14,FM:STB FMTASK STACK BASE * IFT MMUPAG=0 LD A10,ECBBA,A9 FPB/BUFFER ADDRESS XIF * IFT MMUPAG=1 LDKL A3,TTABFM FMTASK TTAB ADDRESS TL TTB:MT,A5 USER MMU TABLE TS TTB:MT,A3 STORE IN FMTASK MMU TABLE EL A10,ECBBA,A9 USER FPB/BUFFER ADDRESS XIF * EJECT FMTASK * * BRANCH TO APPROPRIATE FUNCTION HANDLER. * * THE FOLLOWING PARAMETERS ARE SUPPLIED TO * THE RESP. FUNCTION HANDLER: * * A1 = ORDER OPTION * A5 = TTAB ADDRESS OF CALLING TASK * A7 = COMPLETE PARAMETER FROM A1 * A8 = FM:ECB ADDRESS * A9 = USER ECB ADDRESS * A10 = FPB ADDRESS * ANK A1,/FF ORDER OPTION ABI ORDTAB,A4 BRANCH TO FUNCTION HANDLER * ORDTAB EQU * ADDRESSES TO FUNCTION HANDLERS DATA FMRPAR READ FILE PARAMETERS DATA FMOPEN OPEN/CREATE/EXTEND FILE DATA FMCLOS CLOSE/DELETE FILE * IFT MULEXT=1 DATA FMSPLI SPLIT I/O XIF * IFT MULEXT=0 DATA FM:RQE SPLIT I/O NOT INCLUDED XIF * EJECT FMTASK * * ********** * FMOPEN * ********** * * * FILE MANAGEMENT ADMINISTRATION FUNCTIONS: * OPEN/CREATE/EXTEND FILE * * ENTRY PARAMETERS: * * A1 = ORDER OPTION * A8 = FM:ECB ADDRESS * A9 = USER ECB ADDRESS * A10 = FPB ADDRESS * FMOPEN EQU * OPEN/CREATE/EXTEND FILE LDR A13,A1 SAVE ORDER OPTION * IFT MMUPAG=1 * * MOVE USER FPB TO SYSTEM FPB (FM:FPB) * LDR A1,A10 USER FPB ADDRESS LDKL A2,FM:FPB FM FPB ADDRESS LDR A10,A2 SAVE IT LDK A3,FPBLEN FPB LENGTH (BYTES) MVUS A3 MOVE USER FPB TO FM:FPB XIF * EJECT FMTASK * * LDKL A5,FILCOD FILE CODE TABLE ADDRESS LDK A7,FPB:V1 1ST VOLUME NAME DISPLACEMENT IN FPB * * CHECK IF ANY VOLUME NAME SPECIFIED * FMOP00 EQU * LDR A2,A10 FPB ADDRESS ADR A2,A7 POINT TO VOLUME NAME LDR* A2,A2 FIRST WORD OF VOLUME NAME RF(Z) FMOP20 NO VOLUME NAME SPECIFIED SUKL A2,/2020 CHECK IF SPACES RF(Z) FMOP20 NO VOLUME NAME SPECIFIED LDKL A4,DFTAB-1 DISC FILE CODE TABLE ADDRESS-1 * * CONVERT VOLUME NAME TO FILE CODE * FMOP10 EQU * LDK A2,0 ADK A4,1 POINT TO NEXT FILE CODE CWK A4,DFTABE CHECK IF END OF DFTAB RF(E) FM:INE FILE CODE NOT FOUND, RETURN LCR A2,A4 NEXT FILE CODE CF A14,FNDNAM FIND VOLUME NAME ADDRESS LDR A2,A10 FPB ADDRESS ADR A2,A7 POINT TO CURRENT VOLUME NAME IN FPB LDK A3,6 VOLUME NAME LENGTH CF A14,CMPSTR COMPARE VOLUME NAMES RB(NE) FMOP10 VOLUME NAMES NOT EQUAL LCR A2,A4 FILE CODE SC A3,DWTNVL+1,A6 CLEAR NVL BITS (A3 = 0 FROM CMPSTR) * EJECT FMTASK * * STORE FILE CODE (OR ZERO) IN FILE CODE TABLE (FILCOD) * FMOP20 EQU * SCR A2,A5 SAVE FILE CODE ADK A5,1 ADK A7,FPB:V2-FPB:V1 NEXT VOLUME NAME DISPLACEMENT CWK A5,FILCOD+4 CHECK IF END OF TABLE RB(NE) FMOP00 MORE VOLUMES TO CHECK SUK A5,4 FILE CODE TABLE ADDRESS * * GET FILE CODE OF FIRST SPECIFIED VOLUME * FMOP30 EQU * LCR A7,A5 ONE FILE CODE ANK A7,/FF RF(NZ) FMOP40 FIRST FILE CODE TO TREAT ADK A5,1 POINT TO NEXT FILE CODE CWK A5,FILCOD+4 CHECK IF END OF TABLE RB(NE) FMOP30 CHECK NEXT FILE CODE * * VOLUME/FILE NOT FOUND * FM:INE EQU * VOLUME/FILE NOT FOUND LDKL A4,/8800 RETURN CODE RF ER:RTN * EJECT FMTASK * * CHECK ORDER OPTION * FMOP40 EQU * ST A5,VOLUME CURRENT VOLUME FILE CODE ADDRESS LDR A4,A13 ORDER OPTION RF(Z) OPEN OPEN FILE * IFT FMCDEF=1 SUK A4,1 ABL(Z) EXTEND EXTEND FILE SUK A4,1 ABL(Z) CREATE CREATE FILE XIF * * REQUEST ERROR * FM:RQE EQU * REQUEST ERROR EXIT LDKL A4,/8000 RETURN CODE RF ER:RTN * EJECT FMTASK * * ******** * OPEN * ******** * * * ENTRY PARAMETERS: * * A4 = 0 * A5 = VOLUME FILE CODE ADDRESS IN FILCOD * A7 = FILE CODE, FIRST VOLUME * A8 = FM:ECB ADDRESS * A9 = USER ECB ADDRESS * A10 = FPB ADDRESS * OPEN EQU * OPEN FILE * EJECT FMTASK * * CHECK IF FILE IS ALREADY OPENED AND * FIND FWT ADDRESS * LD A12,SCTFWT FWT CHAIN START ADDRESS * OP:005 EQU * LDK A2,1 * OP:010 EQU * LDR A6,A12 NEXT FWT ADDRESS RF(Z) OP:060 NO MORE FWT:S AVAILABLE LDR* A12,A6 FIRST WORD OF FWT TM A12,A2 CHECK IF USED RF(NZ) OP:015 USED, CHECK FILE NAME ADK A4,0 CHECK IF FREE FWT ADDRESS ALREADY SAVED RB(NZ) OP:010 YES, DON'T SAVE IT LDR A4,A6 NO, SAVE THIS FWT ADDRESS RB OP:010 CONTINUE SEARCH * OP:015 EQU * XRR A12,A2 RESET FWT USED BIT LDR A2,A10 FPB ADDRESS ADK A2,FPB:FN CF A14,CMPFIL COMPARE FILE NAMES RB(NE) OP:005 FILE NAMES NOT EQUAL CC A7,FWTVOL,A6 CHECK FILE CODE OF FIRST EXTENT RB(NE) OP:005 NOT THIS FILE * EJECT FMTASK * * FILE IS ALREADY OPENED: * CHECK ATTACH PARAMETER AND NUMBER OF USERS * IFT ATTDET=1 LC A1,FPB:SH,A10 SHAREABILITY PARAMETER ANK A1,/FF RF(Z) OP:020 NO ATTACH REQUESTED LD A2,FWTTAB,A6 ATTACH WORD (TTAB ADDRESS) RF(Z) OP:018 FILE NOT ATTACHED CW A2,TTAB CHECK IF ATTACHED BY THIS TASK RF(NE) OP:040 NO, ATTACHED TO ANOTHER TASK * OP:018 EQU * LD A5,TTAB TTAB ADDRESS CALLING TASK ST A5,FWTTAB,A6 INDICATE ATTACHED XIF * OP:020 EQU * LC A1,FWTPAR,A6 ACCESS PARAMETERS LDR A2,A1 ANK A1,/3F NUMBER OF USERS SUK A1,/3F ABL(NZ) OPEXIT * EJECT FMTASK * * ERROR EXITS * LDKL A4,/0210 RETURN CODE (TOO MANY USERS) RF ER:RTN * OP:030 EQU * NO FREE FWT AVAILABLE LDKL A4,/8400 RETURN CODE * IFT ATTDET=1 RF ER:RTN * OP:040 EQU * FILE ATTACHED LDK A4,/40 RETURN CODE XIF * ER:RTN EQU * ORS A4,RETCOD PREPARE RETURN CODE ABL FMEXIT RETURN * EJECT FMTASK * * FILE IS NOT OPENED BEFORE: * FIND ALL FILE EXTENTS, BUILD FWT AND EWT:S * * MOVE FILE NAME FROM FPB TO FWT * OP:060 EQU * LDR A6,A4 FREE FWT ADDRESS RB(Z) OP:030 NO FREE FWT AVAILABLE LDR A1,A10 FPB ADDRESS ADK A1,FPB:FN LDR A3,A6 FWT ADDRESS ADK A3,FWTNAM CF A14,FM:MV8 MOVE FILE NAME LDR A2,A7 RESTORE FILE CODE * EJECT FMTASK * * ********* * OPEXT * ********* * * * OPEN EXTENDED FILE (CALLED FROM EXTEND) * * A2 = DISC FILE CODE * A6 = FWT ADDRESS * A8 = FM:ECB ADDRESS * A9 = USER ECB ADDRESS * A10 = FPB ADDRESS * OPEXT EQU * ENTRY USED BY EXTEND FILE OP:070 EQU * * * FIND ONE FILE EXTENT * CM FEXTNO RESET NO OF FILE EXTENTS LD A5,TTAB TTAB ADDRESS OF CALLING TASK CF A14,FNDVTC FIND VTOC ENTRY * OP:075 EQU * LDR A11,A2 SAVE CURRENT VTOC SECTOR NUMBER RF(NZ) OP:080 ONE FILE EXTENT FOUND ADK A4,0 CHECK DISC RETURN CODE RF(Z) OP:160 NO MORE FILE EXTENTS ON THIS VOLUME ABL OPCLOS DISC ERROR, CLOSE FILE * EJECT FMTASK * * MOVE EXTENT LENGTH AND EXTENT BASE * TO FWT AND/OR EWT BLOCKS * OP:080 EQU * LD A3,VTC:EN,A13 FILE EXTENT NUMBER LD A2,VTC:FO,A13 FILE ORGANIZATION ANK A2,/FF SUK A2,'L' RF(Z) OP:085 L-FILE LD A2,VTC:FS,A13 FILE SECTION NUMBER SLL A2,6 ORR A2,A3 FILE SECTION AND EXTENT NUMBER ECR A2,A2 * IFT FMCDEF=1 LC A4,TTB:SA+14,A5 ORDER OPTION SRC A4,1 CHECK IF EXTEND RF(NN) OP:085 NOT EXTEND CW A3,SEXTNO CHECK IF VTOC ALREADY TREATED RF(NG) OP:110 YES, SKIP THIS VTOC XIF * OP:085 EQU * LC A2,VTC:EL+1,A13 FILE EXTENT LENGTH LD A1,VTC:EL+2,A13 ADK A3,0 SET CR RF(Z) OP:095 FIRST FILE EXTENT * OP:090 EQU * INH CF A15,GETBLK EWT BLOCK 1 RF OP:100 * EJECT FMTASK * * OP:095 EQU * LC A4,VTC:NE,A13 NO OF FILE EXTENTS ANK A4,/FF NGR A4,A4 NEGATE VALUE ADS A4,FEXTNO LD A4,FWTVTC,A6 VTOC SECTOR NUMBER, FIRST EXTENT RB(NZ) OP:090 FIRST EXTENT ALREADY FOUND ST A2,FWTEXL-2,A6 STORE FILE EXTENT LENGTH, FIRST EXTENT ST A1,FWTEXL,A6 * OP:100 EQU * LDR* A2,A8 VOLUME FILE CODE ECR A2,A2 FILE CODE NOW IN LEFT BYTE LC A2,VTC:EB+1,A13 FILE EXTENT BASE LD A1,VTC:EB+2,A13 OR A3,FWTVTC,A6 CHECK IF FIRST EXTENT RF(NZ) OP:120 NOT FIRST FILE EXTENT ST A2,FWTEXB-2,A6 STORE FILE EXTENT BASE, FIRST EXTENT ST A1,FWTEXB,A6 ST A11,FWTVTC,A6 STORE VTOC SECTOR NUMBER, FIRST EXTENT * * FIND REMAINING EXTENTS FOR THIS FILE * OP:110 EQU * IM FEXTNO INDICATE ONE MORE EXTENT FOUND RF(Z) OP:160 NO MORE FILE EXTENTS ON THIS VOLUME CF A14,FNDVT3 FIND NEXT VTOC ENTRY RB OP:075 * EJECT FMTASK * * INSERT NEW EWT BLOCKS IN EWT CHAIN * OP:120 EQU * LDR A3,A4 ADDRESS EWT BLOCK 1 CF A15,GETBLK EWT BLOCK 2 ENB STR A4,A3 LINK EWT2 TO EWT1 LDR A1,A6 FWT ADDRESS ADK A1,FWTEW2 * OP:130 EQU * LDR* A2,A1 ADDRESS NEXT EWT STRUCTURE RF(NZ) OP:150 * OP:140 EQU * STR A2,A4 INSERT NEW EWT BLOCK STR A3,A1 RB OP:110 CONTINUE * OP:150 EQU * LC A11,EWTSEX,A2 FILE SECTION AND EXTENT NUMBER CC A11,EWTSEX,A3 RB(G) OP:140 INSERT NEW EWT BLOCKS LDR* A1,A2 ADDRESS TO 2ND EWT BLOCK RB OP:130 * * CHECK IF MORE VOLUMES SPECIFIED * OP:160 EQU * IM VOLUME NEXT VOLUME FILE CODE ADDRESS LD A7,VOLUME VOLUME FILE CODE ADDRESS CWK A7,FILCOD+4 CHECK IF END OF TABLE RF(E) OP:170 ALL VOLUMES CHECKED * EJECT FMTASK * * IFT FMCDEF=1 LDKL A2,-1 ST A2,SEXTNO RESET START EXTENT NUMBER XIF * LCR A2,A7 NEXT FILE CODE ANK A2,/FF RB(NZ) OP:070 NEXT VOLUME RB OP:160 * OP:170 EQU * LD A2,FWTVTC,A6 VTOC SECTOR NUMBER, FIRST EXTENT ABL(Z) FM:INE NO FILE EXTENT FOUND * IFT FMCDEF=1 LC A2,TTB:SA+14,A5 ORDER OPTION SRC A2,1 CHECK IF EXTEND RF(N) FM:270 YES, RETURN XIF * * CHECK ATTACH PARAMETER * IFT ATTDET=1 LC A2,FPB:SH,A10 SHAREABILITY PARAMETER ANK A2,/FF RF(Z) OP:240 NO ATTACH REQUESTED LDR A2,A5 TTAB ADDRESS * OP:240 EQU * ST A2,FWTTAB,A6 SET ATTACH WORD XIF * IMR A6 INDICATE FWT USED (BIT 15 IN 1ST WORD) LDK A2,/40 PREPARE FOR BASIC ORDERS * EJECT FMTASK * * COMMON EXIT FOR ACCEPTED OPEN REQUESTS: * CHECK BASIC ORDERS PARAMETER, INCREMENT NUMBER OF USERS * BY ONE AND RETURN FILE NUMBER FOR THIS FILE TO THE USER * OPEXIT EQU * LD A1,FPB:BO,A10 BASIC ORDERS PARAMETERS ANK A1,/FF RF(NZ) OP:260 BASIC ORDERS WANTED, NO ACTION ANK A2,/BF PHYSICAL ORDERS REQUESTED * OP:260 EQU * ADK A2,1 ADD ONE USER TO THIS FILE SC A2,FWTPAR,A6 SET NEW ACCESS PARAMETERS * IFT MMUPAG=0 LD A4,FWTFNR,A6 FILE NUMBER SC A4,ECBFN,A9 SET FILE NUMBER IN ECB XIF * IFT MMUPAG=1 ELR A4,A9 LC A4,FWTFNR,A6 FILE NUMBER ESR A4,A9 SET FILE NUMBER IN ECB XIF * FM:270 EQU * RF OCEXIT RETURN VIA OPEN/CLOSE EXIT * EJECT FMTASK * * ********** * FMCLOS * ********** * * * FILE MANAGEMENT ADMINISTRATION FUNCTIONS: * CLOSE/DELETE FILE * * ENTRY PARAMETERS: * * CR = 0 IF CLOSE, ELSE CR > 0 * A1 = ORDER OPTION * A5 = TTAB ADDRESS OF CALLING TASK * A8 = FM:ECB ADDRESS * A9 = USER ECB ADDRESS * A10 = FPB ADDRESS * FMCLOS EQU * CLOSE/DELETE FILE * * CHECK ORDER OPTION * IFT FMCDEF=0 ABL(NZ) FM:RQE ILLEGAL ORDER OPTION XIF * IFT FMCDEF=1 RF(Z) CLOSE CLOSE FILE SUK A1,2 ABL(Z) DELETE DELETE FILE ABL FM:RQE ILLEGAL ORDER OPTION XIF * EJECT FMTASK * * ********* * CLOSE * ********* * * ENTRY PARAMETERS: * * A5 = TTAB ADDRESS OF CALLING TASK * A8 = FM:ECB ADDRESS * A9 = USER ECB ADDRESS * A10 = FPB ADDRESS * * CLOSE EQU * CLOSE FILE CF A14,RDVTOC READ VTOC RECORD (FIRST EXTENT) ADK A4,0 CHECK RETURN CODE RF(NZ) CL:000 ERROR LD A3,FWTPAR,A6 ACCESS PARAMETERS RF(NN) CL:005 NOT NVL LDK A4,/20 SET NVL IN RETURN CODE * * ERROR AT CLOSE: CHECK HOW SERIOUS * CL:000 EQU * ORS A4,RETCOD PREPARE RETURN CODE * IFT ATTDET=1 SUK A4,/40 RF(Z) OCEXIT FILE ATTACHED, DON'T CLOSE XIF * ADK A6,0 CHECK FWT ADDRESS RF(Z) OCEXIT NO FWT FOUND, RETURN RF CL:010 DON'T WRITE VTOC * EJECT FMTASK * * MOVE FRN FROM FPB TO VTOC * CL:005 EQU * IFT MMUPAG=0 IFT CPU852=1 LD A1,FPB:FR,A10 FILE RECORD NUMBER LD A2,FPB:FR+2,A10 ST A1,VTC:LR,A13 SET LRN IN VTOC RECORD ST A2,VTC:LR+2,A13 XIF * IFT MMUPAG=0 IFT CPU852=0 ML 2,FPB:FR,A10 FILE RECORD NUMBER MS 2,VTC:LR,A13 SET LRN IN VTOC RECORD XIF * IFT MMUPAG=1 EL A1,FPB:FR,A10 FILE RECORD NUMBER EL A2,FPB:FR+2,A10 MS 2,VTC:LR,A13 SET LRN IN VTOC RECORD XIF * * WRITE VTOC TO DISC WITH NEW FILE RECORD NUMBER IF REQUESTED * ORR A1,A2 CHECK FILE RECORD NUMBER RF(Z) CL:010 FRN ZERO, DON'T WRITE VTOC LDK A7,/95 PHYSICAL WRITE CF A14,FM:IO WRITE VTOC RECORD TO DISC * EJECT FMTASK * * DECREMENT NUMBER OF USERS FOR THIS FILE BY ONE. * FWT AND EWT ARE RELEASED IF NO USER REMAINS. * CL:010 EQU * LC A1,FWTPAR,A6 ACCESS PARAMETERS LDR A2,A1 ANK A2,/3F NUMBER OF USERS SUK A2,1 DECREMENT NO OF USERS BY ONE * IFT MMUPAG=0 SC A2,FPB:US,A10 RETURN REMAINING NO OF USERS XIF * IFT MMUPAG=1 EL A3,FPB:US,A10 ANK A3,/FF ECR A2,A2 NUMBER OF USERS TO LEFT BYTE ORR A3,A2 ES A3,FPB:US,A10 RETURN REMAINING NO OF USERS SRL A2,8 NUMBER OF USERS TO RIGHT BYTE XIF * RF(P) DLCLO2 DON'T RELEASE FWT IF ANY USER LEFT * EJECT FMTASK * * ********** * DLCLO1 * * OPCLOS * ********** * * * RELEASE FWT AND EWT BLOCKS * * INPUT: A6 = FWT ADDRESS * A9 = USER ECB ADDRESS * DLCLO1 EQU * ENTRY USED BY DELETE FILE LDK A2,1 XRRS A2,A6 RESET USED BIT IN FWT * OPCLOS EQU * ENTRY USED BY OPEN FILE LD A4,FWTEW2,A6 ADDRESS TO FIRST EWT STRUCTURE RF(Z) CL:030 NO MORE BLOCKS TO RELEASE * * RETURN EWT BLOCKS TO MONITOR BLOCK POOL * CL:020 EQU * INH CF A15,FREBLK RELEASE EWT BLOCK ENB LDR A4,A3 EWT BLOCK ADDRESS RB(NZ) CL:020 CM FWTEW2,A6 RESET EWT STRUCTURE POINTER * CL:030 EQU * CM FWTVTC,A6 RESET VTOC SECTOR NUMBER RF CL:050 RETURN * EJECT FMTASK * * DLCLO2 EQU * ENTRY USED BY DELETE FILE ANK A1,/C0 SKIP NUMBER OF USERS ORR A1,A2 PUT TOGETHER ACCESS PARAMETERS SC A1,FWTPAR,A6 * * DETACH FILE * CL:050 EQU * IFT FMCDEF=1 LD A5,TTAB TTAB ADDRESS OF CALLING TASK XIF * IFT ATTDET=1 INH CF A15,DET:FM DETACH FILE XIF * OCEXIT EQU * OPEN/CLOSE COMMON EXIT LABEL ABL FMEXIT * EJECT FMTASK * * ********** * FMRPAR * ********** * * * FILE MANAGEMENT ADMINISTRATION FUNCTIONS: * READ FILE PARAMETERS * * ENTRY PARAMETERS: * * CR = 0 IF LEGAL ORDER OPTION * A1 = ORDER OPTION * A5 = TTAB ADDRESS OF CALLING TASK * A8 = FM:ECB ADDRESS * A9 = USER ECB ADDRESS * A10 = FPB ADDRESS * FMRPAR EQU * READ FILE PARAMETERS * * CHECK ORDER OPTION * ABL(NZ) FM:RQE ILLEGAL ORDER OPTION * IFT MMUPAG=1 LDKL A10,FM:FPB SYSTEM FPB ADDRESS XIF * EJECT FMTASK * * CF A14,RDVTOC READ VTOC RECORD (FIRST EXTENT) ADK A4,0 CHECK RETURN CODE RF(NZ) FMEXIT ERROR, RETURN SC A4,FPB:BO,A10 RESET BASIC ORDER PARAMETER * * MOVE SPACES TO VOLUME NAMES * AND RESET FILE SECTION SIZES. * IFT CPU852=1 LDR A1,A10 FPB ADDRESS ADK A1,FPB:V1 1ST VOLUME NAME LDK A2,4 LOOP COUNTER, OUTER LOOP LDK A4,/20 SPACE * FMR:02 EQU * OUTER LOOP ENTRY LDK A3,6 LOOP COUNTER, INNER LOOP * FMR:04 EQU * INNER LOOP ENTRY SCR A4,A1 MOVE SPACES TO VOLUME NAME ADK A1,1 SUK A3,1 RB(P) FMR:04 CMR A1 RESET FILE SECTION SIZE CM 2,A1 ADK A1,FPB:V2-FPB:S1 NEXT VOLUME NAME SUK A2,1 RB(P) FMR:02 XIF * IFT CPU852=0 MLK 3 DATA /2020,/2020,/2020 LDK A5,0 (A4 = 0 FROM RDVTOC) MS 5,FPB:V1,A10 MS 5,FPB:V2,A10 MS 5,FPB:V3,A10 MS 5,FPB:V4,A10 XIF * EJECT FMTASK * * MOVE PARAMETERS FROM VTOC AND FWT TO FPB * IFT CPU852=1 LD A1,VTC:RL,A13 RECORD LENGTH STR A1,A10 LD A1,VTC:BF,A13 BLOCK FACTOR AND FILE ORGANIZATION ST A1,FPB:BF,A10 LD A1,VTC:LR,A13 LAST RECORD NUMBER ST A1,FPB:FR,A10 LD A1,VTC:LR+2,A13 LRN, PART 2 ST A1,FPB:FR+2,A10 LD A1,VTC:MN,A13 MONITOR AND SOP SWITCH NUMBER ECR A1,A1 SC A1,FPB:MN,A10 STORE MONITOR NUMBER LC A1,VTC:IF,A13 NUMBER OF INDEX FILES ST A1,FPB:IF,A10 LD A1,VTC:KA,A13 KEY ADDRESS IN RECORD ST A1,FPB:KA,A10 XIF * IFT CPU852=0 ML 4,VTC:LR,A13 LRN, RECORD LENGTH AND BLOCK FACTOR MS 2,FPB:FR,A10 STR A3,A10 ST A4,FPB:BF,A10 LD A1,VTC:MN,A13 MONITOR AND SOP SWITCH NUMBER ECR A1,A1 LDR A2,A1 LC A2,VTC:IF,A13 NUMBER OF INDEX FILES LD A3,VTC:KA,A13 KEY ADDRESS IN RECORD MS 3,FPB:MN,A10 XIF * IFT ATTDET=1 LD A1,FWTTAB,A6 SHAREABILITY PARAMETER RF(Z) FMR:05 NOT ATTACHED LDK A1,1 XIF * IFT ATTDET=0 LDK A1,0 NOT ATTACHED XIF * FMR:05 EQU * SC A1,FPB:SH,A10 SET ATTACH PARAMETER * EJECT FMTASK * * LD A1,FWTPAR,A6 ACCESS PARAMETERS SLL A1,1 RF(NN) FMR:10 PHYSICAL ORDERS FOR THIS FILE LDK A2,1 SC A2,FPB:BO,A10 INDICATE BASIC ORDERS * FMR:10 EQU * SLC A1,7 ANK A1,/3F NUMBER OF USERS SC A1,FPB:US,A10 * * MOVE CREATION DATE AND RETENTION PERIOD * LDR A1,A13 VTOC ADDRESS ADK A1,VTC:CD LDR A3,A10 FPB ADDRESS ADK A3,FPB:CD LDK A2,9 NO OF CHARACTERS TO MOVE CF A14,FM:MOV MOVE CREATION DATE AND RETENTION PERIOD * * MOVE FILE NAME FROM FWT TO FPB * LDR A1,A6 FWT ADDRESS ADK A1,FWTNAM SUK A3,FPBLEN-FPB:FN-1 POINT TO FILE NAME CF A14,FM:MV8 MOVE FILE NAME ADK A6,FWTEW1 ADDRESS TO FIRST EWT STRUCTURE LDR A11,A6 LDR* A12,A11 ADDRESS TO 2ND EWT BLOCK * EJECT FMTASK * * MOVE VOLUME NAME FROM DWT TO FPB * FMR:20 EQU * LDR A3,A10 FPB ADDRESS ADK A3,FPB:V1-10 LD A1,EWTSEX,A11 FILE SECTION AND EXTENT NUMBER SLC A1,2 ANK A1,3 FILE SECTION NUMBER * FMR:30 EQU * ADK A3,FPB:V2-FPB:V1 COMPUTE VOLUME NAME DISPLACEMENT SUK A1,1 RB(NN) FMR:30 LC A2,EWTVOL,A12 DISC FILE CODE LDR A13,A2 SAVE FILE CODE CF A14,FNDNAM FIND VOLUME NAME ADDRESS CF A14,FM:MOV MOVE VOLUME NAME * IFT CPU852=1 LD A1,EWTEXL-2,A11 FILE EXTENT LENGTH ANK A1,/FF LD A2,EWTEXL,A11 XIF * IFT CPU852=0 ML 2,EWTEXL-2,A11 FILE EXTENT LENGTH ANK A1,/FF XIF * EJECT FMTASK * * COMPUTE FILE SECTION SIZE * FMR:35 EQU * LDR* A11,A12 ADDRESS TO NEXT EWT STRUCTURE RF(Z) FMR:50 END OF EWT CHAIN LD A6,EWTEXL-2,A11 FILE EXTENT LENGTH ANK A6,/FF LD A7,EWTEXL,A11 LDR* A12,A11 ADDRESS TO 2ND EWT BLOCK CC A13,EWTVOL,A12 CHECK FILE CODE RF(NE) FMR:50 END OF THIS FILE SECTION * IFT CPU852=0 DAR A6 ACKUMULATE FILE SECTION LENGTH RB FMR:35 * FMR:50 EQU * MSR 2,A3 STORE FILE SECTION SIZE IN FPB XIF * IFT CPU852=1 ADR A1,A6 ACKUMULATE FILE SECTION LENGTH ADR A2,A7 RF(O) FMR:45 OVERFLOW RB FMR:35 * FMR:45 EQU * ADK A1,1 OVERFLOW CORRECTION ANKL A2,/7FFF RB FMR:35 * FMR:50 EQU * STR A1,A3 STORE FILE SECTION SIZE IN FPB ST A2,2,A3 XIF * LDR A4,A11 CHECK EWT BLOCK ADDRESS RB(NZ) FMR:20 NOT END OF EWT CHAIN * EJECT FMTASK * * IFT MMUPAG=1 * * MOVE SYSTEM FPB (FM:FPB) TO USER FPB * * INPUT: A9 = USER ECB ADDRESS * A10 = FM:FPB ADDRESS * LDR A1,A10 FM:FPB ADDRESS EL A2,ECBBA,A9 USER FPB ADDRESS LDK A3,FPBLEN FPB LENGTH MVSU A3 MOVE FM:FPB TO USER FPB XIF * EJECT FMTASK * * ********** * FMEXIT * ********** * * * SET RETURN CODE IN USER ECB, QUEUE TASK * AND PERFORM EXIT ON FMTASK. * * INPUT: A9 = USER ECB ADDRESS * FMEXIT EQU * GENERAL RETURN CODE EXIT LD A4,RETCOD RETURN CODE * IFT MMUPAG=0 ST A4,ECBRC,A9 SET RETURN CODE IN ECB XIF * IFT MMUPAG=1 ES A4,ECBRC,A9 SET RETURN CODE IN ECB XIF * LD A5,TTAB RESTORE TTAB ADDRESS CALLING TASK ABL QMEXIT QUEUE TASK AND EXIT FMTASK * EJECT FMTASK * * ********** * FMSPLI * ********** * * * FILE MANAGEMENT I/O FUNCTIONS: * FMSPLI IS ENTERED WHEN THE REQUESTED * SECTORS ARE SPLIT OVER TWO OR MORE * FILE EXTENTS. * * A5 = TTAB ADDRESS OF CALLING TASK * A7 = PARAMETER BLOCK ADDRESS * A8 = FM:ECB ADDRESS * A9 = USER ECB ADDRESS * A10 = USER BUFFER ADDRESS * FMSPLI EQU * BASIC AND PHYSICAL READ/WRITE IFT MULEXT=1 LDR A4,A7 PARAMETER BLOCK ADDRESS INH CF A15,FREBLK RELEASE BLOCK AND GET PARAMETERS LDR A13,A2 2ND EWT BLOCK ADDRESS CF A15,FCHEC2 CHECK ACCESS PAR. AND RETURN FWT ADDRESS ENB ORS A4,RETCOD RB(NZ) FMEXIT ERROR, RETURN LDR A7,A1 ORDER CODE * EJECT FMTASK * * IFT MMUPAG=0 IFT CPU852=1 LD A1,ECBCW1,A9 SECTOR NUMBER LD A2,ECBCW2,A9 ST A10,ECBBA,A8 SET BUFFER ADDRESS LD A10,ECBRL,A9 TOTAL REQUESTED LENGTH LDR A11,A10 SAVE IT * * SET ECB PARAMETERS AND PERFORM DISC I/O * FMSP00 EQU * MAIN I/O LOOP ENTRY ST A1,ECBCW1,A8 SET SECTOR NO IN ECB ST A2,ECBCW2,A8 XIF * IFT MULEXT=1 IFT MMUPAG=0 IFT CPU852=0 ML 2,ECBCW1,A9 SECTOR NUMBER ST A10,ECBBA,A8 SET BUFFER ADDRESS LD A10,ECBRL,A9 TOTAL REQUESTED LENGTH LDR A11,A10 SAVE IT * FMSP00 EQU * MAIN I/O LOOP ENTRY MS 2,ECBCW1,A8 SET SECTOR NO IN ECB XIF * IFT MULEXT=1 IFT MMUPAG=1 INH =3 CF A15,TIOMXI CONVERT LOGICAL ADDRESS TO PHYSICAL ENB =3 EL A1,ECBCW1,A9 SECTOR NUMBER EL A2,ECBCW2,A9 EL A10,ECBRL,A9 TOTAL REQUESTED LENGTH LDR A11,A10 * FMSP00 EQU * MAIN I/O LOOP ENTRY MS 2,ECBCW1,A8 SET SECTOR NO IN ECB XIF * IFT MULEXT=1 LC A1,EWTVOL,A13 DISC FILE CODE SC A1,ECBFC,A8 SET FILE CODE IN ECB ST A3,ECBRL,A8 SET REQUESTED LENGTH IN ECB CF A14,FM:IO PERFORM DISC I/O RF(NZ) FMSP50 DISC ERROR LD A4,ECBEL,A8 EFFECTIVE LENGTH SUR A11,A4 UPDATE REMAINING LENGTH RF(Z) FMSP50 I/O COMPLETED * EJECT FMTASK * * UPDATE BUFFER ADDRESS * IFT MMUPAG=0 ADS A4,ECBBA,A8 UPDATE BUFFER ADDRESS XIF * IFT MULEXT=1 IFT MMUPAG=1 LDK A3,0 MOST SIGNIFICANT PART OF LENGTH =3 SRL A4,1 WORD MODE =3 MLR 2,A8 BUFFER ADDRESS SLC A1,4 SRL A2,1 WORD MODE DAR A3 =3 SLL A2,1 BYTE MODE SRC A1,4 MSR 2,A8 SET UPDATED BUFFER ADDRESS IN ECB XIF * EJECT FMTASK * * GET PARAMETERS FROM NEXT EWT STRUCTURE * AND COMPUTE NEW REQUESTED LENGTH * IFT MULEXT=1 LDR* A13,A13 NEXT EWT STRUCTURE RF(Z) FMSP40 END OF EWT STRUCTURE ECR A3,A11 CONVERT REMAINING LENGTH TO SECTORS * IFT CPU852=1 LD A1,EWTEXL-1,A13 EXTENT LENGTH, PART 1 ANK A1,/FF RF(NZ) FMSP30 EXTENT LARGE ENOUGH LD A2,EWTEXL,A13 EXTENT LENGTH, PART 2 XIF * IFT MULEXT=1 IFT CPU852=0 ML 2,EWTEXL-1,A13 EXTENT LENGTH ANK A1,/FF RF(NZ) FMSP30 EXTENT LARGE ENOUGH XIF * EJECT FMTASK * * IFT MULEXT=1 CWR A3,A2 RF(NG) FMSP30 EXTENT LARGE ENOUGH LDR A3,A2 NO OF SECTORS IN THIS I/O * FMSP30 EQU * ECR A3,A3 CONVERT LENGTH TO BYTES LDR* A13,A13 2ND EWT BLOCK * IFT CPU852=1 LD A1,EWTEXB-1,A13 EXTENT BASE ANK A1,/FF LD A2,EWTEXB,A13 RB FMSP00 XIF * IFT MULEXT=1 IFT CPU852=0 ML 2,EWTEXB-1,A13 EXTENT BASE ANK A1,/FF RB FMSP00 XIF * EJECT FMTASK * * FMSP40 EQU * ILLEGAL REQUESTED LENGTH IFT MULEXT=1 LDKL A1,/2000 RETURN CODE ORS A1,RETCOD * FMSP50 EQU * SUR A10,A11 COMPUTE EFFECTIVE LENGTH * IFT MMUPAG=0 ST A10,ECBEL,A9 SET EFFECTIVE LENGTH IN USER ECB XIF * IFT MULEXT=1 IFT MMUPAG=1 ES A10,ECBEL,A9 SET EFFECTIVE LENGTH IN USER ECB XIF * IFT MULEXT=1 RB FMEXIT RETURN XIF * EJECT FMTASK * * ********** * FM:PWR * * FMREAD * ********** * * * INPUT: A2 = SECTOR NUMBER, PART 2 * A8 = FM:ECB/FMECB2 ECB ADDRESS * * OUTPUT: CR = 0 IF OK, ELSE * <> 0 IF DISC ERROR * A4 = DISC RETURN CODE (EXCEPT RETRY BIT) * A7 IS DESTROYED * FM:PWR EQU * PHYSICAL WRITE ENTRY LDK A7,/95 ORDER CODE RF FM:LKM * FMREAD EQU * PHYSICAL READ ENTRY LDK A7,/91 ORDER CODE * FM:LKM EQU * COMMON I/O ROUTINE ENTRY ST A2,ECBCW2,A8 SET SECTOR NUMBER IN ECB * FM:IO EQU * ADKL A14,4 ADJUST STACK POINTER LKM DATA 1 LD A4,ECBRC,A8 RETURN CODE ORS A4,RETCOD PREPARE RETURN CODE ANKL A4,/FEFF SKIP RETRY BIT ABR* A14 RETURN (WITHOUT CHANGING CR) * EJECT FMTASK * * ********** * FNDNAM * ********** * * * FNDNAM WILL CONVERT THE SUPPLIED FILE CODE * TO VOLUME NAME ADDRESS IN THE DISC DWT. * * INPUT: A2 = FILE CODE * * OUTPUT: A1 = VOLUME NAME ADDRESS * A2 = 6 * A6 = DISC DWT ADDRESS + DOUBLE INDEX * FNDNAM EQU * FIND VOLUME NAME ADDRESS INH CF A15,FNDDWD FIND DISC DWT ADDRESS ENB * * CHECK IF DISC RECOVERY GOING ON AND IN THAT CASE * SWITCH TASK WHILE WAITING FOR RECOVERY COMPLETION * FNAM05 EQU * LD A1,DWTST,A6 ANK A1,1 RF(NZ) FNAM10 POWER ON COMPLETED FOR THIS DISC LKM WAIT FOR RECOVERY COMPLETION DATA 0 SWITCH TASKS RB FNAM05 CHECK DISC AGAIN * EJECT FMTASK * * FNAM10 EQU * LDR A1,A6 DISC DWT ADDRESS LDR A6,A2 DISC INDEX ADR A6,A6 DOUBLE INDEX ADR A6,A1 ADD DWT ADDRESS * * COMPUTE VOLUME NAME ADDRESS IN DWT * FNAM20 EQU * ADK A1,6 NEXT VOLUME NAME IN DWT SUK A2,1 DECREMENT INDEX RB(NN) FNAM20 LDK A2,6 ADKL A1,DWTVOL-6 RTN A14 * EJECT FMTASK * * ********** * RDVTOC * ********** * * * RDVTOC WILL CALL FCHEC2 FOR CHECK OF THE * ACCESS PARAMETERS AND READ THE VTOC RECORD * OF THE FIRST FILE EXTENT. * * INPUT: A5 = TTAB ADDRESS * A8 = FM:ECB ADDRESS * A9 = USER ECB ADDRESS * * OUTPUT: A1 = 0 IF FIRST FILE EXTENT FOUND * A2 = VTOC SECTOR NUMBER (FIRST EXTENT) * A4 = RETURN CODE (=0 IF OK) * A6 = FWT ADDRESS * A13 = VTOC RECORD ADDRESS IN FM:BUF * A3, A7, A11 ARE DESTROYED * RDVTOC EQU * CHECK ACCESS PAR. AND READ VTOC RECORD INH CF A15,FCHEC2 CHECK ACCESS PAR. AND RETURN FWT ADDRESS ENB RF(NZ) RDVT20 ERROR, RETURN * EJECT FMTASK * * LC A4,FWTVOL,A6 DISC FILE CODE (FIRST EXTENT) STR A4,A8 LD A2,FWTVTC,A6 VTOC SECTOR NUMBER (FIRST EXTENT) * RDVTO2 EQU * ENTRY USED BY FMCDEF CF A14,FNDVT2 READ VTOC SECTOR AND ONE VTOC RECORD * RDVT10 EQU * ADK A4,0 CHECK RETURN CODE RF(NZ) RDVT20 DISC ERROR, RETURN LD A1,VTC:EN,A13 FILE EXTENT NUMBER RF(Z) RDVT20 FIRST EXTENT FOUND CF A14,FNDVT3 READ NEXT VTOC RECORD FOR THIS FILE RB RDVT10 CHECK IF THIS IS THE FIRST EXTENT * RDVT20 EQU * ORS A4,RETCOD PREPARE RETURN CODE RTN A14 * EJECT FMTASK * * ********** * FNDVTC * ********** * * * FNDVTC SEARCHES THE REQUESTED * FILE SPECIFIED IN THE FPB. * RETURN IS MADE WHEN ONE EXTENT * HAS BEEN FOUND OR WHEN THE COMPLETE * VTOC HAS BEEN SEARCHED WITHOUT MATCH. * * INPUT: A2 = FILE CODE * A6 = FWT ADDRESS * A8 = FM:ECB ADDRESS * * OUTPUT: A2 = VTOC SECTOR NUMBER IF FOUND, ELSE * = 0 IF NO FILE EXTENT FOUND * A4 = DISC RETURN CODE (=0 IF OK) * A13 = VTOC RECORD ADDRESS IN FM:BUF * A1, A3, A7, A11-A12 ARE DESTROYED * FNDVTC EQU * FIND VTOC ENTRY * * READ VOLUME LABEL (SECTOR 0) * SC A2,ECBFC,A8 SET FILE CODE IN ECB LDK A2,0 SECTOR NUMBER CF A14,FMREAD READ SECTOR 0 RF(NZ) FVTC40 DISC ERROR, RETURN LD A2,FM:BUF+VOL:EB VTOC EXTENT BASE LDR A12,A2 AD A2,FM:BUF+VOL:FS SKIP FSAT SECTORS AD A12,FM:BUF+VOL:EL LAST VTOC SECTOR+1 * EJECT FMTASK * * READ NEXT VTOC SECTOR * FNDVT2 EQU * ENTRY USED BY RDVTOC/FMCDEF CF A14,FMREAD READ ONE VTOC SECTOR RF(NZ) FVTC40 DISC ERROR, RETURN LDKL A13,FM:BUF FM:BUF ADDRESS LDK A7,VTOCBF VTOC BLOCK FACTOR * FVTC20 EQU * LD A1,VTC:ST,A13 VTOC STATUS BYTE ANK A1,/FF RF(NZ) FVTC50 VTOC USED * FNDVT3 EQU * ENTRY USED BY OPEN LD A2,ECBCW2,A8 CURRENT VTOC SECTOR NUMBER ADKL A13,VTOCRL NEXT VTOC ADDRESS SUK A7,1 RB(P) FVTC20 MORE VTOC:S IN THIS SECTOR ADK A2,1 NEXT VTOC SECTOR CWR A2,A12 CHECK IF END OF VTOC EXTENT RB(NE) FNDVT2 NOT LAST VTOC SECTOR * FVTC40 EQU * ERROR RETURN LDK A2,0 RETURN CODE RTN A14 * * VTOC USED: COMPARE FILE NAMES AND RETURN IF EQUAL * FVTC50 EQU * LDR A2,A13 VTOC ADDRESS CF A14,CMPFIL COMPARE FILE NAMES RB(NE) FNDVT3 FILE NAMES NOT EQUAL LD A2,ECBCW2,A8 CURRENT VTOC SECTOR NUMBER RTN A14 ONE FILE EXTENT FOUND * EJECT FMTASK * * ********** * CMPFIL * * CMPSTR * * CPMDWD * ********** * * * CMPFIL COMPARES ONE CHARACTER STRING * WITH THE FILE NAME IN SPECIFIED FWT * AND SETS THE CR ACCORDING TO THE RESULT. * * CMPSTR COMPARES TWO CHARACTER STRINGS * AND SETS THE CR ACCORDING TO THE RESULT. * * CMPDWD COMPARES TWO DOUBLE WORDS * AND SETS THE CR ACCORDING TO THE RESULT. * * INPUT: A1 = ADDRESS OF CHARACTER STRING 1 (CMPSTR/CMPDWD ONLY) * A2 = " " " " 2 * A3 = NO OF CHARACTERS TO COMPARE (CMPSTR ONLY) * A6 = FWT ADDRESS (CMPFIL ONLY) * * OUTPUT: CR = 0 IF STRINGS EQUAL, ELSE * > 0 IF STRING 1 GREATER THAN STRING 2, ELSE * < 0 IF STRING 1 LESS THAN STRING 2 * A1-A3, A11 ARE DESTROYED * EJECT FMTASK * * CMPFIL EQU * COMPARE FILE NAMES LDR A1,A6 FWT ADDRESS ADK A1,FWTNAM POINT TO FILE NAME LDK A3,8 FILE NAME LENGTH * CMPSTR EQU * COMPARE CHARACTER STRINGS ADKL A14,4 ADJUST STACK POINTER * * COMPARE STRINGS CHARACTER BY CHARACTER * CMP:10 EQU * LCR A11,A1 ONE CHARACTER FROM STRING 1 CCR A11,A2 COMPARE WITH CORR. CHAR. IN STRING 2 ABR(NE)* A14 STRINGS NOT EQUAL, RETURN ADK A1,1 INCREMENT STRING POINTERS ADK A2,1 SUK A3,1 DECREMENT LOOP COUNTER RB(P) CMP:10 CONTINUE IF NOT END OF STRINGS ABR* A14 STRINGS EQUAL, RETURN * CMPDWD EQU * COMPARE TWO DOUBLE WORDS LDK A3,4 LENGTH RB CMPSTR * EJECT FMTASK * * ********** * FM:MOV * ********** * * * INPUT: A1 = INPUT BUFFER ADDRESS * A2 = NUMBER OF CHARACTERS TO MOVE * A3 = OUTPUT BUFFER ADDRESS * * OUTPUT: A2 = 0 * A1, A3 = ADDRESSES OF LAST MOVED CHARACTERS+1 * A4 IS DESTROYED * FM:MV8 EQU * MOVE 8 CHARACTERS LDK A2,8 LENGTH RF FM:MOV * FM:MV4 EQU * MOVE 4 CHARACTERS LDK A2,4 LENGTH * * MOVE STRING CHARACTER BY CHARACTER * FM:MOV EQU * MOVE STRING LCR A4,A1 MOVE ONE CHARACTER SCR A4,A3 ADK A1,1 INCREMENT BUFFER POINTERS ADK A3,1 SUK A2,1 DECREMENT LOOP COUNTER RB(P) FM:MOV CONTINUE MOVE RTN A14 * * * END