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 / ZCPR33 / A-R / JLTOOLS.LBR / JETLDR.MZO / JETLDR.MMO
Text File  |  2000-06-30  |  18KB  |  471 lines

  1. To:    Z-System Users
  2. From:    Bridger Mitchell
  3. Subject:JetLDR, ZRL files, and Named-Common Segments
  4. Date:    7/8/88
  5.  
  6.  
  7.        The New ZRL Files -  Named Common Z-System Segments
  8.  
  9. This mouthful of nominatives refers to a new method of assembling
  10. Z-System (ZCPR3) operating system segments into relocatable files
  11. or modules.  The resulting "ZRL" files are _portable_ across
  12. systems of different sizes, different addresses, and to other
  13. Z-System computers.   No reassembly is required. 
  14.  
  15. To help distinguish these "REL" files from other relocatable files
  16. (which are normally intended to be linked into an executable COM
  17. file), we will refer to them as type "ZRL" -- Z-system ReLocatable.
  18.  
  19. A single ZRL file will suffice as the command processor for all
  20. (CP/M 2.2) Z-Systems, whatever their memory location!  Another
  21. single file will serve all users desiring a particular version of
  22. a flow command processor.  The same applies to the FCP and IOP
  23. packages.
  24.  
  25. To _use_ the new ZRL files you need only JetLDR (which fully
  26. replaces LDR and LLDR).  The Z3PLUS Z-System (for CP/M 3) and the
  27. new Z-COM (version 2.0)  also use (and require) the new ZRL
  28. format files.  In addition, the next release of XBIOS for SB180
  29. and SB180/FX computers will support this format.
  30.  
  31. To _assemble_ the new ZRL files you need an assembler that
  32. supports multiple named-common relocation addresses.  Some that
  33. do are various SLR assemblers, and M80.  The current version of
  34. ZAS (from Alpha) lacks this feature, but an upgrade (EZASM) is
  35. in the works.
  36.  
  37. I have one _important request_.  The naming standards stated
  38. here have been developed jointly with Jay Sage, Joe Wright, and
  39. Echelon.  In order to maintain true portability, please do not
  40. circulate on bulletin boards any Z-System segments in ZRL form
  41. that don't adhere to these new standards.
  42.  
  43. JetLDR and CMNREL are Copyright 1988 by Bridger Mitchell, all
  44. rights reserved.  JetLDR is bundled with Z3PLUS and NZCOM; it is
  45. also available separately at a nominal charge.  CMNREL is
  46. available for licensing by developers.  Please scrupulously
  47. observe the copyright laws -- any redistribution of these
  48. programs is illegal.
  49.  
  50. The remainder of this memo contains information on using JetLDR
  51. and technical information about the named-common relocation
  52. bases.
  53.  
  54.  
  55.               USING JetLDR
  56.  
  57. JetLDR should fully replace LDR and LLDR.  The complete
  58. command-line syntax is:
  59.  
  60. A> JetLDR //
  61.      gives usage message
  62.  
  63. A> JetLDR  [du:]file1.typ, [du:]file2.typ, ...
  64.      loads file1.typ, file2.typ, ...
  65.  
  66. A> JetLDR [du:]lbrfile[.lbr] file1.typ file2.typ ...
  67.      loads members file1.typ, file2.typ, ... of the library file "lbrfile.lbr"
  68.  
  69. The optional "du:" may be a drive/user spec, or a named
  70. directory.  If neither is given, JetLDR will search one or more
  71. directories for the file, according to several patchable
  72. configuration bytes, described below.
  73.  
  74. The file types may be:
  75.  
  76.   FCP - flow commands       ENV - environment
  77.   IOP - input/output        NDR - named directories
  78.   RCP - resident commands   Z3T - terminal capabitlities
  79.   ZRL -- FCP, RCP, IOP, CCP, CP3, DOS, DO3, BIO, or CFG in relocatable format
  80.  
  81. If the file type is  ZRL or REL (in SLR or MS-relocatable format) 
  82. then JetLDR will relocate and load the FCP, RCP, IOP, CCP, DOS, BIO,
  83. or CFG package, provided that its corresponding module name is:
  84.  
  85.     FCPxxx    xxx = any ascii characters
  86.     RCPxxx
  87.     IOPxxx
  88.     CCPxxx    (for cp/m 2.2)
  89.     CP3xxx    (for cp/m 3)
  90.     DOSxxx    (for cp/m 2.2)
  91.     DO3xxx    (for cp/m 3)
  92.     BIOxxx
  93.     BSXxxx
  94.     RSXxxx
  95.     CFGxxx    for configuring following module(s)
  96.     xxxxxx  a custom module
  97.  
  98. Any intersegment addresses should be referenced via Named Common
  99. relocation bases (see below).
  100.  
  101. On CP/M 2.2 systems, JetLDR relocates a CCP package and
  102. writes the absolute image to a file in the root directory,
  103. because there is no general-purpose method of installing that
  104. image into the warm-boot procedure of the host computer.  The
  105. user can then run SYSGEN or the corresponding utility for his
  106. system to install the image.
  107.  
  108. The CFG option is described in JLCFG.MMO.  It provides for
  109. customized loading and patching of system modules.  One important
  110. application of a CFG is to write the CCP to the system tracks,
  111. banked memory, or whatever is appropriate in the host system, so
  112. that the newly-loaded CCP will thereafter be used on warm boots.
  113.  
  114. JetLDR loads a DOS package to the current bdos base (xx00h)
  115. address and executes bdos function 13 (reset disk system) before
  116. returning.  JetLDR loads a BIO package to the current bios base
  117. address (xx00) as pointed to by (0001h).  As soon as a BIO
  118. package is moved into position JetLDR executes a <<cold>> boot;
  119. no further messages or loading are attempted!
  120.  
  121. JetLDR does extensive checking for addressing conflicts before
  122. loading a package, and will not load a package too large for the
  123. current buffer size.  This will help to catch most mistakes that
  124. result from specifying the wrong absolute code package for the
  125. current system.  In the longer term, I recommend that users
  126. switch to using only ZRL files for Z-System segments containing
  127. code (i.e. everything but Z3ENV, Z3T and NDR).
  128.  
  129. As originally defined, an IOP had no way of being de-installed. 
  130. Now, before loading an IOP package, JetLDR calls the existing IOP
  131. SELECT routine with register B = 0FFh.  This value is an invalid
  132. device selection.  It is used here to enable any new IOP to
  133. execute its deinitialization routine before being overloaded by
  134. another IOP.
  135.  
  136.                File Search Options
  137.  
  138. The first record of JetLDR can be patched to configure the
  139. options for searching for files.  The patch points are identified
  140. by ascii labels, with the default values shown:
  141.  
  142. PATHF determines whether path searching will be used to locate
  143. the file(s). If the flag is 0, then the fixed DU area below will be
  144. used.  If it is 0FFH, then the other path-related flags will be
  145. used to determine how the search is performed.
  146.  
  147.     DEFB    'PATH'
  148. PATHF:    DEFB    0FFh        ; Path search flag (NO = use DU given below)
  149.  
  150. ROOTF determines whether only the root of the path will be
  151. searched.  If it is 0FFH, then only the root will be used; if it
  152. is 0, then the entire path will be searched.
  153.  
  154.     DEFB    'ROOT'
  155. ROOTF:    DEFB    0        ; NO = use entire path / YES = root only
  156.  
  157. If full path searching is selected, then SCANCUR determines
  158. whether or not to include the current directory first.
  159.  
  160.     DEFB    'SCANCUR'
  161. SCANCUR:
  162.     DEFB    0FFH        ; YES = search current DU first
  163.  
  164. If path searching is disabled, then the explicit directory
  165. specified here will be searched for files.
  166.  
  167.     DEFB    'DU'
  168. CMDDRV:    DEFB    0        ; Drive to use if not path (drive A = 0)
  169. CMDUSR:    DEFB    0        ; User to use if not path
  170.  
  171.  
  172.  
  173.  
  174.            Extended External Environment Type
  175.  
  176. JetLDR supports extended external environment types (type >=
  177. 80h).  If bit 7 of the environment type byte is set, then the
  178. following locations in the environment descriptor contain
  179. additional system data:
  180.  
  181. z3env+  08h    db    environment type
  182. z3env+  34h    dw    valid drives vector
  183.  
  184. z3env+    3Fh    dw    ccp base address
  185. z3env+     41h    db    ccp buffer size (80h records)
  186. z3env+    42h    dw    bdos base address (xx00 or xx80)
  187. z3env+    44h    db    bdos buffer size (80h records)
  188. z3env+    45h    dw    bios base address (xx00)
  189.  
  190.  
  191. JetLDR's algorithm is this:
  192.  
  193. 1. If the host environment is not type >= 80h, it assumes a
  194. standard system (bdos size 0E00h, ccp size 800h), and computes
  195. the bdos and ccp addresses from the value at 0001h.  It installs
  196. these addresses and sets environment type 80h.  It sets valid
  197. bits for all drives up to the envrionment's current 'maxdrv'.
  198.  
  199. 2. Otherwise, it preserves the environment type and system
  200. addresses, overlaying them on any ENV segment that may be
  201. loaded.
  202.  
  203. Z3PLUS, NZCOM version 2.0, and upgraded Z-tools use these system
  204. data to support advanced features.  ZCPR34, FF, and other
  205. tools use the valid-drive vector to selectively disable
  206. drives not accessible on a system.
  207.  
  208. Sharp-eyed users will note that the extended environment has
  209. "stolen" bytes originally defined for CRT1 and Printers 2 and
  210. 3.  As the Z-System has actually developed, these parameters
  211. are of very limited use, and almost no program actively
  212. refers to them.  The new CPSET tool should be used to
  213. manipulate the crt and printer parameters.
  214.  
  215. An application can determine whether an environment descriptor
  216. contains valid system data by testing bit 7 of the environment
  217. type byte (z3env+8).  By using JetLDR to load any system segment,
  218. you will automatically upgrade the running environment to type 80h,
  219. with current system parameters.  Thus, JetLDR provides a painless
  220. assembly-free method of upgrading an existing environment to
  221. be compatible with the new extended-environment tools.
  222.  
  223.  
  224.           NAMED-COMMON RELOCATION BASES
  225.  
  226. Until now, a Z-System command processor, or other code package,
  227. had to be reassembled for each system size.  A new assembly was
  228. required whenever a package buffer was enlarged or moved.  Thus,
  229. the first step in bringing up ZCPR3 on a new machine was
  230. assembling everything for the particular system's addresses. Even
  231. on "bootable disk" Z-Systems, separate sets of files were
  232. required for different sized systems.
  233.  
  234. Users no longer need to assemble source code!  Named-common ZRL
  235. files for all Z-System code packages have made assemblers
  236. obsolete for pure users.  Now, a _single_ ZCPR34.ZRL file will
  237. run on _all_ CP/M 2.2-compatible Z-Systems.  Similarly, a
  238. _single_ FCP, RCP or IOP relocatable file can be used immediately by
  239. all CP/M 2.2 and CP/M Plus Z-systems.
  240.  
  241. Named-commons, combined with the new Z3PLUS and NZCOM
  242. auto-install systems, make the Z-System truly portable, capable
  243. of running out of the box, without reassembly, on virtually any
  244. CP/M 2 or CP/M 3 system with a Z-80-compatible processor.
  245.  
  246. The remainder of this file contains technical information on
  247. using named-common references.  Additional information regarding
  248. relocatable code will be found in my "Advanced CP/M" column in The
  249. Computer Journal #33.
  250.  
  251.  
  252.          How named-common relocation bases work
  253.  
  254.  
  255. When assembly-language code is written for _absolute_ addressing,
  256. all addresses and symbols refer to fixed locations in memory.
  257.  
  258. For example, suppose the external environment's message buffer
  259. is located at 0FC00h.  The traditional ZCPR3 system would
  260. contain an equate
  261.  
  262.     z3msg equ 0FC00h
  263.  
  264. in an "include" or "maclib" file, and references to the message
  265. buffer in the command processors would be of the form
  266.  
  267.     ld    hl,z3msg
  268.  
  269. When assembled, this address (0FC00h) is hard-wired into the
  270. resulting command processor file.
  271.  
  272. Relocating assemblers permit the user to split the computer's
  273. address space into different logical segments.   For example,
  274. programs often contain separate code (CSEG) and data (DSEG)
  275. segments. The resulting REL file tags each address with a flag
  276. indicating to which segment (CSEG, DSEG, or absolute) it refers.
  277.  
  278. Modern assemblers carry this flexibility further, and permit the
  279. use of several additional segments.  Each segment is addressed
  280. relative to a specific _named relocation base_.  All references
  281. to an address in one relocation base are tagged in the REL file
  282. with an internal relocation base number.  In addition, the name
  283. of the base and its associated internal base number is included
  284. somewhere in the file.
  285.  
  286. To use this feature, we omit the previous equate and instead
  287. declare z3msg to be in a separate base, named "_MSG_", as follows
  288.  
  289.     COMMON    /_MSG_/
  290.     z3msg    equ    $
  291.  
  292. We place all of the command processor code in the code segment
  293.  
  294.     CSEG
  295. ; ...
  296.     ld    hl,z3msg    ; sample reference to z3msg
  297. ; ...
  298.  
  299. The result:  the address in the ZRL file for "z3msg" is not
  300. 0FC00h, but 0000 plus a tag to the named-common base _MSG_.
  301.  
  302. The ZRL file requires one more step of processing to become
  303. executable -- linking to the final run-time addresses for the
  304. system where it is to run.  This process is conventionally
  305. performed by a linking editor (such as SLRNK or L80):  the user
  306. supplies final addresses for each segment (CSEG, DSEG, and named
  307. commons), and the linker produces an absolute image file (COM or
  308. perhaps CIM).  
  309.  
  310. This is where JetLDR comes in.  It performs the linking step, by
  311. obtaining the final addresses _from the current external
  312. environment_ of the computer system in which it is running. 
  313. Thus, a Z-System ZRL file is tailored to the exact system that is
  314. running at the moment.
  315.  
  316.  
  317.            Other uses of Named-Common
  318.  
  319. In fact, this is also where Z3PLUS, the Z-System for CP/M Plus
  320. (CP/M 3) Z-80 computers, comes in.  I developed the named-common
  321. relocatable files approach in order to be able to use a single, new
  322. command-processor file on all CP/M Plus systems.  Inside the Z3PLUS
  323. system is a relocating loader similar to JetLDR's.
  324.  
  325. This named-common relocatable format has also been adopted by Joe
  326. Wright, for NZCOM version 2 -- the auto-install Z-System
  327. package for Z80 CP/M 2.2 computers.  Again, NZCOM has just a
  328. single ZRL file for each type of Z-System segment, regardless of
  329. system size and configuration.
  330.  
  331. Portability in ZRL format is real:  CP/M Plus users, running
  332. Z3PLUS, will be able to exchange Z-System packages (RCP, FCP) in
  333. named-common ZRL format with CP/M 2.2 systems.  (The packages
  334. themselves will have to be capable of running under both CP/M 2.2
  335. and CP/M Plus operating systems.  In general, two areas require
  336. attention:  calculation of disk space and direct use of BIOS disk
  337. functions.)
  338.  
  339. JetLDR and named commons also make it possible to create and
  340. load resident system extensions (RSXs) more easily than before.
  341. This application is described in my TCJ #34 column.
  342.  
  343.  
  344.      Writing and Assembling Code with Named-Commons
  345.  
  346. To use named-commons you need an assembler that supports additional
  347. relocation bases.  Three that do are the SLR and SLR+ (virtual
  348. memory version) and M80.
  349.  
  350. For Z-System use, JetLDR, Z3PLUS, and NZCOM have adopted the
  351. following names for system segments:
  352.  
  353. named-        Z-System segment
  354. common
  355.  
  356. _BIOS_        BIOS location
  357.  
  358. _CBIO_        CBIOS location in a NZCOM system
  359.  
  360. _SCB_        CP/M Plus system control block
  361.  
  362. _ENV_        ZCPR3 external environment descriptor
  363.  
  364. _SSTK_        shell stack
  365.  
  366. _MSG_        message buffer
  367.  
  368. _FCB_        external fcb
  369.  
  370. _MCL_        multiple command line buffer
  371.  
  372. _XSTK_        external stack
  373.  
  374. _CCP_        command processor
  375.  
  376. _RSX_        CP/M Plus RSX containing Z-system
  377.  
  378. _ID_        <<TEXT>> buffer containing identification of REL file.
  379.  
  380. These named-common declarations, along with equates for key
  381. addresses in each segment (such as z3msg) are contained in the
  382. file Z3COMMON.LIB.  The command processor, the Z3PLUS system,
  383. and specialized BIO modules require several of these named-commons;
  384. a command-processor should "include" this file.
  385.  
  386. All other Z-System code segments (RCP, FCP, IOP) should declare
  387. only the _ENV_ and _BIOS_ relocation bases.  The addresses of
  388. other system segments should be obtained from the external
  389. environment.  To modify an existing source file (e.g. for an
  390. RCP), remove any "include" or "maclib" statements that include
  391. either Z3BASE.LIB or other files with absolute system segment
  392. references.  Check the source file for any external references
  393. and convert them to named-common base references.  For example,
  394. to access the wheel byte, replace
  395.     
  396.     ld    a,(z3whl)    ;old way
  397.  
  398. with
  399.  
  400.     push    hl        ; new way
  401.     ld    hl,(z3env+29h)    ; get ptr to wheel byte
  402.     ld    a,(hl)
  403.     pop    hl
  404.  
  405.  
  406. Assemble the file to relelocatable format; to help distinguish it
  407. from an "ordinary" REL file, specify the output file type, or
  408. rename it, to type ZRL.
  409.  
  410. The file RCPSAMPL.ASM contains a small, sample RCP with H
  411. (command help), SP (disk space), and WHL (set wheel byte)
  412. commands.  It illustrates the use of the named-common method,
  413. and also provides a CP/M Plus-compatible disk space function.
  414.  
  415.  
  416.  
  417.               The _ID_ Named Common
  418.  
  419. JetLDR, Z3PLUS and NZCOM normally require that the
  420. named-common segments include only _addresses_, not actual code. 
  421. However, there is one exception: the _ID_ segment.  This
  422. relocation base is special -- it may include up to 256 bytes of
  423. nul-terminated ascii data.  Its purpose is to embed identifying
  424. information into the ZRL file, such as version number, date, and
  425. supported features.
  426.  
  427. For example, an RCP source file might contain:
  428.  
  429.     COM /_ID_/
  430.     defb    '3/26/88 vers. 1.2c 1.0K',0dh,0ah
  431.     defb    'H, SAVE, P, POKE, SP',0
  432.  
  433. JetLDR will display the id text when it loads the file.  It can
  434. also be viewed, somewhat clumsily, with a debugger or disk
  435. utility.  Perhaps someone will eventually write a simple
  436. librarian that scans ZRL files and displays their names and ID
  437. fields.
  438.  
  439.  
  440.     Loading Named-Common Routines with CMNREL
  441.  
  442. A few, specialized applications (such as Z3PLUS) need to be able
  443. to themselves load code in named-common REL format.  The
  444. CMNREL.REL (common relocation) module provides this service. 
  445. The interface requirements are detailed in a separate memo.
  446.  
  447. CMNREL itself does not restrict the use of code/data in
  448. any of the named commons, and this feature is used for
  449. specialized JetLDR applications with a CFG module, such
  450. as loading an RSX.
  451.  
  452.                Using a CFG Module
  453.  
  454. A configuration (CFG) module (in ZRL format) may be loaded as one
  455. file/member of the JetLDR command-line list.  The file is loaded
  456. to a buffer, and relocated to that address.  The resulting code
  457. is then called at key points in the JetLoad process, and may be
  458. used to customize the normal loading process of the other ZRL
  459. modules.
  460.  
  461. The CFG feature is intended to  help automate the installation of
  462. system segments/modules that require special configuration.
  463. Examples would be:  linking up DateStamper to a DOS, loading an
  464. RSX or BSX, loading a DOS requiring special patches, 
  465. loading/relocating code into a NZCOM patch area, and
  466. deinitializing/initializing an interrupt-driven bios module.
  467.  
  468. See the memo JLCFG.MMO for details.
  469. interface requirements are detailed in a separate memo.
  470.  
  471. CMNREL itself does not r