# HG changeset patch # User roug # Date 1049397916 0 # Node ID a1464c5aedcbc618985011c1a78dd4fa31028211 # Parent 01e088e150514b70f337673bed1420cdf3264940 Added cross references diff -r 01e088e15051 -r a1464c5aedcb docs/os9sysprog/errorcodes.appendix --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/docs/os9sysprog/errorcodes.appendix Thu Apr 03 19:25:16 2003 +0000 @@ -0,0 +1,329 @@ + +Error Codes +
+OS-9 Error Codes + +The error codes are shown both in hexadecimal (first column) and +decimal (second column). Error codes other than those listed are +generated by programming languages or user programs. + + + + + + + + +HEX +DEC + + + + + + $C8 + 200 + PATH TABLE FULL + - The file cannot be opened because + the system path table is currently full. + + $C9 + 201 + ILLEGAL PATH NUMBER + - Number too large or for non-existant path. + + $CA + 202 + INTERRUPT POLLING TABLE FULL + + $CB + 203 + ILLEGAL MODE + - attempt to perform I/O function of which the device or file is incapable. + + $CC + 204 + DEVICE TABLE FULL + - Can't add another device + + $CD + 205 + ILLEGAL MODULE HEADER + - module not loaded because its + sync code, header parity, or CRC is incorrect. + + $CE + 206 + MODULE DIRECTORY FULL + - Can't add another module + + $CF + 207 + MEMORY FULL + - Level One: not enough contiquous RAM free. + Level Two: process address space full + + $D0 + 208 + ILLEGAL SERVICE REQUEST + - System call had an illegal code number + + $D1 + 209 + MODULE BUSY + - non-sharable module is in use by another process. + + $D2 + 210 + BOUNDARY ERROR + - Memory allocation or deallocation request not on a page boundary. + + $D3 + 211 + END OF FILE + - End of file encountered on read. + + $D4 + 212 + RETURNING NON-ALLOCATED MEMORY + - (NOT YOUR MEMORY) + attempted to deallocate memory not previously assigned. + + $D5 + 213 + NON-EXISTING SEGMENT + - device has damaged file structure. + + $D6 + 214 + NO PERMISSION + - file attributes do not permit access requested. + + $D7 + 215 + BAD PATH NAME + - syntax error in pathlist (illegal character, etc.). + + $D8 + 216 + PATH NAME NOT FOUND + - can't find pathlist specified. + + $D9 + 217 + SEGMENT LIST FULL + - file is too fragmented to be expanded further. + + $DA + 218 + FILE ALREADY EXISTS + - file name already appears in current directory. + + $DB + 219 + ILLEGAL BLOCK ADDRESS + - device's file structure has been damaged. + + $DC + 220 + ILLEGAL BLOCK SIZE + - device's file structure has been damaged. + + $DD + 221 + MODULE NOT FOUND + - request for link to module not found in directory. + + $DE + 222 + SECTOR OUT OF RANGE + - device file structure damaged or +incorrectly formatted. + + $DF + 223 + SUICIDE ATTEMPT + - request to return memory where your stack is located. + + $E0 + 224 + ILLEGAL PROCESS NUMBER + - no such process exists. + + $E2 + 226 + NO CHILDREN + - can't wait because process has no children. + + $E3 + 227 + ILLEGAL SWI CODE + - must be 1 to 3. + + $E4 + 228 + PROCESS ABORTED + - process aborted by signal code 2. + + $E5 + 229 + PROCESS TABLE FULL + - can't fork now. + + $E6 + 230 + ILLEGAL PARAMETER AREA + - high and low bounds passed in fork call are incorrect. + + $E7 + 231 + KNOWN MODULE + - for internal use only. + + $E8 + 232 + INCORRECT MODULE CRC + - module has bad CRC value. + + $E9 + 233 + SIGNAL ERROR + - receiving process has previous + unprocessed signal pending. + + $EA + 234 + NON-EXISTENT MODULE + - unable to locate module. + + $EB + 235 + BAD NAME + - illegal name syntax. + + $EC + 236 + BAD HEADER + - module header parity incorrect + + $ED + 237 + RAM FULL + - no free system RAM available at this time + + $EE + 238 + UNKNOWN PROCESS ID + - incorrect process ID number + + $EF + 239 + NO TASK NUMBER AVAILABLE + - all task numbers in use + + + +
+ +
+Device Driver/Hardware Errors + +The following error codes are generated by I/O device drivers, and +are somewhat hardware dependent. Consult manufacturer's hardware +manual for more details. + + + + + + + + +HEX +DEC + + + + + + $F0 + 240 + UNIT ERROR + - device unit does not exist + + $F1 + 241 + SECTOR ERROR + - sector number is out of range. + + $F2 + 242 + WRITE PROTECT + - device is write protected. + + $F3 + 243 + CRC ERROR + - CRC error on read or write verify + + $F4 + 244 + READ ERROR + - Data transfer error during disk read + operation, or SCF (terminal) input buffer overrun. + + $F5 + 245 + WRITE ERROR + - hardware error during disk write operation. + + $F6 + 246 + NOT READY + - device has "not ready" status. + + $F7 + 247 + SEEK ERROR + - physical seek to non-existant sector. + + $F8 + 248 + MEDIA FULL + - insufficient free space on media. + + $F9 + 249 + WRONG TYPE + - attempt to read incompatible media (i.e. + attempt to read double-side disk on single-side drive) + + $FA + 250 + DEVICE BUSY + - non-sharable device is in use + + $FB + 251 + DISK ID CHANGE + - Media was changed with files open + + $FC + 252 + RECORD IS LOCKED-OUT + - Another process is accessing the requested record. + + $FD + 253 + NON-SHARABLE FILE BUSY + - Another process is accessing the requested file. + + $FE + 254 + I/O DEADLOCK ERROR + - Two processes are attempting to use the same two disk areas simultaneously. + + + +
+
diff -r 01e088e15051 -r a1464c5aedcb docs/os9sysprog/os9sysprog.docbook --- a/docs/os9sysprog/os9sysprog.docbook Wed Apr 02 14:48:58 2003 +0000 +++ b/docs/os9sysprog/os9sysprog.docbook Thu Apr 03 19:25:16 2003 +0000 @@ -1,6 +1,8 @@ + "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [ + + ]> @@ -274,7 +276,7 @@ for each specific type of I/O controller regardless of how many controllers the system uses. -One important component not shown is the Shell., which is the +One important component not shown is the shell, which is the command interpreter. It is technically a program and not part of the operating system itself, and is described fully in the OS-9 Users Manual. @@ -329,7 +331,7 @@ other service request functions including interprocess control and timekeeping. -A system-wide assembly languaqe equate file called "OS9Defs" defines +A system-wide assembly languaqe equate file called OS9Defs defines symbolic names for all service requests. This file is included when assembling hand-written or compiler-generated code. The OS-9 Assembler has a built-in macro to generate system calls, for example: @@ -353,7 +355,7 @@ I/O REQUESTS perform various input/output functions. Requests of this type are passed by the kernel to IOMAN for processing. The symbolic names for this category have a "I$" prefix, for example, -the "read" service request is called "I$Read". +the "read" service request is called . FUNCTION REQUESTS perform memory management, multiprogramming, and miscellaneous functions. Most are processed by the kernel. The @@ -491,7 +493,8 @@ Process Creation -New processes are created when an existing process executes a "fork" +New processes are created when an existing process executes a + service request. Its main argument is the name of the program module (called the "primary module") that the new process is to initially execute. OS-9 first attempts to find the module in the @@ -510,13 +513,15 @@ The next step in the creation of a new process is allocation of data storage (RAM) memory for the process. The primary module's -header contains a storage size value that is used unless the "fork" +header contains a storage size value that is used unless the + system call requested an optionally larger size. OS-9 then attempts to allocate a CONTIGUOUS memory area of this size from the free memory space. If any of the previous steps cannot be performed, creation of the -new process is aborted, and the process that originated the "fork" +new process is aborted, and the process that originated the + is informed of the error. Otherwise, the new process is added to the active process queue for execution scheduling. @@ -527,7 +532,7 @@ is used to identify all processes and files belonging to a particular user. The user ID is inherited from the parent process. -Processes terminate when they execute an "EXIT" system service +Processes terminate when they execute an system service request, or when they receive fatal signals. The process termination closes any open paths, deallocates its memory, and unlinks its primary module. @@ -567,7 +572,7 @@ The Wait State -This state is entered when a process executes a WAIT system +This state is entered when a process executes a system service request. The process remains suspended until the death of any of its descendant processes, or, until it receives a signal. @@ -575,7 +580,7 @@ The Sleeping State -This state is entered when a process executes a SLEEP service +This state is entered when a process executes a service request, which specifies a time interval. (a specific number of ticks) for which the process is to remain suspended. The process remains asleep until the specified time has elapsed, or until a @@ -655,13 +660,13 @@ What happens next depends on whether or not the process had previously set up a "signal trap" (signal service routine) by -executing an INTERCEPT service request. If it had not, the process is +executing an service request. If it had not, the process is immediately aborted. It is also aborted if the signal code is zero. The abort will be deferred if the process is in system mode: the process dies upon its return to user state. If a signal intercept trap has been set up, the process resumes -execution at the address given in the INTERCEPT service request. The +execution at the address given in the service request. The signal code is passed to this routine, which should terminate with an RTI instruction to resume normal execution of the process. @@ -745,7 +750,7 @@ specific service routine in the kernel. The SWI, SWI2, and SWI3 vectors point to specific routines which in turn read the corresponding pseudo vector from the process' process descriptor and -dispatch to it. This is why the F$SSWI service request to be local to +dispatch to it. This is why the service request to be local to a process since it only changes a pseudo vector in the process descriptor. The IRQ routine points directly to the IRQ polling system, or to it indirectly via the real-time clock device service @@ -917,17 +922,19 @@ The device's static storage address and service routine address is read from the table and executed. ---> NOTE: The interrupt service routine should terminate with -an an RTS, not an RTI instruction. + +The interrupt service routine should terminate with +an an RTS, not an RTI instruction. Entries can be made to the IRQ polling table by use of a special -OS-9 service request called "F$IRQ". This is a priviledged +OS-9 service request called . This is a priviledged service request that can be executed only when OS-9 is in System Mode (which is the case when device drivers are executed). ---> NOTE: The actual code for the interrupt polling system is + +The actual code for the interrupt polling system is located in the IOMAN module. The kernel P1 and P2 modules contain -the physical interrupt processing routines. +the physical interrupt processing routines. @@ -1147,8 +1154,10 @@ $B,$C = Permanent Storage Requirement. This is the minimum number of bytes of data storage required to run. This is the number used by - FORK and CHAIN to allocate a process' data area. - If the module will not be directly executed by a CHAIN or FORK + and + to allocate a process' data area. + If the module will not be directly executed by a + or service request (for instance a subroutine package), this entry is not used by OS-9. It is commonly used to specify the maximum stack size required by reentrant subroutine modules. The calling @@ -1310,7 +1319,7 @@ having the device name given (or implied) in the pathlist. This module is the device's descriptor, which contains the names of the device driver and file manager for the device. This information is -saved by IOMAN so subsequent system call can be routed to these +saved by IOMAN so subsequent system calls can be routed to these modules. @@ -1435,7 +1444,8 @@ The initialization table is copied into the "option section" of the path descriptor when a path to the device is opened. The values in this table may be used to define the operating parameters -that are changeable by the OS9 I$GetStt and I$SetStt service requests. +that are changeable by the OS9 +and service requests. For example, a terminal's initialization parameters define which control characters are used for backspace, delete, etc. The maximum size of initialization table which may be used is 32 bytes. If the @@ -1588,10 +1598,12 @@ parameters for the file or device. These variables are initialized at the time the path is opened by copying the initialization table contained in the device descriptor module, and can be altered later -by user programs by means of the GETSTAT and SETSTAT system calls. +by user programs by means of the +and system calls. These two sections are defined each file manager's in the assembly -language equate file (SCFDefs for SCFMAN and RBFDefs for RBFMAN). +language equate file (SCFDefs for SCFMAN and +RBFDefs for RBFMAN). @@ -1652,7 +1664,7 @@ Logical sector number zero contains a description of the physical and logical characteristics of the volume. These are established by -the "format" command program when the media is initialized, the +the format command program when the media is initialized, the table below gives the OS-9 mnemonic name, byte address, size, and description of each value stored in this sector. @@ -1772,7 +1784,7 @@ - + Disk Allocation Map Sector One sector (usually LSN 1) of the disk is used for the "disk @@ -1791,7 +1803,7 @@ Each bit is cleared if the corresponding cluster is available for allocation, or set if the sector is already allocated, non-existent, or physically defective. The bitmap is initially created by the -"format" utility program. +format utility program. @@ -1887,7 +1899,7 @@ each of which can bold the name and LSN of a single regular or directory file. -Each directory entry is 32 b,ytes long, consisting of 29 bytes for +Each directory entry is 32 bytes long, consisting of 29 bytes for the file name followed by a three byte logical sector number of the file's descriptor sector. The file name is left-justified in the field with the sign bit of the last character set. Unused entries @@ -2019,7 +2031,7 @@ Address of drive table - RBFMAN Option Section Definitions (Copied from dev descriptor) + RBFMAN Option Section Definitions (Copied from device descriptor) @@ -2143,7 +2155,8 @@ managers, the second and third sections are defined by RBFMAN and RBFMAN-type device drivers. The option section of the path descriptor contains many device operating parameters which may be read and/or -written by the OS9 I$GetStt and I$SetStt service requests. This section +written by the OS9 +and service requests. This section is initialized by IOMAN which copies the initialization table of the device descriptor into the option section of the path descriptor when a path to a device is opened. Any values not determined by this table @@ -2390,8 +2403,10 @@ -NOTE: V.PAGE through V.USER are predefined in the OS9DEFS file. -V.NDRV, DRVBEG, DRVMEM are predefined in the RBFDEFS file. +NOTE: V.PAGE through V.USER are predefined in the +OS9Defs file. +V.NDRV, DRVBEG, DRVMEM are predefined in the RBFDefs +file. V.PAGE, V.PORT These three bytes are defined by IOMAN as the 24-bit device address. @@ -2684,7 +2699,8 @@ - If disk writes are verified, use the F$SRqMem service, request + If disk writes are verified, use the + service request to allocate a 256 byte buffer area where a sector may be read back and verified after a write. Initialize the device permanent storage. For floppy disk @@ -2694,7 +2710,7 @@ may be read or written to, and initializing V.TRAK to $FF so that the first seek will find track zero. Place the IRQ service routine on the IRQ polling list by - using the OS9 F$IRQ service request. + using the OS9 service request. Initialize the device control registers (enable interrupts if necessary). @@ -2884,12 +2900,14 @@ These routines are wild card calls used to get (set) the device's -operating parameters as specified for the OS9 I$GetStt and I$SetStt +operating parameters as specified for the OS9 +and service requests. It may be necessary to examine or change the register stack which -contains the values of MPU registers at the time of the I$GetStt or -I$SetStt service request. The address of the register stack may be +contains the values of MPU registers at the time of the + or + service request. The address of the register stack may be found in PD.RGS, which is located in the path descriptor, . The following offsets may be used to access any particular value in the register stack: @@ -3019,7 +3037,7 @@ 3. Remove the device from the IRQ polling list. 4. If the INIT routine reserved a 256 byte buffer for verifying -disk writes, return the memory with the F$Mem service request. +disk writes, return the memory with the service request. @@ -3102,7 +3120,8 @@ (code $C). The execution offset in the module header contains the offset to the entry point of this subroutine. -It obtains the starting sector number and size of the "OS9Boot" +It obtains the starting sector number and size of the +OS9Boot file from the identification sector (LSN 0). OS-9 is called to allocate a memory area large enough for the boot file, and then it loads the boot file into this memory area. @@ -3112,7 +3131,7 @@ contains the values for DD.BT (the 24 bit logical sector number of the bootstrap file), and DD.BSZ (the size of the bootstrap file in bytes). For a full description of the identification sector. -See 6.1.1. +See . 2. After reading the identification sector into the buffer, get the 24 bit logical sector number of the bootstrap file from DD.BT. @@ -3122,8 +3141,8 @@ logical sector specified in DD.BT and extending for (DD.BSZ/256+1) sectors. -4. Use the OS9 F$SRqMem service request to request the memory area -where the boot file will be loaded into. +4. Use the OS9 service request to +request the memory area where the boot file will be loaded into. 5. Read the boot file into this memory area. @@ -3153,7 +3172,7 @@ SCFMAN Line Editing Functions -I$Read and I$Write service requests (which correspond to Basic09 + and service requests (which correspond to Basic09 GET and PUT statements) to SCFMAN-type devices pass data to/from the device without any modification, except that keyboard interrupt, keyboard abort, and pause character are filtered out of the input @@ -3162,14 +3181,15 @@ automatically followed by line feeds or nulls, and the high order bits are passed as sent/received. -I$ReadLn and I$WritLn service requests (which correspond to Basic09 + and service requests (which correspond to Basic09 INPUT, PRINT, READ and WRITE statements) to SCFMAN-type devices perform full line editing of all functions enabled for the particular device. These functions are initialized when the device is first used by copying the option table from the device descriptor table associated with the specific device. They may be altered anytime -afterwards from assembly language programs using the I$SetStt and -I$GetStt service requests, or from the keyboard using the TMODE +afterwards from assembly language programs using the and + service requests, +or from the keyboard using the tmode command. Also, all bytes transfered in this mode will have the high order bit cleared. @@ -3202,26 +3222,26 @@ line if PD.DLO = 0, or echo CR/LF if PD.DLO <> 0. PD.EOR defines the end of record character. This is the last -character an each line entered (I$ReadLn), and terminates the output -(I$WritLn) when this character is sent. Normally PD.EOR will be set -to $0D. If it is set to zero, SCF's READLN will NEVER terminate, +character an each line entered (), and terminates the output +() when this character is sent. Normally PD.EOR will be set +to $0D. If it is set to zero, SCF's will NEVER terminate, unless an EOF occurs. If PD.EOF <> 0, it defines the end of file character. SCFMAN -will return an end-of-file error on I$Read or I$ReadLn if this is the +will return an end-of-file error on or if this is the first (and only) character input. It can be disabled by setting its value to zero. -If PD.RPR <> 0, SCF (I$ReadLn) will, upon receipt of this +If PD.RPR <> 0, SCF () will, upon receipt of this character, echo a carriage return [optional line feed], and then reprint the current line. -If PD.DUP <> 0, SCF (I$ReadLn) will duplicate whatever is in +If PD.DUP <> 0, SCF () will duplicate whatever is in the input buffer through the first "PD.EOR" character. If PD.PSC <> 0, output is suspended before the next "PD.EOR" character when this character is input. This will also delete any -"type ahead" input for I$ReadLn. +"type ahead" input for . If PD.INT <> 0, and is received on input, a keyboard interrupt signal is sent to the last user of this path. Also it will @@ -3235,13 +3255,13 @@ keyboard interrrupt signal code. This location is normally set to a control-Q character. -If PD.OVF <> 0, It is echoed when I$ReadLn has satisfied its +If PD.OVF <> 0, It is echoed when has satisfied its input byte count without finding a "PD.EOR" character. NOTE: It is possible to disable most of these special editing functions by setting the corresponding control character in the path -descriptor to zero by using the I$SetStt service request, or by running -the TMODE utility. A more permanent solution may be had by setting +descriptor to zero by using the service request, or by running +the tmode utility. A more permanent solution may be had by setting the corresponding control character value in the device descriptor module to zero. @@ -3363,7 +3383,7 @@ and third section are specific for SCFMAN and SCFMAN-type device drivers. The option section of the path descriptor contains many device operating parameters whicb may be read or written by the OS9 -I$GetStt or I$SetStt service requests. IOMAN initializes this section + or service requests. IOMAN initializes this section when a path is opened to a device by copying the corresponding device descriptor initialization table. Any values not determined by this table will default to zero. @@ -3581,8 +3601,7 @@ As with all device drivers. SCFMAN device drivers use a standard executable memory module format with a module type of -edevice -drivers (CODE $5). The execution offset address in the +"device driver" (CODE $5). The execution offset address in the module header points to a branch table that has six three byte entries. Each entry is typically a LBRA to the corresponding subroutine. The branch @@ -3672,7 +3691,7 @@ 1. Initialize the device static storage. 2. Place the IRQ service routine on the IRQ polling list by using -the OS9 F$IRQ service request. +the OS9 service request. 3. Initialize the device control registers (enable interrupts if necessary). @@ -3718,8 +3737,8 @@ This routine should get the next character from the input buffer. If there is no data ready, this routine should copy its -process ID from V.BUSY into V.WAKE and then use the F$Sleep service -request to put itself to sleep. +process ID from V.BUSY into V.WAKE and then use the +service request to put itself to sleep. Later when data is recieved, the IRQ service routine will leave the data in a buffer, then check V.WAKE to see if any process is @@ -3816,7 +3835,8 @@ This routine is a wild card call used to get (set) the device -parameters specified in the I$GetStt and I$SetStt service requests. +parameters specified in the +and service requests. Currently all of the function codes defined by Microware for SCF-type devices are handled by IOMAN or SCFMAN. Any codes not defined by Microware will be passed to the device driver. @@ -3957,7 +3977,7 @@ NOTE: Static storage used by device drivers is never returned to the free memory pool. Therefore, it is desirable to NEVER terminate any device that might be used again. Modules contained in -the BOOT tile will NEVER be terminated. +the Boot file will NEVER be terminated. @@ -3983,23 +4003,28 @@ Although this routine is not included in the device drivers branch table and not called directly from SCFMAN, it is an important routine in device drivers. The main things that it does are: - -1. Service the device interrupts (recieve data from device or send + + +Service the device interrupts (recieve data from device or send data to it). This routine should put its data into and get its data from buffers which are defined in the device static storage. - -2. Wake up any process waiting for I/O to complete by checking + + +Wake up any process waiting for I/O to complete by checking to see if there is a process ID in V.WAKE (non-zero) and it so send a wakeup signal to that process. - -3. If the device is ready to send more data and the output buffer + + +If the device is ready to send more data and the output buffer is emoty, disable the device's "ready to transmit" interrupts. - -4. If a pause character is recieved, set V.PAUS in the attached + + +If a pause character is recieved, set V.PAUS in the attached device static storage to a non-zero value. The address of the attached device static storage is in V.DEV2. - + + When the IRQ service routine finishes servicing an interrupt, it must clear the carry and exit with an RTS instruction. @@ -4071,7 +4096,8 @@ Addressing Variables and Data Structures -Programs executed as processes (by FORK and CHAIN system calls or +Programs executed as processes (by and + system calls or by the Shell) are assigned a RAM memory area for variables, stacks, and data structures at execution-time. The addresses cannot be determined or specified ahead of time. However, a minimum size for @@ -4084,12 +4110,13 @@ process passed a parameter area, it will be located from the value of the SP to the top of memory (Y), and the D register will contain the parameter area size in bytes. If the new process was called by the -shell, the parameter area will contain the part of the shell command +shell, the parameter area will contain +the part of the shell command line that includes the argument (parameter) text. The U register will have the lower bound of the data memory area, and the DP register will contain its page number. -The most important rule is to NOT USE EXTENDED ADDRESSING! +The most important rule is to not use extended addressing! Indexed and direct page addressing should be used exclusively to access data area values and structures. Do not use program-counter relative addressing to find addresses in the data area, but do use it to refer @@ -4148,16 +4175,17 @@ The INIT initialization subroutine within the driver package should allocate static storage for the service routine, get the -service routine address, and execute the F$IRQ system call to add it +service routine address, and execute the system call to add it to the IRQ polling table. When a device driver routine does something that will result in an -interrupt, it should immediately execute a F$Sleep service request. +interrupt, it should immediately execute a +service request. This results in the process' deactivation. When the interrupt in question occurs, its service routine is executed after some random interval. It should then do the minimal amount of processing required, and send a "wakeup" signal to its associated process using -the F$Send service request. It may also put some data in its static +the service request. It may also put some data in its static storage (I/O data and status) which is shared with its associated "sleeping" process. @@ -4197,7 +4225,7 @@ A Sample Program -The OS-9 "list" utility command program is shown on this +The OS-9 list utility command program is shown on this and the next page as an example of assembly language programming. @@ -4354,13 +4382,13 @@ If the target system requires multiprogramming, time-of-day, or other time-related functions, include a CLOCK module for the target system's real-time clock. Also consider how the clock is to - be started,. You may want to ROM the "Setime" command, or + be started,. You may want to ROM the setime command, or have SYSGO start the clock. It the target system will receive commands manually, or if any application program uses Shell functions, include the SHELL and SYSGO modules, otherwise include a modified SYSGO module which calls - your application program instead of Shell. + your application program instead of shell. @@ -4446,8 +4474,8 @@ It does additional high-level system initialization, for -example, disk system SYSGO call the shell to process the "Startup" -shell procedure file. +example, disk system SYSGO call the shell to process the +Startup shell procedure file. It starts the first "user" process. @@ -4462,7 +4490,7 @@ Remove initialization of the working execution directory. -Remove processing of the "Startup" procedure file. +Remove processing of the Startup procedure file. Possibly change the name of the first user program from Shell to the name of a applications program. Here are some example name strings: @@ -4522,7 +4550,7 @@ permits a BCS or BCC instruction immediately following the system call to branch on error/no error. -Here is an example system call for the "CLOSE" service request: +Here is an example system call for the service request: LDA PATHNUM @@ -4553,7 +4581,7 @@ All system calls have a mnemonic name that starts with "F$" for system functions, or "I$" for I/O related requests. These are defined in the assembler-input equate file -called "OS9DEFS". +called OS9Defs. In the service request descriptions which follow, registers not explicitly specified as input or output parameters are not altered. @@ -4604,7 +4632,7 @@ the allocation bit map. - + F$Chain - Load and execute a new primary module @@ -4637,17 +4665,17 @@ -This system call is similar to FORK, but it does not create a new +This system call is similar to , but it does not create a new process. It effectively "resets" the calling process' program and data memory areas and begins execution of a new primary module. Open paths are not closed or otherwise affected. This system call is used when it is necessary to execute an entirely new program, but without the overhead of creating a new -process. It is functionally similar to a FORK followed by an EXIT. -but with less processing overhead. - -The sequence of operations taken by CHAIN is as follows: +process. It is functionally similar to a followed by an +, but with less processing overhead. + +The sequence of operations taken by is as follows: 1. The system parses the name string ot the new proces' @@ -4659,13 +4687,14 @@ is linked to (several modules may have been loaded from a single file). -2. The process' old primary module is UNLINKED. +2. The process' old primary module is +unlinked. 3. The data memory area is reconfigured to the size specified in the new primary module's header. -The diagram below shows how CHAIN sets up the data memory area and -registers for the new module. +The diagram below shows how sets up the +data memory area and registers for the new module. +-----------------+ <-- Y (highest address) @@ -4697,16 +4726,16 @@ WARNING: The hardware stack pointer (SP) should be located -somewhere in the direct page before the F$Chain service request is +somewhere in the direct page before the service request is executed to prevent a "suicide attempt" error or an actual suicide (system crash). This will prevent a suicide from occurring in case the new module requires a smaller data area than what is currently being used. You should allow approximately 200 bytes of stack space -for execution of the F$Chain service request and other system +for execution of the service request and other system "overhead". -For more information, please see the F$Fork service request +For more information, please see the service request description. @@ -4836,7 +4865,7 @@ the allocation bit map. - + F$Exit - Terminate the calling process @@ -4870,15 +4899,15 @@ closed. The death of the process can be detected by the parent executing a -WAIT call, which returns to the parent the status byte passed by the -child in its EXIT call. The status byte can be an OS-9 error code the + call, which returns to the parent the status byte passed by the +child in its call. The status byte can be an OS-9 error code the terminating process wishes to pass back to its parent process (the shell assumes this), or can be used to pass a user-defined status value. Processes to be called directly by the shell should only return an OS-9 error code or zero if no error occurred. - + F$Fork - Create a new process @@ -4935,20 +4964,20 @@ in the diagram on the next page. The execution offset given in the module header is used to set the PC to the module's entry point. -When the shell processes a command line it passes a string in the +When the shell processes a command line it passes a string in the parameter area which is a copy of the parameter part (if any) of the command line. It also inserts an end-of-line character at the end of the parameter string to simplify string-oriented processing. The X register will point to the beginning of the parameter string. If the command line included the optional memory size specification (#n or -#nK), the shell will pass that size as the requested memory size when -executing the FORK. - -If any of the above operations are unsuccessful, the FORK is +#nK), the shell will pass that size as the requested memory size when +executing the . + +If any of the above operations are unsuccessful, the is aborted and the caller is returned an error. The diagram below -shows how FORK sets up the data memory area and registers for a +shows how sets up the data memory area and registers for a newly-created process. @@ -4982,16 +5011,16 @@ the parameter area. NOTE: Both the child and parent process will execute -concurrently. If the parent executes a F$WAIT call +concurrently. If the parent executes a call immediately after the fork, it will wait until the child dies before it resumes execution. Caution should be exercised when recursively -calling a program that uses the F$Fork service request since another +calling a program that uses the service request since another child may be created with each "incarnation". This will continue until the process table becomes full. - -F$Icpt - Set up a signal intercept trap + +F$ICPT - Set up a signal intercept trap @@ -5000,7 +5029,7 @@ ASSEMBLER CALL: - OS9 F$Icpt + OS9 F$ICPT MACHINE CODE: @@ -5029,7 +5058,7 @@ the base address of the routine's storage area. After a signal trap has been set, whenever the process receives a signal, its intercept routine will be executed. A signal will abort any process which has -not used the F$ICPT service request to set a signal trap, and its +not used the service request to set a signal trap, and its termination status (B register) will be the signal code. Many interactive programs will set up an intercept routine to handle keyboard abort (control Q), and keyboard interrupt (control C). @@ -5044,10 +5073,10 @@ B = Signal code. NOTE: The value of DP may not be the same as it was when the -F$Icpt call was made. + call was made. Whenever a signal is received. OS-9 will pass the signal code and -the base address of its data area (which was defined by a F$ICPT +the base address of its data area (which was defined by a service request) to the signal intercept routine. The base address of the data area is selected by the user and is typically a pointer to the process' data area. @@ -5101,7 +5130,7 @@ Several processes can have the same user ID. - + F$LINK - Link to memory module @@ -5145,7 +5174,7 @@ the absolute address of the module's execution entry point is returned in Y (as a convenience: this and other information can be obtained from the module header). The module's link count' is -incremented whenever a LINK references its name, thus keeping track +incremented whenever a references its name, thus keeping track of how many processes are using the module. If the module requested has an attribute byte indicating it is not sharable (meaning it is not reentrant) only one process may link to it at a time. @@ -5201,7 +5230,7 @@ modules from the file into memory, then closes the file. All modules loaded are added to the system module directory, and the first module read is LINKed. The parameters returned are the same as the -LINK call and apply only to the first module loaded. + call and apply only to the first module loaded. In order to be loaded, the file must have the "execute" permission and contain a module or modules that have a proper module @@ -5209,10 +5238,11 @@ unless a complete pathlist is given. Possible errors: module directory full; memory full; plus errors -that occur on OPEN, READ, CLOSE and LINK system calls. - - - +that occur on , +, and system calls. + + + F$Mem - Resize data memory area @@ -5307,7 +5337,7 @@ by default. The error reporting routine is vectored and can be replaced with a more elaborate reporting module. To replace this -routine use the F$SSVC service request. +routine use the service request. @@ -5415,7 +5445,7 @@ carry set, beginning bit number and size of the largest block. - + F$Send - Send a signal to another process @@ -5455,8 +5485,9 @@ If the signal's destination process is sleeping or waiting, it will be activated so that it may process the signal. The signal processing routine (intercept) will be executed if a signal trap was -set up (see F$ICPT), otherwise the signal will abort the destination -process, and the signal code becomes the exit status (see WAIT). An +set up (see ), +otherwise the signal will abort the destination +process, and the signal code becomes the exit status (see ). An exception is the WAKEUP signal, which activates a sleeping process but does not cause the signal intercept routine to be executed. @@ -5478,11 +5509,12 @@ a "sleep" call for a few ticks before a retry to avoid wasting MPU time. -For related information see the F$ICPT, F$WAIT and F$Sleep service +For related information see the , + and service request descriptions. - + F$Sleep - Put calling process to sleep @@ -5525,8 +5557,8 @@ The duration of a "tick" is system dependent but is most commonly 100 milliseconds. -Due to the fact that it is not known when the F$Sleep request was -made during the current tick, F$Sleep can not be used for precise +Due to the fact that it is not known when the request was +made during the current tick, can not be used for precise timing. A sleep of one tick is effectively a "give up remaining time slice" request; the process is immediately inserted into the active process queue and will resume execution when it reaches @@ -5577,7 +5609,7 @@ another process' priority only if it has the same user ID. - + F$SSVC - Install function request @@ -5655,7 +5687,7 @@ - OFFSET OS9DEFS + OFFSET OS9Defs MNEMONIC +------+ U ---> ! CC ! $0 R$CC @@ -5709,7 +5741,7 @@ are free for user definition. - + F$SSWI - Set SWI vector @@ -5744,7 +5776,7 @@ Sets up the interrupt vectors for SWI, SWI2 and SWI3 instructions. -Each process has its own local vectors. Each SETSWI call sets up one +Each process has its own local vectors. Each F$SSWI call sets up one type of vector according to the code number passed in A. @@ -5950,7 +5982,7 @@ the module directory. - + F$Wait - Wait for child process to die @@ -5985,24 +6017,26 @@ The calling process is deactivated until a child process -terminates by executing an EXIT system call, or by receiving a +terminates by executing an +system call, or by receiving a signal. The child's ID number and exit status is returned to the parent. If the child died due to a signal, the exit status byte (B register) is the signal code. If the caller has several children, the caller is activated when -the first one dies, so one WAIT system call is required to detect +the first one dies, so one +system call is required to detect termination of each child. -If a child died before the WAIT call, the caller is reactivated -almost immediately. WAIT will return an error if the caller has no +If a child died before the call, the caller is reactivated +almost immediately. will return an error if the caller has no children. -See the EXIT description for more related information. - - - - +See the description for more related information. + + + + F$All64 - Allocate a 64 byte memory block @@ -6043,8 +6077,9 @@ tour sections. The first 64 bytes of the base page are used as a "page table", which contains the MSB of all pages in the memory structure. Passing a value of zero in the X register will -cause the F$All64 service request to allocate a new base page and the -first 64 byte memory block. Whenever a new page is needed, an F$SRqMem +cause the service request to allocate a new base page and the +first 64 byte memory block. Whenever a new page is needed, an + service request will automatically be executed. The first byte of each block contains the block number; routines using this service request should not alter it. Below is a diagram to show how 7 blocks @@ -6156,7 +6191,7 @@ This system mode service request will return the address of a 64 -byte memory block as described in the F$All64 service request. OS-9 +byte memory block as described in the service request. OS-9 used this service request to find process descriptors and path descriptors when given their number. @@ -6252,7 +6287,7 @@ NOTE: THIS IS A PRIVILEGED SYSTEM MODE SERVICE REQUEST - + F$IRQ - Add or remove device from IRQ table @@ -6405,12 +6440,12 @@ This system mode service request deallocates a 64 byte block of -memory as described in the F$All64 service request. +memory as described in the service request. NOTE: THIS IS A PRIVILEGED SYSTEM MODE SERVICE REQUEST - + F$SRqMem - System memory request @@ -6659,7 +6694,7 @@ execution directory is changed. - + I$Close - Close a path to a file/device @@ -6693,20 +6728,21 @@ Terminates the I/O path specified by the path number. I/O can no -longer be performed to the file/device, unless another OPEN or CREATE +longer be performed to the file/device, unless another or + call is used. Devices that are non-sharable become available to other requesting processes. All OS-9 internally managed buffers and descriptors are deallocated. Note: Because the OS9 F$Exit service request automatically closes all open paths (except the standard I/O paths), it may not he -necessary to close them individually with the OS9 I$Close service request. +necessary to close them individually with the OS9 service request. Standard I/O paths are not typically closed except when it is desired to change the files/devices they correspond to. - + I$Create - Create a path to a new file @@ -6760,7 +6796,8 @@ The access mode parameter passed in register A must be either "WRITE" or "UPDATE". This only affects the file until it is closed; it can be reopened later in any access mode -allowed by the file attributes (see OPEN). Files open for "WRITE" +allowed by the file attributes (see ). +Files open for "WRITE" may allow faster data transfer than "UPDATE", which sometimes needs to preread setors. These access codes are defined as given below: @@ -6778,14 +6815,14 @@ subsequent I/O service requests until the file is closed. No data storage is initially allocated for the file at the time it -is created; this is done automatically by WRITE or explicitly by the -PUTSTAT call. +is created; this is done automatically by +or explicitly by the PUTSTAT call. An error will occur if the file name already exists in the -directory. CREATE calls that specify non-multiple file devices (such -as printers, terminals, etc.) work correctly: the CREATE behaves the -same as OPEN. Create cannot be used to make directory files (see -MAKDIR). +directory. calls that specify non-multiple file devices (such +as printers, terminals, etc.) work correctly: the behaves the +same as . Create cannot be used to make directory files (see +). @@ -6916,7 +6953,7 @@ descriptor is not copied. - + I$GetStt - Get file device status @@ -6962,9 +6999,10 @@ file manager associated with the path. A typical use is to determine a terminal's parameters for backspace character, delete character, echo on/off, null padding, paging, etc. It is commonly -used in conjunction with the SETSTAT service request which is +used in conjunction with the +service request which is used to set the device operating parameters. Below are presently -defined function codes for GETSTAT: +defined function codes for : @@ -7219,7 +7257,7 @@ - + I$MakDir - Make a new directory @@ -7252,14 +7290,14 @@ -MAKDIR is the only way a new directory file can be created. It + is the only way a new directory file can be created. It will create and initialize a new directory as specified by the pathlist. The new directory file contains no entries, except for an entry for itself (".") and its parent directory ("..") -The caller is made the owner of the directory. MAKDIR dies not +The caller is made the owner of the directory. does not return a path number because directory files are not "opened" by -this request (use OPEN to do so). The new directory will +this request (use to do so). The new directory will automatically have its "directory" bit set in the access permission attributes. The remaining attributes are specified by the byte passed in the B register, which has individual bits @@ -7277,7 +7315,7 @@ - + I$Open - Open a path to a file or device @@ -7327,7 +7365,7 @@ Update mode can be slightly slower because pre-reading of sectors may be required for random access of bytes within sectors. The access mode must conform to the access permission attributes -associated with the file or device (see CREATE). Only the owner +associated with the file or device (see ). Only the owner may access a file unless the appropiate "public permit" bits are set. @@ -7349,7 +7387,7 @@ in the access mode. - + I$Read - Read data from a file or device @@ -7390,7 +7428,7 @@ additional processing or editing such as backspace, line delete, end-of-file, etc. -After all data in a file has been read, the next I$Read service +After all data in a file has been read, the next service request will return an end of file error. NOTES: @@ -7410,7 +7448,7 @@ - + I$ReadLn - Read a text line with editing @@ -7445,7 +7483,8 @@ -This system call is the same as "READ" except it reads data from +This system call is the same as +except it reads data from the input file or device until a carriage return character is encountered or until the maximum byte count specified is reached, and that line editing will occur on SCFMAN-type devices. Line @@ -7457,7 +7496,7 @@ than the maximum specified, it will not be accepted and a PD.OVF character (normally bell) will be echoed. -After all data in the file has been read, the next I$ReadLn service +After all data in the file has been read, the next service request will return an end of file error. NOTE: For more information on line editing, see 7.1. @@ -7512,7 +7551,7 @@ without error. - + I$SetStt - Set file/device status @@ -7557,7 +7596,8 @@ file manager associated with the path. A typical use is to set a terminal's parameters for backspace character, delete character, echo on/off, null padding, paging, etc. It is commonly -used in conjunction with the GETSTAT service request which is +used in conjunction with the +service request which is used to read the device operating parameters. Below are presently defined function codes: @@ -7780,7 +7820,7 @@ - + I$Write - Write data to file or device @@ -7815,7 +7855,7 @@ -WRITE outputs one or more bytes to a file or device associated + outputs one or more bytes to a file or device associated with the path number specified. The path must have been OPENed or CREATEd in the WRITE or UPDATE access modes. @@ -7825,7 +7865,7 @@ automatically expanded. - + I$WritLn - Write line of text with editing @@ -7860,7 +7900,7 @@ -This system call is similar to WRITE except it writes data until a +This system call is similar to except it writes data until a carriage return character is encountered. Line editing is also activated for character-oriented devices such as terminals, printers, etc. The line editing refers to auto line feed, null @@ -8484,9 +8524,9 @@ 103F 04 - F$WAIT + F$Wait Wait for child process to die. - + 103F 05 @@ -8514,7 +8554,7 @@ 103F 09 - F$Icpt + F$ICPT Set up a signal intercept trap. @@ -9059,40 +9099,40 @@ - - $1 - Program - - - $2 - Subroutine module - - - $3 - Multi-module - - - $4 - Data module - - - $C - System Module - - - $D - File Manager - - - $E - Device Driver - - - $F - Device Descriptor - - - + + $1 + Program + + + $2 + Subroutine module + + + $3 + Multi-module + + + $4 + Data module + + + $C + System Module + + + $D + File Manager + + + $E + Device Driver + + + $F + Device Descriptor + + + @@ -9146,28 +9186,40 @@ Module Languages - + - $0 - Data + $0 + Data - $1 - 6809 Object code + $1 + 6809 Object code + + + $2 + BASIC09 I-code - $2 - BASIC09 I-code + $3 + Pascal P-Code + + + $4 + C I-code - $3 - Pascal P-Code + $5 + Cobol I-code - $4 - Cobol I-code + $6 + Fortan I-code + + + $7 + 6309 Object code @@ -9178,12 +9230,12 @@ - - - $8 - Reentrant - - + + + $8 + Reentrant + +
@@ -9192,333 +9244,7 @@ - -Error Codes - -OS-9 Error Codes - -The error codes are shown both in hexadecimal (first column) and -decimal (second column). Error codes other than those listed are -generated by programming languages or user programs. - - - - - - - - -HEX -DEC - - - - - - $C8 - 200 - PATH TABLE FULL - - The file cannot be opened because - the system path table is currently full. - - $C9 - 201 - ILLEGAL PATH NUMBER - - Number too large or for non-existant path. - - $CA - 202 - INTERRUPT POLLING TABLE FULL - - $CB - 203 - ILLEGAL MODE - - attempt to perform I/O function of which the device or file is incapable. - - $CC - 204 - DEVICE TABLE FULL - - Can't add another device - - $CD - 205 - ILLEGAL MODULE HEADER - - module not loaded because its - sync code, header parity, or CRC is incorrect. - - $CE - 206 - MODULE DIRECTORY FULL - - Can't add another module - - $CF - 207 - MEMORY FULL - - Level One: not enough contiquous RAM free. - Level Two: process address space full - - $D0 - 208 - ILLEGAL SERVICE REQUEST - - System call had an illegal code number - - $D1 - 209 - MODULE BUSY - - non-sharable module is in use by another process. - - $D2 - 210 - BOUNDARY ERROR - - Memory allocation or deallocation request not on a page boundary. - - $D3 - 211 - END OF FILE - - End of file encountered on read. - - $D4 - 212 - RETURNING NON-ALLOCATED MEMORY - - (NOT YOUR MEMORY) - attempted to deallocate memory not previously assigned. - - $D5 - 213 - NON-EXISTING SEGMENT - - device has damaged file structure. - - $D6 - 214 - NO PERMISSION - - file attributes do not permit access requested. - - $D7 - 215 - BAD PATH NAME - - syntax error in pathlist (illegal character, etc.). - - $D8 - 216 - PATH NAME NOT FOUND - - can't find pathlist specified. - - $D9 - 217 - SEGMENT LIST FULL - - file is too fragmented to be expanded further. - - $DA - 218 - FILE ALREADY EXISTS - - file name already appears in current directory. - - $DB - 219 - ILLEGAL BLOCK ADDRESS - - device's file structure has been damaged. - - $DC - 220 - ILLEGAL BLOCK SIZE - - device's file structure has been damaged. - - $DD - 221 - MODULE NOT FOUND - - request for link to module not found in directory. - - $DE - 222 - SECTOR OUT OF RANGE - - device file structure damaged or -incorrectly formatted. - - $DF - 223 - SUICIDE ATTEMPT - - request to return memory where your stack is located. - - $E0 - 224 - ILLEGAL PROCESS NUMBER - - no such process exists. - - $E2 - 226 - NO CHILDREN - - can't wait because process has no children. - - $E3 - 227 - ILLEGAL SWI CODE - - must be 1 to 3. - - $E4 - 228 - PROCESS ABORTED - - process aborted by signal code 2. - - $E5 - 229 - PROCESS TABLE FULL - - can't fork now. - - $E6 - 230 - ILLEGAL PARAMETER AREA - - high and low bounds passed in fork call are incorrect. - - $E7 - 231 - KNOWN MODULE - - for internal use only. - - $E8 - 232 - INCORRECT MODULE CRC - - module has bad CRC value. - - $E9 - 233 - SIGNAL ERROR - - receiving process has previous - unprocessed signal pending. - - $EA - 234 - NON-EXISTENT MODULE - - unable to locate module. - - $EB - 235 - BAD NAME - - illegal name syntax. - - $EC - 236 - BAD HEADER - - module header parity incorrect - - $ED - 237 - RAM FULL - - no free system RAM available at this time - - $EE - 238 - UNKNOWN PROCESS ID - - incorrect process ID number - - $EF - 239 - NO TASK NUMBER AVAILABLE - - all task numbers in use - - - - - - -Device Driver/Hardware Errors - -The following error codes are generated by I/O device drivers, and -are somewhat hardware dependent. Consult manufacturer's hardware -manual for more details. - - - - - - - - -HEX -DEC - - - - - - $F0 - 240 - UNIT ERROR - - device unit does not exist - - $F1 - 241 - SECTOR ERROR - - sector number is out of range. - - $F2 - 242 - WRITE PROTECT - - device is write protected. - - $F3 - 243 - CRC ERROR - - CRC error on read or write verify - - $F4 - 244 - READ ERROR - - Data transfer error during disk read - operation, or SCF (terminal) input buffer overrun. - - $F5 - 245 - WRITE ERROR - - hardware error during disk write operation. - - $F6 - 246 - NOT READY - - device has "not ready" status. - - $F7 - 247 - SEEK ERROR - - physical seek to non-existant sector. - - $F8 - 248 - MEDIA FULL - - insufficient free space on media. - - $F9 - 249 - WRONG TYPE - - attempt to read incompatible media (i.e. - attempt to read double-side disk on single-side drive) - - $FA - 250 - DEVICE BUSY - - non-sharable device is in use - - $FB - 251 - DISK ID CHANGE - - Media was changed with files open - - $FC - 252 - RECORD IS LOCKED-OUT - - Another process is accessing the requested record. - - $FD - 253 - NON-SHARABLE FILE BUSY - - Another process is accessing the requested file. - - - - - - - - +&errorcodesapp; @@ -11072,7 +10798,7 @@ a full pathlist. If the access mode is read, write, or update, the current data directory is assumed. If the access mode is execute, the current execution directory is assumed. Note that -if a full pathlist (a pathlist beginning witt a "/") appears, the +if a full pathlist (a pathlist beginning with a "/") appears, the access mode is ignored.
ACCESS MODES: