home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug169.arc / Z80DOS2B.LBR / INSTALL.PYS / INSTALL.PYS
Text File  |  1979-12-31  |  6KB  |  166 lines

  1. program Install (input,output) ;
  2. {This program writes a submit file for assembling Z80DOS.  The submit
  3. file should be executed with EX.COM, not SUBMIT.COM}
  4.  
  5. type st14 = string[14] ;
  6.      st5 = string[5] ;
  7. var
  8.     BdosAddr, BdosFilePos, offset, Pages : integer ;
  9.     SysFileName : st14 ;
  10.  
  11. function Hex (i : integer) : st5 ;
  12.   var count, nibble : integer ;
  13.       temp : st5 ;
  14. begin
  15.   for count := 0 to 3 do begin
  16.     nibble := (i shr (count*4)) and $0F ;
  17.     if nibble <= 9
  18.       then temp [5-count] := chr(ord('0')+nibble)
  19.       else temp [5-count] := chr(ord('A')+nibble-10) ;
  20.   end ;
  21.   temp[0] := chr(5) ;
  22.   temp[1] := '0' ;
  23.   Hex := temp ;
  24. end ;
  25.  
  26. procedure Error ;
  27.  
  28. begin
  29.   writeln (^G^M) ;
  30.   writeln ('Error- submit file not created.') ;
  31.   halt ;
  32. end ;
  33.  
  34. procedure GetCpmAddr (var BdosAddr : integer) ;
  35. {This finds the bdos memory address.}
  36.  
  37. var DosAddr : integer absolute $0006 ;
  38.     BiosAddr: integer absolute $0001 ;
  39.     d, b : integer ;
  40. begin
  41.   d := DosAddr - 6 ;
  42.   b := BiosAddr - 3 ;
  43.   writeln ('Your bdos memory address is ', Hex(d),'.') ;
  44.   writeln ('Your bios memory address is ', Hex(b),'.') ;
  45.   if  (b-d) <> $0E00 then begin
  46.     writeln ('  Your bdos address is invalid.  The bdos and bios addresses') ;
  47.     writeln ('should differ by $0E00.  Yours differs by ',Hex(b-d),'.') ;
  48.     writeln ('  Remove all memory resident programs such as RAM disks, keyboard');
  49.     writeln ('redefinition programs, etc. and try again.') ;
  50.     Error ;
  51.   end
  52.     else BdosAddr := d ;
  53. end ;
  54.  
  55. procedure ScanSysFile (var BdosFilePos, Pages : integer;
  56.                        var SysFileName : st14) ;
  57.  
  58. {This finds the location of the bdos in the CP/M system image file.}
  59.  
  60. type
  61.     pseduoblock = record
  62.                     len : byte ;
  63.                     st : array [1..128] of char;
  64.                   end ;
  65. var f : file ;
  66.     block : string [128] ;
  67.     pblock : pseduoblock absolute block ;
  68.     i, bdosloc : integer ;
  69.     found,ok : boolean ;
  70.  
  71. begin
  72.   repeat
  73.     write ('Enter name of CP/M system image file <return=CPM.BIN> : ') ;
  74.     readln (SysFileName) ;
  75.     if SysFileName = '' then SysFileName := 'CPM.BIN' ;
  76.     assign (f, SysFileName) ;
  77.     {$i-}  reset (f) {$i+} ;
  78.     ok := (ioresult = 0) ;
  79.     if not ok then writeln ('Cannot find file ',SysFileName, '.  Try again.') ;
  80.   until ok ;
  81.   if odd(filesize(f))
  82.     then Pages := (filesize(f) div 2)+ 1
  83.     else Pages := filesize(f) div 2 ;
  84.   i := 0 ;
  85.   found := false ;
  86.   pblock.len := 128 ;
  87.   while not eof (f) and (not found) do begin
  88.     i := i + 1 ;
  89.     blockread (f,pblock.st,1) ;
  90.     if pos('Bdos',block) <> 0
  91.       then found := true ;
  92.   end ;
  93.   if found then begin
  94.     bdosloc := i * 128;
  95.     writeln ('Your bdos is located at ', Hex(bdosloc), ' in file ',SysFileName) ;
  96.     BdosFilePos :=bdosloc ;
  97.   end
  98.     else begin
  99.       writeln ('************************* WARNING *******************************') ;
  100.       writeln ('Can''t locate bdos in file ',SysFileName,'.  Automatic generation ') ;
  101.       writeln ('of submit file is not possible.  See Z80DOS.DOC and Z80DOS.BLD') ;
  102.       writeln (' for instructions on manual installation. ') ;
  103.       writeln ('This is probably due to ''Bdos'' message not being present in CPM.BIN.') ;
  104.       writeln ('Z80DOS/SUPRDOS or similar may allready be resident.') ;
  105.       writeln ('You should still be able to upgrade by manual installation.') ;
  106.       writeln ;
  107.  
  108.       Error ;
  109.     end ;
  110. end ;
  111.  
  112. procedure WriteSubFile ;
  113. {This writes the submit file}
  114.  
  115. var f : text ;
  116.  
  117. begin
  118.   assign (F,'GO.SUB') ;
  119.   rewrite (F) ;
  120.   writeln (F,'Z80 Z80DOS') ;
  121.   writeln (F,'DDT') ;
  122.   writeln (F,'I',SysFileName) ;
  123.   writeln (F,'R') ;
  124.   writeln (F,'F',Hex(BdosFilePos + 6),' ',Hex(BdosFilePos-1+$0E00),' 0') ;
  125.   writeln (F,'IZ80DOS.Hex') ;
  126.   writeln (F,'R',Hex(offset)) ;
  127.   writeln (F,'G0') ;
  128.   writeln (F,'SAVE ',Pages,' Z80DOS.BIN') ;
  129.   writeln (F,';Z80DOS ready to be written onto disk. To put Z80DOS') ;
  130.   writeln (F,'; on your disks, type SYSGEN Z80DOS.BIN') ;
  131.   writeln ;
  132.   writeln ('************************* WARNINGS *******************************');
  133.   writeln ('       If your system originally came with single sided drives ') ;
  134.   writeln ('drives you may have to do this SYSGEN onto a Single Sided disk.') ;
  135.   writeln ;
  136.   writeln ('If you are using SID instead of DDT you have to edit GO.SUB') ;
  137.   writeln (' before executing.') ;
  138.   writeln ;
  139.   writeln ('If you are operating under ZCPR make sure there are no Z80DOS.HEX') ;
  140.   writeln ('or Z80DOS.PRN files on the disk.') ;
  141.   writeln ('Default NO answer is taken for ''Delete File'' question.') ;
  142.   writeln ;
  143.   close (F) ;
  144.   writeln ('GO.SUB file created.') ;
  145.   assign (F,'Z80DOS.Z80') ;
  146.   rewrite (F) ;
  147.   writeln (F,'BDOS',^I,'EQU',^I,Hex(BdosAddr),'H') ;
  148.   Writeln (F,'BIOS',^I,'EQU',^I,Hex(BdosAddr + $0E00), 'H') ;
  149.   writeln (F,^I,'CHAIN',^I,'''Z80DOSA.Z80''');
  150.   close (F) ;
  151.   writeln ('Z80DOS.Z80 file created.') ;
  152. end ;
  153.  
  154. begin {main}
  155.   writeln ('This program creates a submit file for assembling Z80DOS.') ;
  156.   GetCpmAddr (BdosAddr) ;
  157.   writeln ;
  158.   ScanSysFile(BdosFilePos, Pages,SysFileName) ;
  159.   write ('Your offset is ') ;
  160.   offset :=BdosFilePos-BdosAddr ;
  161.   writeln (Hex(offset), '.') ;
  162.   WriteSubFile ;
  163.   writeln ;
  164.   writeln ('Type "EX GO" to continue Z80DOS installation. ') ;
  165. end. {main}
  166.