[net.micro.6809] OS-9 programs

dml@loral.UUCP (Dave Lewis) (01/02/86)

--------------------------------------

  In the hope of stimulating some activity in this newsgroup....
I have written a replacement disk device driver for Color Computer OS-9.
This module is a vast improvement over the standard issue CCDisk; it runs
double-sided disks, 40 or 80 tracks, and still reads/writes the ol' 35 track
single siders. If there is sufficient interest out there I will post the
assembly source, commented. I'm placing this program in public domain rather
than go through all the stuff needed to market it -- $$ from people finding
it useful would be much appreciated. I've written or rewritten several OS-9
utilities too, and if there's some interest out there in netland will post
those too. Can anybody use:

 A new OS9Gen that can handle double sided disks. Not finished yet but should
    only take a few days.

 An improved version of Dump that adds an option to start the listing at an
    address other than 0000 and doesn't repeat part of the second-to-last
    line's data when the last line is less than 16 bytes.

 Modifications to S. B. Goldberg's 80-column directory program (which appeared
    in Rainbow magazine a couple months ago) to make it print out the current
    date in the header and accept multiple arguments.

 A utility to split up the OS9Boot file into its component modules and store
    them in files individually. I posted this a few months ago and never
    got any response.

  Any suggestions for programs I haven't thought of, bugs to correct, etc.
will be considered. I've been writing this stuff for my own use but other
people can probably use it too.

-------------------------------
		Dave Lewis    Loral Instrumentation   San Diego

    sdcc6 ---\     gould9 --\
    ihnp4 ---->-->!sdcc3 ---->--->!loral!dml  (uucp)
    sdcrdcf -/     sdcsvax -/

 Stupidity got us into this mess -- why can't it get us out of it?
--------------------------------

dml@loral.UUCP (Dave Lewis) (02/06/86)

-------------------------------

  Here is the module separator program. It works best when the source file
is on a different drive from the destination directory -- less disk grinding.
Ensure that there are no existing files in the destination directory with the
same name as any of the modules, and that there is enough free space on the
disk. Even the smallest module takes at least 2 sectors, one for the file
descriptor and one for the data.

  I have gotten some response to my offer of a disk of programs for $10 but
had hoped for more. I am currently working on modifying NewDisk to work with
OS-9 Version 2 and will post the changes that need to be made to NewDisk
Version 1. 

*****************************************************************
*
* This sourcecode listing is released to public domain by
*
*     Dave Lewis  San Diego CA   October 16, 1985
*
* It may be copied and used for any purpose EXCEPT for sale.
*   Include this header with all copies.
*
*****************************************************************
*
* Utility to break a multiple-module file (like OS9Boot) into its
*   component modules and store them as separate files in a
*   specified or default directory.
*
* Usage:  Separate /Dn/DIRECTORY/filename /Dn/DIRECTORY
*
* Modules are stored in destination directory under their module
*   names. Ensure there are no existing files with the same name
*   as any of the modules.
*
*****************************************************************
*
	 NAM Separate
	 TTL Module separator
*
*  Copyright 1985 by Dave Lewis
*               4417 Idaho apt 4
*               San Diego CA 92116
*  Released to public domain January, 1986
*
         IFP1
	 USE /D0/DEFS/OS9Defs
	 USE /D0/DEFS/SCFDefs
	 ENDC
*
REV      EQU 1
TYPE     EQU PRGRM+OBJCT
ATTR     EQU REENT+REV
*
	 MOD SIZE,NAME,TYPE,ATTR,EXEC,STORG
NAME     FCS 'Separate'
	 FCB 1 Version number
*
INPATH   RMB 1 Input file path number
OUTPATH  RMB 1 Output file path number
FILEPTR  RMB 2 Address of output filename
EOBUFPTR RMB 2 Buffer end address
EOMEMPTR RMB 2 Data memory end address
MODSIZE  RMB 2 Bytes still to be written
MODPTR   RMB 2 Disk file position pointer
OPTHLST  RMB 60 Output pathlist buffer
DATABUF  RMB 700 Module data buffer
	 RMB 232 Reserve stack space
	 RMB 20 Reserve parameter area
STORG    EQU .
*
EXEC     STY EOMEMPTR End of allocated memory
	 LEAY DATABUF+700 Find end of data buffer
	 STY EOBUFPTR Store end address
	 CLR MODPTR Zero out module offset point-
	 CLR MODPTR+1   er; start at BOF
         LDA #READ. Access mode = read
	 OS9 I$OPEN Open input file
	 BCS SPEXIT Exit if error
	 STA INPATH Store input path number
*
	 LEAY OPTHLST,U Get pathlist buffer address
FINDPATH CMPX EOMEMPTR Test X for end of memory
	 BHS NOPATH No pathlist, use working dir
	 LDA ,X+ Get next character
	 CMPA #'/ Test for pathname start
	 BEQ FOUNDPATH
	 BSR ALPHTEST Test for letter (UC or lc)
	 BNE FINDPATH Not a letter; keep looking
