DOR's
DOR may be thought of as standing for "Directory Object Record" - although DOR was not intended as an acronym for this, this does provide quite a good explanation. DORs are a fairly general record structure well suited to displaying hierarchically organized information. They are used in the RAM filening system, but unfortunately not in the EPROM filing system, and in application definitions. Some degree of understanding of them is necessary to extract certain information, such as last updated dates, from the filing system.
Format
A DOR starts with the three link pointers which point to the parent, brother and child respectively. The links are of the form of a 2 byte offset within a bank followed by a bank number, ie. an extended address. If relatives do not exist then the link pointers are set to 0 (three zeroes). The remainder of the DOR consists of a series of keyed subrecords.
3 bytes Link to parent, three zeroes indicates a null (pointer) link3 bytes Link to brother, three zeroes indicates a null (pointer) link3 bytes Link to son, three zeroes indicates a null (pointer) link1 byte DOR type, eg. DM_ROM1 byte Length of DOR in bytes1 byte Record key. This is usually a mnemonic, eg. DT_NAM1 byte Length of record entry in bytesn bytes Data specific to record (type)
...
... More record entries (in the same form as above)
...
1 byte The DOR terminator, $FF
The above format may be useful if you want to set up a static DOR structure. For example the header for application cards, and the headers for the internal applications, use a static DOR structure. On the whole, however, the internal arrangement of the DOR is transparent to the user and the DOR interface can be used throughout. This interface works with the following types and record keys:
NOTE: In the following descriptions the ASCII character corresponding to a hexadecimal value is sometimes placed next to it within brackets. This is done to indicate the mnemonic nature of the values used. For example ($4E,"N") represents the single hexadecimal value $4E, the "N" is mnemonic for DT_NAM, the name record type.
Major types
DM_DEV ($81) RAM device (internal use only)
DM_CHD ($82) Character Device (pseudo type, internal use only) (SCR.0, PRT.0, COM.0, NUL.0, INP.0, OUT.0)DM_ROM ($83) ROM Information, consists of three record types: DT_INF ($40,"@") application information DT_HLP ($48,"H") help information DT_NAM ($4E,"N") name of application
DM_EPR ($84) EPR device (eprom file area)
NOTE: It is not possible to add external device drivers to the system via a DOR, despite the major types shown above. This is because device drivers are not integrated into the DOR system.
Minor Types
DN_FIL ($11) File type, consists of four record types: DT_NAM ($4E,"N") file name DT_CRE ($43,"C") creation time DT_UPD ($55,"U") update time DT_EXT ($58,"X") extent (size of file)DN_DIR ($12) Directory type, consists of three record types: DT_NAM ($4E,"N") directory name DT_CRE ($43,"C") creation time DT_UPD ($55,"U") update timeDN_APL ($13) Application Front DOR Type, consists of record type: DT_NAM ($4E,"N") Name of front DOR; the name will be "APPL" for applications and "HELP" for help.DN_DEL ($7F) Deleted Entry Type
Record Types
DT_NAM ($4E,"N") Name type. Name must be null-terminated. Filenames have a fixed length of 17 characters so, if the real filename is shorter, you will need to ignore excess characters (beyond the null-terminator). A name record might look like this: DEFM $4E & $05 & "Paul" & 0DT_UPD ($55,"U") Last Updated Date. 6 bytes. 3 bytes internal time followed by 3 bytes internal date.DT_CRE ($43,"C") Creation Date. 6 bytes. 3 bytes internal time followed by 3 bytes internal date.DT_EXT ($58,"X") Extent of file. 4 byte long word (low byte first)DT_ATR ($41,"A") Attributes. Not currently used. 2 bytes.DT_HLP ($48,"H") Help type. 12 bytes: four 3 byte link pointers (offset+bank): Topics, command, help and tokens. See an example in "Application Static Strucures" section.DT_INF ($40,"@") Information. See an example in "Application Static Structures" section for details of format.
The DOR interface
DORs are manipulated using the OS_Dor call, which is supplied with various reason codes, one for each DOR operation. The possible operations are:
DR_GET ($01) get a handle for a DOR name (system use)DR_DUP ($02) duplicate DORDR_SIB ($03) return brother DORDR_SON ($04) return child DORDR_FRE ($05) free DOR handleDR_CRE ($06) create blank DORDR_DEL ($07) delete DORDR_INS ($08) insert DORDR_RD ($09) read DOR recordDR_WR ($0A) write DOR recordDR_RD2 ($0B) read DOR record (system use only)
The following is the interface system call definition:
OS_Dor, the DOR interface
RST 20H, DEFB $87
In:
A = reason code
HL, IX arguments
Other register usage depends on reason code
Out, if call successful:
Fc = 0
returned values depend on A(in)
Out, if call failed:
Fc = 1
A = error code:
RC_BAD ($04), bad arguments
RC_HAND ($08), bad handle
RC_ROOM ($07), no room
RC_EOF ($09), end of fileEach reason code operation action is described in detail with the OS_Dor call in the "System Calls Reference" section.
Example
The following example reads the last updated date of a file, which can only be done by reading the DOR of the file. To get a DOR handle for a file, the user must use the GN_Opf call with A = OP_DOR ($06). This differs from the other options of GN_Opf in that:
1) It does not open the file. 2) It returns a DOR handle rather than a file handle
Note that the file should be closed before the call is made, and that it is necessary to free the DOR handle after you have finished, by using OS_Dor with reason code DR_FRE.
include "fileio.def" ; file I/O call definitions & parameters
include "dor.def" ; DOR interface call definitions
include "time.def" ; Date & time call definitions
include "stdio.def" ; standard I/O call defs. & parameters
; assume HL points to local filename and DE points to a dummy buffer
; and 'buff' is at least 6 bytes of temporary workspace
; note, 'buff' must not occur in segment 2, or GN_Sdo will fail
.start ld b, 0 ; HL is a local pointer
ld c, 20 ; max. size of expanded filename
ld a, OP_DOR ; get DOR handle
oz GN_Opf ; get DOR information
ld a, DR_RD ; read DOR record
ld b, DT_UPD ; look at record 'U' (update time)
ld c, 6 ; return time information
ld de, buff ; return data at (DE)
oz OS_Dor ; fetch DOR information
ld a, DR_FRE
oz OS_Dor ; free DOR handle
ld hl, buff ; HL points to internal time, date format
oz GN_Sdo ; write time & date to standard output
oz GN_Nln ; new line
ret