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 / DEBLOCK.ASM < prev    next >
Assembly Source File  |  1997-09-27  |  10KB  |  388 lines

  1. ;*********************************************************
  2. ;*                                                       *
  3. ;*      Sector Deblocking Algorithms for MP/M II V2.0    *
  4. ;*                                                       *
  5. ;*********************************************************
  6. ;
  7. ;    utility macro to compute sector mask
  8. smask    macro    hblk
  9. ;;    compute log2(hblk), return @x as result
  10. ;;    (2 ** @x = hblk on return)
  11. @y    set    hblk
  12. @x    set    0
  13. ;;    count right shifts of @y until = 1
  14.     rept    8
  15.     if    @y = 1
  16.     exitm
  17.     endif
  18. ;;    @y is not 1, shift right one position
  19. @y    set    @y shr 1
  20. @x    set    @x + 1
  21.     endm
  22.     endm
  23. ;
  24. ;*****************************************************
  25. ;*                                                   *
  26. ;*         MP/M to host disk constants               *
  27. ;*                                                   *
  28. ;*****************************************************
  29. blksiz    equ    2048        ;MP/M allocation size
  30. hstsiz    equ    512        ;host disk sector size
  31. hstspt    equ    20        ;host disk sectors/trk
  32. hstblk    equ    hstsiz/128    ;MP/M sects/host buff
  33. cpmspt    equ    hstblk * hstspt    ;MP/M sectors/track
  34. secmsk    equ    hstblk-1    ;sector mask
  35.     smask    hstblk        ;compute sector mask
  36. secshf    equ    @x        ;log2(hstblk)
  37. ;
  38. ;*****************************************************
  39. ;*                                                   *
  40. ;*        BDOS constants on entry to write           *
  41. ;*                                                   *
  42. ;*****************************************************
  43. wrall    equ    0        ;write to allocated
  44. wrdir    equ    1        ;write to directory
  45. wrual    equ    2        ;write to unallocated
  46. ;
  47. ;*****************************************************
  48. ;*                                                   *
  49. ;*    The BDOS entry points given below show the   *
  50. ;*      code which is relevant to deblocking only.   *
  51. ;*                                                   *
  52. ;*****************************************************
  53. ;
  54. ;    DISKDEF macro, or hand coded tables go here
  55. dpbase    equ    $        ;disk param block base
  56. ;
  57. boot:
  58. wboot:
  59.     ;enter here on system boot to initialize
  60.     xra    a        ;0 to accumulator
  61.     sta    hstact        ;host buffer inactive
  62.     sta    unacnt        ;clear unalloc count
  63.     ret
  64. ;
  65. home:
  66.     ;home the selected disk
  67.     lda    hstwrt        ;check for pending write
  68.     ora    a
  69.     jnz    homed
  70.     sta    hstact        ;clear host active flag
  71. homed:
  72.     ret
  73. ;
  74. seldsk:
  75.     ;select disk
  76.     mov    a,c        ;selected disk number
  77.     sta    sekdsk        ;seek disk number
  78.     mov    l,a        ;disk number to HL
  79.     mvi    h,0
  80.     rept    4        ;multiply by 16
  81.     dad    h
  82.     endm
  83.     lxi    d,dpbase    ;base of parm block
  84.     dad    d        ;hl=.dpb(curdsk)
  85.     ret
  86. ;
  87. settrk:
  88.     ;set track given by registers BC
  89.     mov    h,b
  90.     mov    l,c
  91.     shld    sektrk        ;track to seek
  92.     ret
  93. ;
  94. setsec:
  95.     ;set sector given by register c 
  96.     mov    a,c
  97.     sta    seksec        ;sector to seek
  98.     ret
  99. ;
  100. setdma:
  101.     ;set dma address given by BC
  102.     mov    h,b
  103.     mov    l,c
  104.     shld    dmaadr
  105.     ret
  106. ;
  107. sectran:
  108.     ;translate sector number BC
  109.     mov    h,b
  110.     mov    l,c
  111.     ret
  112. ;
  113. ;*****************************************************
  114. ;*                                                   *
  115. ;*    The READ entry point takes the place of      *
  116. ;*    the previous BIOS defintion for READ.        *
  117. ;*                                                   *
  118. ;*****************************************************
  119. read:
  120.     ;read the selected MP/M sector
  121.     xra    a
  122.     sta    unacnt        ;unacnt = 0
  123.     inr    a
  124.     sta    readop        ;read operation
  125.     sta    rsflag        ;must read data
  126.     mvi    a,wrual
  127.     sta    wrtype        ;treat as unalloc
  128.     jmp    rwoper        ;to perform the read
  129. ;
  130. ;*****************************************************
  131. ;*                                                   *
  132. ;*    The WRITE entry point takes the place of     *
  133. ;*    the previous BIOS defintion for WRITE.       *
  134. ;*                                                   *
  135. ;*****************************************************
  136. write:
  137.     ;write the selected MP/M sector
  138.     xra    a        ;0 to accumulator
  139.     sta    readop        ;not a read operation
  140.     mov    a,c        ;write type in c
  141.     sta    wrtype
  142.     ani    wrual        ;write unallocated?
  143.     jz    chkuna        ;check for unalloc
  144. ;
  145. ;    write to unallocated, set parameters
  146.     mvi    a,blksiz/128    ;next unalloc recs
  147.     sta    unacnt
  148.     lda    sekdsk        ;disk to seek
  149.     sta    unadsk        ;unadsk = sekdsk
  150.     lhld    sektrk
  151.     shld    unatrk        ;unatrk = sectrk
  152.     lda    seksec
  153.     sta    unasec        ;unasec = seksec
  154. ;
  155. chkuna:
  156.     ;check for write to unallocated sector
  157.     lda    unacnt        ;any unalloc remain?
  158.     ora    a
  159.     jz    alloc        ;skip if not
  160. ;
  161. ;    more unallocated records remain
  162.     dcr    a        ;unacnt = unacnt-1
  163.     sta    unacnt
  164.     lda    sekdsk        ;same disk?
  165.     lxi    h,unadsk
  166.     cmp    m        ;sekdsk = unadsk?
  167.     jnz    alloc        ;skip if not
  168. ;
  169. ;    disks are the same
  170.     lxi    h,unatrk
  171.     call    sektrkcmp    ;sektrk = unatrk?
  172.     jnz    alloc        ;skip if not
  173. ;
  174. ;    tracks are the same
  175.     lda    seksec        ;same sector?
  176.     lxi    h,unasec
  177.     cmp    m        ;seksec = unasec?
  178.     jnz    alloc        ;skip if not
  179. ;
  180. ;    match, move to next sector for future ref
  181.     inr    m        ;unasec = unasec+1
  182.     mov    a,m        ;end of track?
  183.     cpi    cpmspt        ;count MP/M sectors
  184.     jc    noovf        ;skip if no overflow
  185. ;
  186. ;    overflow to next track
  187.     mvi    m,0        ;unasec = 0
  188.     lhld    unatrk
  189.     inx    h
  190.     shld    unatrk        ;unatrk = unatrk+1
  191. ;
  192. noovf:
  193.     ;match found, mark as unnecessary read
  194.     xra    a        ;0 to accumulator
  195.     sta    rsflag        ;rsflag = 0
  196.     jmp    rwoper        ;to perform the write
  197. ;
  198. alloc:
  199.     ;not an unallocated record, requires pre-read
  200.     xra    a        ;0 to accum
  201.     sta    unacnt        ;unacnt = 0
  202.     inr    a        ;1 to accum
  203.     sta    rsflag        ;rsflag = 1
  204. ;
  205. ;*****************************************************
  206. ;*                                                   *
  207. ;*    Common code for READ and WRITE follows       *
  208. ;*                                                   *
  209. ;*****************************************************
  210. rwoper:
  211.     ;enter here to perform the read/write
  212.     xra    a        ;zero to accum
  213.     sta    erflag        ;no errors (yet)
  214.     lda    seksec        ;compute host sector
  215.     rept    secshf
  216.     ora    a        ;carry = 0
  217.     rar            ;shift right
  218.     endm
  219.     sta    sekhst        ;host sector to seek
  220. ;
  221. ;    active host sector?
  222.     lxi    h,hstact    ;host active flag
  223.     mov    a,m
  224.     mvi    m,1        ;always becomes 1
  225.     ora    a        ;was it already?
  226.     jz    filhst        ;fill host if not
  227. ;
  228. ;    host buffer active, same as seek buffer?
  229.     lda    sekdsk
  230.     lxi    h,hstdsk    ;same disk?
  231.     cmp    m        ;sekdsk = hstdsk?
  232.     jnz    nomatch
  233. ;
  234. ;    same disk, same track?
  235.     lxi    h,hsttrk
  236.     call    sektrkcmp    ;sektrk = hsttrk?
  237.     jnz    nomatch
  238. ;
  239. ;    same disk, same track, same buffer?
  240.     lda    sekhst
  241.     lxi    h,hstsec    ;sekhst = hstsec?
  242.     cmp    m
  243.     jz    match        ;skip if match
  244. ;
  245. nomatch:
  246.     ;proper disk, but not correct sector
  247.     lda    hstwrt        ;host written?
  248.     ora    a
  249.     cnz    writehst    ;clear host buff
  250. ;
  251. filhst:
  252.     ;may have to fill the host buffer
  253.     lda    sekdsk
  254.     sta    hstdsk
  255.     lhld    sektrk
  256.     shld    hsttrk
  257.     lda    sekhst
  258.     sta    hstsec
  259.     lda    rsflag        ;need to read?
  260.     ora    a
  261.     cnz    readhst        ;yes, if 1
  262.     xra    a        ;0 to accum
  263.     sta    hstwrt        ;no pending write
  264. ;
  265. match:
  266.     ;copy data to or from buffer
  267.     lda    seksec        ;mask buffer number
  268.     ani    secmsk        ;least signif bits
  269.     mov    l,a        ;ready to shift
  270.     mvi    h,0        ;double count
  271.     rept    7        ;shift left 7
  272.     dad    h
  273.     endm
  274. ;    hl has relative host buffer address
  275.     lxi    d,hstbuf
  276.     dad    d        ;hl = host address
  277.     xchg            ;now in DE
  278.     lhld    dmaadr        ;get/put MP/M data
  279.     mvi    c,128        ;length of move
  280.     lda    readop        ;which way?
  281.     ora    a
  282.     jnz    rwmove        ;skip if read
  283. ;
  284. ;    write operation, mark and switch direction
  285.     mvi    a,1
  286.     sta    hstwrt        ;hstwrt = 1
  287.     xchg            ;source/dest swap
  288. ;
  289. rwmove:
  290.     ;C initially 128, DE is source, HL is dest
  291.     ldax    d        ;source character
  292.     inx    d
  293.     mov    m,a        ;to dest
  294.     inx    h
  295.     dcr    c        ;loop 128 times
  296.     jnz    rwmove
  297. ;
  298. ;    data has been moved to/from host buffer
  299.     lda    wrtype        ;write type
  300.     ani    wrdir        ;to directory?
  301.     lda    erflag        ;in case of errors
  302.     rz            ;no further processing
  303. ;
  304. ;    clear host buffer for directory write
  305.     ora    a        ;errors?
  306.     rnz            ;skip if so
  307.     xra    a        ;0 to accum
  308.     sta    hstwrt        ;buffer written
  309.     call    writehst
  310.     lda    erflag
  311.     ret
  312. ;
  313. ;*****************************************************
  314. ;*                                                   *
  315. ;*    Utility subroutine for 16-bit compare        *
  316. ;*                                                   *
  317. ;*****************************************************
  318. sektrkcmp:
  319.     ;HL = .unatrk or .hsttrk, compare with sektrk
  320.     xchg
  321.     lxi    h,sektrk
  322.     ldax    d        ;low byte compare
  323.     cmp    m        ;same?
  324.     rnz            ;return if not
  325. ;    low bytes equal, test high 1s
  326.     inx    d
  327.     inx    h
  328.     ldax    d
  329.     cmp    m    ;sets flags
  330.     ret
  331. ;
  332. ;*****************************************************
  333. ;*                                                   *
  334. ;*    WRITEHST performs the physical write to      *
  335. ;*    the host disk, READHST reads the physical    *
  336. ;*    disk.                         *
  337. ;*                                                   *
  338. ;*****************************************************
  339. writehst:
  340.     ;hstdsk = host disk #, hsttrk = host track #,
  341.     ;hstsec = host sect #. write "hstsiz" bytes
  342.     ;from hstbuf and return error flag in erflag.
  343.     ;return erflag non-zero if error
  344.     ret
  345. ;
  346. readhst:
  347.     ;hstdsk = host disk #, hsttrk = host track #,
  348.     ;hstsec = host sect #. read "hstsiz" bytes
  349.     ;into hstbuf and return error flag in erflag.
  350.     ret
  351. ;
  352. ;*****************************************************
  353. ;*                                                   *
  354. ;*    Unitialized RAM data areas             *
  355. ;*                                                   *
  356. ;*****************************************************
  357. ;
  358. sekdsk:    ds    1        ;seek disk number
  359. sektrk:    ds    2        ;seek track number
  360. seksec:    ds    1        ;seek sector number
  361. ;
  362. hstdsk:    ds    1        ;host disk number
  363. hsttrk:    ds    2        ;host track number
  364. hstsec:    ds    1        ;host sector number
  365. ;
  366. sekhst:    ds    1        ;seek shr secshf
  367. hstact:    ds    1        ;host active flag
  368. hstwrt:    ds    1        ;host written flag
  369. ;
  370. unacnt:    ds    1        ;unalloc rec cnt
  371. unadsk:    ds    1        ;last unalloc disk
  372. unatrk:    ds    2        ;last unalloc track
  373. unasec:    ds    1        ;last unalloc sector
  374. ;
  375. erflag:    ds    1        ;error reporting
  376. rsflag:    ds    1        ;read sector flag
  377. readop:    ds    1        ;1 if read operation
  378. wrtype:    ds    1        ;write operation type
  379. dmaadr:    ds    2        ;last dma address
  380. hstbuf:    ds    hstsiz        ;host buffer
  381. ;
  382. ;*****************************************************
  383. ;*                                                   *
  384. ;*    The ENDEF macro invocation goes here         *
  385. ;*                                                   *
  386. ;*****************************************************
  387.     end
  388.