Difference between revisions of "GeneveOS Device Operation"
m |
|||
Line 69: | Line 69: | ||
|- | |- | ||
|} | |} | ||
Note that the buffer addresses are 21-bit wide, represented by the [[MDOS Memory Management Functions#Local_.28virtual.29_pages | virtual address]] within the calling task. The address for this buffer should be derived from [[MDOS Memory Management Functions | memory allocation]] operations that were invoked earlier. | |||
After the operation, the PAB contains information about the results of the operation. | After the operation, the PAB contains information about the results of the operation. |
Revision as of 19:43, 22 July 2016
Accessing devices (floppy disk, hard disk, serial connector, printer) is possible in GeneveOS via XOP calls.
User-task XOPs
User-task XOPs are available for use in application programs. Here is a typical example:
PABADD EQU >F180 FILE DATA 8 ... LI R0,PABADD XOP @FILE,0 MOVB @PABADD+2,R0 JNE ERROR ...
Similar as with the TI-99/4A device service routine concept (DSR), a Peripheral Access Block (PAB) must be set up prior to invoking the XOP.
Device Service Routine Call
Input | Output | |
---|---|---|
R0 | Pointer to PAB | - |
The actual operation is contained in the Peripheral Access Block (PAB).
Peripheral Access Block
While the TI-99/4A DSRs expect the PAB to be stored in VDP RAM, the Geneve OS DSRs use CPU RAM for the PAB, which means the PAB need not be copied to the video RAM before use. Also, you can choose to have the I/O buffers in VDP or CPU RAM.
The general layout of the PAB is as follows:
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F | 10 ... |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Opcode | Mode | Error code | Buffer address | Record number | Record length | Memory type | Character count | Status byte | Name length | Name |
Note that the buffer addresses are 21-bit wide, represented by the virtual address within the calling task. The address for this buffer should be derived from memory allocation operations that were invoked earlier.
After the operation, the PAB contains information about the results of the operation.
Operations
OPEN
Open a record-oriented file. A file must be opened before it can be read from or written to. This operation is not required for flat memory image files.
The PAB must be set up prior to invoking the operation:
IN
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F | 10 ... |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
00 | Mode | - | - | Records to reserve | Record length | - | - | - | Name length | Name |
Open new file: The Record Length must be set to a value greater than 0. This will become the length of the records of the new file.
Open existing file: The Record Length must match the length of the records. If the length is unknown, 0 may be passed.
After the OPEN operation has completed, the PAB delivers information about the result:
OUT
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F | 10 ... |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | - | Error code | - | - | Actual Record Length | - | 0 | True Record Length | - | Name length | Name |
The Actual Record Length is the length of the records of the existing file. When 0 was passed on the call, this delivers the record length of the file; otherwise this is the value that was passed for the call. The True Record Length is the record length of the file when it already exists.
CLOSE
Closes a record-oriented file. A file must be closed after being used. After closing, no further read or write operations may be invoked on the file. This operation is not required for flat memory image files.
The PAB must be set up prior to invoking the operation:
IN
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F | 10 ... |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
01 | Mode | - | - | - | - | - | - | - | Name length | Name |
After the CLOSE operation has completed, the PAB delivers information about the result:
OUT
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F | 10 ... |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | - | Error code | - | - | - | - | - | - | Name length | Name |
BWRITE
Writes a sector to a file or to a device. This is a level-2 operation, that is, it accesses the device based on sector addressing (or sectors of a file). BWRITE allows for three operations:
- Create a new, empty file.
- Write sectors to a file.
- Write sectors to a device.
IN
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F | 10 ... |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0B | - | - | Buffer address | Sector offset | - | - | Number of sectors | - | Name length | Name |
Create a file: When a file is addressed, and the number of sectors is 0, a new file is created. The contents of the file should be written by BWRITE on the same file with a sector count greater than 0.
Write to file: When a file is addressed, the operation writes a sequence of sectors to the file. The Sector offset is the number of the first sector of the file, counting from 0. The physical locations of the sectors are subject to the sector allocation on the device; in particular, when fragmentation is required, the sectors are written to the new fragment.
Writing to device: When a device is addressed, the operation writes a sequence of sectors to the device. The Sector offset is the physical sector number.
After the BWRITE operation has completed, the PAB delivers information about the result:
OUT
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F | 10 ... |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | - | Error code | Updated buffer address | Next unwritten sector | - | - | 0 | Number of unwritten sectors | - | Name length | Name |
The Updated buffer address points to the memory address after the sectors were written (e.g. when 4 sectors are written, the pointer is increased by 4*256 = 1024).
The Next unwritten sector is the first sector that has not been written due to an error condition.
The Number of unwritten sectors is the number of unwritten sectors due to an error condition.
Tick here: [ ] Yes, I fully understood the danger of this operation.
(The author lost a complete hard disk by this incident, and was lucky to have a backup.)