LS-DOS 6.3.1 - LBDIR Assembly Listing (HTML format version)

[Copyright 1999,2002 Frank Durda IV, All Rights Reserved.
Mirroring of any material on this page in any form is expressly prohibited.
The official web site for this material is:  http://nemesis.lonestar.org
Contact this address for use clearances: clearance at nemesis.lonestar.org
Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]

MISOSYS EDAS-4.3 04/11/99 00:14:09 DIR - LS-DOS 6.3             Page 00001 

              00001 ;LBDIR/ASM - DIR / CAT Command
              00003 ;
0000          00004 *GET    BUILDVER/ASM:3
              00005 ;
              00006 ;       Buildver/asm is a bit of a kludge since not all utilities can load
              00007 ;       equates from LDOS60 and still compile.  LOWCORE and everybody else
              00008 ;       relies on this setting, and it eventually ends up in LDOS60/EQU
              00009 ;       for programs that can use that.
              00010 ;
FFFF          00011 @BLD631         EQU     -1      ;<631>Build 631 distribution (LEVEL 1B)
              00012 ;       These switches activate patches made since the 1B release.
              00013 ;       It is important that all earlier patches be enabled when a higher
              00014 ;       patch is enabled.
              00015 ;       Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the
              00016 ;       patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.)
FFFF          00017 @BLD631C        EQU     -1      ;<631>Apply 1C patches (SETKI)
FFFF          00018 @BLD631D        EQU     -1      ;<631>Apply 1D patches (DIR)
FFFF          00019 @BLD631E        EQU     -1      ;<631>Apply 1E patches (DIR & MEMDISK/DCT)
FFFF          00020 @BLD631F        EQU     -1      ;<631>Apply 1F patches (SPOOL)
              00021 ;       Patches G and H were published in TMQ V.i, pages 10 and 18/19.
