;
; Program:  CLEANDIR
; Derivation:  SAP 3.8 (see following history for authors)
; Derivation By:  Richard Conn
; Version: 1.1
; Date:  28 November 1984
; Previous Versions: 1.0 (20 June 84)
;
; bug fix ;841201       Peter T Lyman
; Version 1.1P
;
;       Search for ';841201' to locate the code
;
;       CLEANDIR can and does wipe out the operating system
;       (also known as a crash) whenever the maximum size of
;       the directory (DRM) exceeds the available memory....
;
;       Maybe that is a good feature, since you at least don't
;       hurt the disk...
;
;       However on my hard disk I have two platters with
;       DRM equal to 2048....  In this case CLEANDIR crashes...
;
;       The fix that I have added (I did this with an early version
;       of SAP) gives you a choice....  If DRM is greater than
;       the space available betwwen BUF and BDOS,  you are given
;       a choice with proceeding if the actual number of directory
;       entries is less than or equal to the space available....
;       If not you ABORT.....
;
;       The down side risk of this modification is that if you
;       proceed ("Y") when the actual number of files exceeds
;       the space available,  you lose all the directories entries
;       which don't fit in the available space....
;
;       With out the fix the system crashes and you cannot clean the
;       directory...  With the fix you can clean the directory, but
;       you can lose files if you don't pay attention....
;

vers    equ     11
z3env   equ     0f400h

;
;  SYSLIB and Z3LIB References
;
       ext     z3init,z3log
       ext     eprint,cout
       ext     codend
       ext     phlfdc                                          ;841201

;
; Environment Definition
;
       if      z3env ne 0
;
; External ZCPR3 Environment Descriptor
;
       jmp     start
       db      'Z3ENV' ;This is a ZCPR3 Utility
       db      1       ;External Environment Descriptor
z3eadr:
       dw      z3env
start:
       lhld    z3eadr  ;pt to ZCPR3 environment
;
       else
;
; Internal ZCPR3 Environment Descriptor
;
       MACLIB  Z3BASE.LIB
       MACLIB  SYSENV.LIB
z3eadr:
       jmp     start
       SYSENV
start:
       lxi     h,z3eadr        ;pt to ZCPR3 environment
       endif

;
; Start of Program -- Initialize ZCPR3 Environment
;
       call    z3init  ;initialize the ZCPR3 Environment

; v3.8 SORT AND PACK CP/M DISK DIRECTORY - 10/16/83
;
; THIS PROGRAM READS THE DISK DIRECTORY TRACKS, SORTS THEM ALPHABETICALLY
; THEN REPLACES THEM ON THE DISK.  ALL UNUSED OR ERASED AREAS ON THE DIR-
; ECTORY TRACK ARE REFORMATTED WITH CONTINUOUS 'E5' CHARACTERS.  (THIS
; ERASES PREVIOUS FILE NAMES WHICH HAVE BEEN DEACTIVATED.)  SORTING THE
; DIRECTORY IN THIS MANNER OFFERS MANY ADVANTAGES.  SOME OF THEM ARE:
;
;       1)  ALLOWS 'DIR' TO SHOW AN ALPHABETIZED LISTING
;       2)  ELIMINATES POTENTIAL PROBLEMS WITH "UNERASE" PROGRAMS
;       3)  SPEEDS UP ACCESS VIA 'SD' AND OTHER SPECIAL PROGRAMS
;       4)  ASSISTS ON WORKING DIRECTLY ON THE DISK WITH 'DUU', ETC.
;       5)  REMOVES FILES FROM THE DISK SOMEBODY ELSE COULD RECOVER
;
;                               - Notes by Irv Hoff W6FFC
;
; 1977  Written by L. E. Hughes.  Modified extensively since by Bruce
;       Ratoff, Keith Petersen, James Prest, Ron Fowler, Frank Gaude,
;       Irv Hoff and likely others.
;
; 10/16/83 Now using a Shell-Metzner sort which speeds the sorting time
;          considerably, especially on large directories. (SFK)
;
; 07/27/83 Shows an error flag for MP/M and CP/M+ both.  Rewrites dir-
;          tory even if previously sorted, to insure erased programs at
;   v3.7   end of directory are properly cleared.
;                                       - Irv Hoff
;
TRUE    EQU     0FFH
FALSE   EQU     0
;
BDOS    EQU     5
CR      EQU     0DH
DPBLEN  EQU     15              ;SIZE OF CP/M2 DISK PARAMETER BLOCK
FCB     EQU     5CH
FCB2    EQU     6CH
GETDSK  EQU     25              ;BDOS "GET DISK #" FUNCTION
LF      EQU     0AH
SELDRV  EQU     14              ;SELECT DRIVE
;.....
;
;
; OBTAIN BIOS VECTORS
;
VECTRS:
       JMP     GETVEC
