home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG008.ARK / XSTAT2.ASM < prev   
Assembly Source File  |  1984-04-29  |  6KB  |  380 lines

  1. ;************************************************************
  2. ;ORIGINAL BY RICH ROTH
  3. ;TERRAN SIECH ASSOCIATES
  4. ;(203) 438-3954
  5. ;5 NORTH SALEM RD.
  6. ;RIDGEFIELD
  7. ;CT.    06877
  8. ;
  9. ;NOTE: A.R.G. ADDED A COUPLE OF SUB-ROUTINES WHICH WERE
  10. ;EXTERNALS RESOLVED BY RICH'S LOADER.
  11. ;
  12. ;REMEMBER GOOD BITS BY ROTH.
  13. ;
  14. ;************************************************************
  15. ;
  16. ;    EXTENDED STATUS PROGRAM WITH DIRECTORY
  17. ;
  18. ; LINK:  XSTAT /I  SYSLIB(BINDB,BINH2)
  19. ;
  20. ; SCHEME: 1) EXPAND ALLOCATION VECTOR TO 1 BYTE PER BIT, IN 'ALCBF'
  21. ; EACH REPRESENTING A 1K CLUSTER OF 8 CONTINGIOUS SECTORS. 
  22. ; EACH WITH MSB SET INDICATES AN ALLOCATED, BUT UNCLAIMED
  23. ; SECTOR. 
  24. ; FOR EACH DIRECTORY ENTRY DO
  25. ;     FOR EACH CLUSTER DO
  26. ;    IF THAT CLUSTER IS ALLOCATED & FREE (=80H)
  27. ;        THEN CLAIM BY FILLING IN DIRECTORY ENTRY NUMBER ;
  28. ;
  29. ;    ELSE    IF CLUSTER ISN'T ALLOCATED (=0)
  30. ;        THEN ERROR('NOT ALLOCATED')
  31. ;
  32. ;    ELSE    IF CLUSTER IS CLAIMED(=1..64)
  33. ;        THEN ERROR('LINKED CLUSTER')
  34. ;
  35. ; ON ERRORS: USE 'PRTFIL' TO CONVERT FILE NUMBER(1..64)
  36. ;    TO NAME FROM DIRECTORY BUFFER
  37. ;
  38. ;
  39. ;NO EXTERNALS ALLOWED - A.R.G.
  40. ;    EXT    BINDB,BINH2    ; DECIMAL, HEX PRINT
  41. ;
  42. BDOS    EQU    5 
  43. FCBRC    EQU    15    ; FCB RECORD COUNT
  44. CR    EQU    13
  45. LF    EQU    10
  46. DLR    EQU    '$'
  47. ;
  48. ;NOT RELOCATABLE, SO FIX LOAD
  49.     ORG    100H
  50. START:    LXI    H,0
  51.     DAD    SP
  52.     SHLD    SAVSP
  53. ;
  54.     LXI    SP,STACK
  55. ;
  56. ;
  57.     MVI    C,27
  58.     CALL    BDOS    ; GET DISK ALLOCATION VECTOR
  59.     LXI    H,ALCBF
  60.     MVI    E,32
  61. ;
  62. ALP1:    MVI    D,8
  63.     LDAX    B
  64. ;
  65. ALP2:    PUSH    PSW    ; DECOODE EACH BIT
  66.     ANI    80H
  67.     MOV    M,A
  68.     INX    H
  69.     POP    PSW
  70.     RLC
  71.     DCR    D
  72.     JNZ    ALP2
  73. ;
  74.     INX    B
  75.     DCR    E
  76.     JNZ    ALP1
  77. ;
  78. ;    COUNT SPACE LEFT
  79. ; SKIP 1ST 2 CLUSTERS (THEY ARE THE DIRECTORY PROPER)
  80. ;
  81.     LXI    H,ALCBF+2
  82.     LXI    B,240
  83. ALP3:    MOV    A,M
  84.     ORA    A
  85.     JNZ    ALP4
  86.     INR    B
  87. ALP4:    INX    H
  88.     DCR    C
  89.     JNZ    ALP3
  90.     MOV    C,B
  91.     MVI    B,0
  92.     LXI    H,SPCNT
  93.     CALL    BINDB
  94.     LXI    D,SPCNT
  95.     CALL    PRTLIN
  96. ;
  97. ;
  98. ;    READ IN THE DIRECTORY
  99. ;
  100.     LXI    D,DIRBF
  101.     PUSH    D
  102.     MVI    C,26
  103.     CALL    BDOS    ; SET DMA FOR DIR
  104.     LXI    D,QUEFIL
  105.     MVI    C,17
  106.     CALL    BDOS    ; FIRST FILE
  107.     CPI    255
  108.     JZ    FDNE    ; NO FILES
  109. ;
  110. RDDIR:    LXI    D,QUEFIL
  111.     MVI    C,18
  112.     CALL    BDOS    ; NEXT FILE
  113.     CPI    255
  114.     JZ    RDDNE
  115.     ANI    3
  116.     CPI    3    ; FILE # MOD 3 =3
  117.     JNZ    RDDIR
  118.     POP    D    ; THEN INRECMENT DIR BUFF
  119.     LXI    H,80H
  120.     DAD    D
  121.     XCHG
  122.     PUSH    D
  123.     MVI    C,26
  124.     CALL    BDOS    ; NEXT DIR BLOCK
  125.     JMP    RDDIR
  126. ;
  127. FDNE:    LXI    D,NOFIL
  128.     MVI    C,9
  129.     CALL    BDOS
  130. GRTN:    LHLD    SAVSP
  131.     SPHL
  132.     RET
  133. ;
  134. NOFIL:    DB    ' NO FILES ON DISK',CR,LF,DLR
  135. ;
  136. ;
  137. RDDNE:    POP    D
  138. ;
  139. ;    LOG AND REPORT ON EACH FILE
  140. ;
  141.     LXI    H,DIRBF
  142.     XRA    A
  143.     STA    FILCNT
  144.     STA    FDCNT
  145. ;
  146. NXFIL:    SHLD    CRDIR        ;  NEXT FILE  , SAVE CURR. DIR ENTRY
  147.     LDA    FDCNT
  148.     INR    A
  149.     STA    FDCNT
  150.     MOV    A,M
  151.     CPI    0E5H    
  152.     JZ    NXBK2        ; DONE
  153.     LDA    FILCNT
  154.     INR    A
  155.     STA    FILCNT
  156.     MOV    A,M
  157. ;
  158.     LXI    D,FCBRC
  159.     DAD    D
  160.     MOV    A,M    ; CLUS. CNT:=INT((RECORD-1)/8)+1
  161.     ORA    A
  162.     JNZ    NXBK1    ; CHECK FOR NULL FILES
  163.     DCX    H
  164.     DCX    H
  165.     DCX    H
  166.     MOV    A,M
  167.     ORA    A    ; IF FIRST EXTENT
  168.     JNZ    NXB1A    ; THEN PRINT 'NULL FILE'
  169.     LDA    FDCNT
  170.     CALL    PRTFIL
  171.     LXI    D,NULFIL
  172.     CALL    PRTLIN
  173. NXB1A:    JMP    NXBK2
  174. NXBK1:    DCR    A
  175.     ANI    0F8H
  176.     RRC
  177.     RRC
  178.     RRC
  179.     INR    A
  180.     MOV    C,A
  181. ;
  182. NXBLK:    INX    H    ; NEXT CLUSTER IN FILE
  183.     PUSH    H
  184.     MOV    E,M
  185.     MOV    B,E
  186.     MVI    D,0
  187.     LXI    H,ALCBF
  188.     DAD    D        ; CHECK ALLOCATION
  189.     MOV    A,M
  190.     PUSH    H
  191. ;
  192.     ORA    A
  193.     JNZ    NXBKA
  194.     LXI    D,NOTALC
  195.     CALL    PRTBLK
  196.     JMP    NXBKB
  197. ;
  198. NXBKA:    ANI    7FH
  199.     JZ    NXBKC
  200.     LXI    D,BLKLNK    ; LINKED CLUSTER
  201.     CALL    PRTBLK
  202.     POP    H
  203.     MOV    A,M
  204.     PUSH    H
  205.     CALL    PRTFIL        ; ORIG FILE
  206. ;
  207. NXBKB:    LDA    FDCNT
  208.     CALL    PRTFIL
  209.     CALL    NEWLIN
  210. ;
  211. NXBKC:
  212.     LDA    FDCNT
  213.     POP    H
  214.     MOV    M,A        ; ASSIGN CLUSTER TO FILE
  215. ;
  216.     POP    H
  217.     DCR    C
  218.     JNZ    NXBLK
  219. ;            NEXT FILE
  220. NXBK2:    LHLD    CRDIR
  221.     LXI    D,32
  222.     DAD    D
  223.     LDA    FDCNT
  224.     CPI    64
  225.     JM    NXFIL
  226. ;
  227.     LDA    FILCNT
  228.     MOV    C,A
  229.     MVI    B,0
  230.     LXI    H,FILECNT
  231.     CALL    BINDB
  232.     LXI    D,FILECNT
  233.     CALL    PRTLIN
  234.     JMP    GRTN
  235. ;
  236. PRTBLK:    PUSH     PSW
  237.     PUSH    B
  238.     PUSH    D
  239.     XCHG
  240.     MOV    A,B
  241.     CALL    BINH2
  242.     POP    D
  243.     MVI    C,9
  244.     CALL    BDOS
  245.     POP    B
  246.     POP    PSW
  247.     RET
  248. ;
  249. ;    A=DIR ENTRY OF FILE (TO GET NAME)
  250. PRTFIL:    PUSH    B    ; PRINT FILE NAME
  251.     PUSH    D
  252.     PUSH    PSW
  253.     DCR    A
  254.     MOV    L,A
  255.     MVI    H,0
  256.     DAD    H
  257.     DAD    H
  258.     DAD    H
  259.     DAD    H
  260.     DAD    H
  261.     LXI    D,DIRBF
  262.     DAD    D
  263.     INX    H
  264.     MVI    C,11
  265. PRTF1:    PUSH    H
  266.     PUSH    B
  267.     MOV    E,M
  268.     MVI    C,2
  269.     CALL    BDOS
  270.     POP    B
  271.     POP    H
  272.     INX    H
  273.     DCR    C
  274.     JNZ    PRTF1
  275.     LXI    D,SPCS
  276.     MVI    C,9
  277.     CALL    BDOS    ; SKIP SOME SPACES
  278.     POP    PSW
  279.     POP    D
  280.     POP    B
  281.     RET
  282. ;
  283. NEWLIN:
  284.     LXI    D,CRLF
  285. PRTLIN:    PUSH    B
  286.     MVI    C,9
  287.     CALL    BDOS
  288.     POP    B
  289.     RET
  290. ;
  291. ;
  292. ;
  293. SPCNT:    DB    '   K  BYTES LEFT',CR,LF,CR,LF,DLR
  294. NOTALC:    DB    '00H   NOT ALLOCATED ',DLR
  295. BLKLNK:    DB    '00H   LINKED CLUSTER  ',DLR
  296. SPCS:    DB    '     ',DLR
  297. NULFIL:    DB    '   NULL FILE',CR,LF,DLR
  298. FILECNT:DB    '      DIRECTORY ENTRIES '
  299. CRLF:    DB    CR,LF,DLR
  300.  
  301. CRDIR:    DS    2
  302. FDCNT:    DB    0
  303. FILCNT:    DB    0
  304. QUEFIL:    DB    '?????????????'
  305. SAVSP:    DS    2
  306. ;
  307. ;
  308.     RAM
  309. ;
  310. ALCBF:    DS    256    ; CLUSTER ALLOCATION VECTOR
  311. DIRBF:    DS    2048    ; DIRECTORY SPACE 64 RECORDS OF 32 BYTES EA.
  312. ;
  313.     DS    256
  314. STACK    EQU    $
  315. ;
  316. ;************************************************************
  317. ;FOLLOWING ARE AMATEUR SUBROUTINES TO
  318. ;PERFORM THE MISSING FUNCTIONS. N.B. ORIGINAL
  319. ;AUTHOR HAS NO RESPONIBILITY FOR THESE
  320. ;
  321. ;************************************************************
  322. ;LOOKS LIKE NEED A BINARY TO DECIMAL ROUTINE
  323. ;TO PUT ASCII DECIMALS INTO M[HL], +1, AND +2
  324. ;FROM THE VALUE PASSED IN C
  325. ;
  326. BINDB:    MOV    A,C    ;PASSED IN C
  327.     MVI    M,30H    ;FIX HUNDREDS TO ZERO
  328.     JMP    H2
  329. ;
  330. H1:    INR    M    ;ADD 1 TO HUNDREDS
  331. H2:    SUI    100
  332.     JNC    H1    ;NO UNDERFLOW
  333.     ADI    100    ;IF UNDERFLOW ADD LAST BACK
  334.     INX    H    ;GO TO TENS
  335.     MVI    M,30H    ;SET TO ZERO
  336.     JMP    T2
  337. ;
  338. T1:    INR    M
  339. T2:    SUI    10
  340.     JNC    T1
  341.     ADI    10
  342.     INX    H    ;GO TO UNITS
  343.     MVI    M,30H
  344.     JMP    U2
  345. ;
  346. U1:    INR    M
  347. U2:    SUI    1
  348.     JNC    U1
  349.     ADI    1
  350.     RET
  351. ;
  352. ;************************************************************
  353. ;LOOKS LIKE WE NEED A BINARY TO HEX ROUTINE TO
  354. ;PUT HEX CHARACTERS INTO M[HL] AND +1 EQUIVALENT
  355. ;TO VALUE PASSED IN A
  356. ;
  357. ;
  358. BINH2:    PUSH    PSW    ;SAVE BYTE
  359.     RRC
  360.     RRC
  361.     RRC
  362.     RRC        ;GET MOST SIGNIFICANT NIBBLE
  363.     ANI    0FH
  364.     CALL    PUTHEX
  365. ;
  366.     INX    H
  367.     POP    PSW
  368.     ANI    0FH
  369.     CALL    PUTHEX
  370.     RET
  371. ;
  372. PUTHEX:    ADI    30H    ;0-9
  373.     CPI    3AH
  374.     JC    PUT2
  375.     ADI    7    ;A-F
  376. PUT2:    MOV    M,A
  377.     RET
  378. ;
  379. ;    END    START
  380.