home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpminfo / diskdef.lib < prev    next >
Text File  |  1984-04-29  |  7KB  |  269 lines

  1. ;    CP/M 2.0 disk re-definition library
  2. ;
  3. ;    Copyright (c) 1979
  4. ;    Digital Research
  5. ;    Box 579
  6. ;    Pacific Grove, CA
  7. ;    93950
  8. ;
  9. ;    BUGS fixed 07/07/82    JDW Software Source.
  10. ;
  11. ;    Unterminated IF in 'diskdef' macro itself
  12. ;
  13. ;    Unecessary complexity of 'lds' & 'defds' macros
  14. ;    'lds' now does both jobs, 'defds' removed (not needed).
  15. ;
  16. ;
  17. ;    'comment' dummy in 'ddw' & 'ddb' altered to 'messag'
  18. ;    because of apparent BUG in Macro-80 ver 3.44
  19. ;
  20. ;    'eq' 'gt' 'ge' etc replace '=' '>' '>=' in conditionals
  21. ;
  22. ;
  23. ;
  24. ;    Now will work with Macro-80 ver 3.44 as well as MAC.
  25. ;    if using M80, may need to alter 'set' psuedo-op
  26. ;    to aset equivalent if inside a .z80.
  27. ;
  28. ;
  29. ;
  30. ;    CP/M logical disk drives are defined using the
  31. ;    macros given below, where the sequence of calls
  32. ;    is:
  33. ;
  34. ;    disks    n
  35. ;    diskdef parameter-list-0
  36. ;    diskdef parameter-list-1
  37. ;    ...
  38. ;    diskdef parameter-list-n
  39. ;    endef
  40. ;
  41. ;    where n is the number of logical disk drives attached
  42. ;    to the CP/M system, and parameter-list-i defines the
  43. ;    characteristics of the ith drive (i=0,1,...,n-1)
  44. ;
  45. ;    each parameter-list-i takes the form
  46. ;        dn,fsc,lsc,[skf],bls,dks,dir,cks,ofs,[0]
  47. ;    where
  48. ;    dn    is the disk number 0,1,...,n-1
  49. ;    fsc    is the first sector number (usually 0 or 1)
  50. ;    lsc    is the last sector number on a track
  51. ;    skf    is optional "skew factor" for sector translate
  52. ;    bls    is the data block size (1024,2048,...,16384)
  53. ;    dks    is the disk size in bls increments (word)
  54. ;    dir    is the number of directory elements (word)
  55. ;    cks    is the number of dir elements to checksum
  56. ;    ofs    is the number of tracks to skip (word)
  57. ;    [0]    is an optional 0 which forces 16K/directory entry
  58. ;
  59. ;    for convenience, the form
  60. ;        dn,dm
  61. ;    defines disk dn as having the same characteristics as
  62. ;    a previously defined disk dm.
  63. ;
  64. ;    a standard four drive CP/M system is defined by
  65. ;        disks    4
  66. ;        diskdef 0,1,26,6,1024,243,64,64,2
  67. ;    dsk    set    0
  68. ;        rept    3
  69. ;    dsk    set    dsk+1
  70. ;        diskdef %dsk,0
  71. ;        endm
  72. ;        endef
  73. ;
  74. ;    the value of "begdat" at the end of assembly defines the
  75. ;    beginning of the uninitialize ram area above the bios,
  76. ;    while the value of "enddat" defines the next location
  77. ;    following the end of the data area.  the size of this
  78. ;    area is given by the value of "datsiz" at the end of the
  79. ;    assembly.  note that the allocation vector will be quite
  80. ;    large if a large disk size is defined with a small block
  81. ;    size.
  82. ;
  83. dskhdr    macro    dn
  84. ;;    define a single disk header list
  85. dpe&dn: dw    xlt&dn,0000h    ;translate table
  86.     dw    0000h,0000h    ;scratch area
  87.     dw    dirbuf,dpb&dn    ;dir buff,parm block
  88.     dw    csv&dn,alv&dn    ;check, alloc vectors
  89.     endm
  90. ;
  91. disks    macro    nd
  92. ;;    define nd disks
  93. ndisks    set    nd    ;;for later reference
  94. dpbase    equ    $    ;base of disk parameter blocks
  95. ;;    generate the nd elements
  96. dsknxt    set    0
  97.     rept    nd
  98.     dskhdr    %dsknxt
  99. dsknxt    set    dsknxt+1
  100.     endm
  101.     endm
  102. ;
  103. dpbhdr    macro    dn
  104. dpb&dn    equ    $        ;disk parm block
  105.     endm
  106. ;
  107. ddb    macro    data,messag
  108. ;;    define a db statement
  109.     db    data        messag
  110.     endm
  111. ;
  112. ddw    macro    data,messag
  113. ;;    define a dw statement
  114.     dw    data        messag
  115.     endm
  116. ;
  117. gcd    macro    m,n
  118. ;;    greatest common divisor of m,n
  119. ;;    produces value gcdn as result
  120. ;;    (used in sector translate table generation)
  121. gcdm    set    m    ;;variable for m
  122. gcdn    set    n    ;;variable for n
  123. gcdr    set    0    ;;variable for r
  124.     rept    65535
  125. gcdx    set    gcdm/gcdn
  126. gcdr    set    gcdm - gcdx*gcdn
  127.     if    gcdr eq 0
  128.     exitm
  129.     endif
  130. gcdm    set    gcdn
  131. gcdn    set    gcdr
  132.     endm
  133.     endm
  134. ;
  135. diskdef macro    dn,fsc,lsc,skf,bls,dks,dir,cks,ofs,k16
  136. ;;    generate the set statements for later tables
  137.     if    nul lsc
  138. ;;    current disk dn same as previous fsc
  139. dpb&dn    equ    dpb&fsc ;equivalent parameters
  140. als&dn    equ    als&fsc ;same allocation vector size
  141. css&dn    equ    css&fsc ;same checksum vector size
  142. xlt&dn    equ    xlt&fsc ;same translate table
  143.     else
  144. secmax    set    lsc-(fsc)    ;;sectors 0...secmax
  145. sectors set    secmax+1;;number of sectors
  146. als&dn    set    (dks)/8 ;;size of allocation vector
  147.     if    ((dks) mod 8) ne 0
  148. als&dn    set    als&dn+1
  149.     endif
  150. css&dn    set    (cks)/4 ;;number of checksum elements
  151. ;;    generate the block shift value
  152. blkval    set    bls/128 ;;number of sectors/block
  153. blkshf    set    0    ;;counts right 0's in blkval
  154. blkmsk    set    0    ;;fills with 1's from right
  155.     rept    16    ;;once for each bit position
  156.     if    blkval eq 1
  157.     exitm
  158.     endif
  159. ;;    otherwise, high order 1 not found yet
  160. blkshf    set    blkshf+1
  161. blkmsk    set    (blkmsk shl 1) or 1
  162. blkval    set    blkval/2
  163.     endm
  164. ;;    generate the extent mask byte
  165. blkval    set    bls/1024    ;;number of kilobytes/block
  166. extmsk    set    0    ;;fill from right with 1's
  167.     rept    16
  168.     if    blkval eq 1
  169.     exitm
  170.     endif
  171. ;;    otherwise more to shift
  172. extmsk    set    (extmsk shl 1) or 1
  173. blkval    set    blkval/2
  174.     endm
  175. ;;    may be double byte allocation
  176.     if    (dks) gt 256
  177. extmsk    set    (extmsk shr 1)
  178.     endif
  179. ;;    may be optional [0] in last position
  180.     if    not nul k16
  181. extmsk    set    k16
  182.     endif
  183. ;;    now generate directory reservation bit vector
  184. dirrem    set    dir    ;;# remaining to process
  185. dirbks    set    bls/32    ;;number of entries per block
  186. dirblk    set    0    ;;fill with 1's on each loop
  187.     rept    16
  188.     if    dirrem eq 0
  189.     exitm
  190.     endif
  191. ;;    not complete, iterate once again
  192. ;;    shift right and add 1 high order bit
  193. dirblk    set    (dirblk shr 1) or 8000h
  194.     if    dirrem gt dirbks
  195. dirrem    set    dirrem-dirbks
  196.     else
  197. dirrem    set    0
  198.     endif
  199.     endm
  200.     dpbhdr    dn    ;;generate equ $
  201.     ddw    %sectors,<;sec per track>
  202.     ddb    %blkshf,<;block shift>
  203.     ddb    %blkmsk,<;block mask>
  204.     ddb    %extmsk,<;extnt mask>
  205.     ddw    %(dks)-1,<;disk size-1>
  206.     ddw    %(dir)-1,<;directory max>
  207.     ddb    %dirblk shr 8,<;alloc0>
  208.     ddb    %dirblk and 0ffh,<;alloc1>
  209.     ddw    %(cks)/4,<;check size>
  210.     ddw    %ofs,<;offset>
  211. ;;    generate the translate table, if requested
  212.     if    nul skf
  213. xlt&dn    equ    0        ;no xlate table
  214.     else
  215.     if    skf eq 0
  216. xlt&dn    equ    0        ;no xlate table
  217.     else
  218. ;;    generate the translate table
  219. nxtsec    set    0    ;;next sector to fill
  220. nxtbas    set    0    ;;moves by one on overflow
  221.     gcd    %sectors,skf
  222. ;;    gcdn = gcd(sectors,skew)
  223. neltst    set    sectors/gcdn
  224. ;;    neltst is number of elements to generate
  225. ;;    before we overlap previous elements
  226. nelts    set    neltst    ;;counter
  227. xlt&dn    equ    $        ;translate table
  228.     rept    sectors ;;once for each sector
  229.     if    sectors lt 256
  230.     ddb    %nxtsec+(fsc)
  231.     else
  232.     ddw    %nxtsec+(fsc)
  233.     endif
  234. nxtsec    set    nxtsec+(skf)
  235.     if    nxtsec ge sectors
  236. nxtsec    set    nxtsec-sectors
  237.     endif
  238. nelts    set    nelts-1
  239.     if    nelts eq 0
  240. nxtbas    set    nxtbas+1
  241. nxtsec    set    nxtbas
  242. nelts    set    neltst
  243.     endif
  244.     endm
  245.     endif    ;;end of nul fac test
  246.     endif    ;;end of nul bls test
  247.     endif    ;; BUG for end of repeat last defn.
  248.     endm
  249. ;
  250. lds    macro    lb,dn,val
  251. lb&dn:    ds    val&dn
  252.     endm
  253. ;
  254. endef    macro
  255. ;;    generate the necessary ram data areas
  256. begdat    equ    $
  257. dirbuf: ds    128    ;directory access buffer
  258. dsknxt    set    0
  259.     rept    ndisks    ;;once for each disk
  260.     lds    alv,%dsknxt,als
  261.     lds    csv,%dsknxt,css
  262. dsknxt    set    dsknxt+1
  263.     endm
  264. enddat    equ    $
  265. datsiz    equ    $-begdat
  266. ;;    db 0 at this point forces hex record
  267.     endm
  268. ;
  269.