;
       DS      53              ;ROOM FOR JUMP VECTORS
;
WBOOT   EQU     VECTRS+3        ;DO NOT CHANGE THESE EQUATES
CSTS    EQU     VECTRS+6
CI      EQU     VECTRS+9
CO      EQU     VECTRS+12
LO      EQU     VECTRS+15
PO      EQU     VECTRS+18
RI      EQU     VECTRS+21
HOME    EQU     VECTRS+24
SELDSK  EQU     VECTRS+27
SETTRK  EQU     VECTRS+30
SETSEC  EQU     VECTRS+33
SETDMA  EQU     VECTRS+36
READ    EQU     VECTRS+39
WRITE   EQU     VECTRS+42
LSTS    EQU     VECTRS+45       ;ONLY IN CP/M2
SECTRN  EQU     VECTRS+48       ;ONLY IN CP/M2
;
;  GET BIOS VECTORS
;
GETVEC:
       LXI     D,WBOOT
       LHLD    1
       MVI     B,53
       CALL    MOVE
;
;  PROGRAM STARTS HERE
;
       LXI     H,0
       DAD     SP              ;GET ADDRESS OF CP/M STACK
       SHLD    STACK           ;STORE IT SO WE CAN GO BACK TO IT
       CALL    CODEND          ;DETERMINE FREE SPACE
       LXI     D,80H           ;ALLOW 80H BYTES FOR STACK
       SHLD    BUF             ;SET BUFFER ADDRESS
       SPHL                    ;SET TOP OF STACK
       lda     bdos+2          ;fetch bdos page                ;841201
       dcr     a               ; less one                      ;
       lhld    buf             ;fetch buf pntr                 ;
       sub     h               ;available space for dir        ;
       mvi     h,0             ;                               ;
       mov     l,a             ;number of pages available      ;
       dad     h               ;x2->number of sectors          ;
       dad     h               ;x2                             ;
       dad     h               ;x2->number of directory        ;
                               ;    entries which will fit     ;
       shld    maxdir          ;save for later                 ;
       XRA     A               ;SET NO REVERSE OF USER AREAS
       STA     REVERSE
       CALL    EPRINT          ;PRINT MSG:
       DB      'CLEANDIR, Version '
       DB      (vers/10)+'0','.',(vers mod 10)+'0','P'         ;841201
       DB      0
       LDA     FCB+1           ;CHECK FOR HELP REQUEST
       CPI     '/'             ;ANY OPTION MEANS HELP
       JZ      HELP
       CPI     'D'             ;SELECT DESCENDING ORDER?
       JZ      DESC
       LDA     FCB2+1          ;CHECK FOR OPTION CHAR
       CPI     'D'             ;DESCENDING ORDER OF USER AREAS?
       JNZ     SAP
DESC:
       MVI     A,0FFH          ;ENABLE REVERSE
       STA     REVERSE
       JMP     SAP
;
;  PRINT HELP MESSAGE
;
HELP:
       CALL    EPRINT
       DB      CR,LF,'Syntax:'
       DB      CR,LF,'  CLEANDIR dir: o'
       DB      CR,LF,'Options:'
       DB      CR,LF,'  D - sort in Descending Order (users and files)'
       DB      CR,LF,'Note:'
       DB      CR,LF,'  Only disk ref is used in dir: form'
       DB      0
       JMP     EXIT1
;
;  MAIN PROGRAM ROUTINE
;
SAP:
       CALL    SETUP
       call    ckdrsz          ;check available memory space   ;841201
       CALL    RDDIR
       CALL    CLEAN
       CALL    SORT
       CALL    PACK
       CALL    WRDIR
       CALL    EPRINT
       DB      'Done',0
       JMP     EXIT

