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 / CPM / SB180 / RAMFIX.LBR / RAMFIX.1Z0 / RAMFIX.180
Text File  |  2000-06-30  |  8KB  |  389 lines

  1.     .comment    ~
  2.  
  3. Program:    FIXRAM
  4.  
  5. Purpose:    The SB180FX Boot ROM destroys two bytes at the beginning
  6.         of each of the banks of memory.  Since these could be in
  7.         the middle of a file, or a directory, ths is not a good
  8.         situation.  FIXRAM will examine each RAM disk configured
  9.         on an XBIOS system.  If this disk contains an area that
  10.         is susceptible to such corruption, it will create a file
  11.         named !!!!!RAM.BAD in user area 31.  This file will have
  12.         allocated to it all of the allocation groups that are subject
  13.         to this corruption.
  14.  
  15. Use:        The FIXRAM program should be run each time the MDINIT utility
  16.         is run.  This will insure that the disk cannot contain
  17.         corruptible areas.  If a group is flagged as allocated in
  18.         the FIXRAM report, it may mean that you have a directory
  19.         group in a corruptible area.  Add 1 to the number of tracks
  20.         before directory for this disk to solve this problem.
  21.  
  22. Cautions:    This program creates the file by putting groups in a file
  23.         control block, forcing a write to the FCB, and then closing
  24.         the file.  This technique works with ZRDOS17, but may fail
  25.         with other DOSes.  Check the operation of this technique on
  26.         your system by running it and then using DU3 to make sure
  27.         the allocated groups agree with the report from FIXRAM.
  28.  
  29. Error:        This program will flag the first group in the upper memory
  30.         part of the RAM disk as being a candidate.  It is not, but
  31.         this is a small price to pay for such safety.
  32.     ~
  33.  
  34. cr    equ    13
  35. lf    equ    10
  36.  
  37. wboot    equ    0
  38. bdos    equ    5
  39.  
  40. bdos37    equ    37
  41.  
  42. llrec    equ    128
  43.  
  44. ;
  45. ; Disk Header Block
  46. ;
  47.  
  48. dhb_skew    equ    0        ; Skew values
  49. dhb_dirbufp equ    8        ; Directory buffer address
  50. dhb_dpbp    equ    10        ; Disk parameter block address
  51. dhb_chkp    equ    12        ; Check buffer pointer
  52. dhb_allvp   equ    14        ; Allocation vector address
  53. dhb_length  equ    16        ; Length of disk header block
  54. ldirbuf        equ    128        ; Length of directory buffer
  55.  
  56. ;
  57. ; Disk Parameter Block
  58. ;
  59.  
  60. dpb_spt        equ    0        ; Sectors per track
  61. dpb_bs        equ    2        ; Block shift
  62. dpb_bm        equ    3        ; Block mask
  63. dpb_em        equ    4        ; Extent mask
  64. dpb_maxb    equ    5        ; Maximum allocable block - 1
  65. dpb_dire    equ    7        ; Directory entries - 1
  66. dpb_allblk  equ    9        ; Bit map allocated blocks
  67. dpb_chksiz  equ    11        ; Length of check buffer
  68. dpb_tbfdir  equ    13        ; Tracks before directory
  69. dpb_length  equ    15        ; Length of disk parameter block
  70. ;
  71. ftype        equ    1
  72. htype        equ    2
  73. mtype        equ    3
  74. ;
  75.  
  76.     extrn    print,pa2hc,phl4hc,cout
  77.     extrn    putud,getud,logud
  78.     extrn    initfcb,f$delete,f$mopen,f$write,f$close
  79.  
  80.     maclib    xsys
  81.  
  82. start:
  83.     call    test_xbios
  84.     jp    nz,xbios_error
  85.     call    putud
  86.     ld    de,buffer
  87.     ld    c,3
  88.     ld    hl,(wboot+1)
  89.     ld    l,b_config
  90.     call    callhl            ; Get disk data
  91. disk_loop:
  92.     call    find_dsk
  93.     or    a,a            ; Do we have one
  94.     jp    nz,wrap            ; No, all done
  95.     call    print
  96.     db    cr,lf,'Disk ',0
  97.     ld    a,c
  98.     call    cout
  99.     ld    a,c
  100.     sub    a,'A'
  101.     call    sel_disk
  102.     call    print
  103.     db    ' Groups: ',0
  104.     ld    de,fcb
  105.     call    initfcb            ; Clear FCB
  106.     ld    de,fcb
  107.     call    f$delete        ; Get rid of file
  108.     ld    de,fcb
  109.     call    f$mopen            ; Create and open file
  110.     ld    hl,fcb+16        ; Point to group location
  111.     ld    (grpptr),hl        ; Save away
  112.     ld    hl,0
  113.     ld    (curtrk),hl        ; Initialize our track
  114. group_loop: .new
  115.     ld    de,(curtrk)
  116.     ld    hl,64
  117.     add    hl,de
  118.     ex    de,hl            ; Save our track
  119.     ld    hl,1024+1        ; Largest track number + 1
  120.     sbc    hl,de
  121.     jr    c,end_group
  122.     ex    de,hl            ; HL = current track to check
  123.     ld    (curtrk),hl
  124.     call    chk_track
  125.     or    a,a
  126.     jr    nz,group_loop        ; Not in range of this disk
  127.     call    print
  128.     db    ' ',0
  129.     call    phl4hc
  130. ; Process group number
  131.     push    hl            ; Save group number
  132.     ld    b,3            ; Shift length (divide by 8)
  133.     xor    a,a            ; Set remainder to 0
  134. 1$:
  135.     srl    h
  136.     rr    l
  137.     rra
  138.     djnz    1$
  139.     rla
  140.     rl    b
  141.     rla
  142.     rl    b
  143.     rla
  144.     rl    b            ; Put remainder in B
  145.     ld    a,80h            ; Mask
  146.     jr    z,3$            ; No shift needed
  147. 2$:
  148.     srl    a
  149.     djnz    2$
  150. 3$:
  151.     ld    de,(alvec)        ; Get base
  152.     add    hl,de            ; Pointer to byte
  153.     and    a,(hl)            ; See if we are already allocated
  154.     pop    de            ; Get group number
  155.     jr    z,4$            ; Not allocated, continue
  156.     call    print
  157.     db    ' Allocated',0
  158.     jp    group_loop
  159. 4$:
  160.     ld    hl,(grpptr)        ; Get our current fcb ptr
  161.     ld    a,(max_block+1)
  162.     or    a,a            ; Set flags on size of entry
  163.     ld    (hl),e
  164.     inc    hl
  165.     jr    z,5$
  166.     ld    (hl),d
  167.     inc    hl
  168. 5$:
  169.     ld    (grpptr),hl        ; Save away
  170.     jr    group_loop
  171.  
  172. end_group:
  173.     ld    de,fcb
  174.     call    f$write
  175.     ld    de,fcb
  176.     call    f$close
  177.     jp    disk_loop
  178.  
  179. wrap:
  180.     call    getud
  181.     ld    de,(reset_vector)
  182.     ld    c,bdos37
  183.     call    bdos            ; Reset our disks, rebuild alloc vector
  184.     jp    wboot
  185.  
  186. ; chk_track
  187. ;  Entry:
  188. ;    HL = Track number
  189. ;    CURDSK structure set
  190. ;  Return:
  191. ;    A =0FFh if no match
  192. ;    A = 0
  193. ;    HL = Group number if match
  194. chk_track:
  195.     ld    a,(groups_trk)
  196.     ld    e,a
  197.     call    mlt16x8            ; Get groups from beginning
  198.     ld    de,(group_off)
  199.     or    a,0FFh            ; Reset Carry, set for return status
  200.     sbc    hl,de
  201.     ret    c            ; Before this disk
  202.     ex    de,hl            ; Put group number in DE
  203.     ld    hl,(max_block)
  204.     or    a,0FFh            ; Reset carry, set for return status
  205.     sbc    hl,de
  206.     ex    de,hl
  207.     ret    c            ; Good group number
  208.     xor    a,a
  209.     ret
  210.  
  211. ; sel_disk
  212. ;  Entry:
  213. ;    A = Disk number (A = 0)
  214. ;    Disk will be put in reset vector, and logged in (user 31)
  215. ;    CURDSK structure set
  216. ;
  217. sel_disk: .new
  218.     ld    b,a
  219.     ld    hl,1
  220.     or    a,a
  221.     jr    z,2$        ; A drive, not shift
  222. 1$:
  223.     sla    l
  224.     rl    h        ; Shift
  225.     djnz    1$
  226. 2$:
  227.     ld    b,a        ; Save disk number
  228.     ld    a,(reset_vector)
  229.     or    a,l
  230.     ld    (reset_vector),a
  231.     ld    a,(reset_vector+1)
  232.     or    a,h
  233.     ld    (reset_vector+1),a
  234.     ld    c,31
  235.     call    logud
  236.     ret
  237.  
  238. ; Get next RAM disk.
  239. ;   Return:
  240. ;    A = 0FFh if no more
  241. ;
  242. ;    A = 0
  243. ;    C = Disk name ('A', 'B', etc)
  244. ;    IX -> Disk Header Block
  245. ;    IY -> Disk Parameter Block
  246.  
  247. find_dsk: .new
  248.     ld    hl,buffer
  249.     ld    b,16
  250. 1$:
  251.     ld    c,(hl)
  252.     inc    hl
  253.     ld    a,(hl)
  254.     cp    a,mtype
  255.     jr    nz,4$
  256.  
  257.     xor    a,a
  258.     ld    (hl),a            ; Zero for next pass
  259.     inc    hl            ; Bump to DPH
  260.     ld    e,(hl)
  261.     inc    hl
  262.     ld    d,(hl)
  263.     inc    hl
  264.     push    de
  265.     pop    ix            ; IX -> DPH
  266.     ld    h,(ix+dhb_dpbp+1)
  267.     ld    l,(ix+dhb_dpbp)
  268.     push    hl
  269.     pop    iy            ; Into IY
  270.  
  271.     ld    a,(iy+dpb_bs)        ; Get block shift
  272.     ld    b,a
  273.     ld    a,5
  274.     sub    a,b
  275. ;    jr    c,find_dsk        ; Can't use this, >4k group
  276.     ld    b,a
  277.     ld    a,1
  278.     jr    z,3$            ; 4k allocation, use the 1
  279. 2$:
  280.     sla    a
  281.     djnz    2$            ; calculate groups per track
  282. 3$:
  283.     ld    (groups_trk),a        ; And save
  284.  
  285.     ld    h,(iy+dpb_tbfdir+1)
  286.     ld    l,(iy+dpb_tbfdir)    ; Get tracks before directory
  287.     ld    e,a
  288.     call    mlt16x8            ; Get group offset
  289.     ld    (group_off),hl        ; And save
  290.  
  291.     ld    h,(iy+dpb_maxb+1)
  292.     ld    l,(iy+dpb_maxb)
  293.     ld    (max_block),hl
  294.  
  295.     ld    h,(ix+dhb_allvp+1)
  296.     ld    l,(ix+dhb_allvp)    ; Get allocation vector pointer
  297.     ld    (alvec),hl        ; And save
  298.  
  299.     xor    a,a            ; Set indicators
  300.     ret
  301. 4$:
  302.     inc    hl
  303.     inc    hl
  304.     inc    hl
  305.     djnz    1$            ; Try next entry
  306.     or    a,0FFh            ; Set indicators
  307.     ret
  308.  
  309. ;
  310. ; Routine to multiply HL by E (16bit X 8bit)
  311. ;    Return:
  312. ;        A = MSB
  313. ;        HL = lower two bytes
  314. ;
  315. mlt16x8:
  316.     ld    d,h        ; Save upper byte
  317.     ld    h,e        ; Get multiplier
  318.     mlt    hl        ; First product
  319.     mlt    de        ; And second
  320.     ld    a,d        ; High byte of product
  321.     ld    d,e        ; Move middle byte into position for add
  322.     ld    e,0        ; This product has zero lower byte
  323.     add    hl,de        ; Add for middle and lower byte
  324.     adc    a,0        ; Adjust high byte
  325.     ret
  326.  
  327.  
  328. callhl:
  329.     jp    (hl)
  330.  
  331. ; Routine to test if XBIOS system
  332. ;  Return:
  333. ;    A = 0 if XBIOS
  334. ;    A <> 0 if not XBIOS
  335. ;
  336.  
  337. test_xbios:
  338.     ld    hl,(wboot+1)
  339.     ld    l,b_time
  340.     inc    hl            ; Increment past jump
  341.     ld    e,(hl)
  342.     inc    hl
  343.     ld    d,(hl)
  344.     dec    de
  345.     ld    hl,test_string+4
  346.     ld    b,5
  347. loop:
  348.     ld    a,(de)
  349.     cp    a,(hl)
  350.     ld    a,0FFh
  351.     ret    nz
  352.     dec    hl
  353.     dec    de
  354.     djnz    loop
  355.     xor    a,a            ; Set status
  356.     ret
  357.  
  358. test_string:
  359.     db    'XBIOS'
  360.  
  361. xbios_error:
  362.     call    print
  363.     db    cr,lf,'RAMFIX: Can only run on XBIOS system.',0
  364.     jp    wboot
  365.  
  366. reset_vector:
  367.     dw    0            ; Disk reset vector
  368. fcb:
  369.     db    0,'!!!!!BADRAM'
  370.     ds    24
  371.  
  372. curtrk    ds    2            ; Current track number
  373. alvec    ds    2            ; Pointer to allocation vector
  374. grpptr    ds    2            ; Pointer to groups (in fcb)
  375.  
  376. ; CURDSK structure
  377. group_off:
  378.     ds    2            ; Groups before directory
  379. max_block:
  380.     ds    2            ; Last track number
  381. groups_trk:
  382.     ds    1            ; Groups per track
  383. ; end of CURDSK structure
  384.  
  385. buffer    ds    llrec
  386.  
  387.  
  388.  
  389.