SetMark $2016 GS/OS Parpose: SET-MARK $CE ProDOS 8 To change the current position-in-file pointer (Mark) of an open file. You can set Mark to any position within the file; subsequent read or write operations take place at that position. Parameter table: ProDOS 8 Input or O(fret Symbolic Name Result Description + 0 num parms I Number of parameters (2) + 1 ref~ num I Reference number for the file + 2 to + 4 position I The new mark position GS/OS Input or O(fret Symbolic Name Result Description + 0 to + 1 pcount I Number of parameters (3) + 2 to + 3 ref num 1 Reference number for the file + 4 to + 5 base I Code for determining new mark + 6 to + 9 displacement I The new mark position Descriptions of parameters: num - parms The number of parameters in the ProDOS 8 parameter table (always 2). ref num The reference number ProDOS 8 or GS/OS assigned to the file when it was first opened. position This field holds the new Mark position. This position must not exceed the EOF position for the file. pcount The number of parameters in the GS/OS parameter table. The min- imum value is 3; the maximum is 3. Command Descriptions 203 base This code tells GS/OS how to determine the new value for the M~ pointer: $0000 new Mark = displacement $0001 new Mark = EOF - displacement $0002 new Mark = old Mark + displacement $0003 new Mark = old Mark - displacement displacement GS/OS uses this value in conjunction with the base code to deter- mine the new value for the Mark pointer. Common error codes: $43 The file reference number is invalid. You might be using 'a referen~ number for a file that you've already closed. $4D The Mark position is larger than the EOF position. Other possible error codes are $04, $07, $27. Programming example: Suppose you have created a large textfile in which information is arranged in 98-byte records, and you want to directly access the 23rd such record. The easiest way to do this is to move the Mark pointer directly to the start of this record, and then use the Read or Write command. You can determine the proper value fur Mark by multiplying the record length (98) by the record number (23); the result is 2254 (or $08CE). Here's how to move Mark to this position (assume that the file is open and has a reference number of 1) under GS/OS: PARMTBL New_Mark LDA #$08CE STA NewMark LDA #$00OO STA NewMark+2 ;(high-order word is zero) _SetMark SM_Parms BCS Error ;Branch if error occurred RTS DC I2'3' The # of parameters DC 12' 1' ;File reference number DC 12'0' New Mark = displacement DS 4 ;New Mark position Remember that the Mark position cannot exceed the EOF position. 204 GS/OS and ProDOS 8 Commands SetPrefix $2009 GS/OS ProDOS 8 Parpose: To set the default prefix to a specified directory path. When you pass a filename or partial pathname to an MLI command, ProDOS 8 or GS/OS automatically converts it into a full pathname by appending it to the current value of the prefix you're trying to set. Parameter table: ProDOS 8 Input or bet Symbolic Name Result +0 num~parms I +1to +2 prefix I Description Number of parameters (1) Pointer to the new prefix string GS/OS Input or O(rset Symbolic Name Result +0 to + 1 pcount I +2 to +3 prefixnum I +4to +7 prefix I Descriptions of parameters: Description Number of parameters (2) Prefix number (0 to 31) Pointer to the new prefix string num_parms The number of parameters in the ProDOS 8 parameter table (always 1). pathname A pointer to a class 0 (ProDOS 8) or class 1 (GS/OS) string describ- ing the pathname of the prefix. If the pathname specified is not preceded by a separator (/for ProDOS 8; / or: for GS/OS), ProDOS 8 appends the name to the default prefix and GS/OS appends it to the prefix string for the prefix you're trying to set, thus creating a full pathname. An optional separator may be placed at the end of the prefix pathname. pcount The number of parameters in the GS/OS parameter table. The min- imum value is 2; the maximum is 2. Command Descriptions 205 prefix - num The GS/OS prefix number (0 to 31). This is a binary number, not an ASCII number string followed by a slash. Common error codes: $40 The pathname contains invalid characters, or a full pathname was not specified (and no default prefix has been set up). Verify that the filenames and directory names specified in the pathname adhere to the naming rules described in Chapter 2 and, if a partial pathname was specified, that a default prefix has been set up. $44 A directory in the pathname was not found. Solution: Double-check the spelling of the pathname, insert the disk containing the correct directory, or change the default prefix. $45 The volume directory was not found. Solution: Double-check the spelling of the volume directory name, insert the correct disk, or change the default prefix. $46 The file was not found. $4B A nondirectory name was specified in the prefix string. Solution: Try again with a prefix string that contains only directory names. Other possible error codes are $04, $07, $27, $53. Programming example: It is often convenient to be able to set the ProDOS 8 default prefix to the name of the volume directory on a disk in a specific disk drive. If this is done, all files in the volume directory can be referred to by filename alone, rather than by full pathname. This can be done in two simple steps: First, use the ON - LINE command to determine the volume name for that disk, and second, use SET - PREFIX to assign that name to the default prefix. One complication does arise, however: The name returned by ON - LINE is not quite in the format required by SET PREFIX. Fortunately, we can easily overcome this discrepancy. JSR MLI DFB $CS DA PARMTBL BCS ERROR LDA BUFFER AND #$OF STA PFXNAME INC PFXNAME LDA #'/' STA BUFFER ON_LINE ;Address of parameter table Branch if error occurred ;Get length byte ;Strip off slot/drive bits ;Store length for SET_PREFIX ;(add 1 for leading slash) ;Put slash in front of volume name 206 GS/OS and ProDOS 8 Commands JSR MLI DFB $C6 SET_PREFIX DA PARMTBL1 BCS ERR0R1 ;Branch if error occurred RTS PARMTBL DFB 2 ;The # of parameters DFB $E0 unit number = slot 6, drive 2 DA BUFFER ;Pointer to 16-byte buffer PARMTBL1 PFXNAME BUFFER DFB 1 The # of parameters DA PFXNAME ;Pointer to volume name DS 1 Length of name for SET_PREFIX DS 1 Slot/drive (bits 4-7) and length of volume name (bits 0-3) DS 15 ;Volume name (in ASCII) The ON - LINE command returns a volume name that is not preceded by the slash required by SET PREFIX. This problem is fixed by reading the name length by SET_PREFIX, storing it at the previous memory location (PFXNAME), and then overwriting the name length byte with the slash. After this has been done, the data structure beginning with PFXNAME is in the format required by SET PREFIX. Command Descriptions 207 GS/OS Purpose: To set the GS/OS global system preferences. There is no equivalent ProDOS 8 command. Parameter table: GS/OS Input or Symbolic Name Result +0to +1 pcount I + 2 to + 3 preferences I Descriptions of parameters: ProDOS 8 Description Number of parameters (1) System preferences pcount The number of parameters in the GS/OS parameter table. The imum value is 1; the maximum is 1. preferences Use bit 15 of this value to indicate whether GS/OS should display a mount volume dialog box if a disk volume can't be found during execution of certain GS/OS commands: bit 15 1 = display mount volume dialog box 0 = don't display the dialog box Common error codes: [none] Comments: GS/OS commands that have pathnames as input parameters normally display a mount volume dialog box (to ask the user to insert a specified disk volume) if the commands can't find the volume they may need to complete. If the application wants to handle "volume not found" errors itself it can use SetSysPrefs to clear bit 15 of the prefer- ences word. 208 GS/OS and ProDOS 8 Commands UnbindInt $2032 GS/OS ProDOS 8 Purpose: To remove a GS/OS interrupt handling subroutine. Under ProDOS 8, use the DEALLOC - INT command instead. Parameter table: GS/OS Input or O(rset Symbolic Name Result +0to +1 pcount I +2 to +3 int~num I Descriptions of parameters: Description Number of parameters (1) Interrupt handler reference number pcount The number of parameters in the GS/OS parameter table. The min- imum value is 1; the maximum is 1. int - num The identification number for the interrupt handler. GS/OS assigned this number when the handler was installed using the BindInt com- mand. Important: Do not remove an interrupt-handling subroutine until your application has first told the source of the interrupts to stop generating interrupts. If you remove the subroutine first, the system will crash the next time an interrupt occurs. Common error codes: $53 The int - num parameter is not valid. Use the number BindInt returned when you installed the interrupt handler. Other possible error codes are $04, $07. Comments: See Chapter 6 for a discussion of how to handle interrupts in a GS/OS environment. Command Descriptions 209 GS/OS ProDOS 8 Purpose: To return status information about a disk volume. Under ProDOS 8, use the ON - LINE command instead. Parameter table: GS/OS Input or Offset Symbolic Name Result +0to +1 pcount I +2to +5 devname I +6to +9 volname R + 10 to +13 totalblocks R +14 to +17 freeblocks R +18 to +19 filesysid R +20 to +21 blocksize R Meanings of parameters: Description Number of parameters (6) Pointer to the device name string Pointer to the volume name string Size of the volume in blocks Number of unused blocks Operating system ID code Number of bytes in a block pcount The number of parameters in the GS/OS parameter table. The min- imum value is 2; the maximum is 6. dev - name A pointer to a class 1 string containing the device name. (Use DInfo to get a list of active device names.) vol - name A pointer to a class 1 output buffer where GS/OS returns the disk volume name string. The buffer should be 35 bytes long. total - blocks The total number of blocks on the disk volume. free - blocks The number of unused blocks on the disk volume. For the High Sierra FST, this value is always zero. file - sys - id The identification code for the file system on the disk volume. The currently defined values are: 210 GS/OS and Pro DOS 8 Commands $00 = [reserved] $01 = ProDOS/SOS $02 = DOS 3.3 $03 = DOS 3.2/3.1 $04 = Apple II Pascal $05 = Macintosh MFS $06 = Macintosh HFS $07 = Macintosh XL (LISA) $08 = Apple CP/M $09 = [reserved] $0A = MS-DOS $0B = High Sierra (CD-ROM) $0C = 1509660 (CD-ROM) block size The size of a disk block in bytes. Common error codes: $10 The specified device name does not exist. $27 The disk is unreadable probably because a portion of the disk me- dium is permanently damaged. This error also occurs if the drive door on a 5.25-inch drive is open or no disk is in the drive. $28 No device connected. This error is returned if you do not have a second 5.25-inch drive connected to the drive controller, but you try to access it. $2F Device not on line. This error is returned if no disk is in a 3.5-inch drive. Other possible error codes are $07, $11, $2E, $40, $45, $4A, $52, $55, $57, $58. Programming example: You can use the DInfo command to determine the GS/OS device names for disks attached to the system. It is these names that Volume requires as inputs. To get the status for a particular device, say .APPLEDISK3.5A, so that you can determine the number of blocks in use on the disk, use a subroutine like this: _Volume Vol _Parms SEC ;Used blocks = total blocks LDA total _blk minus free blocks SBC free_blk STA used_blk LDA total _blk+2 SBC free_blk+2 STA used_blk+2 RTS Command Descriptions 211 Vol Parms AN0P DC 12 '6' ;The number of parameters DC I4'DevName' Pointer to device name DC I4'VolSpace' ;Pointer to volume name total blk DS 4 ;total blocks free_blk DS 4 free blocks sys_id DS 2 ;file system ID block sz DS 2 ;bytes per block DevName GSString '.APPLEDISK3.5A' VolSpace DC I2'35' Size of class 1 buffer VolName DS 33 Space for volume name used blk DS 4 212 GS/OS and ProDOS 8 CommandsWrite $2013 GS/OS ProDOS 8 Purpose: To write bytes of data to an open file. Writing begins at the current Mark position. After you write the data to the file, the operating system increases the Mark position by the number of bytes written. If the new Mark position is greater than EOF, EOF is set equal to Mark. Parameter table: ProDOS 8 Input or O(fret Symbolic Name Result Description +0 num - parms I Number of parameters (4) +1 refnum I Reference number for the file +2 to +3 databufler I Pointer to start of data buffer +4to +5 requestcount I Number of bytes to write + 6 to + 7 transfer - count R Number of bytes actually written CS/OS Input or Offset Symbolic Name Result Description + 0 to + 1 pcount I Number of parameters (5) + 2 to + 3 ref num I Reference number for the file +4 to +7 databufler I Pointer to start of data buffer +8 to + 11 requestcount I Number of bytes to write + 12 to + 15 transfer - count R Number of bytes actually written + 16 to + 17 cache priority I Block-caching priority code Descriptions of parameters: num - parms The number of parameters in the ProDOS 8 parameter table (always 4). Command Descriptions 213 ref num data - buffer The reference number ProDOS 8 or GS/OS assigned to the file when it was first opened. A pointer to the beginning of a block of memory that contains the data to be written to the file. request - count The number of characters to be written to the file from the buffer pointed to by data - buffer. transfer - count This result contains the number of characters actually written to the file and usually equals request - count. However, it will be less the request - count if the disk becomes full part way through a write operation or if some other disk error occurs that prevents the file from being written to. pcount The number of parameters in the GS/OS parameter table. The min- imum value is 4; the maximum is 5 (or 4 for a character device file). cache - priority This code indicates how GS/OS is to handle the caching of disk blocks related to the write operation: $0000 do not cache blocks $0001 cache blocks This field is not used for character devices. Common error codes: $2B The disk is write-protected. $43 The file reference number is invalid. You might be using a reference number for a file that you've already closed. $48 The disk is full. $4E The file cannot be accessed. Solution: Set the write-enabled bit of the file's access code to 1 using SET - FILE - INFO. $56 The pathname buffer address is invalid because it has been marked as in use in the ProDOS 8 system bit map. Specifi' a buffer address that does not conflict with areas already used by ProDOS 8 or its file buffers. Examine the system bit map to determine the free and protected areas. Other possible error codes are $04, $07, $27. Programming example: This GS/OS subroutine writes 256 bytes to file 2; the data buffer begins at location Buffer. 214 GS/OS and ProDOS 8 Commands _Write WR_Parms BCS Error ;Branch if error occurred RTS WR_Parms DC 12 '4' ;Parameter count DC 12 '2' ;File reference number (assume #2) DC 14'Buffer' ;Pointer to data buffer DC 14'256' TransCnt DS 4 Buffer DS 256 Number of bytes to write ;# of bytes actually written ;Data buffer If no error occurred, the number stored at TransCnt should be equal to 256, the request count. But if the disk becomes full during the write, TransCnt will be less than 256. If you want to append data to the end of an open file, use GetEOF to determine the file size, and then use SetMark to set the Mark pointer to the EOF value. Subsequent Write operations will begin at the end of the file. Command Descriptions 215 GS/OS ProDOS 8 Purpose: To transfer the contents of a 512-byte buffer from memory to a block on an At - formatted disk. Under GS/OS, use the DWrite command instead. Parameter table: ProDOS 8 Input or Offset Symbolic Name Result Description + 0 num - parms I Number of parameters (3) +1 unitnum I Unit number + 2 to + 3 data - buffer I Pointer to the data output buffer +4to +5 Mcknum I Number of block to be written to Warning: Do not use WRITE - BLOCK if you want your application to work with ~ AppleShare file server volume over AppleTalk. Descriptions of parameters: num - parms The number of parameters in the ProDOS 8 parameter table (always 3). unit - num The slot and drive number for the disk drive to be accessed. The format of this byte is as follows: 7 6 $ 4 3 2 1 0 ProDOS 8 assigns a drive number of 1 or 2 to each drive in the system. DR = 0 for drive 1, and DR = 1 for drive 2. SLOT is usually the actual slot number for the disk controller card (1-7 decimal; 001-111 binary) but may be the number of a phantom, or logical, slot. The unit - num value for the /RAM volume is $B0, meaning it is the logical slot 3, drive 2 device. databufler A pointer to the beginning of a 512-byte block of memory that is to be written to the disk. 216 GS/OS and Pro DOS 8 Commands block - num The number of the block to be accessed. The permitted values for block num depend on the disk device: z 0-279 for 5.25-inch drives z 0-1599 for 3.5-inch drives z 0-127 for the ProDOS 8 /RAM volume You can determine the volume size for a device using the GET - FILE - INFO command and speci~ing the name of the volume directory for the disk in the device. The size (in blocks) is returned at relative positions $5 and $6 in the parameter table. Common error codes: $27 The disk is unwriteable probably because a portion of the disk medium is permanently damaged. This error also occurs if the drive door on a 5.25-inch drive is open or no disk is in the drive. $28 No device connected. This error is returned if you do not have a second 5.25-inch drive connected to the drive controller, but you try to access it. $2B The disk is write-protected. Other possible error codes are $04, $07, $11, $2F, $53, $56. Programming example: WRITE - BLOCK is perhaps the most dangerous of all the ProDOS 8 commands since it lets you overwrite any block on the disk with any data you want. It is very useful, however, for trying to recover damaged files and malcing backup copies of disks. It is also possible to use WRITE - BLOCK to write to any sector on a DOS 3.3- formatted disk. See Appendix II for suggestions on how to do this. Here's an interesting ProDOS 8 program that allows you to rename the volume directory of a disk in slot 6, drive 1 to AREA: JSR ML1 DFB $80 DA PARMTBL BCS ERROR LDX #0 LDY #5 M0VENAME LDA NEWNAME,X BEQ SETLEN STA BLKBUFF,Y INX INY BNE MOVENAME ;READ_BLOCK Address of parameter table Branch if error occurred Offset for volume name Branch if at end Move new name into place ;(Always taken) Command Descriptions 217 SETLEN TXA 0RA #$FO LDY #4 STA BLKBUFF,Y JSR MLI DFB $81 DA PARMTBL BCS ERROR RTS PARMTBL DFB 3 DFB $60 DA BLKBUFF DW 2 BLKBUFF DS 512 NEWNAME ASC 'AREA' DFB 0 Get new name length ;Merge directory ID bits Save new name length ;WRITE_BLOCK ;Address of parameter table Branch if error occurred The # of parameters ;unit number code (slot 6, drive 1) Pointer to 512-byte buffer Block number for volume directory ;This is the block buffer ;New volume name (<15 chars) (Terminate with 0) We saw in Chapter 2 that the volume directory of a disk always begins in block 2 that the volume name is the first entry in that directory block (beginning at offset This program simply reads in block 2 (using READ - BLOCK), changes the vc name, and then writes the block back to disk. The chore is simplified because parameter tables for READ - BLOCK and WRITE - BLOCK are identical. Of course, the preferred way to rename a volume directory is to use the RENAME command. 218 GS/OS and Pro DOS 8 Commands