ckdrsz: lhld    drm             ;fetch max dir size             ;841201
       xchg                    ;                               ;
       lhld    maxdir          ;fetch memory available for dir ;
       call    hlmde           ;subtract                       ;
       rnc                     ;return if room                 ;
       call    eprint          ;else...                        ;
       db      lf,lf,lf,lf,lf,lf                               ;
       db      cr,lf,'Your maximum directory size is ',0       ;
       lhld    drm             ;print max dir size             ;
       inx     h               ;                               ;
       call    phlfdc          ;                               ;
       call    eprint          ;                               ;
       db      ' directory entries.',0                         ;
       call    eprint          ;                               ;
       db      cr,lf,'your memory can only handle    ',0       ;
       lhld    maxdir          ;print space available          ;
       call    phlfdc          ;                               ;
       call    eprint          ;                               ;
       db      ' directory entries.'                           ;
       db      cr,lf,lf,'IF.....your directory DOES NOT exceed ',0;
       lhld    maxdir          ;                               ;
       call    phlfdc          ;                               ;
       call    eprint          ;                               ;
       db      ' directory entries,'                           ;
       db      cr,lf,'                 (Directory entries  NOT  Files)';
       db      cr,lf,'       you may enter "Y" to proceed,'    ;
       db      cr,lf,lf,'ELSE...any other key ABORTS.'         ;
       db      cr,lf,lf,lf,lf,lf,lf,lf,lf,'..............> ',7,0;
ck1:    mvi     c,6             ;get input                      ;
       mvi     e,-1            ;                               ;
       call    bdos            ;                               ;
       cpi     0               ;                               ;
       jz      ck1             ;                               ;
       ani     5fh             ;                               ;
       cpi     'Y'             ;                               ;
       jnz     exit1           ;                               ;
       lhld    maxdir          ;                               ;
       shld    drm             ;                               ;
       ret                     ;                               ;
                               ;                               ;
hlmde:  mov     a,h             ;                               ;
       cmp     d               ;                               ;
       rnz                     ;                               ;
       mov     a,l             ;                               ;
       cmp     e               ;                               ;
       ret                     ;                               ;
;
;       SUBROUTINES
;
;
CLEAN:
       LXI     H,0             ;I = 0
;
CLNLOP:
       SHLD    I
       CALL    INDEX           ;HL = BUF + 16 * I
       MOV     A,M             ;JUMP IF THIS IS A DELETED FILE
       CPI     0E5H
       JZ      FILLE5
       LXI     D,12
       DAD     D               ;HL = HL + 12
       MOV     A,M             ;CHECK EXTENT FIELD
       ORA     A
       JNZ     CLBUMP          ;SKIP IF NOT EXTENT ZERO
       INX     H               ;POINT TO RECORD COUNT FIELD
       INX     H
       MOV     A,M             ;GET S2 BYTE (EXTENDED RC)
       ANI     0FH             ;  FOR CPM2, 0 FOR CPM1
       MOV     E,A
       INX     H
       MOV     A,M             ;CHECK RECORD COUNT FIELD
       ORA     E
       JNZ     CLBUMP          ;JUMP IF NON-ZERO
       LHLD    I               ;CLEAR ALL 32 BYTES OF
       CALL    INDEX           ;  DIRECTORY ENTRY TO E5
       INX     H
       MOV     A,M             ;GET FIRST CHAR OF FILENAME
       DCX     H               ;  WARD CHRISTENSONS CAT PGMS
       CPI     '-'             ;  HAVE DISKNAME OF ZERO LENGTH
       JZ      CLBUMP          ;  THAT START WITH '-', DON'T DELETE
       CPI     ' '             ;  DISCAT USES DISKNAME OF ZERO LENGTH
       JZ      CLBUMP          ;  THAT STARTS WITH ' ', DON'T DELETE
;
FILLE5:
       MVI     C,32            ;NUMBER OF BYTES TO CLEAR
;
FILLOP:
       MVI     M,0E5H          ;MAKE IT ALL E5'S
       INX     H
       DCR     C
       JNZ     FILLOP
;
CLBUMP:
       LHLD    DRM             ;GET COUNT OF FILENAMES
       INX     H
       XCHG
       LHLD    I               ;OUR CURRENT COUNT
       INX     H
       PUSH    H
       CALL    SUBDE           ;SUBTRACT
       POP     H
       JC      CLNLOP          ;LOOP TILL ALL CLEANED
       RET
;
DODIR:
       STA     WRFLAG
       LHLD    SYSTRK
       CALL    DOTRAK          ;SET THE TRACK
       LXI     H,0
       SHLD    SECTOR
       LHLD    DRM             ;NUMBER OF DIR ENTRIES
       INX     H               ;RELATIVE TO 1
       CALL    ROTRHL          ;DIVIDE BY 4
       CALL    ROTRHL          ;  TO GET SECTOR COUNT
       SHLD    DIRCNT
       LHLD    BUF
       SHLD    ADDR            ;FOR DMA ADDRESS
