TITLE PHIMON DIRECTORY READ UTILITY 1 MAY 81 13:00 ;************************************************************* ; ; (c) 1981 GRH Electronics CUPERTINO, CA ; ;************************************************************* ; ; PHI-MON Directory display utility for use under CP/M. ; This utility displays directory information much the ; same way as the CP/M directory utility does, with the ; exception of the file status information. The file ; length and attributes are displayed without the use of ; a STAT command. Total blocks used is also displayed. ; wildcards are allowed to enable culling of files to be ; displayed. ; ; SYNTAX: ; PDIR D: ; ; WHERE: ; /I = Optional display of invisible files. ; /D = Optional display of deleted files. ; D: = PHI Drive # ('0' - '3') ; FILENAME = Optional PHIMON type filename of 6 characters ; + a 2 character extension. Wildcards of '*' or ; '?' are allowed. ; ;************************************************************* ; ; LINKS ; BDOS: EQU 0005H TPA: EQU 100H STACK: EQU TPA ; DEFBFR: EQU 0080H ; SETMAP: EQU 0F403H SETBID: EQU 0F406H SETCNT: EQU 0F409H SETDRV: EQU 0F40FH READF: EQU 0F412H ; ; ; CONSTANTS ; ZERO: EQU 0 ONE: EQU 1 TWO: EQU 2 THREE: EQU 3 FOUR: EQU 4 FIVE: EQU 5 SIX: EQU 6 ; DRIVEO: EQU -1 NAMEO: EQU 0 EXO: EQU NAMEO+6 LENGO: EQU EXO+2 BLOCKO: EQU LENGO+2 MAPO: EQU BLOCKO+2 ALTNMO: EQU MAPO+2 NAMCNT: EQU LENGO-NAMEO ; DELATT: EQU 0 PROATT: EQU 1 INVATT: EQU 2 SYSATT: EQU 3 TITLAT: EQU 7 ; DELATC: EQU 'D' PROATC: EQU 'W' INVATC: EQU 'I' SYSATC: EQU 'S' ; INVSW: EQU 'I' DELSW: EQU 'D' ; OVBUF1: EQU 01000000B DIROV2: EQU OVBUF1+14D ; MAXBLK: EQU 896D BASE10: EQU 10D DIVIDR: EQU 6 NOFILM: EQU 01111111B ; ; ASCII CHARS ; LF: EQU 0AH CR: EQU 0DH ASPACE: EQU 20H ASLASH: EQU 2FH AZERO: EQU '0' AQUEST: EQU '?' ; FORM ;************************************************************* ; ; ASSEMBLER DIRECTIVES ; ORG TPA ; ENTRY: JP START ; ; LOCAL PROCEDURES ; ; ; ASCII TEXT PROCEDURES ; CONOUT: EQU $ LD E,C ;SETUP LD A,C ;IF CHAR = CTRL-P THEN ONLY TOGGLE FLAG CP 10H JR Z,TGLLPT LD A,(TOGGLE) AND 7 ;LIMIT 0-7 LD C,A JP BDOS ; TGLLPT: EQU $ LD A,(TOGGLE) ;2 <-> 5 XOR 7 AND 7 LD (TOGGLE),A RET ; CONIN: EQU $ LD C,1 JP BDOS ; ; SERCH SUBR SEARCHES FOR A STRING CHAR THE SAME AS CONTENTS ; OF C. IT WILL NOT GO BEYOND A SEMICOLON ';'. ; ENTRY- DE= STRING PTR ; C= CHAR TO SEARCH FOR ; EXIT - HL= CHAR PTR ; Z=NOT FOUND ; SERCH: PUSH DE POP HL SERCH1: LD A,(HL) ;IF CHAR = NUL THEN RETURN Z OR A RET Z CP C ;ELSE IF CHAR=C THEN RETURN NZ JR Z,FOUND CP ';' ;IF CHAR = ';' THEN RETURN Z RET Z INC HL ;ELSE TRY NEXT CHAR JR SERCH1 ; FOUND: OR A RET ; ; SPACEL BYPASSES TRAILING SPACES UNTIL NUL OR NON-SPACE ; CHAR IS FOUND ; ENTRY- BC= STRING PTR ; EXIT - HL=1ST NON-SPACE CHAR ; Z=NOT FOUND ; SKIPON: PUSH BC POP HL SKIPO1: LD A,(HL) CP 20H ;IF CHAR <> ' ' THEN RETURN JR NZ,FOUND INC HL JR SKIPO1 ; ; CARRIAGE RETURN/LINE FEED SUBR ; CRLF: EQU $ LD C,0DH CALL CONOUT LD C,0AH JP CONOUT ; ; MESSAGE EDITOR SUBR ; ENTRY- BC = STRING PTR ; EDITOR: EQU $ PUSH BC EDITLP: EQU $ POP HL LD A,(HL) ;GET CHAR INC HL OR A RET Z PUSH HL LD C,A ;IF CHAR >= 80H THEN SPACES CALL M,MLTSPC JR Z,EDITLP CP 0DH ;IF RETURN THEN DO CR-LF PUSH AF CALL Z,CRLF POP AF JR Z,EDITLP CALL CONOUT JR EDITLP ; ; MULTI SPACE SUBR OUTPUTS <= 127D SPACES ; ENTRY- C= # SPACES ; EXIT - ZF SET ; MLTSPC: EQU $ LD B,C RES 7,B LD C,20H SPLP: PUSH BC ;SAVE CNT CALL CONOUT POP BC DJNZ SPLP XOR A RET ; ; SEARCH FOR SWITCH SUBR ; ENTRY- C= CHAR TO SEARCH FOR ; DE= STRING PTR ; EXIT - Z= NOT FOUND, NZ= FOUND ; SRCHSW: LD B,C LD C,2FH ;'/' SWNTFD: CALL SERCH RET Z ;NO SWITCHES INC HL LD A,(HL) EX DE,HL ;PTR -> DE CP B JR NZ,SWNTFD OR A RET ; ; SYSTEM ERROR SUBR - PRINTS ERROR MESSAGES ; ENTRY- ERROR NUMBER (1 THRU n) IN C ; EXIT - CY SET ; SYSERR: EQU $ PUSH BC CALL CRLF POP BC DEC C LD A,C LD HL,ERRTBL ;IF ENTRY COUNT < ERROR# THEN ; JUST ERROR CP (HL) JR NC,NOPRFX INC HL ;POINT TO 1ST ENTRY ADD A ;COMPUTE TABLE PTR LD E,A LD D,ZERO ADD HL,DE LD C,(HL) ;GET MESSAGE PTR INC HL LD B,(HL) CALL EDITOR NOPRFX: LD BC,ERRMSG CALL EDITOR JP 0 ; ERRMSG: DB ' Error!',CR,LF,0 ; ERRTBL: DB NUMENT ; DW CRCM DW NTFM DW JAMM DW PROTM DW SYNM DW FNTFM DW TYPEM DW DIRM DW NORMM ; CRCM: DB 'CRC',0 NTFM: DB 'Block not found',0 JAMM: DB 'Tape',0 PROTM: DB 'Write Protect',0 SYNM: DB 'Syntax',0 FNTFM: DB 'File not found',0 TYPEM: DB 'File type',0 DIRM: DB 'Directory',0 NORMM: DB 'No room',0 ; NUMENT: EQU 9D ; ; ; DONAME SUBR SETS FILE PARAMETER BLOCK PER INPUTTED ; STRING. DRIVE IS SET IF SPECIFIED. CHECKS FOR VALID ; CHARACTERS & ALPHA 1ST CHARACTER ARE PERFORMED. ; WILDCARDS ARE FORMATTED. '*' FILLS REMAINDER OF FPB ; WITH '?'s, '?'s ARE INSERTED AS ENCOUNTERED. ; ; ENTRY- BC= STRING PTR TO 1ST NON-SPACE CHAR. ; IY= FPB PTR ; EXIT - IY= FPB PTR TO NAME FIELD ; HL= STRING PTR TO LAST CHAR +2 ; CF= ERROR [ERR CODE IN A] ; A= '?' IF AMBIGUOUS FILENAME USED, 0 IF SPECIFIC ; ;********************************************************* ; ; RDDRV: EQU 0F430H ;PHI PROM ADDR ; ; DONAME: PUSH BC POP HL DONAM1: PUSH IY ;SETUP POP DE PUSH DE XOR A LD (WILDFL),A ;CLEAR WILDCARD FLAG LD B,EXO ;ZERO FPB FILENAME DOLP: LD (DE),A INC DE DJNZ DOLP POP DE LD B,NAMEO DONEXT: LD A,(HL) ;GET STRING CHAR RES 7,A ;CLEAR ATTRIBUTE INC HL PUSH BC CALL RSVP1 ;IF RESERVED CHAR THEN EXIT POP BC JR Z,DOCOLN CP '[' ;IF OUT OF RANGE THEN ERR CCF JR C,DOERR CP 2AH ;IF CHAR = '*' THEN DO WILDCARD FORMAT JR Z,DOWILD CP '?' ;IF AMBIGUOUS THEN SET FLAG JR NZ,DONOQU LD (WILDFL),A DONOQU: LD (DE),A ;ELSE PUT CHAR INTO FPB INC DE DJNZ DONEXT DOMORE: LD A,(HL) ;IF NEXT CHAR= PERIOD THEN SET EXTEN. RES 7,A NAMEDN: CP 2EH JR Z,EXTNTN LD A,(IY+0) ;ELSE SET NOT DELETED ATTRIB & SET 7,(IY+0) CALL ALPHA1 ;IF 1ST CHAR <> ALPHA THEN ERR JR C,DOERR CALL RDDRV ;SET SPEC'D DRIVE INTO FPB LD (IY+DRIVEO),A OR A ;CLEAR CF LD A,(WILDFL) ;RETURN WILDCARD FLAG RET ; EXTNTN: EQU $ LD B,EXO ;SET PTR TO EXTENSION PUSH IY POP DE EXTLP: INC DE DJNZ EXTLP LD B,LENGO-EXO JR DONEXT ; DOCOLN: EQU $ CP ':' ;IF NOT COLON THEN DONE JR NZ,NAMEDN PUSH HL DEC HL ;IF LAST CHAR NOT VALID DRIVE# THEN ERR EX DE,HL PUSH BC CALL DCKSL1 POP BC POP HL ;RESTORE PTR JR C,DOERR JR Z,NODRV1 LD C,A CALL SETDRV NODRV1: CALL SKIPO1 JR DONAM1 ; DOERR: EQU $ LD A,5 ;SET UP SYNTAX ERROR SCF RET ; DOWILD: EQU $ LD A,'?' ;FILL REMAINING FPB FIELD WITH ?s LD (WILDFL),A ;SET WILDCARD FLAG WILDLP: LD (DE),A INC DE DJNZ WILDLP JR DOMORE ; ; RESERVED CHARACTER LOOKUP SUBR ; ENTRY- CHAR TO LOOKUP IN C ; EXIT - Z= FOUND ; RSVP: LD A,C RSVP1: PUSH BC ;SAVE REGS PUSH HL CP 21H ;IF CTRL CHAR THEN RESERVED JR NC,RSVPT CP A ;SET Z JR RSVPF ; RSVPT: LD HL,RSVPTB ;SET TABLE PTR LD B,(HL) ;GET # ELEMENTS RSVPLP: INC HL CP (HL) JR Z,RSVPF ;IF CHAR IN TABLE THEN RESERVED DJNZ RSVPLP INC B ;SET NZ RSVPF: POP HL POP BC RET ; RSVPTB: DB RSVPL-$-1 DB 20H,'=',2DH,2EH,':',';','<','>' RSVPL: EQU $ ; ; ALPHA CHAR TEST ; ENTRY- C= CHAR ; EXIT - CF= NOT ALPHA, NC= ALPHA ; ALPHAT: LD A,C ALPHA1: EQU $ CP ':' ;IF > '9' THEN OK RET NC CP '0' ;ELSE IF < '0' THEN OK CCF RET ; ; SELECT DRIVE SUBR ; DCKSL1: EQU $ LD C,':' ;FIND DRIVE SPEC CALL SERCH RET Z DEC HL CALL SKIPBK LD A,(HL) SUB '0' RET C CP 4 CCF RET ; ; SKIP BACKWARD ; SKIPBK: EQU $ LD A,(HL) CP 20H RET NZ DEC HL JR SKIPBK ; ; ; DIRECTORY SEARCH FOR FILE REFERENCED IN FPB ; NOTE: IF WILDCARDS USED, THESE ROUTINES RETURN FIRST MATCH. ; ENTRY- IY= FPB PTR (DRIVE, NAME PRESET) ; EXIT - NC AND Z= NORMAL, CF OR NZ= ERROR [A= ERR CODE] ; HL= BLOCK ID OF FILE ; DE= DIRECTORY PTR (NOT NEEDED FOR RE-ENTRY) ; C= ENTRIES REMAINING ; (BLKTOT)= FILE START BLOCK ID ; DIRSRH: EQU $ LD HL,(DIRBUF) ;SET PTR LD (DIRPTR),HL LD C,(HL) ;BLOCK TOTAL:= START BLOCK LD B,0 LD (BLKTOT),BC INC HL ;SET DIR ENTRY COUNT LD C,(HL) DEC C ;IF NO ENTRIES THEN RETURN ERR JR Z,NOENT NXTFIL: PUSH IY ;FPB PTR -> HL POP DE INC HL BIT 7,(HL) ;IF DELETED THEN SKIP LD B,NAMCNT ;SET ENTRY CHAR COUNT JR Z,NOGOOD NXCHAR: LD A,(DE) RES 7,A ;CLEAR ATTRIB. CP '?' ;IF WILDCARD THEN OK AS IS JR Z,GOOD CP (HL) ;ELSE IF (FPB) = (DIR) THEN MATCH JR Z,GOOD SET 7,A ;ELSE TRY WITH ATTRIB. SET CP (HL) JR NZ,NOGOOD GOOD: INC DE ;LOOP IF COUNT <> 0 INC HL DJNZ NXCHAR LD (DIRPTR),HL ;SAVE VARS FOR SEARCH NEXT ENTRY LD (DIRVAR),BC LD DE,-NAMCNT ;BACK UP DIR PTR TO BEGINNING ; OF ENTRY ADD HL,DE EX DE,HL LD HL,(BLKTOT) ;RETURN START BLOCK ID OF FILE XOR A ;CLEAR ERR RET ; NOGOOD: INC HL ;WASTE ENTRY DJNZ NOGOOD NXTENT: DEC C ;IF NOT LAST ENTRY THEN ADD ; FILE LENGTH TO TOTAL & LOOP PUSH AF EX DE,HL CALL ADDBLK EX DE,HL POP AF JR NZ,NXTFIL NOENT: LD A,6 ;RETURN NOT FOUND ERROR CP A ;SET Z SCF RET ; ; DIRECTORY SEARCH NEXT ENTRY POINT ; ENTRY & EXIT PARAMS SAME AS DIRECTORY SEARCH ; DIRSNX: LD HL,(DIRPTR) ;RESTORE SEARCH VARIABLES LD BC,(DIRVAR) JR NXTENT ; ; READ DIRECTORY SUBR ; ENTRY- IY= FPB PTR (DRIVE PRESET) ; (DIRBUF)= 1K DIRECTORY BUFFER AREA ; DIRRD: EQU $ READIR: LD A,(IY+DRIVEO) ;SET CURRENT DIR := FPB(DRIVE) LD C,A CALL SETDRV LD BC,(DIRBUF) ;SET READ PTR CALL SETMAP LD BC,0 ;SET BLOCK ID CALL SETBID LD C,4 ;SET BLK COUNT CALL SETCNT JP READF ; ; ADD LENGTH OF FILE TO TOTAL SUBR ; ENTRY- (DE)= LO BYTE OF FILE LENGTH ; (BLKTOT)= TOTAL TO BE ADDED TO ; EXIT - DE= NEXT DIR ENTRY(NAME) -1 ; ADDBLK: PUSH BC ;SAVE VARS LD A,(DE) ;GET THIS FILE'S LENGTH & ADD TO TOTAL LD C,A INC DE LD A,(DE) LD B,A LD HL,(BLKTOT) ADD HL,BC LD (BLKTOT),HL POP BC RET ; ; ; PRINT FILENAME FROM FPB SUBR ; ENTRY- IY= FPB PTR (NAME PRESET) ; ; PRNAME: EQU $ PUSH IY POP HL LD C,8D ;SET CHAR COUNT PUSH BC PRNXTC: LD A,(HL) ;GET CHAR INC HL RES 7,A OR A ;IF CHAR = 0 THEN CHAR := SPACE LD C,A JR NZ,PRNT LD C,20H ;' ' PRNT: EQU $ PUSH HL CALL CONOUT POP HL POP BC DEC C ;COUNT -1 RET Z PUSH BC LD A,C ;IF COUNT = 2 THEN OUTPUT '.' CP 2 LD C,2EH PUSH HL CALL Z,CONOUT POP HL JR PRNXTC ; ; OUTPUT DECIMAL WORD SUBR ; ENTRY- BC = WORD VALUE OF NUMBER TO OUTPUT ; PUT2D: EQU $ PUSH BC ;BC -> DE POP DE LD HL,UNIT ;ZERO DIGITS LD B,FIVE SET0: LD (HL),ZERO INC HL DJNZ SET0 DEC HL ;(HL) = MSD LD BC,-10000D ;TEN THOUSANDS DIGIT CALL DECDIG LD BC,-1000D ;THOUSANDS DIGIT CALL DECDIG LD BC,-100D ;HUNDREDS DIGIT CALL DECDIG LD BC,-10D ;TENS DIGIT CALL DECDIG LD (HL),E ;UNITS DIGIT LD HL,TTHOU ;HL := PTR LD DE,0500H ;D := COUNT, E := FLAG NXTDEC: LD A,(HL) ;CHAR := NUMBER + '0' ADD '0' LD C,A ;PASS CHAR IN C FOR OUTPUT CP '0' ;IF CHAR <> '0' THEN SET FLAG JR NZ,FIRST INC E ;IF FLAG <> 0 THEN OUTPUT DEC E JR NZ,OUTNUM LD A,D ;IF COUNT = 1 THEN OUTPUT DEC A JR Z,OUTNUM LD C,ASPACE ;ELSE CHAR = ' ' JR OUTNUM ; FIRST: INC E ;FLAG := FLAG +1 OUTNUM: PUSH HL PUSH DE CALL CONOUT POP DE POP HL DEC HL ;NEXT DIGIT DEC D JR NZ,NXTDEC ;DO UNTIL DONE RET ; ; DIVIDE DE BY BC SUBR ; DECDIG: EQU $ PUSH HL ;PTR EX DE,HL ADD HL,BC ;HL := HL + (- NUMBER) JR NC,ADDIT ;IF NO BORROW THEN DIG := DIG +1 EX DE,HL ;ELSE DIG := DIG +1 POP HL ;PTR INC (HL) JR DECDIG ; ADDIT: LD A,C ;BC := +BC CPL LD E,A LD A,B CPL LD D,A INC DE ADD HL,DE ;NUMBER := NUMBER BEFORE LAST SUBTRACT EX DE,HL ;NUMBER -> DE POP HL ;PTR := NEXT DIGIT DEC HL RET ; ; ; DIRECTORY COMMAND ; START: EQU $ LD SP,STACK LD BC,SIGNON CALL EDITOR LD HL,DEFBFR ;MOVE COMMAND LINE TO BUFFER LD DE,CMDBFR LD C,(HL) ;GET COUNT RES 7,C ;INSURE ONLY 128D BYTES LD A,C ;IF CNT = 0 THEN ABORT OR A JR Z,SYNERR LD B,ZERO INC HL ;DON'T MOVE CHAR COUNT LDIR XOR A ;CLEAR & INIT VARIABLES LD (DE),A ;PUT 0 AT LAST CHAR OF CMD LINE LD HL,SWBYTE LD (HL),A LD (SECND),A PUSH HL LD DE,CMDBFR LD (CMDPTR),DE LD C,INVSW ;IF '/I' THEN SET BIT 0 OF ; SWITCH BYTE CALL SRCHSW JR Z,NOINV POP HL SET 0,(HL) PUSH HL NOINV: LD DE,(CMDPTR) ;RESTORE PTR LD C,DELSW ;IF '/D' THEN SET BIT 1 CALL SRCHSW POP HL JR Z,NODELS SET 1,(HL) NODELS: LD HL,(CMDPTR) ;GO FIND FILE SPEC SKIPSW: LD C,ASPACE CALL SERCH1 CALL SKIPO1 JR NZ,CONT1 SYNERR: LD C,5 ;SYNTAX ERR JP SYSERR ; CONT1: EQU $ LD A,(HL) ;IF SWITCH THEN BYPASS CP ASLASH JR Z,SKIPSW LD IY,FPB ;SET UP CALL DONAM1 JR NC,CONT2 JR SYNERR ; CONT2: EQU $ LD A,(IY+NAMEO) ;IF NO NAME SPEC'D THEN USE ALL AND NOFILM JR NZ,SPECIF PUSH IY POP HL LD B,NAMCNT ALLP: LD (HL),AQUEST INC HL DJNZ ALLP SPECIF: CALL READIR JR Z,CONT3 ;IF DIRECTORY READ ERROR THEN EXIT LD C,A JP SYSERR ; CONT3: EQU $ LD A,(IY+DRIVEO) ;PUT DRIVE # INTO HEADER ADD AZERO LD (MSGDRV),A LD BC,DIRHDR ;OUTPUT HEADER CALL EDITOR LD HL,(DIRBUF) ;IF 1ST FILE = TITLE THEN ; OUTPUT IT INC HL INC HL PUSH HL POP IY BIT 7,(IY+TITLAT) CALL NZ,PRNAME LD BC,HDR2M ;OUTPUT HEADER MSG CALL EDITOR LD IY,FPB CALL DIRSRH ENTLP: LD C,A JP NZ,SYSERR JR C,DIRDON PUSH DE ;IF INVISIBLE THEN CHECK SWITCH POP IY BIT 7,(IY+INVATT) JR Z,INVBYP ;IF SWITCH NOT SET THEN SKIP LD A,(SWBYTE) BIT 0,A JR Z,INVBYP INVBYP: EX DE,HL CALL PRNAME LD C,THREE ;OUTPUT 3 SPACES CALL MLTSPC LD C,(IY+LENGO) ;OUTPUT FILE LENGTH LD B,(IY+LENGO+1) CALL PUT2D LD C,FOUR CALL MLTSPC LD C,DELATC ;IF DELETED THEN OUTPUT 'D' BIT 7,(IY+DELATT) CALL PUTSW1 LD C,PROATC ;IF WRITE PROTECTED THEN OUTPUT 'W' BIT 7,(IY+PROATT) CALL PUTSW LD C,INVATC ;IF INVISIBLE THEN OUTPUT 'I' BIT 7,(IY+INVATT) CALL PUTSW LD C,SYSATC ;IF SYSTEM FILE THEN OUTPUT 'S' BIT 7,(IY+SYSATT) CALL PUTSW LD C,DIVIDR ;OUTPUT # SPACES CALL MLTSPC LD A,(SECND) ;IF 2ND COLUMN THEN OUTPUT CRLF XOR ONE LD (SECND),A CALL Z,CRLF NEXT: LD IY,FPB CALL DIRSNX JR ENTLP ; DIRDON: CALL CRLF LD BC,(BLKTOT) ;OUTPUT # USED BLOCKS PUSH BC CALL PUT2D LD BC,USDMSG CALL EDITOR POP BC LD HL,MAXBLK OR A SBC HL,BC PUSH HL POP BC CALL PUT2D LD BC,FREMSG CALL EDITOR XOR A JP ZERO ; PUTSW1: JP Z,CONOUT JR OUTSP ; PUTSW: JP NZ,CONOUT OUTSP: LD C,ASPACE JP CONOUT ; ; MESSAGES ; SIGNON: DB CR,'PHIMON Directory display Utility Ver 1.0' DB CR DB '(c) 1981 GRH Electronics CUPERTINO, CA',0 DIRHDR: DB CR,LF,'Directory for ' MSGDRV: DB '0: ',0 HDR2M: DB CR,LF,'Name',88H,'Length',83H,'Attrib.',83H DB 'Name',88H,'Length',83H,'Attrib.',CR,0 FREMSG: DB ' Free',CR,0 USDMSG: DB ' Used',85H,0 ; SWBYTE: DB 0 SECND: DB 0 ; TOGGLE: DB 02H WILDFL: DB 0 DIRPTR: DW BUFFER DIRVAR: DW 0 BLKTOT: DW 0 CMDPTR: DW CMDBFR FPB: EQU $ DRIVE: DB 0 NAME: DW 0,0,0 EX: DW 0 LENG: DW 0 BLOCK: DW 0 MAP: DW 0 ALTNAM: DW 0,0,0,0 UNIT: DW 0,0 ;PUT DECIMAL ACCUMULATORS TTHOU: DB 0 ; DIRBUF: DW BUFFER ; CMDBFR: DS 129D BUFFER: EQU $ ; END