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 / UTILS / DIRUTL / SETDRU13.LBR / SDRU2.MQC / SDRU2.MAC
Text File  |  2000-06-30  |  9KB  |  397 lines

  1. title    SDRU2   -- set drive and user for files in program
  2.  
  3. ; copyright 1983  Michael M Rubenstein
  4.  
  5. ; installs a filter to redirect certain files to a specified drive/user.
  6. ; is appended to start of program and moves it down
  7.  
  8. ; zcpr solves the problem of making a single copy of a program available
  9. ; to all user numbers, but many programs require overlays or work files
  10. ; which must also be made accessable.
  11.  
  12. ; up to 8 files may be redirected.
  13.  
  14.  
  15. ; known limitations:
  16.  
  17. ;    requires CP/M 2.2 or higher
  18.  
  19. ;    requires Z80 processor
  20.  
  21. ;    untested under CP/M Plus
  22.  
  23. ;    will not work with programs (such as MultiPlan) which modify the drive
  24. ;    spec in the fcb after opening.
  25.  
  26.     .z80
  27.     entry    sdru2
  28.  
  29. false    equ    0
  30. true    equ    not false
  31.  
  32. base    equ    0000h        ;standard cpm base
  33. boot    equ    base        ;warm boot
  34. iobyte    equ    0003h+base  ;i/o byte
  35. cpmdsk    equ    0004h+base  ;current cpm disk
  36. bdos    equ    0005h+base  ;entry to bdos
  37. cpmfcb    equ    005ch+base  ;default cpm fcb
  38. cpmbuf    equ    0080h+base  ;default cpm buffer
  39. tpa    equ    0100h+base  ;start of transient pgm
  40.  
  41. reset    equ    0    ;system reset
  42. rdcon    equ    1    ;read console
  43. wrcon    equ    2    ;write console
  44. rdrdr    equ    3    ;read reader
  45. wrpun    equ    4    ;write punch
  46. wrlst    equ    5    ;write list
  47. conio    equ    6    ;console i/o
  48. getiob    equ    7    ;get i/o byte
  49. setiob    equ    8    ;set i/o byte
  50. wrstr    equ    9    ;put string to console
  51. rdstr    equ    10    ;get a string from con
  52. cnstat    equ    11    ;console status
  53. getver    equ    12    ;get cp/m version numb
  54. resetd    equ    13    ;reset disk system
  55. seldsk    equ    14    ;select disk
  56. opnfle    equ    15    ;open disk file
  57. clsfle    equ    16    ;close disk file
  58. search    equ    17    ;get first disk file
  59.             ;(ambiguous reference)
  60. snext    equ    18    ;get next disk file
  61. delfle    equ    19    ;delete disk file
  62. rdseq    equ    20    ;read disk sequential
  63. wrseq    equ    21    ;write disk sequential
  64. makefl    equ    22    ;create a file
  65. rename    equ    23    ;rename disk file
  66. glogin    equ    24    ;return login vector
  67. curdsk    equ    25    ;return current disk
  68. setdma    equ    26    ;set dma for dsk access
  69. getalc    equ    27    ;return disk alloc vect
  70. wrprot    equ    28    ;write protect disk
  71. getro    equ    29    ;get read only vector
  72. setfla    equ    30    ;set file attributes
  73. gdprm    equ    31    ;get disk parm
  74. ucode    equ    32    ;set/get user code
  75. rdrand    equ    33    ;read random record
  76. wrrand    equ    34    ;write random record
  77. fsize    equ    35    ;comp virt file size
  78. setrnd    equ    36    ;set random record
  79. resdrv    equ    37    ;reset drive
  80. wrranz    equ    40    ;write random with zero fill
  81.  
  82. ; relocation macro (just 'cause i'm lazy)
  83. reloc    macro    n
  84.     ld    hl,(rloc&n+1)
  85.     add    hl,de
  86.     ld    (rloc&n+1),hl
  87.     endm
  88.  
  89. sdru2:
  90.     .phase    tpa
  91. begin:    jp    start
  92.     dw    length            ;length of this module
  93. pgmlen:    dw    0            ;filled in by during installation
  94. pgm:    db    0,0            ;file to load
  95.     db    '        '
  96.     db    '   ' 
  97. fssize    equ    $-pgm
  98. rfiles:    db    0,0             ;file 1
  99.     db    '        '
  100.     db         '   '
  101.     db    0,0            ;file 2
  102.     db    '        '
  103.     db    '   '    
  104.     db    0,0               ;file 3
  105.     db    '        '
  106.     db    '   '    
  107.     db    0,0             ;file 4
  108.     db    '        '
  109.     db    '   '    
  110.     db    0,0              ;file 5
  111.     db    '        '
  112.     db    '   '    
  113.     db    0,0            ;file 6
  114.     db    '        '
  115.     db    '   '
  116.     db    0,0            ;file 7
  117.     db    '        '
  118.     db    '   '
  119.     db    0,0            ;file 8
  120.     db    '        '
  121.     db    '   '
  122. lfiles    equ    $-rfiles
  123.  
  124.     db    "***SETDRU2***"        ;identification
  125.     db    "Copywrite 1983  Michael M Rubenstein"
  126.  
  127. start:    ld    sp,stack
  128.     ld    hl,rfiles        ;move redirected file specs to filter
  129.     ld    de,wrfls
  130.     ld    bc,lfiles
  131.     ldir
  132.  
  133.     ld    hl,(bdos+1)        ;compute location to move to
  134.     ld    (obdos+1),hl        ;save bdos location
  135.     ld    de,-lfilt
  136.     add    hl,de
  137.     push    hl            ;save new location
  138.     ld    de,-filter        ;compute relocation factor
  139.     add    hl,de
  140.     ex    de,hl
  141.  
  142.     reloc    01
  143.     reloc    02
  144.     reloc    03
  145.     reloc    04
  146.     reloc    05
  147.     reloc    06
  148.     reloc    07
  149.     reloc    08
  150.     reloc    09
  151.     reloc    10
  152.     reloc    11
  153.     reloc    12
  154.     reloc    13
  155.     reloc    14
  156.     reloc    15
  157.     reloc    16
  158.     reloc    17
  159.     reloc    18
  160.     reloc    19
  161.     reloc    20
  162.     reloc    21
  163.     reloc    22
  164.     reloc    23
  165.     reloc    24
  166.     reloc    25
  167.     reloc    26
  168.     reloc    27
  169.     reloc    28
  170.     reloc    29
  171.     reloc    30
  172.     reloc    31
  173.     reloc    32
  174.     reloc    33
  175.     reloc    34
  176.     reloc    35
  177.  
  178.     ld    hl,filter        ;move the filter to high memory
  179.     pop    de            ;get location again
  180.     push    de            ;and save it again
  181.     ld    bc,lfilt
  182.     ldir
  183.  
  184.     ld    hl,load            ;set up to move down program
  185.     ld    de,tpa
  186.     ld    bc,(pgmlen)
  187.  
  188.     ret                ;go to high memory routine
  189.  
  190. ; the following code is moved to high memory before execution
  191. filter:
  192. rloc01:    ld    sp,stack
  193.     ldir
  194. rloc02:    ld    hl,nbdos        ;set the bdos to filter
  195.     ld    (bdos+1),hl
  196.     ld    hl,boot            ;return address
  197.     push    hl
  198.     jp    tpa            ;do the program
  199.  
  200. ;resident filter starts here
  201. nbdos:    ld    a,c            ;check the function
  202.     cp    opnfle
  203.     jr    z,opnflt
  204.     cp    clsfle
  205. rloc03:    jp    z,fleflt
  206.     cp    search
  207.     jr    z,opnflt
  208.     cp    delfle
  209.     jr    z,mkflt
  210.     cp    rdseq
  211. rloc04:    jp    z,fleflt
  212.     cp    wrseq
  213. rloc05:    jp    z,fleflt
  214.     cp    makefl
  215.     jr    z,mkflt
  216.     cp    rename
  217.     jr    z,mkflt
  218.     cp    rdrand
  219. rloc06:    jp    z,fleflt
  220.     cp    wrrand
  221. rloc07:    jp    z,fleflt
  222.     cp    fsize
  223. rloc08:    jp    z,fleflt
  224.     cp    wrranz
  225. rloc09:    jp    z,fleflt
  226. obdos:    jp    0            ;set to old bdos loc
  227.  
  228. ;check file on open for redirection
  229. mkflt:    or    a            ;flag for make
  230.     jr    opnfl1
  231. opnflt:    scf                ;flag for open
  232. opnfl1:    sbc    a,a            ;0 for make, ff for open
  233. rloc10:    ld    (oflag),a
  234.     ld    a,(de)            ;may already be set to phony
  235.     cp    17
  236. rloc11:    jp    nc,flefl2
  237. rloc12    equ    $+1
  238.     ld    (fstack),sp
  239. rloc13:    ld    sp,fstack
  240.     push    bc            ;save parameters
  241.     push    de
  242. rloc14:    ld    hl,wrfls
  243.     ld    c,17            ;offset for phony drive
  244.     inc    de            ;point to name
  245. ckloop:    ld    a,(hl)            ;are we done checking?
  246.     or    a
  247.     jr    z,nored            ;yes, no redirection
  248.     sub    a            ;set not ambig
  249. rloc15:    ld    (aflag),a
  250.     push    de            ;save pointer to name
  251.     push    hl            ;save pointer to table
  252.     ld    b,11            ;length of name+type
  253.     inc    hl            ;point to name in table
  254.     inc    hl
  255. rloc16:
  256. cmplp:    ld    a,(oflag)        ;should we consider ambiguous?
  257.     or    a
  258.     jr    z,cmp1            ;not if make
  259.     ld    a,(hl)
  260.     cp    '?'
  261.     jr    nz,cmp1
  262. rloc17:    ld    (aflag),a
  263.     jr    cmp2
  264. cmp1:    ld    a,(de)            ;compare
  265.     and    7fh            ;strip bit 7
  266.     cp    (hl)
  267.     jr    nz,notit
  268. cmp2:    inc    hl            ;advance pointer to table name
  269.     inc    de            ;advance pointer to fcb name
  270.     djnz    cmplp
  271.     pop    hl            ;got it, throw away pointer to table
  272.     pop    hl            ;throw away pointer to name
  273.     pop    de            ;get fcb
  274.     ld    l,c
  275.     pop    bc            ;get function
  276. rloc18:    ld    a,(aflag)        ;ambiguous?
  277.     or    a
  278.     jr    z,opnfl9        ;go to it if not
  279.     push    hl            ;save everything
  280.     push    de
  281.     push    bc
  282. rloc19:    call    obdos
  283.     cp    0ffh            ;ok?
  284.     jr    z,opnfl8
  285. rloc20    equ    $+1
  286.     ld    sp,(fstack)
  287.     ret
  288.  
  289. opnfl8:    pop    bc            ;restore parameters
  290.     pop    de
  291.     pop    hl
  292. opnfl9:    ld    a,l
  293.     ld    (de),a            ;set phony drive
  294.     jr    flefl1            ;now handle the redirection
  295.  
  296. nored:    pop    de            ;no redirection
  297.     pop    bc            ;restore parameters
  298. rloc21    equ    $+1
  299.     ld    sp,(fstack)        ;restore stack
  300.     jr    obdos
  301.  
  302. notit:    pop    hl            ;get pointer to table
  303.     ld    de,fssize        ;size of table entry
  304.     add    hl,de            ;advance to next entry
  305.     ld    a,c
  306.     add    a,e            ;advance phony drive spec
  307.     ld    c,a
  308.     pop    de
  309.     jr    ckloop
  310.  
  311. ; if the file is redirected, fudge it
  312. fleflt:    ld    a,(de)
  313.     cp    16+1            ;if > max drive, redirected
  314. rloc22:    jp    c,obdos
  315. flefl2:    cp    '?'            ;and not ambigous?
  316. rloc23:    jp    z,obdos
  317. rloc24    equ    $+1
  318.     ld    (fstack),sp        ;save old stack
  319. rloc25:    ld    sp,fstack        ;and use local stack
  320. flefl1:    push    bc            ;save parameters
  321.     push    de
  322.     ld    c,ucode            ;get user number
  323.     ld    e,0ffh
  324. rloc26:    call    obdos
  325. rloc27:    ld    (user),a        ;save user number
  326.     pop    hl            ;get fcb address again
  327.     push    hl            ;and save it
  328.     ld    a,(hl)            ;get phony drive spec
  329. rloc28:    ld    (pdrive),a        ;save it
  330.     ld    e,a
  331.     ld    d,0
  332. rloc29:    ld    hl,wrfls-17+1        ;phony drive is entry in table + 17
  333.     add    hl,de
  334.     push    hl            ;save entry in table
  335.     ld    c,ucode            ;set user code
  336.     ld    e,(hl)
  337. rloc30:    call    obdos
  338.     pop    hl            ;get entry in table
  339.     pop    de            ;get fcb again
  340.     pop    bc            ;get function
  341.     dec    hl            ;point to drive
  342.     ld    a,(hl)
  343.     ld    (de),a
  344.     push    de            ;save fcb address
  345.     push    bc            ;save function
  346. rloc31:    call    obdos
  347.     pop    bc            ;get function again
  348.     pop    de            ;get fcb again
  349.     push    af
  350.     ld    a,c
  351.     cp    clsfle            ;is this a close?
  352.     jr    z,flefl9        ;don't reset phony spec if so
  353. rloc32:    ld    a,(pdrive)        ;reset phony drive spec
  354.     ld    (de),a
  355. flefl9:    push    hl            ;save hl return value
  356.     ld    c,ucode
  357. rloc33:    ld    a,(user)
  358.     ld    e,a
  359. rloc34:    call    obdos
  360.     pop    hl            ;get real return values
  361.     pop    af
  362. rloc35    equ    $+1
  363.     ld    sp,(fstack)
  364.     ret
  365.  
  366. user:    db    0            ;hold user number
  367. pdrive:    db    0            ;hold phony drive spec
  368. oflag:    db    0            ;open/make
  369. aflag:    db    0            ;ambiguous?
  370.  
  371. wfcb:    db    0
  372.     db    '        '
  373.     db    '   '
  374.     db    0,0,0,0,0,0,0,0
  375.     db    0,0,0,0,0,0,0,0
  376.     db    0,0,0,0,0,0,0,0
  377.  
  378. wrfls:    ds    lfiles            ;file table
  379.     db    0            ;to end it all
  380.  
  381.     ds    32
  382. fstack:    ds    2
  383.     ds    16
  384. stack:    ds    2
  385.  
  386. lfilt    equ    $-filter
  387. length    equ    $-begin
  388. load    equ    ($+7fh) and 0ff80h
  389.  
  390.     .dephase
  391.  
  392.     end
  393. et entry in table
  394.     pop    de            ;get fcb again
  395.     pop    bc            ;get function
  396.     dec    hl            ;point to drive
  397.