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 / ZSYS / SIMTEL20 / ZCPR3 / LDR.MQC / LDR.MAC
Text File  |  2000-06-30  |  13KB  |  606 lines

  1. ;
  2. ;  PROGRAM:  LDR
  3. ;  AUTHOR:  RICHARD CONN
  4. ;  VERSION:  1.0
  5. ;  DATE:  27 FEB 84
  6. ;  PREVIOUS VERSIONS:  0.1 (3 Feb 84), 0.2 (22 Feb 84), 1.1 (28 Sep 84)
  7. ;
  8. ;VERSION    EQU    10
  9.  
  10. ;VERSION    EQU    11    ; Version 1.1 by Joe Wright  28 Sept 84
  11.  
  12.             ; This version modified to allow loading the .ENV
  13.             ;  file the first time, when there is no environment
  14.             ;  descriptor in memory.  The program now takes
  15.             ;  the environment address from the .ENV file so
  16.             ;  that subsequent files are also loaded correctly.
  17.             ;  ie. LDR SYS.ENV,SYS.RCP,etc.  Note that .ENV must
  18.             ;  be the first declared file until LDR is installed
  19.             ;  to your environment.  jww
  20.  
  21. VERSION    EQU    12    ; Version 1.2 by Dave Lucky  31 Dec 84
  22.  
  23.             ; This version modified to correct exit regs from
  24.             ;  SDLOAD subroutine.  The Source and Destination
  25.             ;  registers on entry were HL and DE, respectively.
  26.             ;  On exit, they were DE and HL.  The calling routine
  27.             ;  (SETDATA) went amuck when calculating number of NDR
  28.             ;  records using bogus DE.  Also, corrected the SETDATA
  29.             ;  routine from using the incorrect address of the NDR
  30.             ;  entry size field as well as its contents acquired
  31.             ;  from the GETNDR routine.
  32.  
  33. EXTENV    EQU    1    ; 1 for External Environ, 0 for Internal Environ
  34.  
  35. ;
  36. ;    LDR is a general-purpose package loader for ZCPR3.  It is
  37. ; invoked by the following form:
  38. ;
  39. ;        LDR <list of packages>
  40. ;
  41. ; For example:
  42. ;        LDR DEFAULT.RCP,SYSIO.IOP
  43. ;
  44. ;    No default file types are assumed on the list of packages, and
  45. ; each package specified must be unambigous and have a type of RCP or IOP
  46. ; (for Resident Command Package or Input/Output Package).  LDR
  47. ; checks to make sure that the files are valid packages and then loads
  48. ; them into memory at the correct locations, checking for package boundary
  49. ; overflow.
  50. ;
  51. ;
  52.  
  53. ;
  54. ;  ZCPR3 Header
  55. ;
  56.     MACLIB    Z3BASE.LIB
  57.  
  58. ;
  59. ;  System Equates
  60. ;
  61. bdos    equ    5
  62. fcb    equ    5ch
  63. tbuff    equ    80h
  64. rcpflg    equ    1    ; package type is RCP
  65. iopflg    equ    2    ; package type is IOP
  66. fcpflg    equ    3    ; package type is FCP
  67. ndrflg    equ    4    ; package type is NDR
  68. envflg    equ    5    ; package type is ENV
  69. tcapflg    equ    6    ; package type is Z3T
  70. cr    equ    0dh
  71. lf    equ    0ah
  72.  
  73.     ext    z3init,envptr
  74.     ext    retud,getud,putud,logud
  75.     ext    getrcp,getfcp,getiop,getndr
  76.     ext    f$open,f$close,f$read
  77.     ext    print,pfn2
  78.     ext    hmovb,moveb,fillb
  79.     ext    cline,sksp,zfname
  80.  
  81. ;
  82. ;  Environments
  83. ;
  84. origin:
  85. ;
  86.     if    extenv        ; if external environment ...
  87. ;
  88. ;  External Environment Definition
  89. ;
  90.     jmp    z3ldr
  91.     db    'Z3ENV'        ; this is an environment
  92.     db    1        ; class 1 environment (external)
  93. envloc:
  94.     dw    z3env        ; ptr to environment
  95. z3ldr:
  96.     lhld    envloc        ; HL pts to environment
  97.  
  98.     else            ; if internal environment ...
  99. ;
  100. ;  Internal Environment Definition
  101. ;
  102.     MACLIB    SYSENV.LIB
  103. envloc:
  104.     jmp    z3ldr
  105.     SYSENV            ; define environment
  106. z3ldr:
  107.     lxi    h,envloc    ; HL pts to environment
  108.  
  109.     endif
  110.  
  111. ;
  112. ;  Beginning of LDR
  113. ;
  114.     call    z3init    ; initialize environment pointer
  115.     call    banner    ; print banner
  116.     lxi    h,tbuff    ; pt to command line
  117.     call    cline    ; save command line as string
  118.     call    sksp    ; skip over spaces
  119.     mov    a,m    ; get offending char
  120.     cpi    '/'    ; help?
  121.     jz    help
  122.     ora    a    ; help?
  123.     jz    help
  124. ;
  125. ;  Main Loop - HL pts to next file name in list
  126. ;
  127. z3ldr1:
  128.     lxi    d,fcb    ; pt to fcb
  129.     call    zfname    ; extract file name and data
  130.     inx    d    ; pt to file name
  131.     call    print
  132.     db    cr,lf,' Loading ',0
  133.     call    pfn2    ; print file name
  134.     push    h    ; save ptr
  135.     call    pkload    ; load file
  136.     pop    h    ; get ptr
  137.     mov    a,m    ; get char
  138.     inx    h    ; pt to next char
  139.     cpi    ','    ; another file in list?
  140.     jz    z3ldr1
  141.     ret
  142. ;
  143. ;  Print Help Message
  144. ;
  145. help:
  146.     call    print
  147.     db    cr,lf,' LDR Syntax:'
  148.     db    cr,lf,'    LDR <list of packages/data files>'
  149.     db    cr,lf,' where entries in the list may be any of these types:'
  150.     db    cr,lf
  151.     db    cr,lf,'    FCP - Flow Cmnd Package        ENV - Z3 Environ'
  152.     db    cr,lf,'    IOP - Input/Output Package    NDR - Z3 Named Dir'
  153.     db    cr,lf,'    RCP - Resident Cmnd Package    Z3T - Z3TCAP Entry'
  154.     db    cr,lf,lf,' The ENV file must be first if LDR is not installed.'
  155.     db    cr,lf,0
  156.     ret
  157. ;
  158. ;  Load package named in FCB
  159. ;
  160. pkload:
  161.     call    setdata    ; load data buffers from environment in case of change
  162.     call    cktype    ; check for valid file type
  163.     jz    typerr    ; abort if error
  164.     call    open    ; open file, read in first block, check for valid
  165.     jz    getud    ; abort if error
  166.  
  167. ; Check if ENV.  If so, get Z3ENV and call z3init
  168.  
  169.     push    h        ; save package pointer from cktype
  170.     lxi    d,fcb+9        ; fcb type
  171.     lxi    h,envtyp    ; ENV?
  172.     call    comptyp        ; compare types
  173.     pop    h        ; get package pointer
  174.     jnz    pkld        ; not ENV, proceed normally
  175. ;
  176. ; File type is ENV.  Get Z3ENV address from file and re-initialize
  177. ;
  178.     lxi    h,tbuff        ; first sector in tbuff
  179.     lxi    d,1bh        ; offset to Z3ENV
  180.     dad    d        ; point hl to it
  181.     mov    e,m        ; get Z3ENV
  182.     inx    h
  183.     mov    d,m        ; got it
  184.     xchg            ; in hl
  185.     call    z3init        ; set new environment
  186.  
  187. pkld:    call    load    ; load package into memory at correct location
  188.     call    close    ; close up process
  189.     call    getud    ; return home
  190. ;
  191. ;  Check for IOP and return if not
  192. ;
  193.     lda    pktype    ; init package if IOP
  194.     cpi    iopflg
  195.     rnz
  196. ;
  197. ;  Init IOP
  198. ;
  199.     lhld    packadr    ; get address
  200.     lxi    d,9    ; 4th JMP into it
  201.     dad    d
  202.     push    h    ; address on stack
  203.     ret        ; "CALL" routine and return to OS
  204. ;
  205. ;  Load Data Buffers from Environment
  206. ;
  207. setdata:
  208.     lhld    envptr    ; get environment descriptor address
  209.     shld    envadr
  210.     lxi    d,80H    ; pt to Z3TCAP
  211.     dad    d
  212.     shld    tcapadr
  213.     call    getrcp    ; get RCP data
  214.     lxi    d,rcpdata    ; load
  215.     call    sdload
  216.     call    getiop    ; get IOP data
  217.     lxi    d,iopdata    ; load
  218.     call    sdload
  219.     call    getfcp    ; get FCP data
  220.     lxi    d,fcpdata    ; load
  221.     call    sdload
  222.     lxi    h,ndridat    ; init NDR data in case no entry
  223.     lxi    d,ndrdata
  224.     mvi    b,9    ; 9 bytes (1-jmp, 5-ID, 2-adr, 1-size)
  225.     call    moveb
  226.     call    getndr    ; get NDR data
  227.     mov    b,a    ; save entry count                ;1284DL
  228.     mov    a,h    ; no NDR data?
  229.     ora    l
  230.     rz
  231.     mov    a,b    ; restore entry count                ;1284DL
  232.     call    sdload    ; with DE -> ndrdata                ;1284DL
  233.     push    d    ; save ptr to entry count            ;1284DL
  234.     mvi    h,0    ; HL = value
  235.     mov    l,a    ; A  = entry count
  236.     dad    h    ; *2
  237.     mov    d,h    ; DE = value * 2
  238.     mov    e,l
  239.     dad    h    ; *4
  240.     dad    h    ; *8
  241.     dad    h    ; *16
  242.     dad    d    ; *18
  243.     mov    a,h    ; /128
  244.     rlc
  245.     ani    0feh
  246.     mov    h,a
  247.     mov    a,l
  248.     rlc
  249.     ani    1
  250.     ora    h    ; A = value * 18 / 128
  251.     inr    a    ; +1
  252.     pop    d    ; get ptr
  253.     stax    d    ; save value
  254.     ret
  255. ;
  256. ;  Load 3 bytes pted to by HL into memory pted to by DE+6
  257. ;
  258. ;    Input Regs:                            ;1284DL
  259. ;        HL = Source                        ;1284DL
  260. ;        DE = Destination                    ;1284DL
  261. ;                                    ;1284DL
  262. ;    Output Regs:                            ;1284DL
  263. ;        HL = Source                        ;1284DL
  264. ;        DE = Destination+8                    ;1284DL
  265. ;                                    ;1284DL
  266. sdload:
  267.     push    h    ; save ptr to data
  268.     lxi    h,6    ; add 6 to DE to pt to proper buffer
  269.     dad    d    ; HL pts to buffer
  270.     pop    d    ; DE contains address
  271.     mov    m,e    ; store address
  272.     inx    h
  273.     mov    m,d
  274.     inx    h
  275.     mov    m,a    ; store size data
  276.     xchg        ; swap Source / Destination regs        ;1284DL
  277.     ret
  278. ;
  279. ;  Print Banner
  280. ;
  281. banner:
  282.     call    print
  283.     db    cr,lf,'ZCPR3 LDR, Version '
  284.     db    (VERSION/10)+'0','.',(VERSION MOD 10)+'0',0
  285.     ret
  286. ;
  287. ;  Check for Valid Package File Type
  288. ;    Return with Zero Flag Set if error
  289. ;    If validated, PKTYPE contains package type and HL pts to data
  290. ;
  291. cktype:
  292.     lxi    d,fcb+9    ; pt to file type
  293.     lxi    h,rcptyp    ; see if RCP
  294.     mvi    b,rcpflg    ; RCP code
  295.     call    comptyp    ; compare
  296.     jz    cktok    ; OK if match
  297.     lxi    h,ioptyp    ; see if IOP
  298.     mvi    b,iopflg    ; IOP code
  299.     call    comptyp    ; compare
  300.     jz    cktok    ; OK if match
  301.     lxi    h,fcptyp    ; see if FCP
  302.     mvi    b,fcpflg    ; FCP code
  303.     call    comptyp    ; compare
  304.     jz    cktok    ; OK if match
  305.     lxi    h,ndrtyp    ; see if NDR
  306.     mvi    b,ndrflg    ; NDR code
  307.     call    comptyp    ; compare
  308.     jz    cktok    ; OK if match
  309.     lxi    h,envtyp    ; see if ENV
  310.     mvi    b,envflg    ; ENV code
  311.     call    comptyp    ; compare
  312.     jz    cktok    ; OK if match
  313.     lxi    h,tcaptyp    ; see if Z3TCAP
  314.     mvi    b,tcapflg    ; Z3T code
  315.     call    comptyp    ; compare
  316.     jz    cktok
  317.     mvi    b,0    ; invalid type
  318. cktok:
  319.     mov    a,b    ; set package type
  320.     sta    pktype
  321.     ora    a    ; set NZ if no error
  322.     ret
  323. comptyp:
  324.     push    d    ; save regs
  325.     push    b
  326.     mvi    b,3    ; 3 bytes
  327. compt1:
  328.     ldax    d    ; get FCB char
  329.     ani    7fh    ; mask
  330.     cmp    m    ; compare
  331.     jnz    compt2
  332.     inx    h    ; pt to next
  333.     inx    d
  334.     dcr    b    ; count down
  335.     jnz    compt1
  336. compt2:
  337.     pop    b    ; restore regs
  338.     pop    d
  339.     ret
  340. typerr:
  341.     call    prf    ; print file name and string
  342.     db    ' is not a Valid Type',0
  343.     ret
  344. ;
  345. ;  Open File and Load First Block into TBUFF
  346. ;    Validate Package Structure and Return with Zero Flag Set if Error
  347. ;    On input, HL pts to data buffer
  348. ;    If no error, HL points to load address and B is number of 128-byte
  349. ;        pages allowed in buffer
  350. ;
  351. open:
  352.     call    putud    ; save location
  353.     call    retud    ; get UD in BC
  354.     lda    fcb    ; get disk
  355.     ora    a    ; default?
  356.     jz    open0
  357.     mov    b,a    ; disk in B (A=1)
  358.     dcr    b    ; adjust to A=0
  359. open0:
  360.     lda    fcb+13    ; get user
  361.     mov    c,a    ; user in C
  362.     call    logud    ; log into UD
  363.     xra    a    ; clear disk
  364.     sta    fcb
  365.  
  366. ;
  367. ;  Disallow Ambiguous File Name
  368. ;
  369.     call    ambchk    ; check for ambiguous file name
  370.     jz    amberr    ; abort if any ambiguity
  371. ;
  372. ;  Open File
  373. ;
  374.     lxi    d,fcb    ; pt to FCB
  375.     call    f$open    ; open file
  376.     jnz    fnferr    ; abort if file not found
  377. ;
  378. ;  Read First 128-byte Block
  379. ;
  380.     call    f$read    ; read in first block
  381.     jnz    fempty    ; abort if file empty
  382. ;
  383. ;  Validate Package
  384. ;    Package Data Area is structured as follows:
  385. ;        DB    numjmps    ; number of jumps at beginning of package
  386. ;        DB    'Z3xxx'    ; package ID (always 5 chars)
  387. ;        DW    address    ; address of memory buffer
  388. ;        DB    size    ; number of 128-byte blocks in memory buffer
  389. ;
  390.     xchg        ; DE pts to package data
  391.     ldax    d    ; get number of jumps
  392.     inx    d    ; pt to package ID
  393.     mov    b,a    ; jump count in B
  394. ;
  395. ;  Validate Package - MUST have proper number of JMPs
  396. ;
  397.     lxi    h,tbuff    ; check jumps
  398. open1:
  399.     mov    a,b    ; at limit of jumps?
  400.     ora    a
  401.     jz    open2
  402.     dcr    b    ; count down
  403.     mov    a,m    ; check for JMP
  404.     cpi    0C3H    ; JMP?
  405.     jnz    strerr    ; structure error
  406.     inx    h    ; pt to next
  407.     inx    h
  408.     inx    h
  409.     jmp    open1
  410. ;
  411. ;  Check Package ID - must match
  412. ;
  413. open2:
  414.     mvi    b,5    ; check package ID
  415. open3:
  416.     ldax    d    ; get byte
  417.     cpi    ' '    ; no ID if space
  418.     jz    open4
  419.     cmp    m    ; check
  420.     jnz    strerr    ; structure error
  421. open4:
  422.     inx    d    ; pt to next
  423.     inx    h
  424.     dcr    b    ; count down
  425.     jnz    open3
  426. ;
  427. ;  Extract Package Address
  428. ;
  429.     ldax    d    ; get low-order address
  430.     mov    l,a    ; put in HL
  431.     inx    d
  432.     ldax    d    ; get high-order address
  433.     mov    h,a
  434.     inx    d
  435. ;
  436. ;  Check for Valid Package Address
  437. ;
  438.     mov    a,h    ; must not be zero
  439.     ora    l
  440.     jz    adrerr
  441. ;
  442. ;  Extract 128-byte Block Count
  443. ;
  444.     ldax    d    ; get block count
  445.     mov    b,a    ; put in B
  446.     xra    a    ; set flags
  447.     dcr    a    ; NZ
  448.     ret
  449. ;
  450. ;  Ambiguous File Name Check
  451. ;    Returns with Z Set if Ambiguous
  452. ;
  453. ambchk:
  454.     lxi    d,fcb+1    ; check for ambiguous file name
  455.     mvi    b,11    ; 11 chars
  456. ambchk1:
  457.     ldax    d    ; get char
  458.     ani    7fh    ; mask
  459.     cpi    '?'
  460.     rz
  461.     inx    d    ; pt to next
  462.     dcr    b    ; count down
  463.     jnz    ambchk1
  464.     dcr    b    ; set NZ flag
  465.     ret
  466.  
  467. ;
  468. ;  Error Messages
  469. ;
  470. amberr:
  471.     call    prf    ; print file name and message
  472.     db    ' is Ambiguous',0
  473. erret:
  474.     xra    a    ; set error code
  475.     ret
  476. adrerr:
  477.     call    prf    ; print file name and message
  478.     db    ' Not Known to Environ',0
  479.     jmp    erret
  480. fnferr:
  481.     call    prf    ; print file name and message
  482.     db    ' Not Found',0
  483.     jmp    erret
  484. fempty:
  485.     call    prf    ; print file name and message
  486.     db    ' Empty',0
  487.     jmp    erret
  488. strerr:
  489.     call    prf    ; print file name and message
  490.     db    ' Contains a Format Flaw',0
  491.     jmp    erret
  492. prf:
  493.     call    print
  494.     db    cr,lf,' File ',0
  495.     lxi    d,fcb+1
  496.     call    pfn2
  497.     jmp    print
  498.  
  499. ;
  500. ;  Close File
  501. ;
  502. close:
  503.     lxi    d,fcb    ; pt to FCB
  504.     jmp    f$close    ; close file
  505.  
  506. ;
  507. ;  Load File Into Buffer
  508. ;
  509. load:
  510.     shld    packadr    ; save package address in case of error
  511.     xchg        ; DE pts to buffer, B = Max Blocks
  512. load1:
  513.     push    b    ; save count
  514.     lxi    h,tbuff    ; pt to buffer
  515.     mvi    b,128
  516.     call    hmovb    ; copy TBUFF into Buffer
  517.     push    d    ; save ptr to next block in buffer
  518.     lxi    d,fcb    ; pt to fcb
  519.     call    f$read    ; read next block
  520.     pop    d    ; get ptr
  521.     pop    b    ; get count
  522.     rnz        ; done if NZ
  523.     dcr    b    ; count down
  524.     jnz    load1
  525. ;
  526. ;  Buffer Full
  527. ;
  528.     call    prf
  529.     db    ' is too Large',0
  530.     lhld    packadr    ; clear package
  531.     mvi    b,128    ; NOPs
  532.     xra    a
  533.     call    fillb
  534.     lxi    b,128    ; pt to after last NOP
  535.     dad    b
  536.     mvi    b,3    ; copy 3 bytes
  537.     xchg        ; DE pts to empty space
  538.     lxi    h,ercode    ; store error code
  539.     jmp    moveb
  540. ;
  541. ;  Error Code to be Stored if Package Load Fails
  542. ;
  543. ercode:
  544.     xra    a    ; 3 bytes
  545.     dcr    a    ; A=0FFH and NZ Flag Set
  546.     ret
  547.  
  548. ;
  549. ;  Buffers
  550. ;
  551. ndridat:
  552.     db    0    ; no JMPs
  553.     db    '     '    ; no ID stored
  554.     dw    0    ; address
  555.     db    0    ; (z3ndirs*18)/128+1 size
  556. rcptyp:
  557.     db    'RCP'    ; file type of RCP file
  558. rcpdata:
  559.     db    0    ; 0 JMPs
  560.     db    'Z3RCP'    ; ID
  561.     dw    0    ; address
  562.     db    0    ; size
  563. ioptyp:
  564.     db    'IOP'    ; file type of IOP file
  565. iopdata:
  566.     db    16    ; 16 JMPs
  567.     db    'Z3IOP'    ; ID
  568.     dw    0    ; address
  569.     db    0    ; size
  570. fcptyp:
  571.     db    'FCP'    ; file type of FCP file
  572. fcpdata:
  573.     db    0    ; 0 JMPs
  574.     db    'Z3FCP'    ; ID
  575.     dw    0    ; address
  576.     db    0    ; size
  577. ndrtyp:
  578.     db    'NDR'    ; file type of NDR file
  579. ndrdata:
  580.     db    0    ; no JMPs
  581.     db    '     '    ; no ID stored
  582.     dw    0    ; address
  583.     db    0    ; (z3ndirs*18)/128+1 size
  584. envtyp:
  585.     db    'ENV'    ; file type of ENV file
  586. envdata:
  587.     db    1    ; 1 JMP
  588.     db    'Z3ENV'    ; ID
  589. envadr:
  590.     dw    0    ; address
  591.     db    2    ; 2 128-byte blocks max
  592. tcaptyp:
  593.     db    'Z3T'    ; file type of Z3TCAP file
  594. tcapdata:
  595.     db    0    ; no JMPs
  596.     db    '     '    ; no ID stored
  597. tcapadr:
  598.     dw    0    ; address
  599.     db    1    ; 1 128-byte block max
  600. pktype:
  601.     ds    1    ; package type (0=error)
  602. packadr:
  603.     ds    2    ; package address
  604.  
  605.     end
  606.