FFFF          00022 @BLD631G        EQU     -1      ;<631>Apply 1G patches (//KEYIN,DIR,DO *)
FFFF          00023 @BLD631H        EQU     -1      ;<631>Apply 1H patches (MEMORY)
              00024 ;
              00025 ;End of BUILDVER/ASM
2400          00026         ORG     2400H
              00027 ;
2400 C39C2D   00028 ENTRY   JP      DIR             ;Go if DIR
              00029 ;
2403 E5       00030 CATBGN  PUSH    HL              ;Here if CAT
2404 210000   00031         LD      HL,0            ;Set the DIR (A
2407 22FC27   00032         LD      (APARM+1),HL    ;  parameter to OFF
240A E1       00033         POP     HL              ;  and do a DIR
240B 18F3     00034         JR      ENTRY           ;  command
              00035 ;
4296          00036 BLKHASH EQU     4296H           ;Hash code of blank password
              00037 ;
240D          00038 *GET SVCMAC:3                   ;Get SVC Macro equivalents and
              00039 ;SVCMAC/ASM - LS-DOS Version VI
              00040 *LIST   OFF
              00432 *LIST   ON
240D          00434 *GET  VALUES:3                  ; other misc. equates
              00435 ;VALUES/ASM - Version 6
              00436 *LIST OFF
              00463 *LIST ON
              00464 ;
240D          00465 *GET LBDIRA:3
              00466 ;LBDIRA/ASM - DIR main processing loop
              00469 ;
              00470 ;       error processing
              00471 ;
240D 21532D   00472 NOMEM   LD      HL,NOMEM$
2410 DD       00473         DB      0DDH
2411 21662D   00474 BADFMT  LD      HL,BADFMT$
2414          00475         @@LOGOT
              00476         IFEQ    00H,1
              00477         LD      HL,
              00478         ENDIF
2414+3E0C     00479         LD      A,12
2416+EF       00480         RST     40
              00481 ;
2417 21FFFF   00482 ABORT   LD      HL,-1           ;Set HL = -1
241A 180F     00483         JR      SAVESP          ;Abort
              00484 ;
              00485 ;       I/O Error Routine
              00486 ;
241C 3E20     00487 ERR32   LD      A,32            ;"Illegal Drive Number"
241E 6F       00488 IOERR   LD      L,A             ;Set HL = Error #
241F 2600     00489         LD      H,0
2421 F6C0     00490         OR      0C0H            ;Set short error
2423 4F       00491         LD      C,A             ;Stuff in C
2424          00492         @@ERROR                 ;Display error
2424+3E1A     00493         LD      A,26
2426+EF       00494         RST     40
              00495         IF      @BLD631
2427 DD       00496         DB      0DDH            ;<631>Make LD   IX,0000 for fall-thru HL NZ
              00497         ELSE
              00498         JR      SAVESP          ;Abort
              00499         ENDIF
              00500 ;
              00501 ;       Clear stack & Exit
              00502 ;
2428 210000   00503 EXIT    LD      HL,0            ;Good exit
242B 310000   00504 SAVESP  LD      SP,$-$          ;P/u old SP address
242E          00505 ABORT3  @@CKBRKC                ;Clear break
242E+3E6A     00506         LD      A,106
2430+EF       00507         RST     40
2431 C9       00508         RET                     ;Go home now
              00509 ;
              00510 ;       Init to 4 files/line & Drive # in string
              00511 ;
2432 C5       00512 DIR4    PUSH    BC              ;Save drive #
2433 3E04     00513         LD      A,4             ;4 filespecs/line
2435 320428   00514         LD      (DONAM9+1),A    ;Save
2438 41       00515         LD      B,C             ;Set for drive date type
2439 04       00516         INC     B               ;Always do once
243A 3E3F     00517         LD      A,47H-8         ;Bit x,A opcode
243C C608     00518 DVTLP   ADD     A,8
243E 10FC     00519         DJNZ    DVTLP
2440 32852A   00520         LD      (DVTEST),A      ;Save for unpack routine
2443 32F828   00521         LD      (DVTEST1),A     ; and display code
2446 79       00522         LD      A,C             ;P/u drive #
2447 C630     00523         ADD     A,'0'           ;Convert to ASCII
2449 32432C   00524         LD      (DRIVE),A       ;  & stuff in message
244C 32072D   00525         LD      (NDRIVE),A      ;Also stuff in No Disk
              00526 ;
              00527 ;       Is the starting Drive available ?
              00528 ;
244F          00529         @@GTDCT                 ;IY => DCT+0
244F+3E51     00530         LD      A,81
2451+EF       00531         RST     40
2452          00532         @@CKDRV                 ;Drive alive ?
2452+3E21     00533         LD      A,33
2454+EF       00534         RST     40
2455 F5       00535         PUSH    AF              ;Save RETurn condition
2456 CDCD2A   00536         CALL    CKPAWS          ; hit ?
2459 F1       00537         POP     AF              ;NZ - couldn't log drive
245A 2826     00538         JR      Z,GDCKDRV       ;Z - Logged drive succ
              00539 ;
              00540 ;       Is this Drive enabled ?
              00541 ;
245C FD7E00   00542         LD      A,(IY)          ;P/u Enable/Disable byte
245F FEC3     00543         CP      0C3H            ;Enabled ?
2461 2809     00544         JR      Z,NO_DISK       ;Yes - display No Disk
              00545 ;
              00546 ;       If this is not global - Illegal Drive #
              00547 ;
2463 3A3A26   00548         LD      A,(SPECIF+1)    ;Specific drive # ?
2466 B7       00549         OR      A               ;
2467 CA1C24   00550         JP      Z,ERR32         ;Yes - illegal drive #
246A 1813     00551         JR      NEXTDRV         ;No - get next drive
              00552 ;
              00553 ;       Enabled Drive - Display "No Disk" string
              00554 ;
246C 32C22A   00555 NO_DISK LD      (NOTITLE+1),A   ;Turn off title
246F CD9F2A   00556         CALL    CKPAGE          ;Check for scroll
2472 21002D   00557         LD      HL,NODISK       ;HL => "No Disk" string
2475 CD102A   00558         CALL    LINOUT          ;Display line
2478 CD9F2A   00559         CALL    CKPAGE          ;Check for scroll
247B AF       00560         XOR     A               ;Turn on Title
247C 32C22A   00561         LD      (NOTITLE+1),A   ;
              00562 ;
247F C33826   00563 NEXTDRV JP      CKHIT4          ;Get next drive
              00564 ;
              00565 ;       Calculate quantity of Sectors/Gran
              00566 ;
2482 C5       00567 GDCKDRV PUSH    BC              ;Save Drive #
2483 FD7E08   00568         LD      A,(IY+8)        ;P/u # Sectors/Gran
2486 E61F     00569         AND     1FH             ;Mask off junk
2488 3C       00570         INC     A               ;Bump for zero offset
2489 32442A   00571         LD      (CALCK1+1),A    ;Stuff it
              00572 ;
              00573 ;       P/u # Cylinders from DCT & stuff in string
              00574 ;
248C FD6E06   00575         LD      L,(IY+6)        ;P/u cyl count
248F 2C       00576         INC     L               ;Offset from 0
2490 2600     00577         LD      H,0             ;Stuff in HL
2492 114E2C   00578         LD      DE,CYLCNT-2     ;DE => Destination
2495          00579         @@HEXDEC
2495+3E61     00580         LD      A,97
2497+EF       00581         RST     40
              00582 ;
              00583 ;       Create "DDEN" String or "HARD" string
              00584 ;
2498 11592C   00585         LD      DE,DENSITY      ;Destination
249B 21342C   00586         LD      HL,DEN
249E 3E44     00587         LD      A,'D'
24A0 FDCB0376 00588         BIT     6,(IY+3)        ;Ck density
24A4 2002     00589         JR      NZ,DUBDEN
24A6 3E53     00590         LD      A,'S'
24A8 77       00591 DUBDEN  LD      (HL),A
24A9 010400   00592         LD      BC,4            ;4 chars to Xfer
24AC FDCB035E 00593         BIT     3,(IY+3)        ;Hard Drive ?
24B0 2803     00594         JR      Z,DOLDIR
24B2 21382C   00595         LD      HL,HARD         ;HL => "HARD"
24B5 EDB0     00596 DOLDIR  LDIR                    ;Xfer string
              00597 ;
              00598 ;       Drive logged in - Read in GAT
              00599 ;
24B7 C1       00600         POP     BC              ;Recover Drive #
24B8 21002E   00601         LD      HL,GAT          ;HL => GAT buffer
24BB FD5609   00602         LD      D,(IY+9)        ;D = Directory Cyl
              00603         IF      @BLD631
24BE 5D       00604         LD      E,L             ;<631>E = L = 0 = GAT Sector
              00605         ELSE
              00606         LD      E,0             ;E = Gat Sector
              00607         ENDIF
24BF          00608         @@RDSSC                 ;Read Sector
24BF+3E55     00609         LD      A,85
24C1+EF       00610         RST     40
24C2 3E14     00611         LD      A,20            ;Init "GAT Read Error"
24C4 C21E24   00612         JP      NZ,IOERR
24C7 CDCD2A   00613         CALL    CKPAWS          ; hit ?
              00614 ;
              00615 ;
              00616 ;       Calculate the FREE space on the disk
              00617 ;
              00618 ;
24CA 110000   00619         LD      DE,0            ;DE = Gran count
24CD 2ECC     00620         LD      L,0CCH          ;HL => GAT + X'CC'
24CF 7E       00621         LD      A,(HL)          ;P/u excess cyl byte
24D0 C623     00622         ADD     A,35            ;Cyl excess of 35
24D2 47       00623         LD      B,A             ;Set loop counter
24D3 6A       00624         LD      L,D             ;HL => GAT + X'00'
24D4 C5       00625         PUSH    BC              ;Save cyl count in B
              00626 ;
              00627 ;       HL => GAT, B = # of cyls, DE = Gran count
              00628 ;
24D5 7E       00629 FS1     LD      A,(HL)          ;P/u a GAT byte & set
24D6 37       00630 FS2     SCF                     ;Carry so bit 7 stays 1
              00631 ;
              00632 ;       Is the granule in use ?
              00633 ;
24D7 1F       00634         RRA                     ;Shift gran bit -> carry
24D8 3801     00635         JR      C,FS3           ;Don't inc if in use
              00636 ;
              00637 ;       Free Granule - bump Free Granule Count
              00638 ;
24DA 13       00639         INC     DE              ;Another spare gran
24DB FEFF     00640 FS3     CP      0FFH            ;Fin with this GAT byte?
24DD 20F7     00641         JR      NZ,FS2          ;Loop if not
              00642 ;
              00643 ;       Finished with GAT byte, advance to next
              00644 ;
24DF 2C       00645         INC     L               ;Advance to next byte
24E0 10F3     00646         DJNZ    FS1             ;B cylinders to check
              00647 ;
              00648 ;       DE = Free Grans, Calculate # Grans/cyl
              00649 ;
24E2 C1       00650         POP     BC              ;B = # of cylinders
24E3 FD7E08   00651         LD      A,(IY+8)        ;P/u DCT+8
24E6 07       00652         RLCA                    ;Move Grans/Cyl into
24E7 07       00653         RLCA                    ;Bits 0-2
24E8 07       00654         RLCA
24E9 E607     00655         AND     7
24EB 3C       00656         INC     A               ;A = Grans/Cylinder
24EC FDCB046E 00657         BIT     5,(IY+4)        ;Double-bit set ?
24F0 2801     00658         JR      Z,NOTDUB        ;No - don't double
24F2 87       00659         ADD     A,A             ;Double grans/cylinder
              00660 ;
              00661 ;       A = # Grans/Cyl, Calculate Total # of Grans
              00662 ;
24F3 210000   00663 NOTDUB  LD      HL,0            ;Init HL = 0
24F6 D5       00664         PUSH    DE              ;Save Free Grans
24F7 54       00665         LD      D,H             ;Set DE = # cyls
24F8 58       00666         LD      E,B
24F9 47       00667         LD      B,A             ;B = Grans/Cyl
              00668 ;
              00669 ;       Multiply Grans/Cyl (B) x # Cyls (DE)
              00670 ;
24FA 19       00671 GPCLOOP ADD     HL,DE           ;Add cylinder count
24FB 10FD     00672         DJNZ    GPCLOOP         ;Grans/cyl times
              00673 ;
              00674 ;       HL = # of grans/disk, Is this a hard drive ?
              00675 ;
24FD FDCB035E 00676         BIT     3,(IY+3)        ;Hard Drive ?
2501 201E     00677         JR      NZ,SKIPLOC      ;Yes-don't check lockout
              00678 ;
              00679 ;       Floppy disk - check for locked out cylinders
              00680 ;
2503 43       00681         LD      B,E             ;B = cylinder count
2504 EB       00682         EX      DE,HL           ;Save total cnt in DE
2505 21602E   00683         LD      HL,GAT+60H      ;HL => Lockout table
2508 0E00     00684         LD      C,0             ;C = Locked out cyl count
250A F5       00685         PUSH    AF              ;Save Grans/Cyl in A
              00686 ;
              00687 ;       Loop to count up Locked out cylinders in C
              00688 ;
250B 3E01     00689 LKLOOP  LD      A,1             ;Init cyl checker
250D A6       00690         AND     (HL)            ;Locked out ?
250E 2801     00691         JR      Z,GOODCYL       ;No - good cylinder
2510 0C       00692         INC     C               ;Bump locked out count
2511 2C       00693 GOODCYL INC     L               ;Bump ptr
2512 10F7     00694         DJNZ    LKLOOP          ;B cylinders
              00695 ;
              00696 ;       Multiply Cylinders (BC) x Grans/Cyl
              00697 ;
2514 F1       00698         POP     AF              ;A = Grans/Cyl
2515 F5       00699         PUSH    AF              ;Save it
2516 60       00700         LD      H,B             ;Init HL = 0
2517 68       00701         LD      L,B
              00702 ;
2518 09       00703 GTUSED  ADD     HL,BC           ;Add cylinder count
2519 3D       00704         DEC     A               ;Grans/cyl times
251A 20FC     00705         JR      NZ,GTUSED
251C F1       00706         POP     AF              ;A = Grans/Cyl
              00707 ;
              00708 ;       Subtract # of Grans locked out from total
              00709 ;
251D B7       00710         OR      A               ;Clear carry
251E EB       00711         EX      DE,HL
251F ED52     00712         SBC     HL,DE           ;HL = Grans possible
2521 D1       00713 SKIPLOC POP     DE              ;Rcvr # of Free Grans
              00714 ;
              00715 ;       HL = # Grans possible, DE = # Grans Free
              00716 ;
2522 E5       00717         PUSH    HL              ;Save Grans used
2523 21652C   00718         LD      HL,KFREE        ;Convert Grans Free
2526 CD3F2A   00719         CALL    CALCK           ;  to ASCII K & stuff
2529 D1       00720         POP     DE              ;  into string.
              00721 ;
              00722 ;       Calculate # of K used & stuff into header
              00723 ;
252A 21712C   00724         LD      HL,KPOSS        ;Pt to where to stuff
252D CD3F2A   00725         CALL    CALCK           ;Calculate K & stuff
              00726 ;
              00727 ;       Transfer Diskette Name into string buffer
              00728 ;
2530 21D02E   00729         LD      HL,GAT+0D0H     ;HL => Diskette Name
2533 11462C   00730         LD      DE,NAME         ;Move pack name -> header
2536 0E08     00731         LD      C,8             ;BC = 8 chars to xfer
2538 EDB0     00732         LDIR                    ;Xfer into buff
              00733 ;
              00734 ;       Clear out Date buffer
              00735 ;
253A 11822C   00736         LD      DE,DATBUF       ;DE => Start of buffer
253D 3E20     00737         LD      A,' '           ;Space
253F 0609     00738         LD      B,9             ;9 chars to clear
2541 12       00739 CLRLP   LD      (DE),A          ;Stuff in space
2542 13       00740         INC     DE              ;Bump
2543 10FC     00741         DJNZ    CLRLP
              00742 ;
              00743 ;       HL => Date in mm/dd/yy format - p/u month
              00744 ;
2545 7E       00745         LD      A,(HL)          ;P/u month
2546 D630     00746         SUB     '0'             ;Convert tens to binary
2548 4F       00747         LD      C,A             ;Save in C
              00748 ;
              00749 ;       Multiply first digit of month x 10
              00750 ;
2549 87       00751         ADD     A,A             ;X 2
254A 87       00752         ADD     A,A             ;X 4
254B 81       00753         ADD     A,C             ;X 5
254C 87       00754         ADD     A,A             ;X 10
254D 4F       00755         LD      C,A             ;Stuff in C
              00756 ;
              00757 ;       Pick up second digit of month & add to 10's
              00758 ;
254E 23       00759         INC     HL              ;Bump to ones
254F 7E       00760         LD      A,(HL)          ;P/u ones of month
              00761         IF      @BLD631
2550 D631     00762         SUB     '1'             ;<631>Convert to binary
              00763         ELSE
              00764         SUB     '0'             ;Convert to binary
              00765         ENDIF
2552 81       00766         ADD     A,C             ;A = Month (1-12)
              00767         IF      @BLD631
2553 FE0C     00768         CP      12              ;<631>Legal Month ?
              00769         ELSE
              00770         JR      Z,ILLDATE       ;Abort if NO DATE
              00771         CP      13              ;Legal Month ?
              00772         ENDIF
2555 3026     00773         JR      NC,ILLDATE      ;No - illegal date
              00774 ;
              00775 ;       Legal Month - Mult x 3 & pt to month string
              00776 ;
2557 4F       00777         LD      C,A             ;Xfer month to C
2558 87       00778         ADD     A,A             ;X 2
2559 81       00779         ADD     A,C             ;X 3
255A 4F       00780         LD      C,A             ;BC = offset
255B E5       00781         PUSH    HL              ;Save date pointer
              00782         IF      @BLD631
255C 21DC04   00783         LD      HL,MONTBL       ;<631>HL => Month String table
              00784         ELSE
              00785         LD      HL,MONTBL-3     ;HL => Month String table
              00786         ENDIF
255F 09       00787         ADD     HL,BC           ;HL => Month String
              00788 ;
              00789 ;       HL => Month String, Stuff into Buffer
              00790 ;
2560 3E2D     00791         LD      A,'-'           ;Init separator
2562 11852C   00792         LD      DE,DATBUF+3     ;DE => Destination
2565 0E03     00793         LD      C,3             ;BC = 3 chars to xfer
2567 EDB0     00794         LDIR                    ;Xfer date to buffer
2569 12       00795         LD      (DE),A
              00796 ;
              00797 ;       Transfer Day (00-31) into date buffer
              00798 ;
256A E1       00799         POP     HL              ;Recover ptr
256B 23       00800         INC     HL              ;Bump
256C 23       00801         INC     HL              ;HL => Day of month
256D 11822C   00802         LD      DE,DATBUF       ;DE => date buffer
2570 0E02     00803         LD      C,2             ;Xfer into buffer
2572 EDB0     00804         LDIR
2574 12       00805         LD      (DE),A
              00806 ;
              00807 ;       Transfer Year into buffer
              00808 ;
2575 23       00809         INC     HL              ;HL => Year (80-87)
2576 0E02     00810         LD      C,2             ;2 chars to xfer
2578 11892C   00811         LD      DE,DATBUF+7     ;DE => Destination
257B EDB0     00812         LDIR                    ;Xfer into buffer
              00813 ;
              00814 ;       Display the files in the directory
              00815 ;       Init DIR rec ptr = mem start, count = 0
              00816 ;
              00817         IF      @BLD631G
257D 7A       00818 ILLDATE:LD      A,D             ;<631G>Set flag
              00819         ELSE
              00820 ILLDATE INC     A               ;Set flag
              00821         ENDIF
257E 329B2D   00822         LD      (FILFLAG),A     ;Set file alr disp flag
2581 210030   00823         LD      HL,MEMORY       ;Init DIRPTR to start
2584 229C2D   00824         LD      (DIRPTR),HL     ;  of available memory
2587 AF       00825         XOR     A               ;Set File display
2588 ED62     00826         SBC     HL,HL           ;Set HL = 0
258A 22F625   00827         LD      (TFILES+1),HL   ;Total Files = 0
258D 22DA25   00828         LD      (COUNT+1),HL    ;Count = 0
2590 220126   00829         LD      (TOTGRNS+1),HL  ;Total Grans = 0
              00830 ;
              00831 ;       Read in the HIT of the disk
              00832 ;
2593 C1       00833         POP     BC              ;Recover Drive # in C
2594 FD5609   00834         LD      D,(IY+9)        ;P/u directory cylinder
2597 1E01     00835         LD      E,1             ;Pt to HIT sector
2599 21002E   00836         LD      HL,HIT          ;HL => I/O buffer
259C          00837         @@RDSSC                 ;Read System Sector
259C+3E55     00838         LD      A,85
259E+EF       00839         RST     40
259F 3E16     00840         LD      A,16H           ;"HIT read error"?
25A1 C21E24   00841         JP      NZ,IOERR        ;Jump if read error
25A4 CDCD2A   00842         CALL    CKPAWS          ; hit ?
25A7 C34826   00843 $JP0    JP      CKHIT5          ;Jump into middle of loop
              00844 ;
              00845 ;       Loop to Process HIT entries
              00846 ;
25AA E1       00847 CKHIT   POP     HL
25AB C1       00848 CKHIT1  POP     BC              ;Recover HIT pointer lo
              00849 ;
              00850 ;       Point HL => Last HIT entry
              00851 ;
25AC 262E     00852         LD      H,HIT<-8        ;Set H = hi byte of HIT
25AE 68       00853         LD      L,B             ;HL => Last HIT entry
              00854 ;
              00855 ;       Position to next entry of the Record
              00856 ;
25AF 7D       00857 CKHIT2  LD      A,L             ;P/u current entry
25B0 C620     00858         ADD     A,32            ;Add 32 (bytes/entry)
25B2 6F       00859         LD      L,A             ;HL => Next entry
25B3 30F2     00860         JR      NC,$JP0         ;Go to next record ?
              00861 ;
              00862 ;       Position to entry zero of next record
              00863 ;
25B5 2C       00864         INC     L               ;Posn to next record
25B6 CB6D     00865         BIT     5,L             ;Done with drive ?
25B8 28ED     00866         JR      Z,$JP0          ;No - process entry
              00867 ;
              00868 ;       Finished with drive - Sort data unless (O=N)
              00869 ;
25BA 3AFC26   00870         LD      A,(SORTPRM+1)   ;If sort requested,
25BD B7       00871         OR      A               ;  then need to output
25BE C4142B   00872         CALL    NZ,SORTIT       ;  the sorted data
              00873 ;
              00874 ;       Were there any files displayed ?
              00875 ;
25C1 2ADA25   00876         LD      HL,(COUNT+1)    ;P/u displayed file count
25C4 7C       00877         LD      A,H             ;Any entered ?
25C5 B5       00878         OR      L
25C6 200B     00879         JR      NZ,FILES        ;Yes - dsp under if (A)
              00880 ;
              00881 ;       Display Title & line feed
              00882 ;
25C8 213C2C   00883         LD      HL,DSTRING      ;HL => Title
25CB CD102A   00884         CALL    LINOUT          ;Display title
25CE CD9F2A   00885         CALL    CKPAGE          ;Check for scroll
25D1 184A     00886         JR      NOTAP           ;Get next drive
              00887 ;
              00888 ;       Get next drive # if the A parm was specified
              00889 ;
25D3 3AFC27   00890 FILES   LD      A,(APARM+1)     ;Don't display if A
25D6 B7       00891         OR      A
25D7 2844     00892         JR      Z,NOTAP         ;Not A - Output C/R
              00893 ;
              00894 ;       Were there any files shown in directory ?
              00895 ;
25D9 210000   00896 COUNT   LD      HL,$-$          ;P/u count
25DC 7C       00897         LD      A,H             ;Any files shown ?
25DD B5       00898         OR      L
25DE 284E     00899         JR      Z,TERMDRV       ;No - get next drive
              00900 ;
              00901 ;       Display Line of equal signs "="
              00902 ;
25E0 064F     00903         LD      B,79            ;Output 79 "="
25E2 3E3D     00904 D79EQ   LD      A,'='
25E4 CD222A   00905         CALL    BYTOUT          ;Output "="
25E7 10F9     00906         DJNZ    D79EQ
              00907 ;
              00908 ;       End line & check for scroll
              00909 ;
              00910         IF      @BLD631
25E9 CD9A2A   00911         CALL    CKPAGE1         ;<631>
              00912         ELSE
              00913         LD      A,CR            ;End line with C/R
              00914         CALL    BYTOUT
              00915         CALL    CKPAGE
              00916         ENDIF
              00917 ;
              00918 ;       Stuff # of files used into footer string
              00919 ;
25EC C5       00920         PUSH    BC              ;Save Drive #
25ED 0603     00921         LD      B,3             ;Max digits to dsp
25EF 11DA2C   00922         LD      DE,FDISP        ;DE => Destination
25F2          00923         @@HEXD
25F2+3E5F     00924         LD      A,95
25F4+EF       00925         RST     40
              00926 ;
              00927 ;       Pick up # of used files & stuff in string
              00928 ;
25F5 210000   00929 TFILES  LD      HL,$-$          ;P/u total files used
25F8 11E72C   00930         LD      DE,FUSED+1      ;DE => Destination
25FB 0603     00931         LD      B,3
25FD          00932         @@HEXD
25FD+3E5F     00933         LD      A,95
25FF+EF       00934         RST     40
              00935 ;
              00936 ;       P/u Total # of Grans & stuff into string
              00937 ;
2600 110000   00938 TOTGRNS LD      DE,$-$          ;P/u total # of Grans
2603 21F52C   00939         LD      HL,SPUSED       ;HL => Destination
2606 CD3F2A   00940         CALL    CALCK           ;Stuff into string
2609 0613     00941         LD      B,19
260B CD372A   00942         CALL    OUTSPC
260E C1       00943         POP     BC              ;C = drive #
              00944 ;
              00945 ;       Display Footer String
              00946 ;
260F 21DA2C   00947         LD      HL,FDISP        ;HL => Files disp string
2612 CD102A   00948         CALL    LINOUT          ;Display line
2615 CD9F2A   00949         CALL    CKPAGE          ;Check for title
2618 CD9F2A   00950         CALL    CKPAGE
261B 1811     00951         JR      TERMDRV         ;Get next drive
              00952 ;
              00953 ;       A parm not spec'd, was a header displayed ?
              00954 ;
261D 3A9B2D   00955 NOTAP   LD      A,(FILFLAG)     ;Was a header displayed ?
2620 B7       00956         OR      A
2621 200B     00957         JR      NZ,TERMDRV      ;No - get next drive
              00958 ;
              00959 ;       Output a C/R if a full line wasn't displayed
              00960 ;
2623 3A0428   00961         LD      A,(DONAM9+1)    ;Full line ?
2626 FE04     00962         CP      4
2628 C40F28   00963         CALL    NZ,ENDLINE      ;End line
262B CD0F28   00964         CALL    ENDLINE         ;Do a blank line
              00965 ;
              00966 ;       Position to next drive - or exit if finished
              00967 ;
262E 3E00     00968 TERMDRV LD      A,$-$           ;P/u term drive
2630 0C       00969         INC     C               ;Bump current drive #
2631 B9       00970         CP      C               ;Done ?
              00971         IF      @BLD631E
              00972 TODIR4:                         ;<631E>
              00973         ENDIF
2632 D23224   00974         JP      NC,DIR4         ;Loop if in range
2635 C32824   00975         JP      EXIT            ;Exit if NZ
              00976 ;
              00977 ;       Get next drive unless drivespec specified
              00978 ;
2638 C1       00979 CKHIT4  POP     BC              ;Get drive # in C
2639 3E00     00980 SPECIF  LD      A,$-$           ;P/u specific flag
263B B7       00981         OR      A
              00982         IF      @BLD631
              00983         IF      @BLD631E
263C 210000   00984         LD      HL,0            ;<631E>Put it back the way it was B4 631
              00985         ELSE
              00986         LD      H,A             ;<631>Init in case exit
              00987         LD      L,A             ;<631>A will equal zero in this case so HL=0
              00988         ENDIF                   ;<631E>
              00989         ELSE
              00990         LD      HL,0            ;Init in case exit
              00991         ENDIF
263F C8       00992         RET     Z               ;Not global
              00993 ;
              00994 ;       Bump Drive number
              00995 ;
2640 3A2F26   00996         LD      A,(TERMDRV+1)   ;P/u term drive #
2643 0C       00997         INC     C               ;Bump
2644 B9       00998         CP      C               ;Finished ?
              00999         IF      @BLD631E
2645 30EB     01000         JR      NC,TODIR4       ;<631>Loop if more
              01001         ELSE
              01002         JP      NC,DIR4         ;Loop if more
              01003         ENDIF
2647 C9       01004         RET                     ;  else return
              01005 ;
              01006 ;       Is the HIT entry in use ?
              01007 ;
2648 7E       01008 CKHIT5  LD      A,(HL)          ;P/u HIT entry
2649 B7       01009         OR      A               ;In use ?
264A CAAF25   01010         JP      Z,CKHIT2        ;No - get next entry
              01011 ;
              01012 ;       HIT entry in use - Point HL to that entry
              01013 ;
264D 45       01014         LD      B,L             ;Save DEC in B
264E C5       01015         PUSH    BC              ;  & to stack
264F 7D       01016         LD      A,L             ;Point L to Entry posn
2650 E6E0     01017         AND     0E0H
2652 6F       01018         LD      L,A
              01019 ;
              01020 ;       Do we need to Read in another sector ?
              01021 ;
2653 A8       01022         XOR     B               ;Done with 8 entries ?
2654 FEFF     01023 CKHIT6  CP      0FFH
2656 2810     01024         JR      Z,CKDIR1        ;No - check out entry
              01025 ;
              01026 ;       Read in the next directory sector
              01027 ;
2658 325526   01028         LD      (CKHIT6+1),A    ;Stuff in last entry posn
265B          01029         @@DIRRD                 ;  & read it into buffer
265B+3E57     01030         LD      A,87
265D+EF       01031         RST     40
265E C21E24   01032         JP      NZ,IOERR        ;Jump on read error
2661 7C       01033         LD      A,H             ;P/u high byte
2662 326926   01034         LD      (CKDIR1+1),A    ;  and save
2665 32DD29   01035         LD      (SBUFFER+1),A   ;  for later
              01036 ;
              01037 ;       Valid File (Alive & FPDE) ?
              01038 ;
2668 2600     01039 CKDIR1  LD      H,$-$           ;P/u high byte
266A CB66     01040         BIT     4,(HL)          ;Alive ?
266C CAAB25   01041         JP      Z,CKHIT1        ;No - get next entry
266F CB7E     01042         BIT     7,(HL)          ;FPDE ?
2671 C2AB25   01043         JP      NZ,CKHIT1       ;No - get next entry
              01044 ;
              01045 ;       Alive FPDE - Bump Total File counter
              01046 ;
2674 E5       01047         PUSH    HL              ;Save ptr
2675 2AF625   01048         LD      HL,(TFILES+1)   ;HL => Total Files
2678 23       01049         INC     HL              ;Bump total files
2679 22F625   01050         LD      (TFILES+1),HL
267C E1       01051         POP     HL
              01052 ;
              01053 ;       Is this a SYStem File ?
              01054 ;
267D CB76     01055         BIT     6,(HL)          ;SYS file ?
267F 280A     01056         JR      Z,CKDIR3        ;No - continue
              01057 ;
              01058 ;       SYS file - don't check unless S parm entered
              01059 ;
2681 110000   01060 SPARM   LD      DE,$-$          ;P/u S-parm
2684 7A       01061         LD      A,D             ;Specified ?
2685 B3       01062         OR      E
2686 CAAB25   01063         JP      Z,CKHIT1        ;No - don't check it
2689 180C     01064         JR      CKMOD           ;Skip INV check
              01065 ;
              01066 ;       Non-SYS file - Is the file Visible ?
              01067 ;
268B CB5E     01068 CKDIR3  BIT     3,(HL)          ;Visible ?
268D 2808     01069         JR      Z,CKMOD         ;Yes - skip I check
              01070 ;
              01071 ;       File is invisible - was INV (I) specified ?
              01072 ;
268F 110000   01073 IPARM   LD      DE,$-$          ;I-parm
2692 7A       01074         LD      A,D             ;Ignore if I-parm not
2693 B3       01075         OR      E               ;  entered as this file
2694 CAAB25   01076         JP      Z,CKHIT1        ;  is invisible
              01077 ;
              01078 ;       Was the MOD parm entered ?
              01079 ;
2697 110000   01080 CKMOD   LD      DE,$-$          ;P/u mod parm
269A 7A       01081         LD      A,D             ;Was it entered ?
269B B3       01082         OR      E
269C 2807     01083         JR      Z,CKNAM         ;Go if MOD not entered
              01084 ;
              01085 ;       MOD parm entered - was this file modified ?
              01086 ;
269E 2C       01087         INC     L               ;HL => DIR + 1
269F CB76     01088         BIT     6,(HL)          ;Was the file modified ?
26A1 CAAB25   01089         JP      Z,CKHIT1        ;No - get next entry
26A4 2D       01090         DEC     L               ;Adjust back to start
              01091 ;
              01092 ;       Attributes match - check if filespec matches
              01093 ;
26A5 E5       01094 CKNAM   PUSH    HL              ;Save ptr to record
26A6 7D       01095         LD      A,L             ;Pt to filename in dir
26A7 C605     01096         ADD     A,5
26A9 6F       01097         LD      L,A             ;HL => DIR filename
26AA 11A72D   01098         LD      DE,BLANKS       ;DE => Partspec input
26AD 060B     01099         LD      B,11            ;Ck name/ext (11-chars)
              01100 ;
              01101 ;       Loop to check if partspec matches dir name
              01102 ;
26AF 1A       01103 CKNAM1  LD      A,(DE)          ;P/u partspec
26B0 FE24     01104         CP      '$'             ;Wild char?
26B2 2807     01105         JR      Z,CKNAM2        ;Yes - match
              01106 ;
              01107 ;       Does Directory char match partspec char ?
              01108 ;
26B4 BE       01109         CP      (HL)            ;Not global, char match?
26B5 2804     01110         JR      Z,CKNAM2        ;Ck more if match
              01111 ;
              01112 ;       Chars don't match - Dir char a space ?
              01113 ;
26B7 FE20     01114         CP      ' '             ;Blank = end of ck
26B9 200B     01115         JR      NZ,MFLG         ;If not blank, no match
              01116 ;
              01117 ;       Bump Dir ptr & Partspec ptr & continue loop
              01118 ;
26BB 23       01119 CKNAM2  INC     HL              ;Bump pointers
26BC 13       01120         INC     DE
26BD 10F0     01121         DJNZ    CKNAM1          ;Loop for 11 chars
              01122 ;
              01123 ;       Entries Match - Was the "-" Exclude given ?
              01124 ;
26BF 3AC726   01125         LD      A,(MFLG+1)      ;P/u flag
26C2 FE2D     01126         CP      '-'             ; - exclude given ?
26C4 1803     01127         JR      CK2HIT          ;Yes - get next entry
              01128 ;
              01129 ;       Entries Don't match - Was exclude given ?
              01130 ;
26C6 3E00     01131 MFLG    LD      A,$-$           ;P/u Exclude flag
26C8 B7       01132         OR      A               ;If no exclude given
26C9 CAAA25   01133 CK2HIT  JP      Z,CKHIT         ;  get next entry
              01134 ;
              01135 ;       Recover DIR+0 pointer
              01136 ;
26CC E1       01137 CKNAM2A POP     HL              ;Rcvr ptr to DIR+0
26CD E5       01138         PUSH    HL              ;Save
              01139 ;
              01140 ;       Unpack Date of Directory entry
              01141 ;
26CE 23       01142         INC     HL              ;HL => DIR+1
26CF CD702A   01143         CALL    UNPACK          ;Unpack date
              01144 ;
              01145 ;       Use Dates before user-specified date ?
              01146 ;
26D2 3A9A2D   01147         LD      A,(FTFLG)       ;P/u From/To flag
26D5 07       01148         RLCA                    ;Tst fm bit
26D6 300F     01149         JR      NC,CKNAM2B      ;No - check to
              01150 ;
              01151 ;       "FROM" flag set - does file have a date ?
              01152 ;
26D8 7A       01153         LD      A,D             ;Ignore if no date
26D9 B3       01154         OR      E               ;  in DIR for file
26DA CAAA25   01155         JP      Z,CKHIT         ;No date - get next entry
              01156 ;
              01157 ;       Is the Specified date >= the file's date ?
              01158 ;
26DD 2AA02D   01159         LD      HL,(FMPAKD)     ;P/u user date entry
26E0 EB       01160         EX      DE,HL
26E1 CD6A2A   01161         CALL    CPHLDE          ;Compare HL to DE
26E4 EB       01162         EX      DE,HL           ;File date < User date ?
26E5 3811     01163         JR      C,$JP1          ;Yes - get next entry
              01164 ;
              01165 ;       Use Dates after user-specified Date ?
              01166 ;
26E7 3A9A2D   01167 CKNAM2B LD      A,(FTFLG)       ;P/u FROM/TO flag
26EA 0F       01168         RRCA                    ;Test TO bit
26EB 300E     01169         JR      NC,SORTPRM      ;Go if no TOPARM
              01170 ;
              01171 ;       "TO" Flag set - Does file have a date ?
              01172 ;
26ED 7A       01173         LD      A,D             ;File have a valid date ?
26EE B3       01174         OR      E
26EF CAAA25   01175         JP      Z,CKHIT         ;No - get next entry
              01176 ;
              01177 ;       File has a date - Is spec'd date less ?
              01178 ;
26F2 2AA22D   01179         LD      HL,(TOPAKD)     ;P/u user's packed date
26F5 CD6A2A   01180         CALL    CPHLDE          ;User date < File date ?
26F8 DAAA25   01181 $JP1    JP      C,CKHIT         ;Yes - get next entry
              01182 ;
              01183 ;       Was the Sort Parameter turned off ?
              01184 ;
26FB 11FFFF   01185 SORTPRM LD      DE,-1           ;P/u default parm
26FE E1       01186         POP     HL              ;HL => DIR+0
26FF 7A       01187         LD      A,D             ;Default to SORT=ON
2700 B3       01188         OR      E
2701 282D     01189         JR      Z,DODSP         ;Go display if no sort
              01190 ;
              01191 ;       SORT = ON --- Calculate allocation & extents
              01192 ;
2703 E5       01193         PUSH    HL              ;Save DIR + 0 ptr
2704 CDB229   01194         CALL    ALL09A          ;Calc alloc & extents
2707 E1       01195         POP     HL              ;Recover DIR+0 ptr
              01196 ;
              01197 ;       Overwrite FPDE's 22-25 with # Grans & # exts
              01198 ;
2708 E5       01199         PUSH    HL              ;Point IX = DIR+22
2709 DDE1     01200         POP     IX
270B DD7316   01201         LD      (IX+22),E       ;Stuff in # Grans
270E DD7217   01202         LD      (IX+23),D
2711 DD7118   01203         LD      (IX+24),C       ;Stuff in # Extents
2714 DD7019   01204         LD      (IX+25),B
              01205 ;
              01206 ;       Transfer Record into Memory For Sort
              01207 ;
2717 ED5B9C2D 01208         LD      DE,(DIRPTR)     ;P/u last used mem addr
271B E5       01209         PUSH    HL              ;Save current DIR ptr
271C 012000   01210         LD      BC,32           ;Move record to buffer
271F EDB0     01211         LDIR                    ;Xfer
2721 ED539C2D 01212         LD      (DIRPTR),DE     ;Update the pointer
              01213 ;
              01214 ;       Is there an overflow of available memory ?
              01215 ;
2725 2A9E2D   01216         LD      HL,(MAXMEM)     ;P/u approximate hi-mem
2728 ED52     01217         SBC     HL,DE           ;Did it overflow ?
272A D2AA25   01218         JP      NC,CKHIT        ;No - get next entry
272D C30D24   01219         JP      NOMEM           ;Insuf mem for sort buff
              01220 ;
              01221 ;       Display A Filename
              01222 ;
2730 CD3627   01223 DODSP   CALL    MATCH           ;Display entry
2733 C3AB25   01224         JP      CKHIT1          ;Loop to next DIR entry
2736          01225 *GET LBDIRB:3
              01226 ;LBDIRB/ASM - Display Filespec & attributes
              01229 ;
              01230 ;       MATCH - Display a File's Name and Extension
              01231 ;
2736 E5       01232 MATCH   PUSH    HL              ;Save HIT posn
2737 21DA25   01233         LD      HL,COUNT+1      ;Bump file count
273A 34       01234         INC     (HL)
              01235 ;
              01236 ;       Was the Drive Header Displayed ?
              01237 ;
273B 219B2D   01238         LD      HL,FILFLAG      ;HL => File Header flag
273E AF       01239         XOR     A               ;If (HL) is Non-Zero
273F BE       01240         CP      (HL)            ;  then the header has not
2740 77       01241         LD      (HL),A          ;  printed.
2741 C4EB2A   01242         CALL    NZ,CKTITL       ;Display title if NZ
              01243 ;
              01244 ;       Position HL to Directory Entry Filename
              01245 ;
2744 E1       01246 ALRPRT  POP     HL              ;Recover DEC
2745 7D       01247         LD      A,L             ;P/u DEC
2746 E6E0     01248         AND     0E0H            ;Posn to entry
2748 C605     01249         ADD     A,5             ;Pt to start of filename
274A 6F       01250         LD      L,A             ;HL => Filename field
              01251 ;
              01252 ;       Init B=8 chars for filename, C=19 to col
              01253 ;
274B 0E13     01254         LD      C,19            ;Chars to next column
274D 0608     01255         LD      B,8             ;Filename
              01256 ;
              01257 ;       Loop to Output the Filename
              01258 ;
274F 7E       01259 DONAM1  LD      A,(HL)          ;P/u character
2750 23       01260         INC     HL              ;Bump DIR ptr
2751 FE20     01261         CP      ' '             ;Space ?
2753 2807     01262         JR      Z,DONAM2        ;Yes - done with filename
2755 CD212A   01263         CALL    BYTOUT2         ;No - output char
2758 10F5     01264         DJNZ    DONAM1          ;Field loop
275A 1804     01265         JR      DONAM3          ;Bypass ext calculation
              01266 ;
              01267 ;       Filename has < 8 chars, Pt to extension
              01268 ;
275C 7D       01269 DONAM2  LD      A,L             ;P/u low byte
275D 80       01270         ADD     A,B             ;Add # of chars left
275E 3D       01271         DEC     A               ;Back one
275F 6F       01272         LD      L,A             ;HL => Extension
              01273 ;
              01274 ;       Does this file have an extension ?
              01275 ;
2760 7E       01276 DONAM3  LD      A,(HL)          ;P/u first char
2761 FE20     01277         CP      ' '             ;Blank
2763 2812     01278         JR      Z,DONAM5        ;Yes - no extension
              01279 ;
              01280 ;       Output a "/" & Set up for Extension loop
              01281 ;
2765 3E2F     01282         LD      A,'/'           ;Display slash
2767 CD212A   01283         CALL    BYTOUT2
276A 0603     01284         LD      B,3             ;3 chars max for EXT
              01285 ;
              01286 ;       Loop to output the extension
              01287 ;
276C 7E       01288 DONAM4  LD      A,(HL)          ;P/u char
276D 23       01289         INC     HL              ;Bump ptr
276E FE20     01290         CP      ' '             ;Space ?
2770 2805     01291         JR      Z,DONAM5        ;Exit on 1st blank
2772 CD212A   01292         CALL    BYTOUT2         ;Else display the char
2775 10F5     01293         DJNZ    DONAM4          ;Loop 3 chars
              01294 ;
              01295 ;       Was the (A) parameter specified ?
              01296 ;
2777 3AFC27   01297 DONAM5  LD      A,(APARM+1)     ;A parm specified ?
277A B7       01298         OR      A
277B 2813     01299         JR      Z,DONAM5A       ;No - continue
              01300 ;
              01301 ;       (A) parameter specified - Tab to column 14
              01302 ;
277D 79       01303         LD      A,C             ;P/u chars left to col 20
277E D606     01304         SUB     6               ;Adjust to column 14
2780 47       01305         LD      B,A             ;Stuff into B for DJNZ
2781 CD372A   01306         CALL    OUTSPC          ;Output B spaces
              01307 ;
              01308 ;       Output mod flag (if modified) & tab to 19
              01309 ;
2784 7D       01310         LD      A,L             ;Pt HL => DIR+0
2785 E6E0     01311         AND     0E0H
2787 6F       01312         LD      L,A
2788 CD8E29   01313         CALL    OUTMOD          ;Output "+" if mod
278B 0601     01314         LD      B,1             ;Output 3 spaces
278D CD372A   01315         CALL    OUTSPC          ;Output B spaces
              01316 ;
              01317 ;       Display the File's Attributes
              01318 ;
2790 0601     01319 DONAM5A LD      B,1             ;Set B=1 space
2792 CD372A   01320         CALL    OUTSPC          ;After filespec.
              01321 ;
              01322 ;       Point HL => DIR+0 (Attributes)
              01323 ;
2795 7D       01324         LD      A,L             ;Pt to 1st byte of
2796 E6E0     01325         AND     0E0H            ;Directory record
2798 6F       01326         LD      L,A
              01327 ;
              01328 ;       Display "?" if File OPEN bit set
              01329 ;
2799 3E3F     01330         LD      A,'?'           ;"?" character
279B 23       01331         INC     HL              ;HL => DIR + 1
279C CB6E     01332         BIT     5,(HL)          ;File Open ?
279E 2B       01333         DEC     HL              ;HL => DIR + 0
279F C4212A   01334         CALL    NZ,BYTOUT2      ;Yes - output byte
              01335 ;
              01336 ;       Display an "*" if this is a PDS file
              01337 ;
27A2 46       01338         LD      B,(HL)          ;P/u attributes byte
27A3 3E2A     01339         LD      A,'*'           ;Init for PDS display
27A5 CB68     01340         BIT     5,B
27A7 C4212A   01341         CALL    NZ,BYTOUT2      ;Display if PDS
              01342 ;
              01343 ;       Display an "S" if file is a SYS file
              01344 ;
27AA CB70     01345         BIT     6,B             ;Is it a SYS file?
27AC 3E53     01346         LD      A,'S'
27AE C4212A   01347         CALL    NZ,BYTOUT2      ;Display S if so
              01348 ;
              01349 ;       Display an "I" if file is invisible
              01350 ;
27B1 CB58     01351         BIT     3,B             ;Is it an INV file?
27B3 3E49     01352         LD      A,'I'
27B5 C4212A   01353         CALL    NZ,BYTOUT2      ;Display I if so
              01354 ;
              01355 ;       Point HL => Password Hash (DIR+16)
              01356 ;
27B8 E5       01357         PUSH    HL              ;Save ptr to 1st dir byte
27B9 7D       01358         LD      A,L             ;Pt to owner password
27BA C610     01359         ADD     A,16
27BC 6F       01360         LD      L,A             ;HL => DIR+16
              01361 ;
              01362 ;       Pick up Password in DE
              01363 ;
27BD 5E       01364         LD      E,(HL)          ;P/u in password in DE
27BE 2C       01365         INC     L
27BF 56       01366         LD      D,(HL)
              01367 ;
              01368 ;       Is this a password protected File ?
              01369 ;
27C0 E5       01370         PUSH    HL              ;Save ptr to user psw
27C1 219642   01371         LD      HL,BLKHASH      ;Init to blanks hash
27C4 ED52     01372         SBC     HL,DE           ;Is password blanks?
27C6 E1       01373         POP     HL
27C7 2807     01374         JR      Z,DONAM6        ;Blanks - no "P"assword
              01375 ;
              01376 ;       Password - Display "P" if access <> ALL
              01377 ;
27C9 78       01378         LD      A,B             ;P/u attributes byte
27CA E607     01379         AND     7               ;Get protection level
27CC 3E50     01380         LD      A,'P'           ;Init for protected
27CE 2002     01381         JR      NZ,DONAM7       ;Stuff the 'P' if prot
27D0 3E20     01382 DONAM6  LD      A,' '           ;  else stuff a blank
              01383 ;
              01384 ;       Set Password flag if protected & display "P"
              01385 ;
27D2 321728   01386 DONAM7  LD      (ALL02+1),A     ;Stuff 'P' or blank
27D5 FE20     01387         CP      ' '             ;Space ?
27D7 C4212A   01388         CALL    NZ,BYTOUT2      ;Display char if needed
27DA E1       01389         POP     HL              ;HL => DIR+0
              01390 ;
              01391 ;       Display a "C" if the file was Created
              01392 ;
27DB 23       01393         INC     HL              ;HL => DIR+1
27DC 7E       01394         LD      A,(HL)          ;P/u attributes
27DD 2B       01395         DEC     HL              ;HL => DIR+0
27DE 07       01396         RLCA                    ;Created ?
27DF 3E43     01397         LD      A,'C'           ;"C"reate character
27E1 DC212A   01398         CALL    C,BYTOUT2       ;Yes - output byte
              01399 ;
              01400 ;       Display Mod flag here if (A) not specified
              01401 ;
27E4 3AFC27   01402         LD      A,(APARM+1)     ;P/u A-parm
27E7 B7       01403         OR      A
27E8 F5       01404         PUSH    AF              ;Save condition
27E9 CC8E29   01405         CALL    Z,OUTMOD        ;Output mod flag if -A
27EC F1       01406         POP     AF              ;NZ - (A) parm
              01407 ;
              01408 ;       If (A) parameter given - then tab to col 26
              01409 ;
27ED 2804     01410         JR      Z,DONAM8        ;Not A - go to 20
27EF 3E04     01411         LD      A,4             ;Add 6 to column #
27F1 81       01412         ADD     A,C
27F2 4F       01413         LD      C,A             ;C = # of spaces
              01414 ;
              01415 ;       Position to Next designated column
              01416 ;
27F3 3E20     01417 DONAM8  LD      A,' '           ;Write a space
27F5 CD222A   01418         CALL    BYTOUT          ;Output byte
27F8 0D       01419         DEC     C               ;Dec column counter
27F9 20F8     01420         JR      NZ,DONAM8       ;Display trailing spaces
              01421 ;
              01422 ;       Display other things if (A) parm set
              01423 ;
27FB 11FFFF   01424 APARM   LD      DE,-1           ;P/u (A) parm
27FE 7A       01425         LD      A,D             ;Specified ?
27FF B3       01426         OR      E
2800 C41528   01427         CALL    NZ,ALL01        ;Full info if A-parm
              01428 ;
              01429 ;       Check for end of line
              01430 ;
2803 3E00     01431 DONAM9  LD      A,0             ;Count down 4-across
2805 3D       01432         DEC     A
2806 320428   01433         LD      (DONAM9+1),A    ;Update count
2809 C0       01434         RET     NZ              ;Loop if more to go
280A 3E04     01435         LD      A,4             ;  else re-init to 4/line
280C 320428   01436         LD      (DONAM9+1),A
              01437 ;
              01438 ;       Finished with one line - end with C/R
              01439 ;
              01440         IF      @BLD631
280F CD9A2A   01441 ENDLINE CALL    CKPAGE1         ;<631>Check for page pause
2812 C3CD2A   01442         JP      CKPAWS          ;<631>Scan pause or break loop
              01443         ELSE
              01444 ENDLINE LD      A,CR            ;End line
              01445         CALL    BYTOUT
              01446         CALL    CKPAGE          ;Check for page pause
              01447         CALL    CKPAWS          ;Scan pause or break
              01448         RET                     ;Loop
              01449         ENDIF
              01450 ;
              01451 ;       ALL01 - Display Full Allocation of a file
              01452 ;
2815 E5       01453 ALL01   PUSH    HL              ;Save pointer to 1st byte
2816 3E00     01454 ALL02   LD      A,0             ;Bypass if not
2818 D620     01455         SUB     20H             ;  password protected
281A 2803     01456         JR      Z,ALL03
281C 7E       01457         LD      A,(HL)          ;Get prot level &
281D E607     01458         AND     7               ;  multiply by 4
281F 07       01459 ALL03   RLCA                    ;  to index string array
2820 07       01460         RLCA
2821 4F       01461         LD      C,A
2822 0600     01462         LD      B,0
2824 211F2D   01463         LD      HL,PROTS$       ;Pt to 4-char abbrevs
2827 09       01464         ADD     HL,BC           ;Pt to proper one
2828 11B42D   01465         LD      DE,PLEVEL       ;Move into output line
282B 0E04     01466         LD      C,4
282D EDB0     01467         LDIR
282F E1       01468         POP     HL              ;Recover pointer to
2830 E5       01469         PUSH    HL              ;  1st byte of dir record
2831 2C       01470         INC     L
2832 2C       01471         INC     L
2833 2C       01472         INC     L
              01473 ;
              01474 ;       Pick up EOF offset byte & Stuff for later
              01475 ;
2834 7E       01476         LD      A,(HL)          ;P/u EOF offset byte
2835 328328   01477         LD      (EOFBYTE+1),A   ;Stuff into LD DE,$-$
              01478 ;
              01479 ;       calculate EOF record according to the formula:
              01480 ;       EOFREC= ((ERN-1)*256+EOF+LRL-1)/LRL if ERN<>0
              01481 ;       EOFREC= 0 if ERN=0
              01482 ;
2838 7E       01483         LD      A,(HL)          ;P/u EOF offset byte
2839 F5       01484         PUSH    AF              ;  & save it
283A 2C       01485         INC     L               ;Pt to LRL
283B 7E       01486         LD      A,(HL)          ;P/u LRL
283C 325828   01487         LD      (ALL04+1),A     ;  & stuff it
              01488 ;
              01489 ;       get LRL into message
              01490 ;
283F E5       01491         PUSH    HL              ;Save ptr
2840 6F       01492         LD      L,A             ;Transfer LRL to HL
2841 2600     01493         LD      H,0
2843 B7       01494         OR      A               ;Test for <> 256
2844 2001     01495         JR      NZ,$+3
2846 24       01496         INC     H               ;Show 256
2847 11B92D   01497         LD      DE,LRL-1                ;DE => LRL destination
              01498         IF      @BLD631
              01499         ELSE
              01500         LD      A,' '           ;Init the ASCII byte
              01501         ENDIF
284A          01502         @@HEXDEC
284A+3E61     01503         LD      A,97
284C+EF       01504         RST     40
284D E1       01505         POP     HL
              01506 ;
              01507 ;       continue to calculate EOF
              01508 ;
284E 7D       01509         LD      A,L             ;Pt to ERN
284F C610     01510         ADD     A,16
2851 6F       01511         LD      L,A
2852 5E       01512         LD      E,(HL)          ;P/u into reg DE
2853 2C       01513         INC     L
2854 56       01514         LD      D,(HL)
2855 C1       01515         POP     BC              ;Rcvr EOF byte in reg B
2856 EB       01516         EX      DE,HL           ;Xfer EOFREC -> reg HL
2857 3E00     01517 ALL04   LD      A,0             ;P/u LRL
2859 B7       01518         OR      A
285A 2818     01519         JR      Z,TSTSIZ        ;Go use ERN if LRL=0
285C 5F       01520         LD      E,A             ;Xfer LRL to reg E
285D 04       01521         INC     B               ;Test EOF
285E 05       01522         DEC     B
285F 2801     01523         JR      Z,DONTDEC       ;Don't dec ERN if EOF=0
2861 2B       01524         DEC     HL              ;Reduce ERN for 0 offset
2862 CD8729   01525 DONTDEC CALL    DIVIDE
2865 4D       01526         LD      C,L
2866 54       01527         LD      D,H
2867 67       01528         LD      H,A
2868 68       01529         LD      L,B             ;P/u EOF
2869 7B       01530         LD      A,E
286A CD8729   01531         CALL    DIVIDE
286D 61       01532         LD      H,C
286E B7       01533         OR      A
286F 2801     01534         JR      Z,DONTINC
2871 23       01535         INC     HL              ;Round up partial record
2872 7A       01536 DONTINC LD      A,D             ;Ck if overflow
2873 B7       01537         OR      A
2874 280C     01538 TSTSIZ  JR      Z,EOFBYTE       ;Use calc'd ERN if not
              01539 ;
              01540 ;       Overflow in # of Records - use "*****"
              01541 ;
2876 21BF2D   01542         LD      HL,RECORDS      ;Dsply field
2879 060A     01543         LD      B,10            ;Display in record and
287B 362A     01544 DOSTAR  LD      (HL),'*'        ;  eof offset fields
287D 23       01545         INC     HL
287E 10FB     01546         DJNZ    DOSTAR
2880 1819     01547         JR      DIR_0
              01548 ;
              01549 ;       If # Records = 0 then set EOF = 0
              01550 ;
2882 110000   01551 EOFBYTE LD      DE,00           ;P/u EOF offset byte
2885 7C       01552         LD      A,H             ;# Records = 0 ?
2886 B5       01553         OR      L
2887 2002     01554         JR      NZ,KEEPEOF      ;No - keep EOF
2889 1E01     01555         LD      E,1             ;Set EOF=1 (gets DECed)
288B E5       01556 KEEPEOF PUSH    HL              ;Save # Records
288C 21C42D   01557         LD      HL,OFFSET-2     ;HL => Destination
288F 1D       01558         DEC     E               ;DE = EOF byte
2890 EB       01559         EX      DE,HL           ;Swap for conversion
              01560         IF      @BLD631
              01561         ELSE
              01562         LD      A,' '           ;Init
              01563         ENDIF
2891          01564         @@HEXDEC
2891+3E61     01565         LD      A,97
2893+EF       01566         RST     40
              01567 ;
              01568 ;       Stuff # of Records used into string
              01569 ;
2894 E1       01570         POP     HL              ;Recover # of Records
2895 11BF2D   01571         LD      DE,RECORDS      ;DE => Destination
2898          01572         @@HEXDEC
2898+3E61     01573         LD      A,97
289A+EF       01574         RST     40
              01575 ;
              01576 ;       Get # of extents & Granules used
              01577 ;
289B E1       01578 DIR_0   POP     HL              ;Rcvr ptr to 1st byte
289C E5       01579         PUSH    HL
289D CD9C29   01580         CALL    ALL09           ;Get total grans in use
28A0 D5       01581         PUSH    DE
28A1 79       01582         LD      A,C             ;Extents
28A2 11D72D   01583         LD      DE,EXTENTS
28A5 CD6729   01584         CALL    ATO2D
28A8 D1       01585         POP     DE
              01586 ;
              01587 ;       DE = # Grans used - Add to Grans Counter
              01588 ;
28A9 2A0126   01589         LD      HL,(TOTGRNS+1)  ;P/u total grans
28AC 19       01590         ADD     HL,DE           ;Add this file's count
28AD 220126   01591         LD      (TOTGRNS+1),HL  ;  & stuff into counter.
              01592 ;
28B0 21CB2D   01593         LD      HL,KSIZE        ;Pt to where to stuff
28B3 CD3F2A   01594         CALL    CALCK           ;Cvrt to K
28B6 21DA2D   01595         LD      HL,DATEFLD-1    ;Blank out day-mo-yr
28B9 11DB2D   01596         LD      DE,DATEFLD
28BC 011100   01597         LD      BC,17
28BF EDB0     01598         LDIR
28C1 E1       01599         POP     HL              ;Rcvr ptr to DIR+0
28C2 11DB2D   01600         LD      DE,DATEFLD
28C5 23       01601         INC     HL
28C6 23       01602         INC     HL              ;Advance to date field
28C7 7E       01603         LD      A,(HL)
28C8 B7       01604         OR      A
28C9 CA5B29   01605         JP      Z,ALL08         ;Ignore if no date saved
28CC 0F       01606         RRCA                    ;Has date, get day
28CD 0F       01607         RRCA
28CE 0F       01608         RRCA
28CF E61F     01609         AND     1FH
28D1 CD6729   01610         CALL    ATO2D           ;Make ascii
28D4 13       01611         INC     DE
28D5 E5       01612         PUSH    HL
28D6 2B       01613         DEC     HL              ;Pt to month
28D7 7E       01614         LD      A,(HL)
28D8 E60F     01615         AND     0FH
28DA 3D       01616         DEC     A
28DB 4F       01617         LD      C,A
28DC 07       01618         RLCA
28DD 81       01619         ADD     A,C
28DE 4F       01620         LD      C,A
28DF 0600     01621         LD      B,0
28E1 21DC04   01622         LD      HL,MONTBL
28E4 09       01623         ADD     HL,BC
28E5 0E03     01624         LD      C,3
28E7 EDB0     01625         LDIR
28E9 13       01626         INC     DE
              01627         IF      @BLD631
28EA 3E2D     01628         LD      A,2DH           ;<631>
28EC 32DD2D   01629         LD      (GETPRM-1),A    ;<631>
28EF 32E12D   01630         LD      (GETPRM+3),A    ;<631>
              01631         ENDIF
28F2 E1       01632         POP     HL
28F3 E5       01633         PUSH    HL
28F4 3A0000   01634         LD      A,($-$)         ;Drive year type
28F5          01635 YFLAG2  EQU     $-2
28F7 CB       01636         DB      0CBH
28F8 47       01637 DVTEST1 DB      47H
28F9 F5       01638         PUSH    AF              ;Save for time ck
28FA 2005     01639         JR      NZ,NEWDT2
28FC 7E       01640         LD      A,(HL)          ;Get old date
28FD E607     01641         AND     7
28FF 1807     01642         JR      NEWDT3
2901 7D       01643 NEWDT2  LD      A,L
2902 C611     01644         ADD     A,17            ;Get new year
2904 6F       01645         LD      L,A
2905 7E       01646         LD      A,(HL)
2906 E61F     01647         AND     1FH
2908 C650     01648 NEWDT3  ADD     A,80
290A FE64     01649         CP      100             ;Bad year?
290C 3802     01650         JR      C,NEWD3A        ;Go ifok
              01651         IF      @BLD631
290E D664     01652         SUB     100             ;<631>This is the max year
              01653         ELSE
              01654         LD      A,99            ;This is max year
              01655         ENDIF
2910 CD6729   01656 NEWD3A  CALL    ATO2D
2913 13       01657         INC     DE
2914 13       01658         INC     DE
2915 F1       01659         POP     AF              ;New style dating?
2916 2842     01660         JR      Z,OLDCODE       ;Go if not
              01661 NEWDT4:
              01662         IF      @BLD631
              01663         IF      @BLD631D
2918 FDE5     01664         PUSH    IY              ;<631D>
291A CD762D   01665         CALL    P631D1          ;<631D>Level-1D Patch
              01666         ELSE                    ;<631D>
              01667         DEC     HL              ;Pt to hours
              01668         @@FLAGS                 ;<631>
              01669         LD      A,(HL)
              01670         ENDIF                   ;<631D>
              01671         ELSE                    ;<631>
              01672         DEC     HL              ;Pt to hours
              01673         LD      A,(HL)
              01674         ENDIF                   ;<631>
291D E6F8     01675         AND     0F8H            ;Mask mins
291F 0F       01676         RRCA
2920 0F       01677         RRCA
2921 0F       01678         RRCA                    ;Hours into posn
2922 F5       01679         PUSH    AF              ;Save for a,p test
              01680         IF      @BLD631
2923 FDCB0866 01681         BIT     4,(IY+8)        ;<631>
2927 200B     01682         JR      NZ,NEWDT8       ;<631>
              01683         ENDIF
2929 B7       01684         OR      A               ;If hour zero, then 12
292A 2002     01685         JR      NZ,NEWDT7
292C 3E0C     01686         LD      A,12
292E FE0D     01687 NEWDT7  CP      13
2930 3802     01688         JR      C,NEWDT8
2932 D60C     01689         SUB     12
2934 CD6729   01690 NEWDT8  CALL    ATO2D
2937 3E3A     01691         LD      A,':'
2939 12       01692         LD      (DE),A
293A 13       01693         INC     DE
293B 7E       01694         LD      A,(HL)          ;MSbits, min
293C 23       01695         INC     HL
293D 6E       01696         LD      L,(HL)          ;LS bits
293E E607     01697         AND     7               ;Mask off hour
2940 0603     01698         LD      B,3
2942 CB25     01699 NEWDT5  SLA     L               ;Shift out a LSbit
2944 17       01700         RLA                     ; into A
2945 10FB     01701         DJNZ    NEWDT5
2947 CD6729   01702         CALL    ATO2D
294A F1       01703         POP     AF              ;Get hour
              01704         IF      @BLD631
              01705         IF      @BLD631D
294B C37C2D   01706         JP      P631D2          ;<631D>Level 1D patch
294E 00       01707         NOP                     ;<631D>
              01708 P631D3:                         ;<631D>Back from the patch
              01709         ELSE
              01710         BIT     4,(IY+8)        ;<631>
              01711         ENDIF
294F 2009     01712         JR      NZ,OLDCODE      ;<631>
              01713         ENDIF
2951 FE0C     01714         CP      12
2953 3E61     01715         LD      A,'a'
2955 3802     01716         JR      C,NEWDT6
2957 3E70     01717         LD      A,'p'
2959 12       01718 NEWDT6  LD      (DE),A
295A E1       01719 OLDCODE POP     HL              ;Rcvr DIR+2
              01720         IF      @BLD631
              01721         ELSE
              01722         DEC     HL              ;B/u to DIR+1
              01723         LD      A,'-'           ;Else change to not cur
              01724         LD      (DATEFLD+2),A   ;Stuff indicator
              01725         LD      (DATEFLD+6),A   ;  between mo&day, day&yr
              01726         ENDIF
295B 21B42D   01727 ALL08   LD      HL,PLEVEL       ;Pt to start of message
295E CD102A   01728         CALL    LINOUT          ;  & output entire string
2961 3E01     01729         LD      A,1             ;Show only one entry
2963 320428   01730         LD      (DONAM9+1),A    ;  per line if A-parm
2966 C9       01731         RET
              01732 ;
              01733 ;       A=> value, DE=> buffer for ascii
              01734 ;
              01735         IF      @BLD631
2967 013000   01736 ATO2D   LD      BC,'0'          ;<631>Init to 0
              01737         ELSE
              01738 ATO2D   LD      B,0             ;Init to 0
              01739         ENDIF
296A D60A     01740 ATD1    SUB     10              ;Find 10's count
296C 3803     01741         JR      C,ATD2          ;Go if got it
296E 04       01742         INC     B               ;  else inc 10's counter
296F 18F9     01743         JR      ATD1            ;Try again
2971 F5       01744 ATD2    PUSH    AF              ;Save 1's count
2972 78       01745         LD      A,B             ;Get 10's count
              01746         IF      @BLD631
2973 81       01747         ADD     A,C             ;<631>Make ascii
              01748         ELSE
              01749         ADD     A,'0'           ;Make ascii
              01750         ENDIF
2974 12       01751         LD      (DE),A          ;Stuff in buffer
              01752         IF      @BLD631
2975 B9       01753         CP      C               ;<631>Leading zero?
              01754         ELSE
              01755         CP      '0'             ;Leading zero?
              01756         ENDIF
2976 2008     01757         JR      NZ,ATD3         ;Go if not
2978 1B       01758         DEC     DE
2979 1A       01759         LD      A,(DE)          ;Was prev a space?
297A 13       01760         INC     DE
297B FE20     01761         CP      ' '
297D 2001     01762         JR      NZ,ATD3         ;Go if not
297F 12       01763         LD      (DE),A          ;  else lead 0 = space
2980 13       01764 ATD3    INC     DE
2981 F1       01765         POP     AF
2982 C63A     01766         ADD     A,'0'+10
2984 12       01767         LD      (DE),A
2985 13       01768         INC     DE
2986 C9       01769         RET
              01770 ;
              01771 ;       DIVIDE - Divide HL by A
              01772 ;
2987 C5       01773 DIVIDE  PUSH    BC              ;Save BC
2988 4F       01774         LD      C,A             ;Xfer Divisor in C
2989          01775         @@DIV16                 ;Divide HL / C
2989+3E5E     01776         LD      A,94
298B+EF       01777         RST     40
298C C1       01778         POP     BC              ;Restore BC
298D C9       01779         RET
              01780 ;
              01781 ;       OUTMOD - Output a "+" if file has been modified
              01782 ;
298E 23       01783 OUTMOD  INC     HL              ;HL => DIR+1
298F 3E20     01784         LD      A,' '           ;Default to no mod
2991 CB76     01785         BIT     6,(HL)          ;Test MOD flag
2993 2802     01786         JR      Z,OUTCHR        ;Output space
2995 3E2B     01787         LD      A,'+'           ;Mod flag char
2997 CD212A   01788 OUTCHR  CALL    BYTOUT2         ;Display '+' if MOD
299A 2B       01789         DEC     HL              ;Repoint to 1st byte
299B C9       01790         RET                     ;Done
              01791 ;
              01792 ;
              01793 ;        routine calculates total # of grans in use
              01794 ;
299C 3AFC26   01795 ALL09   LD      A,(SORTPRM+1)   ;If sorted, then data
299F B7       01796         OR      A               ;  already calculated
29A0 2810     01797         JR      Z,ALL09A        ;Go if not sorted
29A2 E5       01798         PUSH    HL
29A3 DDE1     01799         POP     IX              ;P/u the saved data
29A5 DD5E16   01800         LD      E,(IX+22)
29A8 DD5617   01801         LD      D,(IX+23)       ;P/u Space used
29AB DD4E18   01802         LD      C,(IX+24)
29AE DD4619   01803         LD      B,(IX+25)       ;P/u # of extents
29B1 C9       01804         RET
              01805 ;
              01806 ;       ALL09A - Calculate space allocated to a file
              01807 ;       HL => DIR+0 of an FPDE
              01808 ;       BC <= # of Extents in the file
              01809 ;       DE <= # of Grans allocated to the file
              01810 ;
29B2 110000   01811 ALL09A  LD      DE,0            ;Init gran counter to 0
29B5 43       01812         LD      B,E             ;Init extent ctr to 0
29B6 4B       01813         LD      C,E
              01814 ;
              01815 ;       Point to First Extent of a directory entry
              01816 ;
29B7 7D       01817 ALL10   LD      A,L             ;P/u low byte
29B8 C616     01818 ALL11   ADD     A,22
29BA 6F       01819         LD      L,A             ;HL => DIR + 22
              01820 ;
              01821 ;       Is the Extent Field in Use ?
              01822 ;
29BB 7E       01823 ALL14   LD      A,(HL)          ;P/u cylinder
29BC 2C       01824         INC     L               ;Bump to alloc info
29BD FEFE     01825         CP      0FEH            ;Another extent or done ?
29BF 300D     01826         JR      NC,ALL15        ;Either X'FE' or X'FF'
              01827 ;
              01828 ;       Extent Field is in use - Get allocation info
              01829 ;
29C1 03       01830         INC     BC              ;Bump extent counter
29C2 7E       01831         LD      A,(HL)          ;P/u alloc info
29C3 2C       01832         INC     L               ;Bump ptr to next extent
29C4 E61F     01833         AND     1FH             ;Keep # of grans
29C6 3C       01834         INC     A               ;Adj for zero offset
              01835 ;
              01836 ;       A = # of contig grans, add to gran counter
              01837 ;
29C7 83       01838         ADD     A,E             ;Accumulate # of grans
29C8 5F       01839         LD      E,A
29C9 30F0     01840         JR      NC,ALL14        ;Forget hi if no carry
29CB 14       01841         INC     D               ;Bump hi
29CC 18ED     01842         JR      ALL14           ;Get next extent field
              01843 ;
              01844 ;       P/u DEC if (X'FE') or RET if done (X'FF')
              01845 ;
29CE C0       01846 ALL15   RET     NZ              ;Ret if not extended
29CF 7E       01847         LD      A,(HL)          ;P/u DEC of FXDE
              01848 ;
              01849 ;       Point HL => Extended Directory Entry posn
              01850 ;
29D0 E61F     01851         AND     1FH             ;Get dir sector of DEC
29D2 F5       01852         PUSH    AF              ;Save it
29D3 AE       01853         XOR     (HL)            ;Get dir record of FXDE
29D4 6F       01854         LD      L,A             ;Save dir record position
29D5 F1       01855         POP     AF              ;Recover DEC of FXDE
              01856 ;
              01857 ;       Is the Dir Sector with FXDE already in mem ?
              01858 ;
29D6 E5       01859         PUSH    HL              ;Save ptr to 1st extent
29D7 215526   01860         LD      HL,CKHIT6+1     ;Do we have this dir
29DA BE       01861         CP      (HL)            ;  sector in core?
29DB E1       01862         POP     HL              ;Restore ptr
29DC 2600     01863 SBUFFER LD      H,00            ;Buffer hi order
29DE 28D7     01864         JR      Z,ALL10         ;Jump if we have it
              01865 ;
              01866 ;       Dir Sector not res - Is Ext buf resident ?
              01867 ;
29E0 FEFF     01868 ALL16   CP      0FFH            ;Same as extended area?
29E2 262F     01869         LD      H,BUF2<-8       ;Pt to extended buf area
29E4 28D1     01870         JR      Z,ALL10         ;Jump if we have it there
29E6 32E129   01871         LD      (ALL16+1),A     ;  else upd the test byte
              01872 ;
              01873 ;       Set B = Directory Entry Code of FXDE
              01874 ;
29E9 C5       01875         PUSH    BC              ;Save Gran counter
29EA D5       01876         PUSH    DE              ;  & Extent counter
29EB B5       01877         OR      L               ;Combine sector & record
29EC 47       01878         LD      B,A             ;  pointers to retrieve DEC
              01879 ;
              01880 ;       Set C = Logical Drive #, D = Directory Cyl
              01881 ;
29ED 3A432C   01882         LD      A,(DRIVE)       ;P/u ASCII drive #
29F0 D630     01883         SUB     '0'             ;Adjust to binary
29F2 4F       01884         LD      C,A             ;Save in C
29F3 FD5609   01885         LD      D,(IY+9)        ;P/u Directory cyl in D
              01886 ;
              01887 ;       Set E = FXDE's Dir Sector, HL => I/O buffer
              01888 ;
29F6 78       01889         LD      A,B             ;P/u DEC
29F7 E61F     01890         AND     1FH             ;Get sector #
29F9 C602     01891         ADD     A,2             ;Adj for GAT & HIT
29FB 5F       01892         LD      E,A             ;Stuff in E
29FC 21002F   01893         LD      HL,BUF2         ;HL => I/O Buffer
              01894 ;
              01895 ;       Read in the FXDE's Directory Sector
              01896 ;
29FF          01897         @@RDSEC                 ;Read a sector
29FF+3E31     01898         LD      A,49
2A01+EF       01899         RST     40
2A02 FE06     01900         CP      6               ;Expecting Error #6
2A04 3E11     01901         LD      A,11H           ;Read error?
2A06 C21E24   01902         JP      NZ,IOERR        ;Jump if got error
              01903 ;
              01904 ;       Set A = offset into Sector of entry
              01905 ;
2A09 78       01906         LD      A,B             ;P/u FXDE DEC
2A0A E6E0     01907         AND     0E0H            ;Pt to dir record
2A0C D1       01908         POP     DE              ;Restore counters
2A0D C1       01909         POP     BC
2A0E 18A8     01910         JR      ALL11           ;Loop through extents
              01911 ;
              01912 ;       LINOUT - Output line to *DO/*PR
              01913 ;       HL => Buffer to output
              01914 ;
2A10          01915 LINOUT  @@DSPLY                 ;Output line to *DO
              01916         IFEQ    00H,1
              01917         LD      HL,
              01918         ENDIF
2A10+3E0A     01919         LD      A,10
2A12+EF       01920         RST     40
2A13 2008     01921         JR      NZ,IOER1        ;NZ - Abort
2A15 3A2A2A   01922         LD      A,(PPARM+1)     ;Ck P-parm
2A18 B7       01923         OR      A
2A19 C8       01924         RET     Z               ;Not spec'd - don't print
2A1A          01925         @@PRINT                 ;Output line to *PR
              01926         IFEQ    00H,1
              01927         LD      HL,
              01928         ENDIF
2A1A+3E0E     01929         LD      A,14
2A1C+EF       01930         RST     40
2A1D C21E24   01931 IOER1   JP      NZ,IOERR        ;NZ - Abort
2A20 C9       01932         RET
              01933 ;
              01934 ;       BYTOUT - Output a byte to *DO/*PR
              01935 ;       A = Character to output
              01936 ;
2A21 0D       01937 BYTOUT2 DEC     C               ;Decrement col #
2A22 C5       01938 BYTOUT  PUSH    BC              ;Save BC
2A23 4F       01939         LD      C,A             ;Save char in C
2A24          01940         @@DSP                   ;Display char
2A24+3E02     01941         LD      A,2
2A26+EF       01942         RST     40
2A27 20F4     01943         JR      NZ,IOER1        ;NZ - Abort
2A29 110000   01944 PPARM   LD      DE,0            ;P/u P-parm
2A2C 1C       01945         INC     E               ;Specified ?
2A2D 2006     01946         JR      NZ,NOPRT        ;No - don't print
2A2F          01947         @@PRT                   ;Output byte
2A2F+3E06     01948         LD      A,6
2A31+EF       01949         RST     40
2A32 20E9     01950         JR      NZ,IOER1        ;NZ - Abort
2A34 79       01951         LD      A,C             ;Get back char
2A35 C1       01952 NOPRT   POP     BC              ;Restore BC
2A36 C9       01953         RET                     ;And return
              01954 ;
              01955 ;       OUTSPC - Output B spaces
              01956 ;
2A37 3E20     01957 OUTSPC  LD      A,' '           ;Space char
2A39 CD212A   01958         CALL    BYTOUT2         ;Output space
2A3C 10F9     01959         DJNZ    OUTSPC
2A3E C9       01960         RET                     ;RETurn
2A3F          01961 *GET LBDIRC:3
              01962 ;LBDIRC/ASM - DIR math, strings, & buffers
              01965 ;
              01966 ;       CALCK - Calculate the # of K given # of Grans
              01967 ;       DE => # of Granules
              01968 ;       HL => Destination of #K ASCII string
              01969 ;
2A3F 22542A   01970 CALCK   LD      (CALCK2+1),HL   ;Stuff dest address
              01971 ;
              01972 ;       Calc # of Free Sects (Sectors/Gran x Grans)
              01973 ;
2A42 EB       01974         EX      DE,HL           ;HL = # of Free Grans
2A43 0E00     01975 CALCK1  LD      C,$-$           ;C = Sectors/Gran
2A45          01976         @@MUL16                 ;Mult HL x C
2A45+3E5B     01977         LD      A,91
2A47+EF       01978         RST     40
              01979 ;
              01980 ;       LA = Total # of Sectors - Divide by 4 for K
              01981 ;
2A48 F5       01982         PUSH    AF              ;Save offset
2A49 65       01983         LD      H,L             ;Set HL = LA
2A4A 6F       01984         LD      L,A
2A4B CB3C     01985         SRL     H               ;Divide HL / 4
2A4D CB1D     01986         RR      L
2A4F CB3C     01987         SRL     H
2A51 CB1D     01988         RR      L
              01989 ;
              01990 ;       P/u dest address & stuff in # of FULL K
              01991 ;
2A53 110000   01992 CALCK2  LD      DE,$-$          ;P/u destination address
2A56          01993         @@HEXDEC
2A56+3E61     01994         LD      A,97
2A58+EF       01995         RST     40
2A59 13       01996         INC     DE              ;DE => Hundredths
              01997 ;
              01998 ;       Stuff hundredths value into string
              01999 ;
2A5A F1       02000         POP     AF              ;Rcvr offset to
2A5B E603     02001         AND     3               ;Get offset
2A5D 87       02002         ADD     A,A
2A5E 0600     02003         LD      B,0
2A60 4F       02004         LD      C,A             ;BC = offset
2A61 214B2D   02005         LD      HL,HUNDTAB      ;HL => Hundredths table
2A64 09       02006         ADD     HL,BC           ;HL => Hundredths offset
2A65 0E02     02007         LD      C,2             ;BC = 2 characters
2A67 EDB0     02008         LDIR                    ;Transfer to DE
2A69 C9       02009         RET
              02010 ;
              02011 ;       CPHLDE - Compare HL to DE
              02012 ;
2A6A 7C       02013 CPHLDE  LD      A,H             ;P/u high byte
2A6B BA       02014         CP      D               ;Same ?
2A6C C0       02015         RET     NZ              ;No - Return C or NC
2A6D 7D       02016         LD      A,L             ;P/u low byte
2A6E BB       02017         CP      E               ;Less than or greater ?
2A6F C9       02018         RET                     ;Return - C, NC, or Z
              02019 ;
              02020 ;       UNPACK - Unpack the Date from a directory entry
              02021 ;       HL => DIR+1
              02022 ;       DE <= Date in DATE$ format
              02023 ;
2A70 7E       02024 UNPACK  LD      A,(HL)          ;Get month
2A71 E60F     02025         AND     0FH
2A73 1E00     02026         LD      E,0
2A75 57       02027         LD      D,A
2A76 CB3A     02028         SRL     D
2A78 CB1B     02029         RR      E               ;Split into DE
2A7A 23       02030         INC     HL              ;Pt to day
2A7B 7E       02031         LD      A,(HL)
2A7C E6F8     02032         AND     0F8H
2A7E 0F       02033         RRCA
2A7F B3       02034         OR      E
2A80 5F       02035         LD      E,A             ;Month to E
2A81 3A0000   02036         LD      A,($-$)
2A82          02037 YFLAG1  EQU     $-2
2A84 CB       02038         DB      0CBH
2A85 47       02039 DVTEST  DB      47H
2A86 2009     02040         JR      NZ,NWDT         ;Go if new type date
2A88 7E       02041         LD      A,(HL)
2A89 E607     02042         AND     7               ;Else use old
2A8B 07       02043 SHFTD   RLCA                    ;Into bits 3-7
2A8C 07       02044         RLCA
2A8D 07       02045         RLCA
2A8E B2       02046         OR      D
2A8F 57       02047         LD      D,A
2A90 C9       02048         RET
2A91 7D       02049 NWDT    LD      A,L
2A92 C611     02050         ADD     A,17
2A94 6F       02051         LD      L,A             ;Pt to new year
2A95 7E       02052         LD      A,(HL)
2A96 E61F     02053         AND     1FH
2A98 18F1     02054         JR      SHFTD
              02055 ;
              02056 ;       CKPAGE - Check for Page Pause
              02057 ;
              02058         IF      @BLD631
2A9A 3E0D     02059 CKPAGE1 LD      A,CR            ;<631>
2A9C CD222A   02060         CALL    BYTOUT          ;<631>
              02061         ENDIF
2A9F 3E00     02062 CKPAGE  LD      A,$-$           ;Ck for display pause
2AA1 3D       02063         DEC     A               ;Count down
2AA2 32A02A   02064         LD      (CKPAGE+1),A    ;Update
2AA5 C0       02065         RET     NZ              ;Ret if not yet full
              02066 ;
              02067 ;       Displayed a full page - Reset Counter
              02068 ;
2AA6 3E16     02069         LD      A,22            ;Reset to max lines/page
2AA8 32A02A   02070         LD      (CKPAGE+1),A
              02071 ;
              02072 ;       Don't pause if NOPAUSE (N) parm entered
              02073 ;
2AAB 110000   02074 NPARM   LD      DE,0            ;P/u NOPAUSE parm
2AAE 7B       02075         LD      A,E             ;Specified ?
2AAF B2       02076         OR      D
2AB0 C0       02077         RET     NZ              ;Nonstop if non-zero
              02078 ;
              02079 ;       Non-Stop if  in effect
              02080 ;
2AB1 3E00     02081 SFLAG   LD      A,$-$           ;P/u SFLAG$
2AB3 E620     02082         AND     20H             ;Strip all but  bit
2AB5 C0       02083         RET     NZ              ;Return if do in effect
              02084 ;
              02085 ;       There isn't a  in effect - Wait for key
              02086 ;
2AB6          02087         @@KEY                   ;Wait for key entry
2AB6+3E01     02088         LD      A,1
2AB8+EF       02089         RST     40
2AB9 C21E24   02090 IOERR5  JP      NZ,IOERR
              02091 ;
              02092 ;       Clear Screen
              02093 ;
2ABC 3E69     02094         LD      A,105
2ABE 00       02095         NOP                     ;CLS out for now
              02096 ;       rst     40              ;Uncomment for CLS
2ABF 20F8     02097         JR      NZ,IOERR5
              02098 ;
              02099 ;       If the NOTITLE flag is set - don't display
              02100 ;
2AC1 3E00     02101 NOTITLE LD      A,$-$           ;P/u flag
2AC3 B7       02102         OR      A               ;No title ?
2AC4 C0       02103         RET     NZ              ;Then RETurn
              02104 ;
              02105 ;       Display a title if there were matching files
              02106 ;
2AC5 3A9B2D   02107         LD      A,(FILFLAG)     ;Was a matching file
2AC8 B7       02108         OR      A               ;  displayed ?
2AC9 C4EB2A   02109         CALL    NZ,CKTITL       ;Yes - display title
2ACC C9       02110         RET                     ;Return
              02111 ;
              02112 ;       CKPAWS - Check for <@> or 
              02113 ;
              02114 CKPAWS
              02115 ;
              02116 ;       Was the  key hit ?
              02117 ;
2ACD 3A0000   02118 KFLAG   LD      A,($-$)         ;P/u KFLAG$
2AD0 0F       02119         RRCA                    ; hit ?
2AD1 DA1724   02120         JP      C,ABORT         ;Yes - cease DIR
              02121 ;
              02122 ;       Is the  bit set ?
              02123 ;
2AD4 0F       02124         RRCA                    ; bit set ?
2AD5 D0       02125         RET     NC              ;Ret if not pause
              02126 ;
              02127 ;       The  bit is set - Wait for Char
              02128 ;
2AD6          02129 CKPAW1  @@KEY                   ;Scan keyboard
2AD6+3E01     02130         LD      A,1
2AD8+EF       02131         RST     40
              02132 ;
              02133 ;       Character entered - Ignore it if <@>
              02134 ;
2AD9 FE60     02135 CKPAW2  CP      60H             ;<@> ?
2ADB 28F9     02136         JR      Z,CKPAW1        ;Yes - get another char
2ADD FE80     02137         CP      BREAK
2ADF CA1724   02138         JP      Z,ABORT
              02139 ;
              02140 ;       Reset  &  bits
              02141 ;
2AE2 3A0000   02142 RESKFL  LD      A,($-$)         ;P/u KFLAG$
2AE5 E6F9     02143         AND     0F9H            ;Reset  & 
2AE7 320000   02144 KFLAG1  LD      ($-$),A         ;Stuff into KFLAG$
2AEA C9       02145         RET                     ;  & RETurn
              02146 ;
              02147 ;       CKTITL - Display Title
              02148 ;
              02149 ;       Display Disk type Header
              02150 ;
2AEB 213C2C   02151 CKTITL  LD      HL,DSTRING      ;HL => Heading
2AEE CD102A   02152         CALL    LINOUT          ;Output line
2AF1 CD9F2A   02153         CALL    CKPAGE          ;Bump line count
2AF4 CD9F2A   02154         CALL    CKPAGE          ;  twice.
              02155 ;
              02156 ;       Display Attributes header if A parm spec'd
              02157 ;
2AF7 3AFC27   02158         LD      A,(APARM+1)     ;Was the A parm spec'd
2AFA B7       02159         OR      A
2AFB 3E0D     02160         LD      A,CR            ;Output a CR if A
2AFD CA222A   02161         JP      Z,BYTOUT        ;  not specified.
              02162 ;
2B00 218C2C   02163         LD      HL,HEADING      ;HL => Attr heading
2B03 CD102A   02164         CALL    LINOUT          ;Output line
              02165 ;
              02166 ;       Display Underline
              02167 ;
2B06 C5       02168         PUSH    BC              ;Save BC
2B07 064F     02169         LD      B,79            ;Display underline
2B09 3E2D     02170 D79L    LD      A,'-'
2B0B CD222A   02171         CALL    BYTOUT          ;Output byte
2B0E 10F9     02172         DJNZ    D79L            ;  79 times
2B10 C1       02173         POP     BC              ;Restore BC
              02174         IF      @BLD631
2B11 C39A2A   02175         JP      CKPAGE1         ;<631>Check page pause & RET
              02176         ELSE
              02177         LD      A,CR            ;One CR between
              02178         CALL    BYTOUT
              02179         JP      CKPAGE          ;Check page pause & RET
              02180         ENDIF
              02181 ;
              02183 ;
              02184 ;       SORTIT - Set up Directory Records for Shell Sort
              02185 ;
2B14 2A9C2D   02186 SORTIT  LD      HL,(DIRPTR)     ;Calculate # of records
2B17 110030   02187         LD      DE,MEMORY       ;Point to buf start
2B1A 73       02188         LD      (HL),E          ;Prime the 1st index
2B1B 23       02189         INC     HL              ;  in case there is
2B1C 72       02190         LD      (HL),D          ;  only one record
2B1D 2B       02191         DEC     HL              ;  to sort
2B1E AF       02192         XOR     A
2B1F ED52     02193         SBC     HL,DE           ;PTREND - PTRBGN
2B21 C8       02194         RET     Z               ;Ret if nothing
              02195 ;
              02196 ;       Set HL = # of directory entries
              02197 ;
2B22 0605     02198         LD      B,5             ;Divide by
2B24 CB3C     02199 SORT1   SRL     H               ;  32 bytes/record
2B26 CB1D     02200         RR      L
2B28 10FA     02201         DJNZ    SORT1
              02202 ;
              02203 ;       Set B = # of entries & init count
              02204 ;
2B2A 45       02205         LD      B,L             ;Set loop counter
2B2B C5       02206         PUSH    BC              ;Save it for printing
2B2C 22682B   02207         LD      (COUNTM1),HL    ;Init the count
              02208 ;
              02209 ;       Skip sort if # of entries = 0
              02210 ;
2B2F 7C       02211         LD      A,H             ;If length = 0
2B30 B5       02212         OR      L               ;  then no need to sort
2B31 2821     02213         JR      Z,SORT2A
2B33 29       02214         ADD     HL,HL           ;Make sure enuff room
2B34 EB       02215         EX      DE,HL
2B35 2A9E2D   02216         LD      HL,(MAXMEM)
2B38 AF       02217         XOR     A
2B39 ED52     02218         SBC     HL,DE
2B3B DA0D24   02219         JP      C,NOMEM
2B3E 2A9C2D   02220         LD      HL,(DIRPTR)     ;Set up the index array
2B41 110030   02221         LD      DE,MEMORY       ;Starting record pointer
2B44 73       02222 SORT2   LD      (HL),E          ;Place record pointers
2B45 23       02223         INC     HL              ;  into index array
2B46 72       02224         LD      (HL),D
2B47 23       02225         INC     HL
2B48 7B       02226         LD      A,E             ;Increment pointer by 32
2B49 C620     02227         ADD     A,32
2B4B 5F       02228         LD      E,A
2B4C 3001     02229         JR      NC,$+3          ;Go if no overflow
2B4E 14       02230         INC     D               ;  else bump high order
2B4F 10F3     02231         DJNZ    SORT2           ;Loop for all records
2B51 CD672B   02232         CALL    SHELL           ;Sort the dir records
2B54 C1       02233 SORT2A  POP     BC              ;Recover loop counter
2B55 2A9C2D   02234         LD      HL,(DIRPTR)     ;P/u starting record
2B58 5E       02235 SORT3   LD      E,(HL)          ;Grab its address
2B59 23       02236         INC     HL
2B5A 56       02237         LD      D,(HL)
2B5B 23       02238         INC     HL
2B5C E5       02239         PUSH    HL              ;Save index pointer
2B5D C5       02240         PUSH    BC              ;Save loop counter
2B5E EB       02241         EX      DE,HL           ;Record address -> HL
2B5F CD3627   02242         CALL    MATCH           ;Display the record
2B62 C1       02243         POP     BC              ;Rcvr loop counter
2B63 E1       02244         POP     HL              ;Rcvr index pointer
2B64 10F2     02245         DJNZ    SORT3
2B66 C9       02246         RET
              02247 ;
              02248 ;       SHELL - Shell Sort Routine
              02249 ;
2B67 210000   02250 SHELL   LD      HL,$-$          ;P/u count minus 1
2B68          02251 COUNTM1 EQU     $-2
2B6A 226E2B   02252         LD      (STORM),HL
              02253 ;
              02254 ;       Start Select & Compare
              02255 ;
2B6D 110000   02256 CYCLE   LD      DE,0            ;M = M / 2
2B6E          02257 STORM   EQU     $-2
2B70 CB3A     02258         SRL     D
2B72 CB1B     02259         RR      E
2B74 7A       02260         LD      A,D             ;Return when M=0
2B75 B3       02261         OR      E
2B76 C8       02262         RET     Z
2B77 ED536E2B 02263         LD      (STORM),DE
2B7B 2A682B   02264         LD      HL,(COUNTM1)    ;K = N - M
2B7E ED52     02265         SBC     HL,DE
2B80 22EF2B   02266         LD      (STORK),HL
2B83 210000   02267         LD      HL,0            ;J = 0
2B86 228A2B   02268         LD      (STORJ),HL
2B89 210000   02269 AGAIN   LD      HL,$-$          ;I = J
2B8A          02270 STORJ   EQU     $-2
2B8C 22902B   02271         LD      (STORI),HL
2B8F 210000   02272 REPEAT  LD      HL,$-$          ;L = I + M
2B90          02273 STORI   EQU     $-2
2B92 ED5B6E2B 02274         LD      DE,(STORM)
2B96 19       02275         ADD     HL,DE
2B97 29       02276         ADD     HL,HL           ;L * 2 -> regHL
2B98 E5       02277         PUSH    HL              ;Save L
2B99 2A902B   02278         LD      HL,(STORI)      ;I * 2 -> regHL
2B9C 29       02279         ADD     HL,HL
2B9D ED4B9C2D 02280         LD      BC,(DIRPTR)     ;P/u string parm ptr
2BA1 09       02281         ADD     HL,BC           ;Pt to A$(I) parm
2BA2 EB       02282         EX      DE,HL           ;Ptr -> DE
2BA3 E1       02283         POP     HL              ;Pt to A$(L) parm
2BA4 09       02284         ADD     HL,BC           ;Ptr -> HL
2BA5 E5       02285         PUSH    HL              ;Save ptr to A$(L)
2BA6 D5       02286         PUSH    DE              ;Save ptr to A$(I)
2BA7 060B     02287         LD      B,11            ;Set compare length
2BA9 C5       02288         PUSH    BC              ;Save cpr len & flag
2BAA 7E       02289         LD      A,(HL)          ;P/u string2 ptr
2BAB 23       02290         INC     HL
2BAC 66       02291         LD      H,(HL)
2BAD 6F       02292         LD      L,A
2BAE 010500   02293         LD      BC,5            ;Key is 5 bytes in
2BB1 09       02294         ADD     HL,BC
2BB2 EB       02295         EX      DE,HL           ;String2 ptr -> rDE
2BB3 7E       02296         LD      A,(HL)          ;P/u string1 ptr
2BB4 23       02297         INC     HL
2BB5 66       02298         LD      H,(HL)
2BB6 6F       02299         LD      L,A
2BB7 09       02300         ADD     HL,BC           ;Key is 5 bytes in
2BB8 C1       02301         POP     BC              ;Rcvr len & flag
2BB9 1A       02302 BACK    LD      A,(DE)          ;Go swap if str1>str2
2BBA 96       02303         SUB     (HL)
2BBB 3808     02304         JR      C,POP
2BBD 2025     02305         JR      NZ,FINIS        ;Next str if str2>str1
2BBF 13       02306         INC     DE              ;Loop if this matches
2BC0 23       02307         INC     HL
2BC1 10F6     02308         DJNZ    BACK
2BC3 181F     02309         JR      FINIS           ;None really should match
2BC5 D1       02310 POP     POP     DE              ;Else swap
2BC6 E1       02311         POP     HL
2BC7 0602     02312         LD      B,2             ;Swap 2-byte
2BC9 4E       02313 SWAP    LD      C,(HL)          ;String pointer
2BCA EB       02314         EX      DE,HL
2BCB 7E       02315         LD      A,(HL)
2BCC 71       02316         LD      (HL),C
2BCD EB       02317         EX      DE,HL
2BCE 77       02318         LD      (HL),A
2BCF 23       02319         INC     HL
2BD0 13       02320         INC     DE
2BD1 10F6     02321         DJNZ    SWAP
2BD3 2A6E2B   02322         LD      HL,(STORM)      ;P/u M
2BD6 EB       02323         EX      DE,HL
2BD7 2A902B   02324         LD      HL,(STORI)      ;P/u I
2BDA AF       02325         XOR     A
2BDB ED52     02326         SBC     HL,DE
2BDD 22902B   02327         LD      (STORI),HL      ;I = I - M
2BE0 30AD     02328         JR      NC,REPEAT       ;Repeat if I => 0
2BE2 1802     02329         JR      EXITSRT         ;Else exit the loop
2BE4 D1       02330 FINIS   POP     DE
2BE5 E1       02331         POP     HL
2BE6 2A8A2B   02332 EXITSRT LD      HL,(STORJ)
2BE9 23       02333         INC     HL              ;J = J + 1
2BEA 228A2B   02334         LD      (STORJ),HL
2BED AF       02335         XOR     A
2BEE 110000   02336         LD      DE,$-$
2BEF          02337 STORK   EQU     $-2
2BF1 ED52     02338         SBC     HL,DE           ;J - K
2BF3 D26D2B   02339         JP      NC,CYCLE        ;Cycle if J => K *
2BF6 C3892B   02340         JP      AGAIN           ;Else again
              02341 ;
              02343 ;
2BF9 80       02344 PRMTBL$ DB      80H             ;6.x parameters
              02345 ;
              02346 ;       A - Flag input only
              02347 ;
2BFA 41       02348         DB      FLAG!1
2BFB 41       02349         DB      'A'
2BFC 00       02350         DB      0
2BFD FC27     02351         DW      APARM+1
              02352 ;
              02353 ;       INV (I) - Flag input only
              02354 ;
2BFF 53       02355         DB      FLAG!ABB!3
2C00 49       02356         DB      'INV'
     4E 56 
2C03 00       02357         DB      0
2C04 9026     02358         DW      IPARM+1
              02359 ;
              02360 ;       P - Flag input only
              02361 ;
2C06 41       02362         DB      FLAG!1
2C07 50       02363         DB      'P'
2C08 00       02364         DB      0
2C09 2A2A     02365         DW      PPARM+1
              02366 ;
              02367 ;       SYS (S) - Flag input only
              02368 ;
2C0B 53       02369         DB      FLAG!ABB!3
2C0C 53       02370         DB      'SYS'
     59 53 
2C0F 00       02371         DB      0
2C10 8226     02372         DW      SPARM+1
              02373 ;
              02374 ;       N - Flag input only
              02375 ;
2C12 41       02376         DB      FLAG!1
2C13 4E       02377         DB      'N'
2C14 00       02378         DB      0
2C15 AC2A     02379         DW      NPARM+1
              02380 ;
              02381 ;       DATE (D) - Flag or String input
              02382 ;
2C17 74       02383         DB      FLAG!STR!ABB!4
2C18 44       02384         DB      'DATE'
     41 54 45 
2C1C 00       02385 DRESP   DB      0
2C1D 8E2E     02386         DW      DATPRM+1
              02387 ;
              02388 ;       MOD (M) - Flag input only
              02389 ;
2C1F 53       02390         DB      FLAG!ABB!3
2C20 4D       02391         DB      'MOD'
     4F 44 
2C23 00       02392         DB      0
2C24 9826     02393         DW      CKMOD+1
              02394 ;
              02395 ;       SORT (O) - Flag input only
              02396 ;
2C26 44       02397         DB      FLAG!4
2C27 53       02398         DB      'SORT'
     4F 52 54 
2C2B 00       02399         DB      0
2C2C FC26     02400         DW      SORTPRM+1
              02401 ;
2C2E 41       02402         DB      FLAG!1
2C2F 4F       02403         DB      'O'
2C30 00       02404         DB      0
2C31 FC26     02405         DW      SORTPRM+1
              02406 ;
              02407 ;
2C33 00       02408         DB      0
              02409 ;
2C34 78       02410 DEN     DB      'xDEN'
     44 45 4E 
2C38 48       02411 HARD    DB      'Hard'
     61 72 64 
              02412 ;
2C3C 44       02413 DSTRING DB      'Drive :'
     72 69 76 65 20 3A 
2C43 64       02414 DRIVE   DB      'd  '
     20 20 
2C46 64       02415 NAME    DB      'diskname  '
     69 73 6B 6E 61 6D 65 20
     20 
2C50 20       02416 CYLCNT  DB      '    Cyl, '
     20 20 20 43 79 6C 2C 20
2C59 6E       02417 DENSITY DB      'nDEN, Free ='
     44 45 4E 2C 20 46 72 65
     65 20 3D 
2C65 20       02418 KFREE   DB      '     .  K / '
     20 20 20 20 2E 20 20 4B
     20 2F 20 
2C71 20       02419 KPOSS   DB      '     .  K,  Date '
     20 20 20 20 2E 20 20 4B
     2C 20 20 44 61 74 65 20
2C82 64       02420 DATBUF  DB      'dd-mmm-yy',CR
     64 2D 6D 6D 6D 2D 79 79
     0D 
              02421 ;
2C8C 46       02422 HEADING DB      'Filespec    MOD Attr   Prot  LRL'
     69 6C 65 73 70 65 63 20
     20 20 20 4D 4F 44 20 41
     74 74 72 20 20 20 50 72
     6F 74 20 20 4C 52 4C 
2CAC 20       02423         DB      '  #Recs  EOF  File Size  Ext  Mod '
     20 23 52 65 63 73 20 20
     45 4F 46 20 20 46 69 6C
     65 20 53 69 7A 65 20 20
     45 78 74 20 20 4D 6F 64
     20 
2CCE 44       02424         DB      'Date   Time',CR
     61 74 65 20 20 20 54 69
     6D 65 0D 
              02425 ;
2CDA 20       02426 FDISP   DB      '    files of'
     20 20 20 66 69 6C 65 73
     20 6F 66 
2CE6 20       02427 FUSED   DB      '     selected, '
     20 20 20 20 73 65 6C 65
     63 74 65 64 2C 20 
2CF5 20       02428 SPUSED  DB      '     .  K',LF,CR
     20 20 20 20 2E 20 20 4B
     0A 0D 
              02429 ;
2D00 44       02430 NODISK  DB      'Drive :'
     72 69 76 65 20 3A 
2D07 6E       02431 NDRIVE  DB      'n  [No  Disk]',LF,CR
     20 20 5B 4E 6F 20 20 44
     69 73 6B 5D 0A 0D 
              02432 ;
2D16 6D       02433 TDATE   DB      'mm/dd/yy"'
     6D 2F 64 64 2F 79 79 22
2D1F 46       02434 PROTS$  DB      'FULLREMVNAMEWRITUPDTREADEXECNO  '
     55 4C 4C 52 45 4D 56 4E
     41 4D 45 57 52 49 54 55
     50 44 54 52 45 41 44 45
     58 45 43 4E 4F 20 20 
2D3F 1F       02435 MAXDAYS DB      31,28,31,30,31,30,31,31,30,31,30,31
     1C 1F 1E 1F 1E 1F 1F 1E
     1F 1E 1F 
2D4B 30       02436 HUNDTAB DB      '00255075'
     30 32 35 35 30 37 35 
2D53 4E       02437 NOMEM$  DB      'No memory for SORT',CR
     6F 20 6D 65 6D 6F 72 79
     20 66 6F 72 20 53 4F 52
     54 0D 
2D66 42       02438 BADFMT$ DB      'Bad date format',CR
     61 64 20 64 61 74 65 20
     66 6F 72 6D 61 74 0D 
              02439         IF      @BLD631D
2D76 2B       02440 P631D1: DEC     HL              ;<631D>
2D77          02441         @@FLAGS                 ;<631D>
2D77+3E65     02442         LD      A,101
2D79+EF       02443         RST     40
2D7A 7E       02444         LD      A,(HL)          ;<631D>
2D7B C9       02445         RET                     ;<631D>
2D7C FDCB0866 02446 P631D2: BIT     4,(IY+8)        ;<631D>
2D80 FDE1     02447         POP     IY              ;<631D>
2D82 C34F29   02448         JP      P631D3          ;<631D>
              02449 ;<631D>If you want the code to exactly match the MISOSYS PATCH DIR1/FIX,
              02450 ;<631D>Uncomment the EQU and comment-out the DB.  WARNING, the EQU references
              02451 ;<631D>a location in SYSRES to avoid making the module grow by the patch size.
04DC          02452 MONTBL  EQU     04DCH           ;<631D>Location of MONTBL$ in SYSRES
2D85 4A       02453         DB      'JunJulAugSepOctNovDec' ;<631D>Use with MONTBL$ EQU
     75 6E 4A 75 6C 41 75 67
     53 65 70 4F 63 74 4E 6F
     76 44 65 63 
              02454 ;<631D>If you build the code, build it right, but it won't match exactly
              02455 ;MONTBL DB      'JanFebMarAprMayJunJulAugSepOctNovDec'  ;<631D>
              02456         ELSE
              02457 MONTBL  DB      'JanFebMarAprMayJunJulAugSepOctNovDec'
              02458         ENDIF
2D9A 00       02459 FTFLG   DB      0
2D9B 00       02460 FILFLAG DB      0
2D9C          02461 DIRPTR  EQU     $
2D9E          02462 MAXMEM  EQU     DIRPTR+2
2DA0          02463 FMPAKD  EQU     MAXMEM+2
2DA2          02464 TOPAKD  EQU     FMPAKD+2
2DA4          02465 LILBUF$ EQU     TOPAKD+2
              02466 ;
              02467 ;
2DA7          02468 BLANKS  EQU     LILBUF$+3
2DB4          02469 PLEVEL  EQU     BLANKS+13
2DBA          02470 LRL     EQU     PLEVEL+6
2DBF          02471 RECORDS EQU     LRL+5
2DC6          02472 OFFSET  EQU     RECORDS+7
2DCB          02473 KSIZE   EQU     OFFSET+5
2DD7          02474 EXTENTS EQU     KSIZE+12
2DDB          02475 DATEFLD EQU     EXTENTS+4
2DEB          02476 ETXBUF  EQU     DATEFLD+16
              02477 ;
2E00          02478 GAT     EQU     ETXBUF+1<-8+1<+8
2E00          02479 HIT     EQU     GAT
2F00          02480 BUF2    EQU     GAT+256
3000          02481 MEMORY  EQU     GAT+512
              02482 ;
              02483         IFGT    MEMORY,3000H
              02484         ERR     'Buffers overflow LIB region'
              02485         ENDIF
              02486 ;
              02489 ;
              02490 ;       DIR Entry Point - Initialization code
              02491 ;
              02492 DIR
2D9C          02493         @@CKBRKC                ;Check for break
2D9C+3E6A     02494         LD      A,106
2D9E+EF       02495         RST     40
2D9F 2804     02496         JR      Z,DIRA          ;If not go
2DA1 21FFFF   02497         LD      HL,-1           ;  else abort
2DA4 C9       02498         RET
              02499 ;
              02500 DIRA
2DA5 ED732C24 02501         LD      (SAVESP+1),SP   ;Save SP address
2DA9 E5       02502         PUSH    HL              ;Save command ptr
              02503 ;
              02504 ;       Pick up Flag Table base Address
              02505 ;
2DAA          02506         @@FLAGS                 ;IY => System Flag table
2DAA+3E65     02507         LD      A,101
2DAC+EF       02508         RST     40
2DAD FDE5     02509         PUSH    IY              ;Xfer to DE too
2DAF D1       02510         POP     DE
2DB0 211800   02511         LD      HL,'Y'-'A'      ;Get date type flag
2DB3 19       02512         ADD     HL,DE
2DB4 22822A   02513         LD      (YFLAG1),HL
2DB7 22F528   02514         LD      (YFLAG2),HL
              02515 ;
              02516 ;       Calculate KFLAG$ address & stuff away
              02517 ;
2DBA 210A00   02518         LD      HL,KFLAG$       ;KFLAG$ offset
2DBD 19       02519         ADD     HL,DE           ;HL => KFLAG$
2DBE 22CE2A   02520         LD      (KFLAG+1),HL    ;Save for later testing
2DC1 22E32A   02521         LD      (RESKFL+1),HL
2DC4 22E82A   02522         LD      (KFLAG1+1),HL
              02523 ;
2DC7 CDE22A   02524         CALL    RESKFL          ;Reset bits 0-2 of KFLAG$
2DCA E1       02525         POP     HL              ;Rvr command ptr
              02526 ;
              02527 ;       Pick up SFLAG
              02528 ;
2DCB FD7E12   02529         LD      A,(IY+'S'-'A')  ;Get SFLAG
2DCE 32B22A   02530         LD      (SFLAG+1),A     ;Save for later testing
              02531 ;
              02532 ;       Find parameter entry if existent
              02533 ;
2DD1 E5       02534         PUSH    HL              ;Save command ptr
2DD2 7E       02535 FPLP    LD      A,(HL)          ;P/u character
2DD3 FE28     02536         CP      '('             ;Parameter(s) ?
2DD5 2807     02537         JR      Z,GETPRM        ;Yes - go get 'em
2DD7 FE0D     02538         CP      CR              ;End of line ?
2DD9 2809     02539         JR      Z,RESTPTR       ;Yes - restore ptr
2DDB 23       02540         INC     HL              ;No - bump til end
2DDC 18F4     02541         JR      FPLP            ;Do til eol or "("
              02542 ;
              02543 ;       Process any parameters entered
              02544 ;
2DDE 11F92B   02545 GETPRM  LD      DE,PRMTBL$      ;DE => Parameter table
2DE1          02546         @@PARAM                 ;@PARAM
2DE1+3E11     02547         LD      A,17
2DE3+EF       02548         RST     40
2DE4 E1       02549 RESTPTR POP     HL              ;Recover ptr
2DE5 C21E24   02550         JP      NZ,IOERR        ;NZ - "Parameter Error"
              02551 ;
2DE8 E5       02552         PUSH    HL
2DE9 21A72D   02553         LD      HL,BLANKS       ;Clear dsp buffer area
2DEC 3620     02554         LD      (HL),' '
2DEE 54       02555         LD      D,H
2DEF 5D       02556         LD      E,L
2DF0 13       02557         INC     DE              ;Set to blank buffer
2DF1 014400   02558         LD      BC,ETXBUF-BLANKS
2DF4 EDB0     02559         LDIR
2DF6 3E03     02560         LD      A,ETX
2DF8 12       02561         LD      (DE),A
2DF9 3E2E     02562         LD      A,'.'
2DFB 32D02D   02563         LD      (KSIZE+5),A
2DFE 3E4B     02564         LD      A,'K'
2E00 32D32D   02565         LD      (KSIZE+8),A
2E03 E1       02566         POP     HL
              02567 ;
              02568 ;       If first character is a "8" or "9" abort
              02569 ;
2E04 7E       02570         LD      A,(HL)          ;Is this a "8" or "9" ?
2E05 FE0D     02571         CP      CR              ;If CR, then global
2E07 2838     02572         JR      Z,DIR2
2E09 FE38     02573         CP      '8'             ;If so - Illegal drive #
2E0B 2804     02574         JR      Z,ILLDRV
2E0D FE39     02575         CP      '9'
2E0F 2003     02576         JR      NZ,CKITOUT      ;Must be a partspec
              02577 ;
              02578 ;       Illegal Drive Number
              02579 ;
2E11 C31C24   02580 ILLDRV  JP      ERR32           ;Go to I/O error handler
              02581 ;
              02582 ;       Pick up Drive # Range field if any
              02583 ;
2E14 E5       02584 CKITOUT PUSH    HL              ;Save source ptr
2E15 CDDD2E   02585         CALL    CKDSPEC         ;Legal Drive range ?
2E18 D1       02586         POP     DE              ;Save source ptr in DE
2E19 283F     02587         JR      Z,DIR3          ;Legal - use HL
              02588 ;
              02589 ;       Point DE => Partspec match field, B=8 chars
              02590 ;
2E1B EB       02591         EX      DE,HL           ;Illegal - use DE
2E1C 7E       02592         LD      A,(HL)          ;P/u first char
2E1D 23       02593         INC     HL              ;  and bump to next
2E1E 11A72D   02594 DIR0    LD      DE,BLANKS       ;DE => Partspec area
2E21 0608     02595         LD      B,8             ;B = 8 chars/filename
              02596 ;
              02597 ;       Was the NOT switch entered ?
              02598 ;
2E23 FE2D     02599         CP      '-'             ;NOT ?
2E25 2005     02600         JR      NZ,DIR1         ;No - continue
              02601 ;
              02602 ;       NOT "-" entered - set flag & bump cmd ptr
              02603 ;
2E27 32C726   02604         LD      (MFLG+1),A      ;Stuff "-" in flag
2E2A 7E       02605         LD      A,(HL)          ;P/u next char & bump
2E2B 23       02606         INC     HL              ;  command ptr
              02607 ;
              02608 ;       Transfer Filename to Filespec buffer
              02609 ;
2E2C CD202F   02610 DIR1    CALL    PRSPC           ;Parse 8 chars
2E2F FE2F     02611         CP      '/'             ;Extension ?
2E31 2804     02612         JR      Z,DIR1A
2E33 FE2E     02613         CP      '.'
2E35 200A     02614         JR      NZ,DIR2
              02615 ;
              02616 ;       Transfer Extension to Filespec buffer
              02617 ;
2E37 11AF2D   02618 DIR1A   LD      DE,BLANKS+8     ;DE => Extension field
2E3A 0603     02619         LD      B,3             ;Max 3 chars
2E3C 7E       02620         LD      A,(HL)          ;P/u next character
2E3D 23       02621         INC     HL              ;Bump
2E3E CD202F   02622         CALL    PRSPC           ;Xfer extension
              02623 ;
              02624 ;       Was a drivespec entered ?
              02625 ;
2E41 FE3A     02626 DIR2    CP      ':'             ;Drive entered?
2E43 010700   02627         LD      BC,7            ;St = 0, terminating = 7
2E46 2809     02628         JR      Z,DIR2A         ;Yes, check it out
2E48 FE29     02629         CP      '('+1           ;Was last char valid?
2E4A 380E     02630         JR      C,DIR3          ;Yes, global dir
2E4C 3E13     02631         LD      A,19            ;"Illegal filename
2E4E C31E24   02632         JP      IOERR
              02633 ;
              02634 ;       Check if char following is a legal drive #
              02635 ;
2E51 CDDD2E   02636 DIR2A   CALL    CKDSPEC         ;Legal Drive field ?
2E54 20BB     02637         JR      NZ,ILLDRV       ;Illegal - abort
2E56 FE08     02638         CP      8               ;Trap DIR :8
2E58 28B7     02639         JR      Z,ILLDRV
              02640 ;
              02641 ;       B = Start drv #, C = Term drv # - save 'em
              02642 ;
2E5A 78       02643 DIR3    LD      A,B             ;Save starting drive
2E5B 32D42E   02644         LD      (DIR3A+1),A
2E5E 91       02645         SUB     C               ;Set Specific Drive flag
2E5F 323A26   02646         LD      (SPECIF+1),A
2E62 79       02647         LD      A,C             ;Save term drive
2E63 322F26   02648         LD      (TERMDRV+1),A
              02649 ;
              02650 ;       Command line parsed - check available mem
              02651 ;
2E66 FDCB024E 02652         BIT     1,(IY+CFLAG$)   ;Called from @CMNDR?
2E6A 210000   02653         LD      HL,0            ;Set SORT (O) parm = 0
2E6D 2803     02654         JR      Z,GETHI         ;No - fine
              02655 ;
              02656 ;       Executing from @CMNDR - Turn off SORT
              02657 ;
2E6F 22FC26   02658         LD      (SORTPRM+1),HL
              02659 ;
              02660 ;       Pick up Current HIGH$, & set max mem to use
              02661 ;
2E72 45       02662 GETHI   LD      B,L             ;B=0
2E73          02663         @@HIGH$
2E73+3E64     02664         LD      A,100
2E75+EF       02665         RST     40
2E76 11DFFF   02666         LD      DE,-33          ;Subtract 33 from it
2E79 19       02667         ADD     HL,DE
2E7A 229E2D   02668         LD      (MAXMEM),HL     ;Stuff in maximum memory
              02669 ;
              02670 ;       Turn on N parm if P parm specified
              02671 ;
2E7D 2A2A2A   02672         LD      HL,(PPARM+1)    ;P/u P-parm
2E80 7C       02673         LD      A,H             ;Specified ?
2E81 B5       02674         OR      L
2E82 2803     02675         JR      Z,GTDATE        ;No - don't change N
2E84 22AC2A   02676         LD      (NPARM+1),HL    ;Turn on N-parm
              02677 ;
              02678 ;       Was the DATE parameter specified ?
              02679 ;
2E87 3A1C2C   02680 GTDATE  LD      A,(DRESP)       ;Check out response
2E8A B7       02681         OR      A               ;Any response ?
2E8B 2846     02682         JR      Z,DIR3A         ;None entered - no date
              02683 ;
              02684 ;       Something was specified - Check type
              02685 ;
2E8D 210000   02686 DATPRM  LD      HL,$-$          ;P/u date
2E90 CB77     02687         BIT     6,A             ;Flag input ?
2E92 280C     02688         JR      Z,CHKSTR        ;No - must be string
              02689 ;
              02690 ;       Flag input - if YES, then use today's date
              02691 ;
2E94 7C       02692         LD      A,H             ;DATE = OFF ?
2E95 B5       02693         OR      L
2E96 283B     02694         JR      Z,DIR3A         ;Yes - ignore it
              02695 ;
              02696 ;       DATE parameter entered - get today's date
              02697 ;
2E98 21162D   02698         LD      HL,TDATE        ;HL => Todays Date
2E9B E5       02699         PUSH    HL              ;Save position
2E9C          02700         @@DATE                  ;Get today's date
2E9C+3E12     02701         LD      A,18
2E9E+EF       02702         RST     40
2E9F E1       02703         POP     HL              ;HL => Today's Date
              02704 ;
              02705 ;       Display dates before "-mm/dd/yy" ?
              02706 ;
2EA0 7E       02707 CHKSTR  LD      A,(HL)          ;P/u first char
2EA1 FE2D     02708         CP      '-'             ;"to-" ?
2EA3 2815     02709         JR      Z,CKTO          ;Yes - do it
              02710 ;
              02711 ;       Not before - set flag accordingly
              02712 ;
2EA5 3E80     02713         LD      A,80H           ;Set from bit
2EA7 329A2D   02714         LD      (FTFLG),A       ;Note from entered
              02715 ;
              02716 ;       Pack Date entry
              02717 ;
2EAA CD4C2F   02718         CALL    PAKDAT          ;Pack the date entry
2EAD ED43A02D 02719         LD      (FMPAKD),BC     ;Stuff away date
              02720 ;
              02721 ;       End of first date ?
              02722 ;
2EB1 7E       02723         LD      A,(HL)          ;P/u terminator
2EB2 FE22     02724         CP      '"'             ;End of date ?
2EB4 2811     02725         JR      Z,FRCTO         ;Yes - use spec'd date
              02726 ;
              02727 ;       Is there a to "-" symbol following date ?
              02728 ;
2EB6 FE2D     02729         CP      '-'             ;Check for "-to"
2EB8 2019     02730         JR      NZ,DIR3A        ;No - check if legal
              02731 ;
              02732 ;       Is there a date following ?
              02733 ;
2EBA 23       02734 CKTO    INC     HL              ;Bypass the '-'
2EBB 7E       02735         LD      A,(HL)          ;P/u next char
2EBC FE22     02736         CP      '"'             ;End of parm ?
2EBE 2813     02737         JR      Z,DIR3A         ;Yes - use that date
              02738 ;
2EC0 FE0D     02739         CP      CR              ;End of parm ?
2EC2 280F     02740         JR      Z,DIR3A         ;Yes - use that date
              02741 ;
              02742 ;       Something following - parse date
              02743 ;
2EC4 CD4C2F   02744         CALL    PAKDAT          ;Pack Date
              02745 ;
              02746 ;       Stuff in "TO" packed date & set TO flag
              02747 ;
2EC7 3A9A2D   02748 FRCTO   LD      A,(FTFLG)       ;P/u From-To Flag
2ECA F601     02749         OR      1               ;Set TO bit
2ECC 329A2D   02750         LD      (FTFLG),A       ;Stuff in flag
2ECF ED43A22D 02751         LD      (TOPAKD),BC     ;Stuff for later
              02752 ;
              02753 ;       P/u starting drive #, & init page counter
              02754 ;
2ED3 0E00     02755 DIR3A   LD      C,$-$           ;P/u starting drive
2ED5 3E16     02756         LD      A,22            ;Max lines to dsply
2ED7 32A02A   02757         LD      (CKPAGE+1),A    ;Stuff in counter
2EDA C33224   02758         JP      DIR4            ;Directory Start
              02759 ;
              02760 ;       CKDSPEC - Check if a drive spec field is legal
              02761 ;       HL => Drive specification Field
              02762 ;       Z - Set if Drive spec Field is Legal
              02763 ;       B <= Starting Drive # (0-7)
              02764 ;       C <= Terminating Drive # (0-7)
              02765 ;
2EDD 7E       02766 CKDSPEC LD      A,(HL)          ;P/u first character
2EDE FE2D     02767         CP      '-'             ;"TO" or "NOT" ?
2EE0 200C     02768         JR      NZ,NOTDASH      ;No - check if drive #
              02769 ;
              02770 ;       Char is a "-" ---- Could be "TO" or "NOT"
              02771 ;
2EE2 CD182F   02772         CALL    LEGDRV          ;Legal Drive Number ?
2EE5 D8       02773         RET     C               ;No - RETurn NZ
              02774 ;
              02775 ;       Legal Drive # - Next char must be a term
              02776 ;
2EE6 4F       02777         LD      C,A             ;C = Terminating Drive
2EE7 23       02778         INC     HL              ;HL => Following char
2EE8 CD012F   02779         CALL    TERM            ;Does a term follow ?
2EEB 0600     02780         LD      B,0             ;B  default start 0
2EED C9       02781         RET                     ;RETurn Z or NZ
              02782 ;
              02783 ;       Is the First character a legal drive # ?
              02784 ;
2EEE CD192F   02785 NOTDASH CALL    LEGDRV1         ;Legal drive (0-7) ?
2EF1 D8       02786         RET     C               ;No - RETurn NZ (ex 8)
2EF2 47       02787         LD      B,A             ;Set B = Starting Drive
2EF3 4F       02788         LD      C,A             ;Set C = Terminator
              02789 ;
              02790 ;       Legal Drive - a "-" or term MUST follow
              02791 ;
2EF4 23       02792         INC     HL              ;Bump to next char
2EF5 7E       02793         LD      A,(HL)          ;If next char is not a
2EF6 FE2D     02794         CP      '-'             ;  "-", RETurn Z or NZ
2EF8 2811     02795         JR      Z,CKTDRIV       ;  depending on next char.
2EFA CD012F   02796         CALL    TERM            ;Legal terminator ?
2EFD C2112E   02797         JP      NZ,ILLDRV       ;No - Illegal Drive #
2F00 C9       02798         RET                     ;Yes - Return
              02799 ;
              02800 ;       Is the character a terminator ?
              02801 ;
2F01 7E       02802 TERM    LD      A,(HL)          ;P/u char
2F02 FE20     02803         CP      ' '             ;Space is legal
2F04 C8       02804         RET     Z               ;RETurn Z if space
2F05 FE0D     02805         CP      CR              ;CR is legal
2F07 C8       02806         RET     Z               ;RETurn Z if CR
2F08 FE28     02807         CP      '('             ;Paren is legal
2F0A C9       02808         RET                     ;RETurn w/ condition
              02809 ;
              02810 ;       Next char must be a valid drive # or term
              02811 ;
2F0B CD182F   02812 CKTDRIV CALL    LEGDRV          ;Legal Drive # ?
2F0E 0E07     02813         LD      C,7             ;C = Default term drive 7
2F10 38EF     02814         JR      C,TERM          ;Not drv # - ck for term
              02815 ;
              02816 ;       Make sure Term Drive # > or = Start Drive #
              02817 ;
2F12 4F       02818         LD      C,A             ;Set C = Term drive #
2F13 B8       02819         CP      B               ;> or = start drive # ?
2F14 D8       02820         RET     C               ;Less - Return
              02821 ;
              02822 ;       Drive span range good - make sure term legal
              02823 ;
2F15 23       02824         INC     HL              ;Bump ptr
2F16 18E9     02825         JR      TERM            ;RETurn Z or NZ
              02826 ;
              02827 ;       LEGDRV - Is a character a legal drive #
              02828 ;       HL => One before Character to check
              02829 ;       HL <= Character in question
              02830 ;       A  <= Drive Number (0-7)
              02831 ;       CF <= Set if Character is not a legal drive #
              02832 ;
2F18 23       02833 LEGDRV  INC     HL              ;Bump to next
2F19 7E       02834 LEGDRV1 LD      A,(HL)          ;P/u char
2F1A D630     02835         SUB     '0'             ;Convert to binary
2F1C FE08     02836         CP      7+1             ;Greater than "7" ?
2F1E 3F       02837         CCF                     ;C - Illegal
2F1F C9       02838         RET                     ;RETurn with condition
              02839 ;
              02840 ;       PRSPC - Parse a line and stuff in buffer
              02841 ;       HL => Source Buffer
              02842 ;       DE => Destination of converted field
              02843 ;       B = # of characters to parse
              02844 ;
2F20 FE2A     02845 PRSPC:  CP      '*'             ;Global wc?
2F22 2009     02846         JR      NZ,PS4          ;Go if not
2F24 3E24     02847         LD      A,'$'           ;Make all remaining into $
2F26 12       02848 PS5     LD      (DE),A
2F27 13       02849         INC     DE
2F28 10FC     02850         DJNZ    PS5
2F2A 7E       02851         LD      A,(HL)          ;Get next char
2F2B 23       02852         INC     HL              ;Posn for next char
2F2C C9       02853         RET
              02854 ;
2F2D FE24     02855 PS4     CP      '$'             ;Wild character?
2F2F 2814     02856         JR      Z,PS2           ;Yes - stuff in buff
2F31 FE41     02857         CP      'A'             ;Alphabetic ?
2F33 3006     02858         JR      NC,PS1          ;Maybe - convert to U/C
              02859 ;
              02860 ;       Is the character a numeric value (0-9) ?
              02861 ;
2F35 FE3A     02862         CP      '9'+1           ;Greater than "9" ?
2F37 D0       02863         RET     NC              ;Yes - return
2F38 FE30     02864         CP      '0'             ;Less than "0" ?
2F3A D8       02865         RET     C               ;Yes - return
              02866 ;
              02867 ;       Convert character to Upper Case
              02868 ;
2F3B FE61     02869 PS1     CP      'a'             ;Lower case alpha ?
2F3D 3806     02870         JR      C,PS2           ;No - stuff in buffer
2F3F FE7B     02871         CP      'z'+1
2F41 3002     02872         JR      NC,PS2
2F43 CBAF     02873         RES     5,A             ;Convert to U/C
              02874 ;
              02875 ;       Put char in buffer, & bump cmd & buffer ptrs
              02876 ;
2F45 12       02877 PS2     LD      (DE),A          ;Stuff in buffer
2F46 13       02878 PS3     INC     DE              ;Bump
2F47 7E       02879         LD      A,(HL)          ;P/u command buff char
2F48 23       02880         INC     HL              ;Bump
2F49 10D5     02881         DJNZ    PRSPC           ;  B times
2F4B C9       02882         RET
              02883 ;
              02884 ;       PAKDAT - Pack Date & Stuff into buffer
              02885 ;       HL => Buffer containing Date string
              02886 ;       BC <= Packed Date in lsb,msb format
              02887 ;
2F4C 7E       02888 PAKDAT  LD      A,(HL)          ;P/u character
2F4D 0E2F     02889         LD      C,'/'           ;Init separator
              02890 ;
              02891 ;       Is the date a valid entry ?
              02892 ;
2F4F CD9D2F   02893         CALL    PARSDAT         ;Parse entry
2F52 C21124   02894         JP      NZ,BADFMT       ;Abort on format error
              02895 ;
              02896 ;       If year = 1980 or 84 then set FEB = 29 days
              02897 ;
              02898         IF      @BLD631
2F55 1A       02899         LD      A,(DE)          ;<631>
2F56 FE0C     02900         CP      0CH             ;<631>
2F58 3003     02901         JR      NC,L2F5D        ;<631>
2F5A C664     02902         ADD     A,64H           ;<631>
2F5C 12       02903         LD      (DE),A          ;<631>
              02904 L2F5D:                          ;<631>
              02905         ENDIF
2F5D EB       02906         EX      DE,HL           ;Save command ptr
              02907         IF      @BLD631
              02908         ELSE
              02909         LD      A,(LILBUF$)     ;P/u year (80-87)
              02910         ENDIF
2F5E E603     02911         AND     3               ;Mask off bits 7-2
2F60 21402D   02912         LD      HL,MAXDAYS+1    ;Set Feb to have 29 days
2F63 2001     02913         JR      NZ,NOTLEAP      ;No - don't inc it
2F65 34       02914         INC     (HL)            ;Leap year - inc max days
              02915 ;
              02916 ;       Check Range of month - must be 1-12
              02917 ;
2F66 3AA62D   02918 NOTLEAP LD      A,(LILBUF$+2)   ;P/u month
2F69 3D       02919         DEC     A               ;Set month = 1-11
2F6A FE0C     02920         CP      12              ;Valid month ?
2F6C D21124   02921         JP      NC,BADFMT       ;Abort if 0 or >12
              02922 ;
              02923 ;       Valid month - point HL to max days/month
              02924 ;
2F6F 2B       02925         DEC     HL              ;Point before JAN entry
2F70 85       02926         ADD     A,L             ;Add the month
2F71 6F       02927         LD      L,A             ;HL => max days for month
2F72 3001     02928         JR      NC,NOINC        ;Bump H if C set
2F74 24       02929         INC     H
              02930 ;
              02931 ;       Check if day entry is valid
              02932 ;
2F75 3AA52D   02933 NOINC   LD      A,(LILBUF$+1)   ;P/u day entry
2F78 3D       02934         DEC     A               ;Reduce for test (0->FF)
2F79 BE       02935         CP      (HL)            ;More than max days ?
2F7A D21124   02936         JP      NC,BADFMT       ;Go if too large (or 0)
              02937 ;
              02938 ;       Pick up month from buffer
              02939 ;
2F7D 21A62D   02940         LD      HL,LILBUF$+2    ;Pt to month
2F80 46       02941         LD      B,(HL)
2F81 0E00     02942         LD      C,0
2F83 CB38     02943         SRL     B               ;LSbit of mon to C
2F85 CB19     02944         RR      C
2F87 2B       02945         DEC     HL              ;Pt to day
2F88 7E       02946         LD      A,(HL)
2F89 2B       02947         DEC     HL
2F8A 07       02948         RLCA                    ;Shift day left to
2F8B 07       02949         RLCA                    ; bits 2-6
2F8C B1       02950         OR      C               ;Merge w/month
2F8D 4F       02951         LD      C,A
2F8E 7E       02952         LD      A,(HL)          ;Get year
2F8F D650     02953         SUB     80              ;Use only offset
              02954         IF      @BLD631
2F91 FE70     02955         CP      70H             ;<631>
2F93 3801     02956         JR      C,GDATE         ;<631>Go if date ok
              02957         ELSE
              02958         JR      NC,GDATE        ;Go if date ok
              02959         ENDIF
2F95 AF       02960         XOR     A               ; else use 0
2F96 07       02961 GDATE   RLCA                    ;Posn for merge with month
2F97 07       02962         RLCA
2F98 07       02963         RLCA
2F99 B0       02964         OR      B
2F9A 47       02965         LD      B,A
2F9B EB       02966         EX      DE,HL
2F9C C9       02967         RET
              02968 ;
              02969 ;       PARSDAT - Parse TIME/DATE string entry
              02970 ;       HL => Buffer containing string to parse
              02971 ;       C  => Delimiter ("/" = DATE, ":" = TIME)
              02972 ;       LILBUF$-LILBUF$+2 <= Data in compressed format
              02973 ;       Z  - Set if successful
              02974 ;
2F9D 11A62D   02975 PARSDAT LD      DE,LILBUF$+2    ;Point to buf end
2FA0 0603     02976         LD      B,3             ;Process 3 fields
              02977 ;
              02978 ;       Parse a field - Return NZ if bad
              02979 ;
2FA2 D5       02980 PRS1    PUSH    DE              ;Save pointer
2FA3 CDB22F   02981         CALL    PRS2            ;Get a digit pair
2FA6 D1       02982         POP     DE              ;Recover pointer
2FA7 C0       02983         RET     NZ              ;Ret if bad digit pair
              02984 ;
              02985 ;       Good field - Stuff in buff, dec ptr, & count
              02986 ;
2FA8 12       02987         LD      (DE),A          ;  else stuff the value
              02988         IF      @BLD631
2FA9 05       02989         DEC     B               ;<631>Loop countdown
2FAA C8       02990         RET     Z               ;<631>Do for 3 fields
2FAB 1B       02991         DEC     DE              ;<631>Backup the pointer
              02992         ELSE
              02993         DEC     DE              ;Backup the pointer
              02994         DEC     B               ;Loop countdown
              02995         RET     Z               ;Do for 3 fields
              02996         ENDIF
              02997 ;
              02998 ;       Parsed a field - is the separator valid ?
              02999 ;
2FAC 7E       03000         LD      A,(HL)          ;P/u separator
2FAD 23       03001         INC     HL              ;Bump pointer
2FAE B9       03002         CP      C               ;Correct ?
2FAF 28F1     03003         JR      Z,PRS1          ;Yes - continue
2FB1 C9       03004         RET                     ;No - RET NZ
              03005 ;
              03006 ;       PRS2 - Parse a digit pair at HL
              03007 ;
2FB2 CDC82F   03008 PRS2    CALL    PRS4            ;Get a digit
2FB5 300F     03009         JR      NC,PRS3         ;Illegal - clr stc & RET
              03010 ;
              03011 ;       Legal Digit - Multiply by 10
              03012 ;
2FB7 5F       03013         LD      E,A             ;Multiply by ten
2FB8 07       03014         RLCA                    ;X 2
2FB9 07       03015         RLCA                    ;X 4
2FBA 83       03016         ADD     A,E             ;X 5
2FBB 07       03017         RLCA                    ;X 10
2FBC 5F       03018         LD      E,A             ;Stuff in E
              03019 ;
              03020 ;       Get another digit
              03021 ;
2FBD CDC82F   03022         CALL    PRS4            ;Get ones digit
2FC0 3004     03023         JR      NC,PRS3         ;Bad - return NZ
              03024 ;
              03025 ;       Legal digit - Add to tens digit & set Z flag
              03026 ;
2FC2 83       03027         ADD     A,E             ;Accumulate new digit
2FC3 5F       03028         LD      E,A             ;Save 2-digit value
2FC4 BF       03029         CP      A               ;Clear flags
2FC5 C9       03030         RET                     ;Return Z
              03031 ;
              03032 ;       Force NZ & Return
              03033 ;
2FC6 B7       03034 PRS3    OR      A               ;Set NZ
2FC7 C9       03035         RET                     ;RETurn
              03036 ;
              03037 ;       Pick up a digit and convert to binary
              03038 ;
2FC8 7E       03039 PRS4    LD      A,(HL)          ;P/u a digit &
2FC9 23       03040         INC     HL              ;  bump ptr
2FCA D630     03041         SUB     '0'             ;Convert to binary
2FCC FE0A     03042         CP      10              ;Legal ?
2FCE C9       03043         RET                     ;C - legal, NC - illegal
              03044 ;
2FCF          03045 ENDMEM  EQU     $
              03046 ;
              03047 ;       Bytes Free =
              03048 ;
0031          03049 FREE$   EQU     3000H-ENDMEM
              03050 ;
              03051         IFGT    $,2FFFH
              03052         ERR     'LIB memory region overflow
              03053         ENDIF
              03054 ;
2400          03056         END     ENTRY
2400 is the transfer address
00000 Total errors


[Copyright 1999,2002 Frank Durda IV, All Rights Reserved.
Mirroring of any material on this page in any form is expressly prohibited.
The official web site for this material is:  http://nemesis.lonestar.org
Contact this address for use clearances: clearance at nemesis.lonestar.org
Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]

Valid HTML 4.01!