;
DIRLOP:
       LHLD    SECTOR          ;GET SECTORS PER TRACK
       INX     H
       XCHG
       LHLD    SPT             ;CURRENT SECTOR
       CALL    SUBDE           ;  SECTOR - SPT
       XCHG
       JNC     NOTROV
;
; TRACK OVERFLOW, BUMP TO NEXT
;
       LHLD    TRACK
       INX     H
       CALL    DOTRAK
       LXI     H,1             ;REWIND SECTOR NUMBER
;
NOTROV:
       CALL    DOSEC           ;SET CURRENT SECTOR
       LHLD    ADDR
       MOV     B,H             ;SET UP DMA ADDRESS
       MOV     C,L
       CALL    SETDMA
       LDA     WRFLAG          ;TIME TO FIGURE OUT
       ORA     A               ;  IF WE ARE READING
       JNZ     DWRT            ;  OR WRITING
;
;
; READ
;
       CALL    READ
       ORA     A               ;TEST FLAGS ON READ
       JNZ     RERROR          ;NZ=ERROR
       JMP     MORE            ;GOOD READ, GO DO MORE
;
; TRACK AND SECTOR UPDATE ROUTINES
;
DOTRAK:
       SHLD    TRACK
       MOV     B,H
       MOV     C,L
       CALL    SETTRK
       RET
DOSEC:
       SHLD    SECTOR
       MOV     B,H
       MOV     C,L
       LHLD    SECTBL
       XCHG
       DCX     B
       CALL    SECTRN
       MOV     B,H
       MOV     C,L
       CALL    SETSEC
       RET
;
; WRITE
;
DWRT:
       MVI     C,1             ;FOR CPM/2 DEBLOCKING BIOS'S
       CALL    WRITE
       ORA     A               ;TEST FLAGS ON WRITE
       JNZ     WERROR          ;NZ=BAD DIRECTORY WRITE
       JMP     MORE
;
; Exit Program
;
EXIT:
       LDA     NOBOOT          ;SEE IF BOOT IS NEEDED
       ORA     A
       JNZ     EXIT1           ;FLAG IS SET IF ALREADY ALPHABETIZED
       JMP     0000H           ;A REWRITTEN DIRECTORY NEEDS A WARM BOOT
;
EXIT1:
       LHLD    STACK           ;GET ADDRESS OF ORIGINAL CP/M STACK
       SPHL                    ;RESET STACK ADDRESS
       RET
;
INDEX:
       DAD     H
       DAD     H
       DAD     H
       DAD     H
       DAD     H
       XCHG
       LHLD    BUF     ;GET ADDRESS OF BUF
       XCHG
       DAD     D
       RET
;
; GOOD READ OR WRITE
;
MORE:
       LHLD    ADDR            ;BUMP DMA ADRS FOR NEXT PASS
       LXI     D,80H
       DAD     D
       SHLD    ADDR
       LHLD    DIRCNT          ;COUNTDOWN ENTRIES
       DCX     H
       SHLD    DIRCNT
       MOV     A,H             ;TEST FOR ZERO LEFT
       ORA     L
       JNZ     DIRLOP          ;LOOP TILL ZERO
;
;
; DIRECTORY I/O DONE, RESET DMA ADDRESS
;
       LXI     B,80H
       CALL    SETDMA
       RET
;
; MOVE UTILITY SUBROUTINE
;
MOVE:
       MOV     A,M
       STAX    D
       INX     H
       INX     D
       DCR     B
       JNZ     MOVE
       RET
;
; PACK DIRECTORY
;
PACK:
       LXI     H,0             ;I = 0
;
PACK1:
       SHLD    I
       CALL    INDEX           ;HL = BUF + 16 * I
       LXI     D,9
       DAD     D               ;HL = HL + 9
       MOV     A,M             ;JUMP IF FILETYPE NOT 'X$$'
       SUI     '0'             ;  WHERE 0.LE.X.LE.9
       JC      PACK2
       CPI     10
       JNC     PACK2
       STA     J
       INX     H
       MOV     A,M
       CPI     '$'
       JNZ     PACK2
       INX     H
       MOV     A,M
       CPI     '$'
       JNZ     PACK2
       INX     H               ;SET EXTENT NUMBER TO X
       LDA     J
       MOV     M,A
       DCX     H               ;SET FILETYPE TO '$$$'
       MVI     M,'$'
       DCX     H
       MVI     M,'$'
       DCX     H
       MVI     M,'$'