FOUNDPTH LEAX -1,X Set X back to character
MOVEPATH LDA ,X+ Get next character
	 CMPA #C$CR Test character for `CR' or
	 BEQ MPEXIT   blank; either indicates
	 CMPA #C$SPAC   the end of a pathlist.
	 BEQ MPEXIT
	 STA ,Y+ Add character to outpathlist
	 CMPX EOMEMPTR Test for end of parameter
	 BLO MOVEPATH   memory; can't go past it
MPEXIT   LDA #'/ Prepare pathlist for addition
	 STA ,Y+   of a filename
*
NOPATH   STY FILEPTR Save pointer to next byte
	 BSR GETMOD Do all modules of input file
SPEXIT   OS9 F$EXIT End; pass any errors out
*
ALPHTEST TFR A,B Don't change letter in A
	 ANDB #$DF Change lowercase to uppercase
	 CMPB #'A Test for less than an `A'
	 BLO NOTALPH
	 CMPB #'Z Test for greater than a `Z'
	 BHI NOTALPH
	 CLRB Return w/Z flag set if alpha
NOTALPH  RTS
*
GETMOD   LDA INPATH Read from input file
	 LEAX DATABUF,U Point to data buffer
	 LDY #9 Read first 9 bytes (header)
	 OS9 I$READ Does not change X register
	 BCC GETMOD2 Continue if no error
	 CMPB #E$EOF Test for end-of-file error
	 BNE GMEXIT1 End of file just means you're
	 CLRB   done; other errors are real
GMEXIT1  RTS
*
GETMOD2  LDD DATABUF Load first two bytes of file
	 CMPD #M$ID12   and test for module ID
	 BEQ GETMOD3 Continue if ID good
	 COMB Set carry flag for error
	 LDB #E$BMID Set error code
	 RTS
*
GETMOD3  LDD DATABUF+2 Load module size
	 STD MODSIZE Store as variable
	 LDD DATABUF+4 Load module name offset
	 PSHS U Save U
	 LDU MODPTR Get module offset in file
	 LEAU D,U Add name offset in module
	 LDX #0 MS 16 bits of file position
	 LDA INPATH Position file pointer on
	 OS9 I$SEEK   first byte of module name
         PULS U Restore U register
	 BCC GETMOD4 Continue if no error
GMEXIT2  RTS
*
GETMOD4  LEAX DATABUF,U
	 LDY #32 Module name can't exceed
	 LDA INPATH   32 characters
	 OS9 I$READ Read module name
	 BCS GMEXIT2 Exit if error
	 LDY FILEPTR Point to destination
MOVLOOP  LDA ,X+ Move name to pathlist buffer
	 STA ,Y+
	 TSTA Test for last character --
	 BPL MOVLOOP   MSB will be set
	 ANDA #$7F Clear MSB
	 STA -1,Y Store corrected character
	 LDA #C$CR Terminate line
	 STA ,Y
	 LEAX OPTHLST,U Point to pathlist
	 LDB #$F Attributes: r w e pr
	 LDA #WRITE. Access mode
	 OS9 I$CREATE Create and open output file
	 BCS GMEXIT2 Exit if error
	 STA OUTPATH Store path number
*
	 PSHS U Save U
	 LDU MODPTR Point to start of module
	 LDX #0 MS 16 bits of file pointer
	 LDA INPATH Path number
	 OS9 I$SEEK Position file pointer
	 PULS U Restore U
	 BCS GMEXIT2 Exit if error
	 LDX MODPTR Module offset in file
	 LDD MODSIZE Length of module
	 LEAX D,X Add length to position
	 STX MODPTR Point to next module in file
*
MODLOOP  STD MODSIZE Store updated module size
	 CMPD #700 Is it bigger than buffer?
	 BLS LOADALL No, read it all
	 LDD #700 Fill the buffer
LOADALL  TFR D,Y Y contains #bytes to read
	 PSHS D Save #bytes to be read
	 LEAX DATABUF,U Point to start of buffer
	 LDA INPATH Get input path number
	 OS9 I$READ Read data
	 BCS GMEXIT3 Exit if read error
	 CMPY ,S Were intended number of bytes
	 BEQ GETMOD5   actually read?
	 COMB If not, report it as a
	 LDB #E$READ   read error
GMEXIT3  PULS Y,PC Pull and return
*
GETMOD5  LDA OUTPATH Get output path number
	 OS9 I$WRITE Write same number of bytes
	 BCS GMEXIT4 Exit if error
	 CMPY ,S Were correct number of
	 BEQ GETMOD6   bytes written?
	 COMB If not, report a write
	 LDB #E$WRITE   error
GMEXIT4  PULS Y,PC Pull and return
*
GETMOD6  LDD MODSIZE Get total size of module
	 SUBD ,S++ Subtract bytes just processed
	 BNE MODLOOP More of this module remains
	 LDA OUTPATH Get output path number
	 OS9 I$CLOSE Close output file
	 LBCC GETMOD Process next module
*
	 RTS If error, exit
	 EMOD CRC bytes
SIZE     EQU *

-------------------------------