CPA B13 'ASCII' ? RSS YES JMP GTNXE NO LDB ARG2,I GET EFMP CODE CPB D7 INITIALIZE FUNC. ? JSB ER27 YES JMP SRET1 NO CKINF EQU * LDB ARG2,I GET EFMP CODE CPB D7 INITIALIZE FUNC. ? JMP SRET1 YES LDB SPKSR GET PACK SEARCH SWITCH SZA SEARCH FOR A SPECIFIC PACK ? JSB ER28 YES JMP GTNXE NO CKEQN EQU * LDA AFNAM GET ADDR OF REQUESTED NAME LDB $BUFP GET ADDR OF CURRENT ENTRY NAME JSB CMPAR NAMES EQUAL ? JMP EBIAS NO SRET1 EQU * LDA SECCT SECTOR OF ENTRY LDB $BUFP GET DIRECTORY ENTRY ADDR ISZ SRCDR INCREMENT TO P+2 JMP SRCDR,I RETURN TO P+2 EBIAS EQU * LDB $BUFP GET CURRENT ENTRY ADDR ADB MXWPE ADD ENTRY SIZE STB $BUFP STORE ADDR OF NEXT ENTRY JMP SRCNF SEARCH NEXT ENTRY GETNS EQU * ISZ SECCT INCR SECTOR COUNT ISZ SECIO INCR SECTOR FOR I/O LDA SECIO CPA SECTR END OF TRACK ? RSS YES JMP SRCNS NO ISZ TRKIO INCR TO NEXT TRACK CLA STA SECIO STORE NEW I/O SECTOR JMP SRCNS GET NEXT SECTOR ATRKI DEF TRKIO TRKIO BSS 1 I/O TRACK SECIO BSS 1 I/O SECTOR SECCT BSS 1 SECTOR COUNT SPKSR BSS 1 SEARCH MODE(0=GENERAL,1=SPECIFIC) AFNAM BSS 1 FILE NAME ADDRESS TYPDR BSS 1 DIRECTORY TYPE FLAG NOPAS BSS 1 COMPARE SWITCH PAKSC BSS 1 PACK SUBCHANNEL $BUFP BSS 1 POINTER TO DIRECTORY ENTRY ZMASK OCT 60 ASCII ZERO MASK SKP * CKDSP - CHECK FOR SUFFICIENT DIRECTORY SPACE * ENTER: * A = SIZE OF DIRECTORY ENTRY TO CREATE * B = ADDR OF OPEN TABLE ENTRY OF FILE TO COPY * (ONLY IF CALLER IS 'COPY' FUNCTION) * NXTFP = ADDR OF NEXT FILE POSITION * SECCT = SECTOR OF NEXT FILE POSITION * PNEAD = ADDR OF PACK NO. ENTRY * PAKSC = CURRENT SUBCHANNEL * NOSEC = NO. SECTORS REQUIRED * EXIT: * P+1 = NO SPACE * A = 0(NO FILE SPACE) * = 1(NO DIRECTORY SPACE) * P+2 = DIRECTORY SPACE AVAILABLE * NEW EOD MARK INSERTED * DIRECTORY UPDATED * NEW ENTRY CREATED * CKDSP NOP STA DESIZ SAVE DIRECTORY ENTRY SIZE STB DEADR SAVE OPEN TABLE ADDR CPA D5 PN000 ? JMP CKRSC YES LDA NXTFP GET ADDR OF NEXT FILE POSITION ADA MD9 BACK UP TO NAME OF PREVIOUS FILE CLB CPB A,I EFMP'S OWN ENTRY ? JMP CKRSC YES, NO NEED TO CHECK LSA LDA NXTFP GET ADDR OF NEXT FILE POSITION ADA MD4 BACK UP TO PREVIOUS FILE'S RECORD LENGTH LDB A,I GET RECORD LENGTH ADA MD1 BACK UP TO PREVIOUS FILES SIZE LDA A,I GET NO. OF RECORDS JSB MPY JSB DIV DEF D128 SZB INA STA SECFL SAVE SECTORS USED LDA NXTFP GET ADDR OF NEXT FILE POSITION ADA MD6 BACK UP TO STARTING SECTOR LDB SECFL GET SECTORS USED BY FILE ADB A,I CALCULATE LAST SECTOR ALLOCATED ADB MD1 LDA PNEAD GET PACK NO. ENTRY ADDR ADA D3 INCREMENT TO LAST SECTOR ALLOCATED CPB A,I ARE LAST SECTOR ALLOCATED EQUAL ? JMP CKRSC YES STB A,I NO, UPDATE PACK NO. ENTRY CLA,INA CPA SECCT IS EFMP'S OWN DIRECTORY ENTRY IN CORE ? JMP SUPS1 YES LDA TRKIO GET TRACK OF CURRENT ENTRY STA STRKI SAVE TRACK OF CURRENT ENTRY LDA SECIO GET SECTOR OF CURRENT ENTRY STA SSECI SAVE SECTOR OF CURRENT ENTRY JSB UPSC1 UPDATE SECTOR 1 LDA STRKI GET TRACK OF CURRENT ENTRY STA TRKIO RESTORE THE TRACK LDA SSECI GET SECTOR OF CURRENT ENTRY STA SECIO RESTORE THE SECTOR CLA READ SWITCH LDB PAKSC GET SUBCHANNEL JSB PRWIO RESTORE THE CURRENT ENTRY JMP ESPC GO CHECK FOR SPACE SUPS1 EQU * LDA AESPC RETURN ADDR STA UPSC1 STORE RETURN ADDR JMP UPLSA GO UPDATE LSA ESPC EQU * LDA PNEAD GET ADDR OF PACK NO. ENTRY ADA D3 INCREMENT TO LSA FIELD LDB A,I GET LSA CMB,INB ADA MD2 BACK UP TO FILE LENGTH FIELD ADB A,I CALCULATE SECOTRS UNUSED STB SECFL SAVE SECTORS REMAINING LDA NOSEC GET NO. OF SECTORS REQUESTED CMA,INA ADA SECFL CALCULATE SECTORS LEFT SSA,RSS ENOUGH SPACE ? JMP CKRSC YES CLA NO SPACE JMP CKDSP,I RETURN, P+1 CKRSC EQU * LDA NXTFP GET NEXT FILE POSITION ADDR ADA DESIZ ADD SIZE OF NEXT ENTRY CMA,INA TWO'S COMPLEMENT ADA END$B CALCULATE SPACE AVAILABLE IN SECTOR INA SSA,RSS SPACE AVAILABLE IN SECTOR ? JMP BLDEN YES LDA PNEAD GET PACK NO ENTRY ADDR ADA D2 INCREMENT TO DIRECTORY SIZE LDB A,I GET DIRECTORY SIZE CMB,INB TWO'S COMPLEMENT ADB SECCT CALCULATE SECTORS LEFT IN DIRECTORY SZB PHYSICAL EOD ? JMP CGEOD NO CLA,INA NO DIRECTORY SPACE JMP CKDSP,I NO, RETURN P+1 BLDEN EQU * JSB PKDIR CREATE DIRECTORY ENTRY LDA DESIZ ADA NXTFP ADA MD1 CPA END$B SPACE IN SECTOR FOR EOD MARK ? RSS NO JMP W$BUF YES LDA SECCT INA CPA SECTR PHYSICAL EOD ? JMP W$BUF YES CLB STB ATBUF,I STORE EOD MARKER ISZ SECIO WRITE EOD MARK ON NEXT SECTOR LDA A$BUF STA A$BSV SAVE ADDR OF $BUF LDB ATBUF STB A$BUF USE TEMPORARY BUFFER LDB PAKSC SUB CHANNEL FOR I/O CLA,INA WRITE FLAG FOR I/O JSB PRWIO WRITE NEW EOD MARKER LDA SECIO RESTORE SECTOR NUMBER ADA MD1 STA SECIO LDA A$BSV RESTORE ADDR OF $BUF STA A$BUF JMP W$BUF WRITE BACK NEW DIRECTORY ENTRY CGEOD EQU * LDA DESIZ ADA NXTFP ADA MD1 CPA END$B ROOM IN SECTOR FOR EOS MARK ? RSS NO JMP EOSFL YES ISZ SECIO INCR TO NEXT DIRECTORY SECTOR LDA A$BUF ADDR OF NEXT ENTRY STA NXTBF STORE ADDR OF NEXT ENTRY JMP BLDEN GO BUILD NEW DIRECTORY ENTRY EOSFL EQU * LDB MD1 END-OF-SECTOR INDICATOR STB NXTFP,I STORE INDICATOR LDA A$BUF GET CURRENT BUFFER ADDR STA A$BSV SAVE ADDR LDB ATBUF GET ADDR OF BUFFER FOR NEW ENTRY STB A$BUF STORE NEW WRITE ADDR STB NXTFP STORE ADDR FOR 'PKDIR' JSB PKDIR CREATE DIRECTORY ENTRY ISZ SECIO INCR SECTOR LDB SECIO CPB SECTR END-OF-TRACK ? RSS YES JMP WTBUF NO CLB SECTOR 0 STB SECIO STORE NEW SECTOR ISZ TRKIO INCR TRACK WTBUF EQU * LDB PAKSC GET CURRENT SUBCHANNEL CLA,INA WRITE INDICATOR JSB PRWIO WRITE NEW DIRECTORY SECTOR LDB A$BSV GET OLD BUFFER ADDR STB A$BUF RESTORE ADDR CLB CPB SECIO NEW ENTRY WRITTEN ON NEW TRACK RSS YES JMP DESEC NO LDB SECTR RESTORE TO PREVIOUS SECTOR ADB MD1 STB SECIO LDB TRKIO RESTORE TO PREVIOUS TRACK ADB MD1 STB TRKIO JMP W$BUF WRITE $BUF DESEC EQU * LDB SECIO RESTORE TO PREVIOUS SECTOR ADB MD1 STB SECIO W$BUF EQU * LDA D5 CPA DESIZ PN000 ? JMP W$BF1 YES CLA,INA CPA SECCT 1ST EFMP DIREC. SECT. IN $BUF ? RSS YES JMP W$BF1 NO LDA PNEAD GET NEW LSA OF PACK NO. ADA D3 LDB A,I LDA A$BUF UPDATE EFMP DIREC. ENTRY WITH ADA D8 NEW LSA STB A,I W$BF1 EQU * LDB PAKSC GET CURRENT SUBCHANNEL CLA,INA WRITE INDICATOR JSB PRWIO WRITE $BUF LDA D5 CPA DESIZ PN000 ? JMP RETP2 YES CLA,INA CPA SECCT 1ST EFMP DIREC. SECT. IN $BUF ? RSS YES JSB UPSC1 UPDATE LSA OF PACK NO. RETP2 EQU * ISZ CKDSP P+2 JMP CKDSP,I RETURN UPSC1 NOP LDA PNEAD,I GET T/S OF DIRECTORY START JSB PRETS PREPARE T/S FOR I/O LDB PAKSC GET SUBCHANNEL CLA READ INDICATOR JSB PRWIO READ 1ST SECTOR OF DIRECTORY UPLSA EQU * LDB PNEAD GET ADDR OF PACK NO. ENTRY ADB D3 INCREMENT TO LAST SECTOR ALLOCATED FIELD LDA B,I GET LAST SECTOR ALLOCATED LDB A$BUF GET ADDR OF EFMP'S DIRECTORY ENTRY ADB D8 INCREMENT TO LAST SECTOR ALLOCATED FIELD STA B,I STORE NEW LAST SECTOR ALLOCATED LDB PAKSC GET SUBCHANNEL CLA,INA WRITE INDICATOR JSB PRWIO WRITE $BUF JMP UPSC1,I NXTBF DEF 0 ADDRESS OF NEXT ENTRY NOSEC BSS 1 FILE LENGTH IN SECTORS/END SECFL BSS 1 SECTORS FOR THE FILE STRKI BSS 1 SAVE FOR TRACK NUMBER SSECI BSS 1 SAVE FOR SECTOR NUMBER AESPC DEF ESPC DESIZ BSS 1 DIRECTORY ENTRY SIZE DEADR BSS 1 OPEN TABLE ENTRY ADDR ATBUF DEF TBUFF ADDR OF TEMP BUFFER A$BSV BSS 1 SAVE FOR A$BUF APN00 DEF PN ADDR OF 'PN000' PN ASC 1,PN PN000 ASC 1,00 OCT 030212 TBUFF BSS 10 SKP * PKDIR - PACK DIRECTORY ENTRY * ENTER: * DESIZ = SIZE OF DIRECTORY ENTRY * NXTFP = ADDR OF ENTRY TO CREATE * NOSEC = SIZE OF FILE IN SECTORS * PNEAD = ADDR OF PACK NO. ENTRY * DEADR = ADDR OF ENTRY TO COPY('COPY FUNCTION ONLY') * EXIT: * P+1 * DIRECTORY ENTRY CREATED * PKDIR NOP LDB DESIZ GET DIRECTORY ENTRY SIZE CPB D5 PN000 ? RSS YES JMP CEFMP NO LDB NXTFP GET NEW DIRECTORY ENTRY ADDR LDA PN STORE NAME 'PN000' AND ENTRY TYPE STA B,I INB LDA PN+1 STA B,I INB LDA PN+2 STA B,I INB LDA SYNTS GET STARTING T/S STA B,I STORE STARTING T/S INB LDA NOSEC GET FILE LENGTH STA B,I STORE FILE LENGTH INB LDA DESIZ ADA NXTFP ADA MD1 CPA END$B IS SECTOR FULL ? JMP PKDIR,I YES CLA GET EOD INDICATOR STA B,I STORE EOD INDICATOR JMP PKDIR,I RETURN P+1 CEFMP EQU * LDB ARG2,I GET EFMP FUNCTION NUMBER CPB D12 COPY ? JMP CCOPY YES LDA MD2 NO. WORDS TO MOVE STA MOVCT STORE NO. LDA ARG3 ADDR. OF FILE NAME LDB NXTFP GET DESTINATION ADDR JSB MOVE MOVE 1ST 4 CHARS. STA TMPTR STORE NAME ADDR LDA TMPTR,I GET 3RD WORD OF NAME AND H8BT SAVE ONLY 5TH CHAR STA B,I STORE CHAR. INB LDA PNEAD GET PACK NO. ENTRY ADDR ADA D3 INCREMENT TO LSA FIELD LDA A,I GET LAST SECTOR ALLOCATED INA CALCULATE STARTING RELATIVE SECTOR OF FILE STA B,I INB LDA ARG5,I FILE LENGTH STA B,I INB LDA ARG6,I RECORD LENGTH STA B,I INB LDA ARG7,I SECURITY CODE STA B,I INB LDA ARG7 INA LDA A,I STA B,I USER STATUS INB CLA STA B,I HIGHEST RECORD ACCESSED INB STA B,I END-OF-DIRECTORY INDICATOR STLSA EQU * LDA PNEAD GET PACK NO. ENTRY ADDR ADA D3 INCREMENT TO LSA FIELD LDB NOSEC GET NO. OF SECTORS FOR THIS FILE ADB A,I CALCULATE NEW LSA STB A,I STORE NEW LSA JMP PKDIR,I CCOPY EQU * LDA MD8 NO. OF WORDS TO MOVE STA MOVCT STORE MOVE COUNT LDA DEADR GET DIRECTORY ENTRY ADDR LDB NXTFP GET NEXT FILE POS. ADDR JSB MOVE MOVE ENTRY LDB NXTFP GET NEXT FILE POS. ADDR ADB D3 INCREMENT TO STARTING SECTOR FIELD LDA PNEAD GET ADDR OF PACK NO. ENTRY ADA D3 INCREMENT TO LSA FIELD LDA A,I GET LSA INA CALCULATE STARTING RELATIVE SECTOR STA B,I STORE STARTING SECTOR ADB D5 INCREMENT TO HRA LDA DEADR GET OPEN TABLE ENTRY ADDR ADA D15 INCREMENT TO HRA FIELD LDA A,I GET HRA STA B,I STORE HRA IN DIRECTORY ENTRY INB CLA STA B,I SET EOD INDICATOR JMP STLSA TMPTR BSS 1 SKP * CKOPN - CHECK OPEN TABLE * ENTER: * B = ADDR. OF FILE NAME * EXIT: * P+1 = FILE NAME NOT FOUND * A = (-) IF END OF TABLE * B = POINTER TO BEGINNING OF NEXT FILE NAME. * P+2 = FILE NAME FOUND * B = POINTER TO BEGINNING OF FILE NAME * CKOPN NOP CHECK OPEN TABLE STB AFNAM SAVE ADDR. OF FILE NAME LDB OPNT1 START OF OPEN TABLE FILE ENTRIES CKNOE EQU * CHECK NEXT OPEN ENTRY STB OPNTP O.T. POINTER LDA B CMA ADA NXOTL NEXT O.T. LOCATION SSA ANY MORE FILES OPEN? JMP CKOPN,I NO, RETURN LDA AFNAM ADDR. OF FILE NAME JSB CMPAR COMPARE FILE NAMES JMP NOCPR NAMES NOT EQUAL ISZ CKOPN P+2 LDB OPNTP RESTORE CURRENT POINTER JMP CKOPN,I RETURN NOCPR EQU * NAMES DID NOT COMPARE LDB OPNTP POINTER TO LAST ENTRY ADB WPOTE BIAS TO NEXT ENTRY IN O.T. JMP CKNOE CHECK NEXT OPEN ENTRY OPNTP OCT 0 OPEN TABLE POINTER SKP SKP * CKCLM - CHECK CORE LIMITS * ENTER: * A = STARTING ADDRESS OF CORE TO BE CHECKED. * B = LENGTH (IN WORDS) OF BUFFER TO BE CHECKED. * EXIT: * B = SAME AS ENTRY * P+1 = INVALID BUFFER AREA. * P+2 = VALID BUFFER AREA. * A = STARTING ADDR. OF CORE TO BE CHECKED * OR EFFECTIVE ADDR. IF ORIGINAL WAS INDIRECT. * CKCLM NOP CHECK CORE LIMITS EFFA1 EQU * SZA,RSS ERROR IF 0 OR 1 JMP CKCLM,I 0, SO ERROR CPA D1 JMP CKCLM,I 1, SO ERROR RAL,CLE,SLA,ERA RSS JMP EFFAD VALID, EFFECTIVE ADDR. LDA A,I GET NEXT ADDR. IN INDIRECT CHAIN JMP EFFA1 AND PROCESS IT. EFFAD EQU * STA CORAD SAVE CORE ADDR. CMA ADA UMFWA USER MEMORY FWA SSA,RSS .GE. 1ST USER WORD? JMP CKCLM,I NO, RETURN LDA CORAD ADA B CALCULATE FINAL ADDR. CMA,INA ADA UMLWA USER MEM. LAST WORD ADDR. SSA TOO BIG? JMP CKCLM,I YES LDA VALSU VALID SETUP FLAG SZA,RSS VALID SETUP? JMP CKLMR NO, CHECK-LIMIT RETURN LDA CORAD STARTING ADDR. OF BUFFER CMA,INA ADA OPNTE END OF OPEN TABLE BUFFER SSA START .GT. END OF OPEN TABLE? JMP CKLMR YES, CHECK-LIMIT RETURN LDA CORAD STARTING ADDR. OF BUFFER ADA B NO OF WDS. IN BUFFER CMA,INA ADA OPNTB START OF OPEN TABLE SSA END .LE. START OF OPEN TABLE? JMP CKCLM,I NO, ERROR CKLMR EQU * CHECK-LIMIT RETURN LDA CORAD ISZ CKCLM VALID BUFFER AREA JMP CKCLM,I RETURN CORAD OCT 0 SKP * CMPAR - COMPARE FILE NAMES * ENTER: * A = ADDRESS OF FILE NAME REQUESTED. * B = ADDRESS OF FILE NAME TO BE COMPARED. * EXIT: * P+1 = NAMES DO NOT COMPARE * P+2 = NAMES COMPARE * CMPAR NOP COMPARE FILE NAMES STA AFLNM ADDR. OF FILE NAME LDA MD5 NUMBER OF CHARS TO COMPARE(-) STA CPRNC STORE COUNT CLE RESET 1ST/2ND FLAG COM2C EQU * LDA B,I PICK UP 2 CHAR. IN WORD REQ. SEZ,RSS LEFT CHAR? ALF,ALF YES, SHIFT INTO POSITION AND L8BT STRIP LOW 8 BITS STA COM1C SAVE TO COMPARE 1 CHAR. LDA AFLNM,I PICK UP 2 CHAR. IN WORD TO COMP. SEZ,RSS LEFT CHAR? ALF,ALF YES, SHIFT INTO POSITION AND L8BT STRIP LOW 8 BITS CPA COM1C ARE 2 CHAR'S. EQUAL RSS EQUAL SO FAR JMP CMPAR,I RETURN NAMES DO NOT COMPARE ISZ CPRNC FINISHED? JMP *+3 NO ISZ CMPAR P+2 JMP CMPAR,I RETURN SEZ,CME,RSS CHECK 2ND CHAR.? JMP COM2C YES ISZ AFLNM BUMP POINTER TO REQUESTED NAME INB BUMP POINTER TO NAME TO BE COMP. JMP COM2C-1 AFLNM OCT 0 ADDR. OF FILE NAME COM1C OCT 0 TEMP. FOR COMPARE 1 CHAR. CPRNC OCT -5 (-) NO. OF CHARS TO COMPARE SKP * ASDEC - ASCII TO DECIMAL CONVERSION * ENTER: * A = ASCII CHAR TO BE CONVERTED IN LO 8 BITS: * EXITS: * P+1 = NO. NOT BETWEEN 0 AND 9 INCLUSIVE * P+2 = VALID NUMBER * A = CONVERTED NUMBER * ASDEC NOP ASCII TO DEC. CONVERSION AND L8BT SAVE ONLY RIGHT CHAR. ADA MB60 BIAS TO NO. 0 SSA IS NO. .GE. TO ZERO? JMP ASDEC,I NO, ERROR ADA MD10 BIAS FOR NO. 9 SSA,RSS LESS THAN 10? JMP ASDEC,I NO, ERROR ADA D10 RESTORE NO. ISZ ASDEC P+2 JMP ASDEC,I RETURN SKP * T.STS - CONVERT TRACK/SECTOR TO SECTORS * ENTER: * A = T/S TO BE CONVERTED * EXIT: * A = TOTAL SECTORS * B IS SAVED * T.STS NOP T/S TO SECTORS STA T.STM SAVE T/S TO BE CONVERTED STB T.STM+1 SAVE B FOR EXIT AND L8BT STRIP SECT. NO. STA T.STM+2 SAVE SECTOR NO. LDA T.STM T/S ALF,ALF PUT TK. NO. IN LO 8 BITS AND L8BT STRIP TK. NO. LDB SECTR JSB MPY CALC. TOTAL SECTORS/TRACK SZB OVERFLOW? JSB ER23 YES, INVALID ARGUEMENT ADA T.STM+2 ADD REMAINING SECTORS LDB T.STM+1 RESTORE B JMP T.STS,I RETURN T.STM OCT 0,0,0 TEMP. STORAGE SPC 1 * STT.S - SECTORS TO TRACK/SECTOR * ENTER: * A = TOTAL SECTORS TO BE CONVERTED