dml@loral.UUCP (Dave Lewis) (01/16/86)
----------------------------------------
Here is my new version of OS9Gen. It will work equally well on single-
or double-sided disks. Use it just like the old version.
If you anticipate your bootfile will run over 16 Kbytes, change the value
of BOOTSECT to more sectors than you expect your bootfile to need. This
program hunts for enough free space for the bootfile BEFORE writing it, so
you won't get any disks cluttered up with a useless, fragmented bootfile.
I have also rewritten Cobbler.
*****************************************************************
* Copyright 1985 by Dave Lewis.
*
* UUCP address is loral!dml; in S. Cal. use ihnp4!sdcc3!loral
*
* I'm releasing this program to public domain. Copy it, share
* it, but don't you DARE sell it! I worked hard on it. Include
* this header with all copies.
*
* If you like this program, send me 5 bucks to encourage me to
* write more stuff - or at least to release it. If you send
* me 10 bucks I'll send you a good (Dysan) double side disk
* formatted 35 track single side with both sourcecode and
* executable binary files of the following:
*
* - NewDisk -- single or double sided disks, any number of
* tracks within reason, step rate set in device descriptor
* - OS9Gen -- rewritten version that automatically senses for
* single/double sided disk and puts all the boot data in
* the right places. Also enters the kernel file in the
* root directory, which makes Dcheck happy.
* - Separate -- breaks up your bootfile into its component
* modules for modification. Replace or remove any module
* individually.
* - Diskdescr -- sourcecode for an OS-9 disk device descriptor
* with EQUates at the beginning for step rate, #tracks,
* and single or double sided.
* - Documentation and procedure files for installing all of
* the above in most common system configurations.
* - Other stuff I've written that you may find useful.
*
* Send to:
* Dave Lewis
* 4417 Idaho Apt. 4
* San Diego CA 92116
*****************************************************************
*
* OS9Gen2 copyright 1986 by Dave Lewis
* Released to public domain January, 1986
*
* Rewritten OS9Gen utility for single or double sided system
* disks.
*
* Usage: OS9Gen /Dn
* reads filenames from stdin, combining files into OS9Boot
* file on target disk
*
*****************************************************************
*
NAM OS9Gen
TTL System disk generator
*
* Copyright 1986 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
USE /D0/DEFS/RBFDefs
ENDC
*
REV EQU 2
TYPE EQU PRGRM+OBJCT
ATTR EQU REENT+REV
VERSION EQU 1 Version of OS-9 to generate
BOOTSECT EQU 64 Free space to hunt for
*
IFEQ VERSION-2
KERNSECT EQU 18 Number of sectors for kernel
KERNADDR EQU $ED00 Address of kernel in memory
KERNSIZE EQU $1200 Size of kernel
ELSE
KERNSECT EQU 15 Number of sectors for kernel
KERNADDR EQU $F000 Kernel address in memory
KERNSIZE EQU $F00 Size of kernel file
ENDC
*
MOD SIZE,NAME,TYPE,ATTR,EXEC,STORG
NAME FCS 'OS9Gen' Still the same module name
FCB $01 Version number
*
MEMPTR RMB 2 Memory origin pointer
DEVPATH RMB 1 /Dn@ path number
TEMPPATH RMB 1 Temporary file path number
SRCPTHNM RMB 1 Source file path number
DBLSIDE RMB 1 Nonzero for double sided disk
TRACKNUM RMB 1 Current track number
FREESECT RMB 1 Free sectors to find
SECTOR.N RMB 1 Sector number in track
BOOTSIZE RMB 2 Cumulative size of bootfile
SEGMENT RMB 2 Pointer to segment entry
TRACKEND RMB 2 Bytes left in current track
DEVICEND RMB 2 End of device name
FDS.LSN RMB 3 File Descriptor sector #
PATHBUF RMB 32 Pathlist buffer
PATHOPTS RMB 20 File path options buffer
PTHOPTFD RMB 30 File Descriptor sector number
GPBUFFER RMB 16 Main data buffer - 1Kbyte
SEG1PTR RMB 10 Segment 1 LSN of FD
MOREBUFR RMB 1000 The rest of GPBUFFER
RMB 280 Stack space
RMB 120 Parameter area
STORG EQU .
*
USEOS9G FCB C$LF
FCC 'Use (CAUTION): OS9GEN </devname>'
FCB C$LF
FCC ' ..reads (std input) pathnames '
FCB C$LF
FCC 'until EOF, combining files'
FCB C$LF
FCC 'into new OS9Boot file.'
FCB C$CR
CANTFIND FCC "Can't find: "
FCB C$CR
KERNERR FCB C$LF
FCC 'Error writing kernel track'
FCB C$CR
TK34NFRE FCB C$LF
FCC 'Warning - file(s) or kernel'
FCB C$LF
FCC 'present on track 34 - this'
FCB C$LF
FCC 'track not rewritten.'
FCB C$CR
FRAGERR FCB C$LF
FCC 'ERROR - not enough contiguous '
FCB C$LF
FCC 'free space for OS9boot file'
FCB C$CR
KERNELFN FCC 'Kernel '
FCB 0
OS9BOOT FCC 'OS9Boot'
FCB C$CR,0
*
EXEC STU MEMPTR Save start of memory pointer
LDA #'/ Test first character of args
CMPA ,X for device name
BNE PARAMERR Error if not a device name
OS9 F$PRSNAM Parse the name
BCS PARAMERR Error if name is bad
LDA #'/ Test for more of pathlist
CMPA ,Y
BNE MOVEARG Move device name to buffer
PARAMERR LEAX USEOS9G,PCR Point to error string
LBRA COMPLAIN Write out error and quit
*
MOVEARG LEAY PATHBUF,U Point to pathlist buffer
MOVLOOP1 STA ,Y+ Move device name into the
LDA ,X+ pathlist buffer
DECB Length from PARSE NAME call
BPL MOVLOOP1 Move the whole thing
STY DEVICEND Save end of device name
LDD #$4020 '@ in A and C$SPACE in B
STD ,Y Store it after device name
LEAX PATHBUF,U Point to pathname buffer
LDA #UPDAT. Access mode: read and write
OS9 I$OPEN Open the entire disk
BCS PARAMERR Error if can't open
STA DEVPATH Save path number
*
LBSR READSECT Read identification sector
LDA SEG1PTR Get disk format byte
ANDA #1 Bit zero is set if disk
STA DBLSIDE is double sided
LBSR READSECT Read allocation sector #1
LDX #$264 Track 34, sector 1
TST DBLSIDE If disk is single sided, use
BEQ T34FREE1 logical sector #264
LDX #$4C8 Track 68, sector 1
T34FREE1 STX TRACKEND Save logical sector number
LDA #KERNSECT Look for free sectors
STA FREESECT Set sector counter
T34FREE2 LBSR SECTINFO Identify sector
BITA ,Y Test for free
LBNE KERNWARN Warn if not free
ORA ,Y Mark sector as allocated
STA ,Y Store updated byte
LEAX 1,X Count sector just tested
DEC FREESECT Test for done
BNE T34FREE2 Continue until done
*
LDX TRACKEND Get logical sector number
LBSR SEEKSECT Seek to start of sector
LDX #KERNADDR Point to kernel in memory
LDY #KERNSIZE Bytes to be written
OS9 I$WRITE Write kernel data
BCS ERR.KERN Quit if error
*
LDX #1 Seek to first sector of
LBSR SEEKSECT disk allocation map
LBSR WRITSECT Write updated allocation map
LEAY KERNELFN,PCR Point to kernel file name
LDX DEVICEND Point to end of device name
LDA #'/ Prepare to extend pathlist
MOVLOOP2 STA ,X+ Move `Kernel ' into pathlist
LDA ,Y+ buffer
BNE MOVLOOP2 Stop at the null
LBSR NAMEFILE Make a file descriptor
LDX FDS.LSN+1 Seek to start of file
BSR SEEKSECT descriptor sector
LEAX PATHOPTS,U Point to buffer
LDY #32 Bytes to be read
LDA DEVPATH Get path number
OS9 I$READ Read part of descriptor
BCS ERR.KERN Quit if error
*
LDD TRACKEND Get kernel file sector number
STD PATHOPTS+17 First segment sector number
LDD #KERNSIZE Size of Kernel file
STD PATHOPTS+11 File size
STA PTHOPTFD Size of first segment
LDX FDS.LSN+1 File descriptor sector number
BSR SEEKSECT Seek to start of sector
LEAX PATHOPTS,U Point to descriptor data
LDY #32 Bytes to write
LDA DEVPATH Path number
OS9 I$WRITE Set up kernel file descriptor
LBCC MAIN2 Continue if no error
ERR.KERN LEAX KERNERR,PCR Point to error string
COMPLAIN LDY #255 Real long strings
FILERROR LDA #2 Outpath: stderr
OS9 I$WRITLN Write out the message
QUIT OS9 F$EXIT Quit
*
READSECT LDA DEVPATH Get /Dn@ path number
LDY #$100 One sector
READFILE LEAX GPBUFFER,U Point to data buffer
OS9 I$READ Read the data
BCS QUIT.SUB Quit if error
RTS
*
SECTINFO TFR X,D Get sector number
LSRA Divide sector number by 8
RORB to get byte offset into
LSRA sector allocation map
RORB
LSRA
RORB
LEAY GPBUFFER,U Point to allocation map
LEAY D,Y Offset into allocation map
CLR ,-S Push a zero on the stack
TFR X,D Get sector number
FINDTRAK INC ,S Increment track number
SUBD #18 Subtract sectors in one track
BPL FINDTRAK Loop until negative
ADDB #18 Restore sector number
DEC ,S Compensate for extra count
STB SECTOR.N Store sector number
TFR X,D Get sector number again
LDA #$80 Bit 7 set
ANDB #7 Mask off upper 5 bits
BEQ BITSEVEN Skip loop if zero
FINDBIT LSRA Indicate bit corresponding
DECB to current sector
BNE FINDBIT
BITSEVEN PULS B,PC Pull and return
*
SEEKSECT CLR ,-S Push a zero on stack
PSHS X Push logical sector number
CLR ,-S Push a zero on stack
PULS X,U Pull file position pointer
LDA DEVPATH Get /Dn@ path number
OS9 I$SEEK Position file pointer
LDU MEMPTR Restore U!
BCC RETURN Return if no error
QUIT.SUB LEAS 2,S Quit from within a subroutine
BRA QUIT
*
NAMEFILE LEAX PATHBUF,U Point to pathname buffer
LDD #$203 Access: write Attribs: r w
OS9 I$CREATE Create file
BCS QUIT.SUB Quit if error
STA TEMPPATH Save path number
LEAX PATHOPTS,U Point to path options buffer
LDB #SS.OPT Get Options code
OS9 I$GETSTT Read path descriptor options
BCS QUIT.SUB Quit if error
LDA PTHOPTFD Get LSN of File Descriptor
STA FDS.LSN Store it
LDD PTHOPTFD+1 There's three bytes so
STD FDS.LSN+1 get all of them
LDA TEMPPATH Get path number
OS9 I$CLOSE Close the file
BCS QUIT.SUB Quit if error
LDX FDS.LSN+1 Get logical sector number of
BSR SECTINFO file descriptor just
ORA ,Y created and mark that
STA ,Y sector as allocated
RETURN RTS
*
WRITSECT LDY #$100 Bytes in one sector
WRITFILE LEAX GPBUFFER,U Point to data buffer
LDA DEVPATH Get /Dn@ path number
OS9 I$WRITE Write the data
BCS QUIT.SUB Quit if error
RTS
*
KERNWARN LEAX TK34NFRE,PCR Point to warning message
LDY #255 Long string
LDA #2 Output path: stderr
OS9 I$WRITLN Print out message
LBCS QUIT Quit if error
*
MAIN2 LDX DEVICEND Point to end of device name
LEAY OS9BOOT,PCR Point to `OS9Boot' string
LDA #'/ Prepare to extend pathlist
MOVLOOP3 STA ,X+ Move `OS9Boot' into
LDA ,Y+ pathlist buffer
BNE MOVLOOP3 String terminated with NULL
LEAX PATHBUF,U Point to start of buffer
OS9 I$DELETE Delete any existing bootfile
BSR NAMEFILE Create a file descriptor
*
LDX #0 Start at sector 0
FINDFREE LEAY PATHOPTS,U Point to segment list area
LDB #49 Number of bytes -1
WIPELOOP CLR B,Y Clear out segment list
DECB Count one byte
BPL WIPELOOP Continue through zero
LDB #BOOTSECT Number of free sectors to find
STB FREESECT Set free sector counter
FINDFR.2 STY SEGMENT Save pointer to segment
STX 1,Y Store first sector number
FINDFR.3 LBSR SECTINFO Get sector data
CMPB #113 Has it reached track 113?
BHS NOTFREE No free block found if so
LEAX 1,X Point to next sector
TST DBLSIDE Is disk double sided?
BEQ FINDFR.4 Continue if not
BITB #1 Was it an odd track number?
BEQ FINDFR.4 Continue if not
LEAX 17,X Skip the odd tracks
LDY SEGMENT Get segment pointer
LEAY 5,Y Point to next segment
BRA FINDFR.2 Start a new segment
*
FINDFR.4 BITA ,Y Is current sector allocated?
BNE FINDFREE Start over if it is
LDY SEGMENT Point to current segment
INC 4,Y Add one sector to size
DEC FREESECT Count another free sector
BNE FINDFR.3 Repeat if not done
*
LEAX PATHOPTS,U Point to first segment entry
STX SEGMENT Store segment pointer
CLRA Initialize BOOTSIZE to zero
CLRB
STD BOOTSIZE
LDA 4,X Get size of first segment
STD TRACKEND Store size limit
LDX 1,X Get logical sector number
LBSR SEEKSECT Seek to start of segment
BRA READSRC Go get first sourcefile name
*
NOTFREE LEAX FRAGERR,PCR Point to error message
COMPL.2 LBRA COMPLAIN Write message and quit
*
MAKOS9.1 OS9 I$OPEN Open source file
STA SRCPTHNM Save path number
BCC MAKOS9.2 Continue if no error
CMPB #E$PNNF Error = file not found?
BNE QUIT.2 Something else; quit
LEAX CANTFIND,PCR Point to message string
LDY #12 It's 12 characters long
LDA #2 Outpath: stderr
OS9 I$WRITLN Start the error message
LEAX GPBUFFER,U Point to offending filename
BRA COMPL.2 Tell the world about it
*
MAKOS9.2 LDD #$400 Size of GPBUFFER
CMPD TRACKEND Compare to segment size limit
BLS MAKOS9.3 Plenty of room, use full size
LDD TRACKEND Don't go over size limit
MAKOS9.3 TFR D,Y Number of bytes to read
LDA SRCPTHNM Get path number
LEAX GPBUFFER,U Point to data buffer
OS9 I$READ Read the data
BCC MAKOS9.4 Continue if no error
CMPB #E$EOF Is it end of file?
BEQ MAKOS9.5 Close source file
QUIT.2 COMA Make sure carry is set
OS9 F$EXIT Exit with error
*
MAKOS9.4 LBSR WRITFILE Write it on destination disk
PSHS Y Save number of bytes written
LDD BOOTSIZE Get total size of bootfile
ADDD ,S Add bytes just written
STD BOOTSIZE Store updated bootsize
LDD TRACKEND Get size left in segment
SUBD ,S++ Subtract bytes just used
STD TRACKEND Store updated segment size
BNE MAKOS9.2 Continue until out of space
*
LDX SEGMENT Get segment pointer
LEAX 5,X Point to next segment
STX SEGMENT Store updated segment pointer
LDA 4,X Get segment size limit
CLRB Convert sectors to bytes
STD TRACKEND Store size variable
LDX 1,X Get logical sector number
LBSR SEEKSECT Seek to start of segment
BRA MAKOS9.2 Start writing on new segment
*
MAKOS9.5 LDA SRCPTHNM Get source path number
OS9 I$CLOSE Close the file
READSRC LEAX GPBUFFER,U Point to data buffer
LDY #255 Maximum bytes to read
CLRA Inpath: stdin
OS9 I$READLN Read next filename
BCC MAKOS9.6 Continue if no error
CMPB #E$EOF End of file error?
BEQ LASTSEG Go set last segment size
BRA QUIT.2 Other error, quit
*
MAKOS9.6 LDA ,X Get first character
CMPA #C$CR Is it a <CR>?
BNE MAKOS9.1 Use the file if not
*
LASTSEG LDY SEGMENT Point to last segment
LDA 4,Y Get segment size limit
CLRB Convert sectors to bytes
SUBD TRACKEND Subtract unused capacity
ADDD #$FF Count last partial sector
STA 4,Y Store size used
BNE SETSEG.3 Continue if not zero
SETSEG.1 LDB #4 Clear out segment data
SETSEG.2 CLR B,Y
DECB
BPL SETSEG.2 Do all the bytes
SETSEG.3 LEAY 5,Y Point to next segment
TST 4,Y Test segment size
BNE SETSEG.1 Clear it if not zero
*
LDX #0 Disk identification sector
LBSR SEEKSECT Set file pointer
LBSR READSECT Read the sector
LDD BOOTSIZE Get total size of bootfile
STD DD.BSZ,X Store bootfile size
LDD PATHOPTS+1 Get bootfile first sector #
TST DBLSIDE Is disk single sided?
BEQ SETBOOT Sector number correct if so
*
PSHS D Save raw sector number
CLR ,-S Push a zero on stack
SECTLOOP INC ,S Increment track counter
SUBD #36 Subtract sectors in 2 tracks
BPL SECTLOOP Continue until negative
PULS B Get number of tracks
DECB Compensate for extra count
LDA #18 Find number of unused sectors
MUL in odd-numbered tracks
PSHS D Put number on stack
LDD 2,S Get raw sector number
SUBD ,S++ Subtract skipped sectors
LEAS 2,S Adjust stack
*
SETBOOT STD DD.BT+1,X Store sector number
LDX #0 Identification sector number
LBSR SEEKSECT Point to start of sector
LBSR WRITSECT Write updated data to disk
LBSR READSECT Read disk allocation sector
LEAY PATHOPTS,U Point to first segment
ALLOC.1 STY SEGMENT Store segment pointer
LDX 1,Y Get first sector of segment
LDA 4,Y Get segment size
STA TRACKEND Save total segment size
ALLOC.2 LBSR SECTINFO Point to allocation bit
LEAX 1,X Advance to next sector
ORA ,Y Mark sector as allocated
STA ,Y Store updated byte
DEC TRACKEND Count off sector
BNE ALLOC.2 Repeat until end of segment
LDY SEGMENT Get segment pointer
LEAY 5,Y Point to next segment
TST 4,Y Test segment size
BNE ALLOC.1 Mark sectors if size not zero
*
LDX #1 Point to allocation sector
LBSR SEEKSECT Seek to start of sector
LBSR WRITSECT Write updated allocation data
LDX FDS.LSN+1 Point to file descriptor
LBSR SEEKSECT Seek to start of sector
LBSR READSECT Read file descriptor sector
LDD BOOTSIZE Get bootfile size
STD GPBUFFER+11 Store in file descriptor
LEAX PATHOPTS,U Point to segment list
LEAY SEG1PTR,U Point into file descriptor
LDB #50 Size of segment list
MOVLOOP4 LDA ,X+ Move bootfile segment list
STA ,Y+ into appropriate place
DECB in the file descriptor
BNE MOVLOOP4 Move it all
LDX FDS.LSN+1 Point to file descriptor
LBSR SEEKSECT Seek to start of sector
LBSR WRITSECT Write updated descriptor
OS9 F$EXIT Done; quit
*
EMOD CRC bytes
SIZE EQU *
END
-------------------------------
Dave Lewis Loral Instrumentation San Diego
sdcc6 ---\ gould9 --\
ihnp4 ---->-->!sdcc3 ---->--->!loral!dml (uucp)
sdcrdcf -/ sdcsvax -/
A portable program is one which exhibits the same bugs on many
different computers.dml@loral.UUCP (Dave Lewis) (01/20/86)
-------------------------------
There are a few wrong symbols in the posted version of OS9Gen2. At the
beginning, the Version 2 kernel equates should be:
IFEQ VERSION-2
KERNSECT EQU 16 Number of sectors required by kernel file
KERNADDR EQU $EF00 Address of kernel in memory
KERNSIZE EQU $1000 Size of kernel file
ELSE
The stuff after ELSE is for Version 1 and is OK as is. NewDisk does not
work under Version 2. The V2 CCDisk uses the new virtual interrupt scheme
to time-out the disk spindle motors; I tried sticking the code into NewDisk
but it locked up the system after the first access. I'll need the Version 2
system call documentation to do anything further, and the local Radio Shack
professes total ignorance when asked about it.
The newsgroup is silent once more. These programs are the only traffic
I've seen in two weeks. Where is everybody?
-------------------------------
Dave Lewis Loral Instrumentation San Diego
sdcc6 ---\ gould9 --\
ihnp4 ---->-->!sdcc3 ---->--->!loral!dml (uucp)
sdcrdcf -/ sdcsvax -/
A portable program is one that will exhibit the same bugs on many
different computers.
-------------------------------jimomura@lsuc.UUCP (Jim Omura) (01/24/86)
Dave asked what's going on. Well, OS-9 messages should now go to
the moderators of 'mod.os.os9'. You may have missed the announcement
somehow, but you should have had the new mod group Arriving. Messages
should go to 'nyit!os9'.
Cheers! -- Jim O.
--
James Omura, Barrister & Solicitor, Toronto
ihnp4!utzoo!lsuc!jimomura
Byte Information eXchange: jimomura
(416) 652-3880