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 / CPMUG006.ARK / SIZE.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  5KB  |  209 lines

  1. ;
  2. ;
  3. ; PRINT SIZE OF A DISK FILE ARGUMENT IN K BYTES.
  4. ;
  5. ; ROBERT A. VAN VALZAH
  6. ;
  7. ; 7/16/77
  8. ;
  9. *
  10. *
  11. ***************************************************************
  12. *
  13. *    CP/M ASSEMBLER LIBRARY PROCEDURES
  14. *
  15. *    INITIALIZATION OF TRANSIENT PROGRAM
  16. *
  17. *    FILE NAME:    THEAD.LIB
  18. *
  19. *    7/16/77
  20. *
  21. *
  22. *    THIS LIBRARY CAN BE USED TO SET UP A STANDARD
  23. *  CP/M PROGRAM.  TO USE, TYPE THE PROGRAM HEADER AND 
  24. *  PROGRAM CONSTANTS (EQUATES), THEN READ IN THE LIBRARY.
  25. *  TO RETURN TO CP/M EXECUTE A JUMP TO EXIT.
  26. *  USERS MAIN PROGRAM MUST BE LABLED MAIN (OR CHANGE JMP)
  27. *  STACK SIZE IS SET TO 64 BYTES.
  28. *
  29. *    BDOS I/O EQUATES
  30. *
  31. INCON    EQU    1    ;READ CONSOLE FUNCTION NO.
  32. OUTCON    EQU    2    ;WRITE CONSOLE FUNCTION NO.
  33. INTAPE    EQU    3    ;INPUT FROM TAPE READER FUNCTION NO.
  34. OUTTAPE    EQU    4    ;OUTPUT TO PUNCH FUNCTION NO.
  35. OUTBUF    EQU    9    ;OUTPUT STRING TERMINATED BY $
  36. INBUF    EQU    10    ;INPUT BUFFER FUNCTION NO.
  37. BDOS    EQU    5    ;BDOS ENTRY POINT
  38. *
  39. *    CONTROL CHARACTERS
  40. *
  41. CR    EQU    0DH    ;CARRIAGE RETURN
  42. LF    EQU    0AH    ;LINE FEED
  43. CNTRL    EQU    -40H    ;CONTROL KEY OFFSET (I.E.  CNTRL+'C')
  44. *
  45. *    EXECUTION
  46. *
  47.     ORG    100H
  48. START:    LXI    H,0
  49.     DAD    SP
  50.     SHLD    OLDSP    ;SAVE CP/M'S STACK POINTER
  51.     LXI    SP,STKTOP
  52.     JMP    MAIN
  53. *
  54. *
  55. *    RETURN TO OPERATING SYSTEM
  56. EXIT:    LHLD    OLDSP    ;RETURN CP/M'S STACK POINTER
  57.     SPHL
  58.     RET        ;RETURN TO SYSTEM
  59. *
  60. *    STACKS
  61. *
  62. OLDSP    DS    2    ;RESERVED FOR SYSTEM STACK POINTER
  63. STACK    DS    64    ;SPACE FOR USER STACK
  64. STKTOP    EQU    $    ;STACK WORKS UP FROM HERE
  65. *
  66. *            END THEAD.LIB
  67. ***************************************************************
  68. *
  69. *
  70. *
  71. *
  72. ***************************************************************
  73. *
  74. *    CP/M ASSEMBLER LIBRARY PROCEDURES
  75. *
  76. *    DISK I/O EQUATES THRU CP/M
  77. *
  78. *    FILE NAME DISKIOEQ.LIB
  79. *
  80. *    7/16/77
  81. *
  82. *
  83. BUFF    EQU    0080H    ;DEFAULT DISK I/O BUFFER
  84. *
  85. *    FILE CONTROL BLOCK DEFINITION AND SUB-DEFINITIONS
  86. *
  87. FCB    EQU    005CH    ;DEFAULT FILE CONTROL BLOCK
  88. *
  89. FCBDN    EQU    FCB+0    ;DISK NAME, 0=LOGGED IN DISK, 1=A, 2=B
  90. FCBFN    EQU    FCB+1    ;FILE NAME (8 CHARACTERS)
  91. FCBFT    EQU    FCB+9    ;FILE TYPE (3 CHARACTERS)
  92. FCBEX    EQU    FCB+12    ;FILE EXTENT, 0=FIRST 16K, 1=NEXT 16K
  93. FCBRC    EQU    FCB+15    ;RECORD COUNT, 80H=FULL EXTENT
  94. FCBNR    EQU    FCB+32    ;NEXT RECORD TO BE READ
  95. *
  96. *    BDOS FUNCTION NUMBER EQUATES
  97. *
  98. OPENFF    EQU    15    ;OPEN FILE FUNCTION, 255=NOT FOUND
  99. CLOSFF    EQU    16    ;CLOSE FILE FUNCTION, 255=NOT FOUND
  100. SRCHF    EQU    17    ;SEARCH FOR FILE, 255=NO MATCH
  101. SRCHN    EQU    18    ;SEARCH FOR NEXT OCCURRENCE
  102. DELTFF    EQU    19    ;DELETE FILE FUNCTION
  103. READRF    EQU    20    ;READ NEXT RECORD FUNCTION, 0=READ OK,
  104.             ;1=READ PAST END OF FILE,
  105.             ;2=READING UNWRITTEN DATA IN RANDOM
  106.             ;ACCESS
  107. WRITRF    EQU    21    ;WRITE RECORD FUNCTION, 0=WRITE OK,
  108.             ;1=ERROR IN EXTENDING FILE,
  109.             ;2=NO MORE DISK DATA SPACE (>240K)
  110.             ;255=NO MORE DIRECTORY SPACE
  111. MAKEFF    EQU    22    ;MAKE FILE FUNCTION, 255=NO DIR. SPACE
  112. *
  113. *
  114. *            END DISKIOEQ.LIB
  115. ***************************************************************
  116. *
  117. *
  118. ;
  119. ; MESSAGES
  120. ;
  121. LENMES:    DB    'FILE LENGTH: $'
  122. KMES:    DB    'K$'
  123. NOFILM:    DB    'NO SUCH FILE$'
  124. ;
  125. MAIN:
  126.     MVI    B,0    ;CLEAR SIZE SUM REG
  127. OPEN:
  128.     PUSH    B    ;SAVE SUM SO FAR
  129.     LXI    D,FCB    ;OPEN AN EXTENT OF THE FILE
  130.     MVI    C,OPENFF
  131.     CALL    BDOS
  132.     POP    B    ;GET SUM SO FAR BACK
  133.     CPI    255    ;ABLE TO FIND THAT FILE?
  134.     JZ    NOTHER    ;NOPE - GIVE ERROR AND EXIT
  135. ;
  136. ;    FCBRC NOW CONTAINS THE NUMBER OF 128 BYTE RECORDS
  137. ;    IN THIS EXTENT OF THE FILE.  THUS, DIVIDING BY 8
  138. ;    WE CAN GET THE EXTENT LENGTH IN K BYTES.  BUT THE
  139. ;    DISK IS ALLOCATED IN 1K CHUNKS, SO A LENGTH OF 4.5K
  140. ;    BYTES REALLY HAS 5K BYTES ALLOCATED FOR IT.
  141. ;    THEREFORE, WE MUST ROUND UP TO GET THE TRUE AMMOUNT
  142. ;    OF DISK SPACE ALLOCATED FOR A FILE.
  143. ;
  144.     LDA    FCBRC    ;GET RECORD COUNT
  145.     ADI    0000$0111B    ;CAUSE CARRY INTO BIT 3 IF
  146.             ;LENGTH IS NOT AN EVEN K (ROUND UP).
  147.     ANI    1111$1000B    ;REMOVE ANY FRACTION LEFT
  148.     RRC        ;DIVIDE RESULT BY 8
  149.     RRC
  150.     RRC
  151.     ADD    B    ;ADD TO OLD SUM
  152.     MOV    B,A    ;UPDATE NEW SUM
  153.     LDA    FCBEX    ;PREPARE TO OPEN NEXT EXTENT IF THIS
  154.     INR    A    ;ONE IS FULL
  155.     STA    FCBEX
  156.     LDA    FCBRC    ;EXTENT IS FULL IF RC=128
  157.     CPI    128
  158.     JZ    OPEN    ;IS FULL - OPEN AND ADD NEXT EXTENT
  159. ;
  160. ;    REACHED LAST EXTENT, FILE LENGTH IN K BYTES IN IN B.
  161. ;
  162.     PUSH    B    ;SAVE LENGTH
  163.     LXI    D,LENMES    ;PRINT "FILE LENGTH: "
  164.     MVI    C,OUTBUF
  165.     CALL    BDOS
  166.     POP    B    ;GET LENGTH BACK
  167.     MOV    A,B    ;LENGTH -> A
  168.     CALL    DECA    ;PRINT A AS A NUMBER 0 - 255
  169.     LXI    D,KMES    ;PRINT "K"
  170.     JMP    PRARET    ;PRINT AND RETURN
  171. NOTHER:            ;COMES HERE IF FILE CAN'T BE FOUND
  172.     LXI    D,NOFILM
  173. PRARET:            ;PRINT MESSAGE AT DE AND EXIT
  174.     MVI    C,OUTBUF
  175.     CALL    BDOS
  176.     JMP    EXIT
  177. ;
  178. ;    DECA PRINTS THE NUMBER IN THE A REG AS A DECIMAL
  179. ;    NUMBER 0 - 255.  CLOBBERS A AND E.
  180. ;
  181. DECA:
  182.     MVI    E,-1 AND 255    ;INITIALIZE QUOTITENT
  183. ;
  184. ;    THIS LOOP DIVIDES THE A REG BY 10 THRU MULTIPLE
  185. ;    SUBTRACTION.  QUOTIENT IS LEFT IN E REG,
  186. ;    REMAINDER-10 IS LEFT IN A.
  187. ;
  188. LOOP:
  189.     INR    E    ;ADD ONE TO QUOTIENT FOR EACH SUBTRACT
  190.     SUI    10
  191.     JNC    LOOP    ;HAVEN'T UNDERFLOWED YET
  192. ;
  193.     ADI    '0' + 10    ;CONVERT REMAINDER TO ASCII
  194.     PUSH    PSW    ;PUT THIS DIGIT ON THE STACK
  195.     MOV    A,E    ;GET REMAINDER -> A
  196.     ORA    A    ;DONE WITH ALL DIGITS?
  197.     CNZ    DECA    ;NO - DO THIS AGAIN WITH THE REMAINDER
  198. ;
  199. ;    THE ASCII NUMBER IS NOW UP ON THE STACK, MSD FIRST
  200. ;    TO COME OFF.  BDOS WILL PROBABLY RETURN HERE.
  201. ;
  202.     POP    PSW
  203.     MOV    E,A
  204.     MVI    C,OUTCON
  205.     JMP    BDOS
  206. ;
  207.     END    ENTRY
  208.