home *** CD-ROM | disk | FTP | other *** search
/ norge.freeshell.org (192.94.73.8) / 192.94.73.8.tar / 192.94.73.8 / pub / computers / cpm / alphatronic / MPM-GEN.ZIP / DISKDEF.LIB < prev    next >
Text File  |  1997-09-27  |  7KB  |  257 lines

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