; PROGRAM: UNERA for ZCPR2 ; AUTHOR: RICHARD CONN ; VERSION: 2.2 ; DATE: 25 July 83 ; PREVIOUS VERSIONS: 2.1 (24 JULY 83), 2.0 (23 JULY 83) ; DERIVATION: UNERA BY GENE COTTON VERS EQU 22 ;version number ; ; PROGRAM TO RECOVER ERASED FILES, BY GENE COTTON ; ; From Interface Age December 1981 pg 146 ; ; v2.0 - 07/23/83 Modified to be consistent in the ZCPR2 tool set. ; - Rick Conn ; ; Contributors: ; v1.6 - Dave Rand ; v1.5 - Irv Hoff ; v1.4 - Paul Traina ; v1.3 - Irv Hoff ; v1.2 - Charlie Strom ; v1.1 - Bruce Blakeslee ; v1.0 - Retyped from Interface Age (Dec 81). - Henry Rothberg ; ; ; System equates: ; BOOT EQU 0000H ;CP/M WARM BOOT JUMP VECTOR BDOS EQU BOOT+05H ;CP/M BDOS CALL JUMP VECTOR TBUFF EQU BOOT+80H ;DISK I/O BUFFER FCB EQU BOOT+5CH ;DEFAULT FILE CONTROL BLOCK FCB2 EQU BOOT+6CH ;SECONDARY FILE CONTROL AREA CR EQU 'M'-'@' ;CTL-M FOR CARRIAGE RETURN LF EQU 'J'-'@' ;CTL-J FOR LINE FEED CTRLC EQU 'C'-'@' ;ABORT ; ; ZCPR2 and its utilities, including this one, are released ; to the public domain. Anyone who wishes to USE them may do so with ; no strings attached. The author assumes no responsibility or ; liability for the use of ZCPR2 and its utilities. ; ; ; Branch to Start of Program ; ORG BOOT+100H JMP START ; ;****************************************************************** ; ; SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format ; ; This data block precisely defines the data format for ; initial features of a ZCPR2 system which are required for proper ; initialization of the ZCPR2-Specific Routines in SYSLIB. ; ; ; EXTERNAL PATH DATA ; EPAVAIL: DB 0FFH ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES) EPADR: DW 40H ; ADDRESS OF EXTERNAL PATH IF AVAILABLE ; ; INTERNAL PATH DATA ; INTPATH: DB 0,0 ; DISK, USER FOR FIRST PATH ELEMENT ; DISK = 1 FOR A, '$' FOR CURRENT ; USER = NUMBER, '$' FOR CURRENT DB 0,0 DB 0,0 DB 0,0 DB 0,0 DB 0,0 DB 0,0 DB 0,0 ; DISK, USER FOR 8TH PATH ELEMENT DB 0 ; END OF PATH ; ; MULTIPLE COMMAND LINE BUFFER DATA ; MCAVAIL: DB 0FFH ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE? MCADR: DW 0FF00H ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE ; ; DISK/USER LIMITS ; MDISK: DB 4 ; MAXIMUM NUMBER OF DISKS MUSER: DB 31 ; MAXIMUM USER NUMBER ; ; FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK ; DOK: DB 0FFH ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES) UOK: DB 0FFH ; ALLOW USER CHANGE? (0=NO, 0FFH=YES) ; ; PRIVILEGED USER DATA ; PUSER: DB 10 ; BEGINNING OF PRIVILEGED USER AREAS PPASS: DB 'chdir',0 ; PASSWORD FOR MOVING INTO PRIV USER AREAS DS 41-($-PPASS) ; 40 CHARS MAX IN BUFFER + 1 for ending NULL ; ; CURRENT USER/DISK INDICATOR ; CINDIC: DB '$' ; USUAL VALUE (FOR PATH EXPRESSIONS) ; ; DMA ADDRESS FOR DISK TRANSFERS ; DMADR: DW 80H ; TBUFF AREA ; ; NAMED DIRECTORY INFORMATION ; NDRADR: DW 00000H ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY NDNAMES: DB 64 ; MAX NUMBER OF DIRECTORY NAMES DNFILE: DB 'NAMES ' ; NAME OF DISK NAME FILE DB 'DIR' ; TYPE OF DISK NAME FILE ; ; REQUIREMENTS FLAGS ; EPREQD: DB 000H ; EXTERNAL PATH? MCREQD: DB 000H ; MULTIPLE COMMAND LINE? MXREQD: DB 000H ; MAX USER/DISK? UDREQD: DB 000H ; ALLOW USER/DISK CHANGE? PUREQD: DB 000H ; PRIVILEGED USER? CDREQD: DB 000H ; CURRENT INDIC AND DMA? NDREQD: DB 000H ; NAMED DIRECTORIES? Z2CLASS: DB 0 ; CLASS 0 DB 'ZCPR2' DS 10 ; RESERVED ; ; END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA ; ;****************************************************************** ; ; ; Start of Program ; START: ; LXI H,0 ;SAVE STACK PTR DAD SP SHLD STACK LXI SP,STACK ;SET STACK POINTER CALL HELLO ;SIGN ON MESSAGE CALL HELPCHK ;CHECK FOR AND PRINT HELP MESSAGE CALL PCHECK ;CHECK PARAMETERS LDA FNCOUNT ;NUMBER OF FILES SPECIFIED ORA A ;0=NONE CNZ TRYFIX ;DO THE RECOVERY CALL BYE ;SIGN OFF MESSAGE JMP BOOT ;RETURN TO CP/M ; ; ** Main Routines ** ; ; ; SAY WHO WE ARE ; HELLO: CALL PRINT DB 'UNERA, Version ' DB (VERS/10)+'0','.',(VERS MOD 10)+'0',0 RET ; ; CHECK FOR VALID PARAMETERS AND SAY WHICH CP?M VERSION ; PCHECK: CALL OPTCHK ;CHECK FOR OPTIONS AND SET FLAGS CALL FCBCHK ;MAKE SURE FILE SPECIFIED CALL CPMCHK ;ESTABLISH CP/M PARAMETERS CALL PUSCHK ;CHECK IF USER WANTS TO CHANGE DISK RET ; ; LOOK THROUGH DIRECTORY ; TRYFIX: CALL NXTSEC ;GET A DIRECTORY SECTOR RZ ;RETURNS ZERO FLAG IF NO MORE CALL CHKENT ;CHECK IT OUT AND MAYBE FIX JMP TRYFIX ;KEEP IT UP TILL DONE ; ; SIGN OFF AND RESET SYSTEM ; BYE: MVI C,13 ;SYSTEM RESET CALL BDOS LDA LISTFL ;LIST ONLY? ORA A ;0=NO JNZ PRNF LDA FIXCNT ;CHECK FOR ACTIVITY ORA A JZ PRNF ;SAY NONE FOUND CALL PRINT DB CR,LF,'File(s) Recovered - DOUBLE CHECK Before Using',0 RET PRNF: CALL PRINT DB CR,LF,'NO Files Recovered',0 RET ; ; CHECKS FOR P AND 0 OPTIONS IN COMMAND LINE ; OPTCHK: XRA A ;TURN OFF FLAGS STA CURUSR STA PAUSE STA FIXCNT STA LISTFL STA FNCOUNT ;NO FILE NAMES LXI H,1 ;SET SECTOR 1 SHLD SECTOR LXI H,TBUFF ;SCAN THRU TBUFF, BUILDING A FILE NAME TABLE MOV A,M ;GET CHAR COUNT INX H ;PT TO FIRST CHAR PUSH H ;SAVE PTR ADD L ;PT TO AFTER LAST CHAR MOV L,A MVI M,0 ;STORE ENDING ZERO POP H ;GET PTR TO FIRST CHAR CALL SBLANK ;SKIP BLANKS LXI D,FNTAB ;PT TO TABLE FNLOOP: PUSH D ;SAVE TABLE PTR CALL GETFN ;EXTRACT FILE NAME POP D PUSH H LXI H,11 ;PT TO NEXT TABLE ENTRY DAD D XCHG POP H LDA FNCOUNT ;INCREMENT COUNT INR A STA FNCOUNT MOV A,M ;GET TERMINATING CHAR INX H ;PT TO NEXT CPI ',' ;ANOTHER FOLLOWS? JZ FNLOOP DCX H ;POINT BACK TO DELIM CALL SBLANK ;SKIP TO NON-BLANK OPTCK1: MOV A,M ;GET OPTION CALL DELCHK ;DONE IF DELIM RZ CPI 'L' ;LIST ONLY? JZ OPTCKL CPI 'P' ;PAUSE? JZ OPTCKP CPI 'Z' ;USER 0? JZ OPTCKZ CALL PRINT DB CR,LF,'Invalid Option -- ',0 MOV A,M CALL TYPE JMP HCK1 OPTCKL: MVI A,0FFH ;SET FLAG STA LISTFL INX H ;PT TO NEXT JMP OPTCK1 OPTCKP: MVI A,0FFH ;SET FLAG STA PAUSE INX H ;PT TO NEXT JMP OPTCK1 OPTCKZ: MVI A,0FFH ;SET FLAG STA CURUSR INX H JMP OPTCK1 GETFN: PUSH D ;FILL TARGET FCB MVI B,11 ;11 BYTES MVI A,' ' ;SPACE FILL GETFN0: STAX D ;PUT SPACE INX D DCR B JNZ GETFN0 POP D ;PT TO ENTRY AGAIN CALL SCANCOL ;SCAN FOR COLON MVI B,8 ;8 CHARS MAX CALL GETFN1 ;GET AND FILL ENTRY MOV A,M ;GET CHAR CPI '.' ;DELIM? RNZ ;DONE INX H ;PT TO AFTER PERIOD MVI B,3 ;3 CHARS MAX AND DO IT AGAIN GETFN1: MOV A,M ;GET CHAR CPI '.' ;END OF FIELD? JZ GETFN3 CALL DELCHK ;CHECK DELIMITER RZ CPI '*' ;WILD? JZ GETFNQ STAX D ;STORE CHAR INX H ;PT TO NEXT INX D DCR B ;COUNT DOWN JNZ GETFN1 GETFN2: MOV A,M ;FLUSH CHARS TO DELIM CALL DELCHK ;CHECK FOR DELIMITER RZ INX H ;PT TO NEXT JMP GETFN2 GETFN3: INX D ;PT TO AFTER FIELD DCR B ;COUNT DOWN JNZ GETFN3 RET GETFNQ: MVI A,'?' ;FILL WITH QUESTION MARKS STAX D INX D DCR B JNZ GETFNQ JMP GETFN2 ;SKIP TO DELIM DELCHK: ORA A ;END OF LINE? RZ CPI '.' ;END OF FIELD? RZ CPI ',' ;END OF ENTRY? RZ CPI ' ' RET SBLANK: MOV A,M ;SKIP TO NON-BLANK CPI ' ' RNZ INX H JMP SBLANK SCANCOL: PUSH D ;SAVE TABLE PTR PUSH H ;SAVE PTR SCOL1: MOV A,M ;GET CHAR INX H ;PT TO NEXT CPI ':' ;COLON? JZ SCOLX CALL DELCHK ;CHECK FOR DELIMITER JNZ SCOL1 SCOL2: POP H ;RESTORE POP D RET SCOLX: XCHG ;DE PTS TO AFTER COLON POP H ;GET OLD PTR XCHG ;REPLACE IT POP D ;GET TABLE PTR RET ; ; CHECKS THE CURRENT 4 DIRECTORY ENTRIES AGAINST ARGUMENT ; IF MATCH, REWRITES SECTOR WITH REACTIVATED 1ST BYTES ; CHKENT: XRA A ;ASSUME NO REWRITE STA REWRT MVI B,4 ;NUMBER OF ENTRIES PER SECTOR LXI H,TBUFF ;BEGINNING OF BUFFER CKLUP: PUSH B MOV A,M CPI 0E5H ;CHECK FOR UNUSED JNZ CKINC LXI D,FNTAB ;PT TO POTENTIAL FILES LDA FNCOUNT ;NUMBER OF ENTRIES TO COUNT MOV B,A ;... IN B CKLUP0: PUSH H ;SAVE BEGINNING ADDRESS PUSH D ;SAVE PTR PUSH B ;SET NAME COUNT CALL COMPAR ;COMPARE WITH ARGUMENT POP B ;GET NAME COUNT POP D ;GET PTR POP H JZ CKLUP1 ;MATCH! PUSH H ;SAVE PTR LXI H,11 ;PT TO NEXT ENTRY DAD D XCHG POP H DCR B ;COUNT DOWN JNZ CKLUP0 JMP CKINC CKLUP1: LDA LISTFL ;LIST ONLY? ORA A ;0=NO JNZ CKINC MVI M,0 ;SET USER 0 LDA CURUSR ;CHECK FOR CURRENT USER CPI 0FFH JZ CKLUP2 PUSH H ;SAVE HL MVI E,0FFH ;GET USER VALUE MVI C,32 ;GET USER AREA FUNCTION CALL BDOS ;BDOS RETURNS CURRENT AREA IN 'A' REG. POP H ;RESTORE HL MOV M,A ;POKE IN CURRENT USER AREA CKLUP2: MVI A,0FH ;SAY NEED REWRITE STA REWRT MVI A,0FFH ;SET COUNT FLAG STA FIXCNT CKINC: POP B LXI D,32 ;LENGTH OF ENTRY DAD D DCR B JNZ CKLUP LDA REWRT ;SEE IF NEED REWRITE ORA A JZ CKDONE ;NO - DONE ; ; WRITE THE DIRECTORY SECTOR BACK TO THE DISK ; LHLD TRACK ;SET TRACK MOV C,L MOV B,H CALL SETTRK LHLD SECTOR ;SET SECTOR MOV B,H MOV C,L CALL TRNSLT CALL SETSEC CALL WRITE ;WRITE THE SECTOR BACK ORA A JNZ ERRWRT ;ABORT IF ERROR CKDONE: LHLD DIRMAX DCX H ;REDUCE SECTORS LEFT SHLD DIRMAX LHLD SECTOR ;POINT TO NEXT SECTOR INX H SHLD SECTOR XCHG LHLD MAXSEC ;REACHED LIMIT? INX H ;ONE MORE MOV A,H ;CHECK HIGH CMP D RNZ MOV A,L ;CHECK LOW CMP E RNZ LHLD TRACK ;NEXT TRACK INX H SHLD TRACK LXI H,1 ;FIRST SECTOR OF NEXT TRACK SHLD SECTOR RET ; ; COMPARE 11 BYTES OF DIRECTORY ENTRY AGAINST ARGUMENT ; COMPAR: SHLD TEMP ;Hold pointer in case of match INX H XCHG MVI C,11 CMPR1: LDAX D ;GET DIRECTORY ENTRY CHARACTER ANI 7FH ;STRIP ANY FLAGS CMP M JNZ CMPCKAM CMPR2: INX D INX H ;BUMP TO NEXT CHARACTER DCR C JNZ CMPR1 ;LOOP FOR 11 CHARACTERS LDA FIXCNT ;CHECK FLAG ORA A ;0=FIRST TIME CZ PRFIX LHLD TEMP CALL PRINTFCB XRA A RET ;RETURNS 'ZERO' FLAG SET FOR MATCH PRFIX: LDA LISTFL ;LIST ONLY? ORA A ;0=NO JNZ PRFIX1 CALL PRINT DB CR,LF,'File(s) Recovered --',0 RET PRFIX1: MVI A,0FFH ;DON'T PRINT THIS AGAIN STA FIXCNT CALL PRINT DB CR,LF,'Erased File(s) --',0 RET CMPCKAM: LDAX D CPI 0E5H ;NON-ALLOCATED ENTRY? JZ SKIP MOV A,M CPI '?' RNZ JMP CMPR2 SKIP: ORA A RET ;SET NZ FLAG ; ; CHECK FOR CP/M VERSION AND SET THINGS ; CPMCHK: LXI D,80H ;SET DMA TO TBUFF MVI C,26 CALL BDOS MVI C,12 ;VERSION NUMBER REQUEST CALL BDOS CPI 20H ;EARLIER THAN 2.2? JC VERERR CALL CPM22 ;IF 2.2 GO SET THINGS CALL GTBIOS ;ESTABLISH BIOS JUMP VECTOR ; ; SELECT DISK AND SETUP DISK PARAMETER HEADER ; LDA FCB ;GET THE DISK MOV E,A MVI C,14 CALL BDOS LDA FCB MOV C,A MVI B,0 CALL SELDSK ;MAKE SURE DRIVE IS MOV A,H ; SELECTED ORA L JZ ILDISK MOV E,M ;GET THE ADDRESS INX H ; OF THE XLTO MOV D,M XCHG SHLD DPH ;SAVE THE ADDRESS RET VERERR: CALL PRINT DB CR,LF,'ABORT - Prior to CP/M 2.x',0 JMP BOOT ; ; IF CP/M 2.2 DETERMINE NUMBER OF DIRECTORY ENTRIES ALSO ; CPM22: MVI C,31 ;GET DISK PARAMETERS ADDRESS CALL BDOS ;DPB ADDRESS IN 'HL' ON RETURN MOV E,M ;NUMBER OF SECTORS/TRACK INX H ;AS 2-BYTE QUANTITY IN DE MOV D,M INX H XCHG SHLD MAXSEC ;SET MAX SECTORS/TRACK XCHG INX H INX H MOV A,M ;GET EXM STA EXTENT INX H ;PT TO DRM INX H INX H MOV E,M ;GET NUMBER OF INX H ; DIRECTORY ENTRIES MOV D,M XCHG INX H ;ACCOUNT FOR - 1 CALL SHFHL2 ;SHIFT 'HL' RIGHT 2 SHLD DIRMAX ;SAVE NUMBER DIRECTORY SECTORS LXI H,5 ;NOW POINT TO SYSTEM DAD D ; TRACK OFFSET MOV A,M ;PICK UP NUMBER OF INX H MOV H,M MOV L,A SHLD TRACK RET ; ; ERROR OCCURED DURING DISK WRITE - ABORT ; ERRWRT: CALL PRINT DB CR,LF,'ABORT - Error During Disk Write',0 JMP BOOT ;ABORT ; ; MAKE SURE A LEGAL DISK IS SPECIFIED AND CHECK FOR HELP ; FCBCHK: LDA FCB ;GET DRIVE SPECIFICATION ORA A ;SEE IF DEFAULT JNZ FCBCK1 ;NO, GO CHECK FILENAME MVI C,25 ;ASK FOR CURRENT DRIVE CALL BDOS INR A ;OFFSET FOR NEXT INSTRUCTION FCBCK1: DCR A ;CURRENT DRIVE NUMBER STA FCB ;SAVE IT RET ; ; CHECK FOR HELP REQUEST ; HELPCHK: LDA FCB+1 ;GET 1ST BYTE OF FILENAME CPI '/' ;HELP? JZ HCK1 CPI ' ' ;MAKE SURE IT IS NON-BLANK RNZ ;OK - KEEP GOING ; ; IF NO FILE NAME IS SPECIFIED, ABORT WITH NOTICE ; HCK1: CALL PRINT DB CR,LF DB CR,LF,' UNERA is used to Unerase Files. It must be used' DB CR,LF,'IMMEDIATELY after the file is erased (before any' DB CR,LF,'new files are created). It is invoked by a command' DB CR,LF,'of the form:' DB CR,LF,' UNERA afn,afn,afn,... o' DB CR,LF,'where "afn" is an ambigous file name which' DB CR,LF,'specifies the files to be unerased and "o" is' DB CR,LF,'none or more of the following options:' DB CR,LF,' L - List Erased Files Only' DB CR,LF,' P - Pause for disk change' DB CR,LF,' Z - Place file in User 0 ' DB '(default is current)' DB CR,LF,' The forms:' DB CR,LF,' UNERA or UNERA //' DB CR,LF,'present this Help message.' DB CR,LF,' Drive prefixes (DU:) are ignored.' DB CR,LF,0 CLEANRET: LHLD STACK ;QUIET RETURN SPHL RET ; ; GET BIOS JUMPS VECTORS FOR EASY REFERENCE ; GTBIOS: LHLD BOOT+1 ;POINTS TO BIOS JUMP TABLE+3 LXI D,WBOOT ;WHERE WE WILL KEEP A COPY MVI B,16*3 ;MOVE 48 BYTES AND FALL THRU TO MOVE ; ; GENERAL PURPOSE MOVE ROUTINE ; FROM 'HL' TO 'DE' FOR COUNT OF 8 ; MOVE: MOV A,M ;GET A BYTE STAX D ;PUT A BYTE INX D ;INCREMENT TO NEXT INX H DCR B ;COUNT DOWN JNZ MOVE RET ; ;SPECIFIED AN ILLEGAL DISK DRIVE - ABORT ; ILDISK: CALL PRINT DB CR,LF,'ABORT - Illegal Disk Requested',0 JMP BOOT ;ABORT ; ; READS NEXT SECTOR (GROUP OF FOUR DIRECTORY ENTRIES) ; RETURNS WITH ZERO FLAG SET IF NO MORE ; NXTSEC: LHLD DIRMAX ;SEE IF MORE SECTORS MOV A,H ORA L RZ ;RETURNS ZERO FLAG IF NO MORE LHLD TRACK ;SET TRACK MOV C,L MOV B,H CALL SETTRK LHLD SECTOR ;SET SECTOR MOV B,H MOV C,L CALL TRNSLT CALL SETSEC CALL READ ;READ A SECTOR ANI 1 ;REVERSE SENSE OF ERROR FLAG XRI 1 ;RETURNS WITH ZERO FLAG SET RET ;IF BAD READ ; ; PRINT STRING PTED TO BY RET ADR ; PRINT: XTHL PRINTL: MOV A,M ;GET CHAR INX H ;PT TO NEXT ANI 7FH ;MASK JZ PRINTD CALL TYPE ;PRINT JMP PRINTL PRINTD: XTHL RET ; ; FCB PRINTING ROUTINE ; PRINTFCB: PUSH H LXI D,1+8+3 DAD D LDA EXTENT ;GET EXTENT MASK CMP M ;COMPARE TO TARGET POP H RC ;PRINT ONLY FIRST EXTENT CALL CRLF ;NEW LINE MVI A,' ' ;SPACE IN CALL TYPE CALL TYPE INX H MVI B,8 CALL PR1 MVI A,'.' CALL TYPE MVI B,3 PR1: MOV A,M ANI 7FH CPI ' ' ;Check for blanks CNZ TYPE INX H DCR B JNZ PR1 RET ; ; PRINT CHAR IN A ON TERMINAL; AFFECT NO REGS ; TYPE: PUSH H ;SAVE REGS PUSH D PUSH B PUSH PSW MOV E,A ;CHAR IN E MVI C,2 ;BDOS ROUTINE CALL BDOS POP PSW ;RESTORE REGS POP B POP D POP H RET ; ; DOES USER WANT TO PAUSE TO CHANGE DISKS OR SELECT USER 0? ; PUSCHK: LDA PAUSE ;GET OPTION ORA A RZ ;NOPE, SO RETURN CALL PRINT ;PRINT PAUSE MESSAGE DB CR,LF,'Change Disk - Hit ^C to Abort, Anything Else to Cont - ' DB 0 MVI C,01 CALL BDOS ;INPUT A CHAR CPI CTRLC ;ABORT? JZ CLEANRET CALL CRLF MVI C,0DH JMP BDOS ;RESET THE DISK ; ; NEW LINE ; CRLF: MVI A,0DH ;NEW LINE CALL TYPE MVI A,0AH JMP TYPE ; ; SHIFT REGS 'HL' RIGHT 2 BITS LOGICAL ; SHFHL2: CALL SHFHL ;ROTATE RIGHT 1 BIT AND FALL THRU SHFHL: XRA A ;CLEAR CARRY MOV A,H RAR ;SHIFTED BIT IN CARRY MOV H,A MOV A,L RAR MOV L,A RET ; ; TRANSLATE REG 'BC' FROM LOGICAL TO PHYSICAL SECTOR NUMBER ; TRNSLT: LHLD DPH ;GET ADDRESS OF XLTO XCHG CALL SECTRAN ;USE BIOS ROUTINE MOV C,L ;RETURN VALUE IN BC MOV B,H RET ; ; THIS IS THE WORKING COPY OF THE BIOS JUMP TABLE ; WBOOT: DS 3 CONST: DS 3 CONIN: DS 3 CONOUT: DS 3 LIST: DS 3 PUNCH: DS 3 READER: DS 3 HOME: DS 3 SELDSK: DS 3 SETTRK: DS 3 SETSEC: DS 3 SETDMA: DS 3 READ: DS 3 WRITE: DS 3 LISTST: DS 3 SECTRAN: DS 3 ; DS 100 ;STACK DEPTH STACK: DS 2 ;LOCATION OF STACK ; ; DATA AREAS ; FNCOUNT: DS 1 ;NUMBER OF FILE NAMES IN COMMAND LINE CURUSR: DS 1 ;0 IF NOT IN CURRENT USER PAUSE: DS 1 ;0 IF NO PAUSE FOR DISK CHANGE LISTFL: DS 1 ;0 IF NOT LIST ONLY DIRMAX: DS 2 ;NUMBER OF SECTORS IN DIRECTORY = ; ; MAXIMUM NUMBER OF DIRECTORY ENTRIES ; ; DIVIDED BY 4 (ENTRIES PER SECTOR) TEMP: DS 2 ;TEMP STORAGE FOR FCB PRINT EXTENT: DS 1 ;EXTENT MASK MAXSEC: DS 2 ;MAXIMUM NUMBER OF SECTORS/TRACK FIXCNT: DS 1 ;CHANGE FLAG REWRT: DS 1 ;REWRITE FLAG 0=NO, F=YES SECTOR: DS 2 ;CURRENT SECTOR NUMBER TRACK: DS 2 ;TRACK NUMBER OF DIRECTORY ; ; ADDRESS OF THE TRANSLATE TABLE ; DPH: DS 16 FNTAB: DS 11*40 ;FILE NAME BUFFER END