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 / TURBOPAS / TP / UTL2 / TRUN.PZS / TRUN.PAS
Pascal/Delphi Source File  |  2000-06-30  |  5KB  |  151 lines

  1. {TRUN is a program that runs Turbo .CHN type files from CP/M.
  2.  
  3. Wait a minute...why make .CHN files at all?  Turbo, after all,
  4. generates .COM files that run directly from CP/M.
  5. The problem is: each Turbo .COM file takes a minimum of
  6. 8 kb on your disk (for the Turbo runtime library).
  7. You can save 8 kb/file by generating .CHN files instead,
  8. but now you must have a way of running these.  To do this,
  9. compile TRUN.COM, then compile your program YOURPROG.CHN.
  10. (Use the same start and end addresses for all files.)
  11. Now, from CP/M, type
  12.  
  13. A>trun d:yourprog
  14.  
  15. And you're in business.
  16.  
  17. Written by Jim Zisfein and uploaded 10/14/85 to the
  18. Blaise Pascal RCP/M, (212)-604-1930, for the public
  19. domain.   Please send comments, addressed to me, to
  20. the Blaise Pascal RCP/M.}
  21.  
  22. label boot;
  23.  
  24. const
  25.   cr=^M^J;
  26.  
  27. {If you type A>peace b:with.you at the CP/M prompt, PEACE.COM is loaded
  28. and run, and memory locations $005c to $005c+11 are loaded with information
  29. about file WITH.YOU on drive B: (ref: Lindsay J, Introduction to CP/M
  30. Assembly Language, Hayden, 1984, p.38).  This region is called the file
  31. control buffer (fcb).}
  32.  
  33.   fcb=$5c;
  34.  
  35. var
  36.   n: integer;                       {all purpose variable}
  37.   entrycode: byte;                  {returned by bdos calls #17 and #18}
  38.   chainfile: file;                  {file variable for .CHN file}
  39.   filename: string[14];             {name of .CHN file}
  40.  
  41. {The direct memory address (dma) is where CP/M will, on command, retrieve
  42. information on the disk directory (ref: Lindsay, p.43).}
  43.  
  44.   dma: array[0..127] of byte;
  45.  
  46. {Writeentry prints a directory of .CHN files on the logged disk.  "Start"
  47. is the location within the dma array where CP/M placed the file name}
  48.  
  49. procedure writeentry(start: integer);
  50. var n: byte;
  51. begin
  52.   if (char(mem[addr(dma)+start+9])='C') and
  53.     (char(mem[addr(dma)+start+10])='H') and
  54.     (char(mem[addr(dma)+start+11])='N') then begin
  55.     write('      ');
  56.     for n:=start+1 to start+8 do write(char(mem[addr(dma)+n]));
  57.     writeln;
  58.   end;
  59. end;
  60.  
  61. {TRUN - main program}
  62.  
  63. begin
  64.  
  65. {TRUN first attempts to chain to the file in the fcb (see above).
  66. This file, named "filename", consists of an optional drive name,
  67. a 1-8 character file identifier, and the .CHN extension.}
  68.  
  69. {The disk drive, specified in the CP/M command line, is indicated
  70. at fcb+0 as follows: 0=none, 1=A:, 2=B:, etc.}
  71.  
  72.   if mem[fcb]>0 then filename:=char(mem[fcb]+64)+':' else filename:='';
  73.  
  74. {The 1-8 character file name resides at fcb+1 to fcb+8.  These characters,
  75. exclusive of spaces, are added to "filename".}
  76.  
  77.   for n:=fcb+1 to fcb+8 do if mem[n]>32 then filename:=filename+char(mem[n]);
  78.  
  79. {Finally, the .CHN extension is added}
  80.  
  81.   filename:=filename+'.CHN';
  82.  
  83. {If TRUN can chain to "filename", it does so, and you're finished.}
  84.  
  85.   assign(chainfile,filename);
  86.   {$I-} chain(chainfile); {$I+}
  87.  
  88. {If it can't, e.g., if you entered A>trun <RETURN> on the command line,
  89. then you get a directory of the logged disk and a chance to try again.}
  90.  
  91.   if ioresult>0 then begin end;
  92.   write(cr,'TRUN routine to run Turbo .CHN files',cr,
  93.     '------------------------------------',cr,cr,
  94.     '  Syntax: A>TRUN B:GARBAGE  (if GARBAGE.CHN is on B:)',cr,
  95.     '      or: A>TRUN B:         (gets directory on drive B:)');
  96.  
  97. {And again, and again, until you chain the file or the file chains you.}
  98.  
  99.   repeat
  100.  
  101. {The directory is obtained by making bdos calls: #26 to set the dma address,
  102. #17 to get the first directory entry, and #18 to get subsequent directory
  103. entries.  Calls #17 and #18 return "entrycode", which indicates the
  104. directory entry offset in the dma (entrycode*32) or if no entry found
  105. (entrycode=255).}
  106.  
  107.     write(cr,cr,'Please select a Turbo .CHN file from list below,',cr,
  108.       'or drive identifier (e.g., B:) to change default drive,',cr,
  109.       'or CPM (to quit).',cr,cr);
  110.     for n:=fcb+1 to fcb+11 do mem[n]:=ord('?');
  111.     bdos(26,addr(dma));
  112.     entrycode:=bdos(17,fcb);
  113.     while entrycode<>255 do begin
  114.       writeentry(entrycode*32);
  115.       entrycode:=bdos(18);
  116.     end;
  117.  
  118. {User makes selection}
  119.  
  120.     write('      CPM',cr,cr,'Enter filename, drive identifier, or CPM --> ');
  121.     buflen:=14;
  122.     read(filename);
  123.     write(cr,cr);
  124.     for n:=1 to length(filename) do
  125.       filename[n]:=upcase(filename[n]);
  126.  
  127. {"CPM" quits}
  128.  
  129.     if filename='CPM' then goto boot;
  130.  
  131. {If drive selected, then drive # placed at fcb and deleted from filename,
  132. also disk reset (bdos #13) performed.}
  133.  
  134.     if filename[2]=':' then begin
  135.       mem[fcb]:=byte(filename[1])-64;
  136.       delete(filename,1,2);
  137.       bdos(13);
  138.     end;
  139.  
  140. {Drive prefix reinserted, .CHN suffix appended, and attempt made to chain}
  141.  
  142.     if mem[fcb]>0 then filename:=char(mem[fcb]+64)+':'+filename;
  143.     filename:=filename+'.CHN';
  144.     assign(chainfile,filename);
  145.     {$I-} chain(chainfile); {$I+}
  146.  
  147. {If at first you don't succeed...}
  148.  
  149.   until ioresult=0;
  150. boot: end.
  151.