;
PACK2:
       LHLD    I               ;I = I + 1
       INX     H
       XCHG
       LHLD    DRM
       INX     H
       XCHG
       PUSH    H
       CALL    SUBDE
       POP     H               ;LOOP UNTIL I > DRM
       JC      PACK1
       RET
;
; READ AND WRITE DIRECTORY ROUTINES
;
RDDIR:
       CALL    EPRINT
       DB      ' --> Reading, ',0
       XRA     A
       STA     NOBOOT          ;ZERO THE FLAG
       JMP     DODIR           ;ZERO THE WRITE FLAG FOR NOW
;
; COME HERE IF WE GET A READ ERROR
;
RERROR:
       CALL    EPRINT          ;PRINT:
       DB      ' READ ERROR - No Change Made',0
       JMP     EXIT
;
; DIVIDE HL BY 2
;
ROTRHL:
       ORA     A               ;CLEAR CARRY
       MOV     A,H
       RAR
       MOV     H,A
       MOV     A,L
       RAR
       MOV     L,A
       RET
;
; SETUP FOR SELECTING DRIVE AND LOADING DISK PARM BLOCK
;
SETUP:
       LXI     D,FCB
       CALL    Z3LOG           ;LOG INTO DISK SPECIFIED BY USER
       MVI     C,GETDSK        ;OTHERWISE GET CURRENT DEFAULT DRIVE
       CALL    BDOS            ;SO QUERY 'BDOS' FOR DRIVE
       MOV     C,A             ;PREP FOR OBTAINING DPB
       CALL    EPRINT
       DB      CR,LF,' Disk ',0
       MOV     A,C             ;GET DISK NUMBER
       ADI     'A'             ;CONVERT TO ASCII
       CALL    COUT
       CALL    SELDSK
;
; GET CP/M 2.2 DPB DATA
;
       MOV     E,M
       INX     H
       MOV     D,M
       INX     H
       XCHG
       SHLD    SECTBL
       XCHG
       LXI     D,8             ;OFFSET TO DPB WITHIN HEADER
       DAD     D               ;RETURNED BY SELDSK IN CPM2
       MOV     A,M             ;GET ADRS OF DPB
       INX     H
       MOV     H,M
       MOV     L,A
       LXI     D,DPB           ;POINT TO DEST: OUR DPB
       MVI     B,DPBLEN
       CALL    MOVE
       RET
;
; SORT THE DIRECTORY
;
SORT:
       CALL    EPRINT
       DB      'Sorting (',0
       LDA     REVERSE         ;INDICATE ASC OR DSC
       ORA     A               ;0=ASC
       JZ      SORTASC
       CALL    EPRINT
       DB      'Descending',0
       JMP     SORTDO
SORTASC:
       CALL    EPRINT
       DB      'Ascending',0
;
; SHELL-METZNER SORT
;
SORTDO:
       CALL    EPRINT
       DB      ' Order), ',0
       LHLD    I
       SHLD    SNUMRECW
       LHLD    BUF
       SHLD    SSTADR
       PUSH    H               ;  AND SAVE IT
       LXI     H,32
       SHLD    SRECLEN
       PUSH    H               ;  AND SAVE IT
;
; NOW DIVIDE # OF FIELDS BY 2
;
DIVIDE:
       LHLD    SNUMRECW        ;GET VALUE
       CALL    ROTRHL
       SHLD    SNUMRECW        ;SAVE RESULT
       MOV     A,L             ;IF SNUMRECW<>0
       ORA     H               ;  THEN
       JNZ     NOTDONE         ;    NOT DONE
;
; ALL FIELDS SORTED
;
       POP     B               ;CLEAN UP STACK
       POP     D
       RET
;
NOTDONE:
       XCHG
       LHLD    I
       MOV     A,L
       SUB     E
       MOV     L,A
       MOV     A,H
       SBB     D
       MOV     H,A
       SHLD    SRECLEN
       LXI     H,1
       SHLD    SSORTV1
       SHLD    SSTADR
       DCR     L
       POP     B
       PUSH    B
NDONE1:
       DAD     D
       DCX     B
       MOV     A,B
       ORA     C
       JNZ     NDONE1
       SHLD    SSORTV2
       XCHG
       POP     B
       POP     H
       PUSH    H
       PUSH    B
NDONE2:
       SHLD    SSORTV4
       SHLD    SSORTV3
       XCHG
       DAD     D
       XCHG
COMPARE:
       POP     B
       PUSH    B
