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 / BEEHIVE / ZCAT / SETDRU13.LBR / SDRU1.MZC / SDRU1.MAC
Text File  |  2000-06-30  |  9KB  |  443 lines

  1.     title    SDRUL1  -- allow setdru use of program
  2.  
  3. ; copyright 1983  Michael M Rubenstein
  4.  
  5. ; installs a filter to redirect certain files to a specified drive/user
  6. ; and loads program
  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    sdru1
  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. sdru1:
  90.     .phase    tpa
  91. begin:    jp    start
  92.     dw    length            ;length of this module
  93.     dw    0            ;for compatibility
  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    "***SETDRU1***"        ;identification
  125.     db    "Copyright 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,pgm+2        ;set up fcb to read program
  134.     ld    de,wfcb+1
  135.     ld    bc,11
  136.     ldir
  137.     ld    a,(pgm)
  138.     ld    (wfcb),a
  139.  
  140.     ld    c,ucode            ;get current user number
  141.     ld    e,0ffh
  142.     call    bdos
  143.     ld    (user),a
  144.  
  145.     ld    c,ucode            ;set user code for program
  146.     ld    a,(pgm+1)
  147.     ld    e,a
  148.     call    bdos
  149.  
  150.     ld    hl,(bdos+1)        ;compute location to move to
  151.     ld    (obdos+1),hl        ;save bdos location
  152.     ld    de,-lfilt
  153.     add    hl,de
  154.     push    hl            ;save new location
  155.     ld    de,-filter        ;compute relocation factor
  156.     add    hl,de
  157.     ex    de,hl
  158.  
  159.     reloc    01
  160.     reloc    02
  161.     reloc    03
  162.     reloc    04
  163.     reloc    05
  164.     reloc    06
  165.     reloc    07
  166.     reloc    08
  167.     reloc    09
  168.     reloc    10
  169.     reloc    11
  170.     reloc    12
  171.     reloc    13
  172.     reloc    14
  173.     reloc    15
  174.     reloc    16
  175.     reloc    17
  176.     reloc    18
  177.     reloc    19
  178.     reloc    20
  179.     reloc    21
  180.     reloc    22
  181.     reloc    23
  182.     reloc    24
  183.     reloc    25
  184.     reloc    26
  185.     reloc    27
  186.     reloc    28
  187.     reloc    29
  188.     reloc    30
  189.     reloc    31
  190.     reloc    32
  191.     reloc    33
  192.     reloc    34
  193.     reloc    35
  194.     reloc    36
  195.     reloc    37
  196.     reloc    38
  197.     reloc    39
  198.  
  199.     ld    hl,filter        ;move the filter to high memory
  200.     pop    de            ;get location again
  201.     push    de            ;and save it again
  202.     ld    bc,lfilt
  203.     ldir
  204.  
  205.     ret                ;go to high memory routine
  206.  
  207. ; the following code is moved to high memory before execution
  208. filter:
  209. rloc01:    ld    sp,stack
  210.     ld    c,opnfle        ;open program
  211. rloc02:    ld    de,wfcb
  212.     call    bdos
  213.     inc    a
  214.     jp    z,boot            ;get out if can't find
  215.  
  216.     ld    de,tpa
  217.  
  218. load:    push    de            ;load program loop
  219.     ld    c,setdma
  220.     call    bdos
  221. rloc03:    ld    de,wfcb
  222.     ld    c,rdseq
  223.     call    bdos
  224.     pop    de            ;advance position
  225.     ld    hl,128
  226.     add    hl,de
  227.     ex    de,hl
  228.     or    a            ;end of file?
  229.     jr    z,load
  230.  
  231.     ld    c,clsfle        ;close the file
  232. rloc04:    ld    de,wfcb
  233.     call    bdos
  234.  
  235.     ld    c,ucode
  236. rloc05:    ld    a,(user)        ;reset the user number
  237.     ld    e,a
  238.     call    bdos
  239.  
  240.     ld    c,setdma        ;reset the dma to default buffer
  241.     ld    de,cpmbuf
  242.     call    bdos
  243.  
  244. rloc06:    ld    hl,nbdos        ;set the bdos to filter
  245.     ld    (bdos+1),hl
  246.     ld    hl,boot            ;return address
  247.     push    hl
  248.     jp    tpa            ;do the program
  249.  
  250. ;resident filter starts here
  251. nbdos:    ld    a,c            ;check the function
  252.     cp    opnfle
  253.     jr    z,opnflt
  254.     cp    clsfle
  255. rloc07:    jp    z,fleflt
  256.     cp    search
  257.     jr    z,opnflt
  258.     cp    delfle
  259.     jr    z,mkflt
  260.     cp    rdseq
  261. rloc08:    jp    z,fleflt
  262.     cp    wrseq
  263. rloc09:    jp    z,fleflt
  264.     cp    makefl
  265.     jr    z,mkflt
  266.     cp    rename
  267.     jr    z,mkflt
  268.     cp    rdrand
  269. rloc10:    jp    z,fleflt
  270.     cp    wrrand
  271. rloc11:    jp    z,fleflt
  272.     cp    fsize
  273. rloc12:    jp    z,fleflt
  274.     cp    wrranz
  275. rloc13:    jp    z,fleflt
  276. obdos:    jp    0            ;set to old bdos loc
  277.  
  278. ;check file on open for redirection
  279. mkflt:    or    a            ;flag for make
  280.     jr    opnfl1
  281. opnflt:    scf                ;flag for open
  282. opnfl1:    sbc    a,a            ;0 for make, ff for open
  283. rloc14:    ld    (oflag),a
  284.     ld    a,(de)            ;may already be set to phony
  285.     cp    c
  286. rloc15:    jp    nc,flefl2
  287. rloc16    equ    $+1
  288.     ld    (fstack),sp
  289. rloc17:    ld    sp,fstack
  290.     push    bc            ;save parameters
  291.     push    de
  292. rloc18:    ld    hl,wrfls
  293.     ld    c,17            ;offset for phony drive
  294.     inc    de            ;point to name
  295. ckloop:    ld    a,(hl)            ;are we done checking?
  296.     or    a
  297.     jr    z,nored            ;yes, no redirection
  298.     sub    a            ;set not ambig
  299. rloc19:    ld    (aflag),a
  300.     push    de            ;save pointer to name
  301.     push    hl            ;save pointer to table
  302.     ld    b,11            ;length of name+type
  303.     inc    hl            ;point to name in table
  304.     inc    hl
  305. rloc20:
  306. cmplp:    ld    a,(oflag)        ;should we consider ambiguous?
  307.     or    a
  308.     jr    z,cmp1            ;not if make
  309.     ld    a,(hl)
  310.     cp    '?'
  311.     jr    nz,cmp1
  312. rloc21:    ld    (aflag),a
  313.     jr    cmp2
  314. cmp1:    ld    a,(de)            ;compare
  315.     and    7fh            ;strip bit 7
  316.     cp    (hl)
  317.     jr    nz,notit
  318. cmp2:    inc    hl            ;advance pointer to table name
  319.     inc    de            ;advance pointer to fcb name
  320.     djnz    cmplp
  321.     pop    hl            ;got it, throw away pointer to table
  322.     pop    hl            ;throw away pointer to name
  323.     pop    de            ;get fcb
  324.     ld    l,c
  325.     pop    bc            ;get function
  326. rloc22:    ld    a,(aflag)        ;ambiguous?
  327.     or    a
  328.     jr    z,opnfl9        ;go to it if not
  329.     push    hl            ;save everything
  330.     push    de
  331.     push    bc
  332. rloc23:    call    obdos
  333.     cp    0ffh            ;ok?
  334.     jr    z,opnfl8
  335. rloc24    equ    $+1
  336.     ld    sp,(fstack)
  337.     ret
  338.  
  339. opnfl8:    pop    bc            ;restore parameters
  340.     pop    de
  341.     pop    hl
  342. opnfl9:    ld    a,l
  343.     ld    (de),a            ;set phony drive
  344.     jr    flefl1            ;now handle the redirection
  345.  
  346. nored:    pop    de            ;no redirection
  347.     pop    bc            ;restore parameters
  348. rloc25    equ    $+1
  349.     ld    sp,(fstack)        ;restore stack
  350.     jr    obdos
  351.  
  352. notit:    pop    hl            ;get pointer to table
  353.     ld    de,fssize        ;size of table entry
  354.     add    hl,de            ;advance to next entry
  355.     ld    a,c
  356.     add    a,e            ;advance phony drive spec
  357.     ld    c,a
  358.     pop    de
  359.     jr    ckloop
  360.  
  361. ; if the file is redirected, fudge it
  362. fleflt:    ld    a,(de)
  363.     cp    16+1            ;if > max drive, redirected
  364. rloc26:    jp    c,obdos
  365. flefl2:    cp    '?'
  366. rloc27:    jp    z,obdos
  367. rloc28    equ    $+1
  368.     ld    (fstack),sp        ;save old stack
  369. rloc29:    ld    sp,fstack        ;and use local stack
  370. flefl1:    push    bc            ;save parameters
  371.     push    de
  372.     ld    c,ucode            ;get user number
  373.     ld    e,0ffh
  374. rloc30:    call    obdos
  375. rloc31:    ld    (user),a        ;save user number
  376.     pop    hl            ;get fcb address again
  377.     push    hl            ;and save it
  378.     ld    a,(hl)            ;get phony drive spec
  379. rloc32:    ld    (pdrive),a        ;save it
  380.     ld    e,a
  381.     ld    d,0
  382. rloc33:    ld    hl,wrfls-17+1        ;phony drive is entry in table + 17
  383.     add    hl,de
  384.     push    hl            ;save entry in table
  385.     ld    c,ucode            ;set user code
  386.     ld    e,(hl)
  387. rloc34:    call    obdos
  388.     pop    hl            ;get entry in table
  389.     pop    de            ;get fcb again
  390.     pop    bc            ;get function
  391.     dec    hl            ;point to drive
  392.     ld    a,(hl)
  393.     ld    (de),a
  394.     push    de            ;save fcb address
  395.     push    bc            ;save function
  396. rloc35:    call    obdos
  397.     pop    bc            ;get function again
  398.     pop    de            ;get fcb again
  399.     push    af
  400.     ld    a,c
  401.     cp    clsfle            ;is this a close?
  402.     jr    z,flefl9        ;don't reset phony spec if so
  403. rloc36:    ld    a,(pdrive)        ;reset phony drive spec
  404.     ld    (de),a
  405. flefl9:    push    hl            ;save hl return value
  406.     ld    c,ucode
  407. rloc37:    ld    a,(user)
  408.     ld    e,a
  409. rloc38:    call    obdos
  410.     pop    hl            ;get real return values
  411.     pop    af
  412. rloc39    equ    $+1
  413.     ld    sp,(fstack)
  414.     ret
  415.  
  416. user:    db    0            ;hold user number
  417. pdrive:    db    0            ;hold phony drive spec
  418. oflag:    db    0            ;open/make
  419. aflag:    db    0            ;ambiguous?
  420.  
  421. wfcb:    db    0
  422.     db    '        '
  423.     db    '   '
  424.     db    0,0,0,0,0,0,0,0
  425.     db    0,0,0,0,0,0,0,0
  426.     db    0,0,0,0,0,0,0,0
  427.  
  428. wrfls:    ds    lfiles            ;file table
  429.     db    0            ;to end it all
  430.  
  431.     ds    32
  432. fstack:    ds    2
  433.     ds    16
  434. stack:    ds    2
  435.  
  436. length    equ    $-begin
  437. lfilt    equ    $-filter
  438.     .dephase
  439.  
  440.     end
  441. loc34:    call    obdos
  442.     pop    hl            ;get entry in table
  443.     pop    de            ;get fcb a