COMPAR1:
       LDAX    D
       ANI     7FH
       PUSH    B
       MOV     C,A
       MOV     A,M
       ANI     7FH
       MOV     B,A
       MOV     A,C
       SUB     B
       POP     B
       JNZ     NOTEQU
       INX     H
       INX     D
       DCX     B
       MOV     A,B
       ORA     C
       JNZ     COMPAR1
       JMP     NOSWITCH
;
; THE CONDITION AT NOTEQU: HAS TO
; BE CHANGED FOR DESCENDING SORT -- IF REVERSE=0, JNC TO NOSWITCH, ELSE
; JC TO NOSWITCH
;
NOTEQU:
       PUSH    PSW     ;SAVE CONDITION
       LDAX    D       ;GET (DE)
       CPI     0E5H    ;IF ERASED, SELECT ASCENDING
       JZ      ASCENDING
       MOV     A,M     ;GET (HL)
       CPI     0E5H    ;IF ERASED, SELECT ASCENDING
       JZ      ASCENDING
       LDA     REVERSE ;DESCENDING SORT?
       ORA     A       ;0=NO
       JZ      ASCENDING
       POP     PSW     ;GET CONDITION FOR DESCENDING SORT
       JC      NOSWITCH
       JMP     SWITCH
ASCENDING:
       POP     PSW     ;GET CONDITION FOR ASCENDING SORT
       JNC     NOSWITCH
SWITCH:
       PUSH    B
       MOV     B,M
       LDAX    D
       MOV     M,A
       MOV     A,B
       STAX    D
       INX     H
       INX     D
       POP     B
       DCX     B
       MOV     A,B
       ORA     C
       JNZ     SWITCH
       LHLD    SNUMRECW
       MOV     A,H
       CMA
       MOV     D,A
       MOV     A,L
       CMA
       MOV     E,A
       LHLD    SSORTV1
       DAD     D
       JNC     NOSWITCH
       INX     H
       SHLD    SSORTV1
       LHLD    SSORTV3
       XCHG
       LHLD    SSORTV2
       MOV     A,E
       SUB     L
       MOV     L,A
       MOV     A,D
       SBB     H
       MOV     H,A
       SHLD    SSORTV3
       JMP     COMPARE
;
NOSWITCH:
       LHLD    SSTADR
       INX     H
       SHLD    SSTADR
       SHLD    SSORTV1
       XCHG
       LHLD    SRECLEN
       MOV     A,L
       SUB     E
       MOV     A,H
       SBB     D
       JC      DIVIDE
       LHLD    SSORTV4
       POP     D
       PUSH    D
       DAD     D
       XCHG
       LHLD    SSORTV2
       XCHG
       JMP     NDONE2
;
; UTILITY SUBTRACTION SUBROUTINE...
; HL=HL-DE
;
SUBDE:
       MOV     A,L
       SUB     E
       MOV     L,A
       MOV     A,H
       SBB     D
       MOV     H,A
       RET
;.....
;
;
WRDIR:
       CALL    EPRINT
       DB      'Writing, ',0
       MVI     A,1
       JMP     DODIR
;
; COME HERE IF WE GET A WRITE ERROR
;
WERROR:
       CALL    EPRINT          ;PRINT:
       DB      ' WRITE ERROR - Directory Left in UNKNOWN Condition',0
       JMP     EXIT
;
; DATA AREA
;
ADDR:
       DS      2
BUF:
       DS      2
DIRCNT:
       DS      2
I:
       DS      2
J:
       DS      2
MAPPTR:
       DS      2
maxdir:
       ds      2                                               ;841201
NOBOOT:
       DS      1
NOSWAP:
       DS      1
REVERSE:
       DS      1
SECTBL:
       DS      2
SECTOR:
       DS      2
TRACK:
       DS      2
WRFLAG:
       DS      1
SRECLEN:
       DS      2
SSTADR:
       DS      2
SSORTV1:
       DS      2
SSORTV2:
       DS      2
SSORTV3:
       DS      2
SSORTV4:
       DS      2
SNUMRECW:
       DS      2
;
; DISK PARAMETER BLOCK:
;
DPB:
SPT:
       DS      2
BSH:
       DS      1
BLM:
       DS      1
EXM:
       DS      1
DSM:
       DS      2
DRM:
       DS      2
AL0:
       DS      1
AL1:
       DS      1
CKS:
       DS      2
SYSTRK:
       DS      2
;
STACK:
       DS      2               ;SPACE FOR OLD STACK ADDRESS
;
       END
;