QDOS Low-Level Documentation
INTRODUCTION
This document is a collection of different documents from different
sources dealing with low-level details of the QL and QDOS.
TABLE OF CONTENTS
QL Device Names & Related Conventions
QDOS Errors
QDOS Basic Memory Areas
QDOS Memory Map
QDOS Register conventions
CHANNEL- & SCR_-DEFINITION BLOCKS
QDOS Device Driver Headers
QDOS Job Control Headers
QDOS Vectored Calls
Summary of QDOS Traps
CREDITS
Kit Lester ( Most QDOS summeries), Simon Goodwin ( QDOS Traps )
QL Device names & related conventions
-------------------------------------
CON_wXhAxXy_k or
CON_ - default con_448x180a32x16_128
CTLn - see concepts/"joystick"
DEVn 93- GC/p iii n=1 to 8: logical devices attacable to
physical devices or directories
FLPn_*D2h 93- GC/p ix for direct sector access to a HD disk
FLPn_*D4e 93- GC/p ix for direct sector access to an ED disk:
4 means 2048-byte sectors
FLPn_*Dsd 86 Trumpcard see keywords/OPEN
FLPn_name * 86 Trumpcard see keywords/FORMAT
MDVn_name - see concepts/"Microdrives"
NET - see concepts/"network"
NETd_s - see concepts/"devices"
NETI_0 84 TK1/tk2 device to receive broadcast, with
2.4,22 buffer size 2kb less than memory
NETI_0_buffersize 84 TK1/tk2 as NETI_0, with given buffer size in kb
2.4,22
device for input from the given
NETI_station 84 TK1/tk2 station: if station=this machine, input
2.4,22
from any station
NETO_0 84 TK1/tk2 device for broadcast to all stations
2.4,22
NETO_station 84 TK1/tk2 device for output to the given station
2.4,22
Nn_dev_ 84 TK1/tk2 dev_ on network node n
2.4,22
PAR 95 SGC/p II Parallel port
PAR 95 SGC/p VI Parallel port connector details
PARF 95 SGC/p II Parallel port with FF at CLOSE
PIPE_ - input pipe whose channel is in D3
(assembler)
PIPE_n - output pipe with a n-byte buffer
RAMn 86 TK2 ramdisk
ROM1_ 98 RomDisq RomDisq (Flash-disk, from Firshman)
SCR_wXhAxXy or SCR_ - default ser_448x180a32x16
SERnphz - default ser1r
WINn 93- GC/p vii ...
QDOS Errors
-----------
Returned in D0 from TRAPs, Vectored Calls, and Basic extensions
-1 ERR_NC Operation not complete
-2 ERR_NJ Not a (valid) job
-3 ERR_OM Out of memory
-4 ERR_OR Out of range
-5 ERR_BO Buffer overflow
-6 ERR_NO Channel not open
-7 ERR_NF File or device not found
-8 ERR_EX File already exists
-9 ERR_IU File or device already in use
-10 ERR_EF End of file
-11 ERR_DF Drive full
-12 ERR_BN Bad device
-13 ERR_TE Transmission error
-14 ERR_FF Format failed
-15 ERR_BP Bad parameter
-16 ERR_FE File error
-17 ERR_EX Expression error
-18 ERR_OV Arithmetic overflow
-19 ERR_NI Not implemented (yet)
-20 ERR_RO Read only
-21 ERR_BL Bad line of Basic
QDOS Basic Memory Areas
-----------------------
There are 12 distinct areas:
LOW ADDRESS
job header -- Same layout as any other JB area. $68 bytes.
SV_BASIC points to the base of this area.
-- Interpreter work variables. fixed length:
includes pointers to other areas, which may be
SuperBASIC work area moved around. During interpretation, A6 points
to the base of this area: the BV values are the
offsets: the whole area can be moved (hence A6
is changed to new base address). See below.
-- For access to SuperBasic variables and
name table parameters. A table of 8-byte entries: see
below.
-- For access to SuperBasic variables and
namelist parameters. Each entry is a BYTE character
count, then the characters of the name [ALL
OTHER STRINGS USE*WORD* -LENGTH COUNTS].
-- For access to SuperBasic variables and
variable values area parameters. A heap in which the values of the
variables are cstored: see below for the formats
of the entries.
channel table -- For SuperBASIC channels. See below.
-- Convenient for reserving space in added
arithmetic (RI) stack routines: and for passing parameters from
SuperBASIC to routines. See above.
token list -- Not described in TechRefMan
line number table -- Not described in TechRefMan
program file -- Not described in TechRefMan
return list -- Not described in TechRefMan
buffer -- Not described in TechRefMan
HIGH ADDRESS
1 SuperBASIC work area
$00 BC_START Relative to SV_BASIC
- - *** START OF POINTERS ***
$00.L BV_BFBAS Buffer base
$04.L BV_BFP Buffer running pointer
$08.L BV_TKBAS Token list
$0C.L BV_TKP ?
$10.L BV_PFBAS Program file
$14.L BV_PFP ?
$18.L BV_NBAS Name table
$1C.L BV_NTP ?
$20.L BV_NLBAS Name list
$24.L BV_NLP ?
$28.L BV_VVBAS Variable values
$2C.L BV_VVP ?
$30.L BV_CHBAS Channel name
$34.L BV_CHP ?
$38.L BV_RTBAS Return table
$3C.L BV_RTP ?
$40.L BV_LNBAS Line number table
$44.L BV_LNP ?
- - *** CHANGE OF DIRECTION ***
$48.L BV_BTP Backtrack stack during parsing
$4C.L BV_BTBAS ?
$50.L BV_TGP Temporary graph stack during parsing
$54.L BV_TGBAS ?
$58.L BV_RIP Arithmetic stack
$5C.L BV_RIBAS ?
$60.L BV_SSP System stack
$64.L BV_SSBAS ?
- - *** END OF POINTERS ***
$68.W BV_LINUM Current line number
$6A.W BV_LENGTH Current length
$6C.B BV_STMNT Current statement on line
$6D.B BV_CONT Continue ($80) or stop (0) processing
$6E.B BV_INLIN Processing in-line clause (loop=1, other=$FF) or
not (=0)
$6F.B BV_SING Single line execution ON ($FF) or OFF (0)
$70.W BV_INDEX Name tab row of last inline loop index read
$72.L BV_VVFREE First free space in variable value table
$76.L BV_SSSAV Saved sp for out/mem to back to
$7C.? BV_UPROC MINERVA: Set address of use trace routine [p
ASM.5-]
$80.L BV_RAND Random number
$84.L BV_COMCH Command channel
$88.W BV_NXLIN Which line number to start after
$8A.B BV_NXSTM Which statement to start after
$8B.B BV_COMLN Command line saved ($FF) or not (0)
$8C.W BV_STOPN Which stop number set
$8E.B BV_EDIT Program has been edited ($FF) or not (0)
$8F.B BV_BRK There has been a break (0) or not ($80)
$90.B BV_UNRVL Need to unravel ($FF) or not (0)
$91.B BV_CNSTM Statement to CONTINUE from
$92.W BV_CNLND Line to CONTINUE from
$94.W BV_DALNO Current DATA line number
$96.B BV_DASTM Current DATA statement number
$97.B BV_DAITM Next DATA item to read
$98.W BV_CNIND Inline loop index to CONTINUE with
$9A.B BV_CNINL Inline loop flag for CONTINUE
$9B.B BV_LSANY Whether checking list ($FF) or not (0)
$9C.W BV_LSBEF Invisible top line
$9E.W BV_LSBAS Bottom line in window
$A0.W BV_LSAFT Invisible bottom line
$A2.W BV_LENLN Length of window line
$A4.W BV_MAXLN Max. number of window lines
$A6.W BV_TOTLN Number of window line so far
$AA.B BV_AUTO Whether AUTO/EDIT is on ($FF) or off (0)
$AB.B BV_PRINT Print from prtok ($FF) or leave in buffer (0)
$AC.W BV_EDLIN Line number to edit next
$AE.W BV_EDINC Increment on edit range
$B0 to $100 - See p163 of the Tech Ref Man
Basic channel definitions: (1) see later (2) p164 Tech Ref Man
2 NAME TABLE ENTRIES
The entries can be of the following kinds:
bytes 7-4 bytes 3-2 byte 1 byte 0 [1] Kind
value pointer name pointer $00 $01/02/03 Unset typed value
ptr to RI stack -1 $01 $01/02/03 Typed expression [2]
value pointer name pointer $02 $01/02/03 Typed value
value pointer -1 $03 $00 Substring [2]
value pointer name pointer $03 $01/02/03 Typed array
line # in msw name pointer $04 $00 SuperBASIC procedure
line # in msw name pointer $05 $01/02/03 SuperBASIC typed
function
value pointer name pointer $06 $02 REPeat loop index
value pointer name pointer $07 $02 FOR loop index
abs address name pointer $08 $00 Machine code procedure
abs address name pointer $09 $00 Machine code function
* A positive name pointer is to an entry in the name list: -1 is a
nameless item: other -ve name pointers are to another entry in the name
table of which this entry is a copy.
* A positive value pointer is to an entry in the variable values area: -1
is for an undefined value.
* Because the areas are movable, the pointers are offsets: for the RI
stack the offsets are from the high-address base; for other areas it is
from the low-address base.
[1] Byte 0 has bitwise format h sss tttt where
sss separator after the parameter
0 none/not param
1 comma
2 semi-colon
3 backslash
4 exclamation mark
5 'TO' keyword
h # before the parameter
0
no/not param
1
yes
tttt type of entry
0 null
1 string
2 f p
3 integer
(Only tttt is shown in the main table)
[2] Not normally reccomended for use by added routines.
3 VARIABLE VALUES AREA
A heap in which the values are stored. The item entries are:
--integer - 16-bit two's complement word.
- 2-byte exponent, then 4-byte mantissa. Ms 4 bits of exponent
are 0, LS 12 bits are offset -$800.
Mantissa is 2's complement with bit 31 -1, bit 30 +1/2,
normalized so that bit31 /= bit30 (unless the whole number is
--f p exactly zero, in which case all 6 bytes are 0). So value is
-- mantissa*2^(exponent-$800)
if the mantissa is taken as fraction or
-- mantissa*2^(exponent-$81F)
if the mantissa is taken as .L integer.
- 2 byte character count, then that number of characters, then
-- string (if the count was odd) an ignored byte to make the whole an even
# of bytes
- header of format
* .L offset from base of variable values area to the array
values
* .W number of dimensions
* .W max index of the dimension
-- array * .W index multiplier for the dimension
[The last pair of items are repeated once for each dimension.]
STRING ARRAY: is an array of characters, except zeroth element
of the final demension is .W containing the string length; Final
dimension defines the maximum string length, +1 if odd.
SUBSTRING: result of a slicing: an array of characters, except
that the base of indexing is one rather than zero.
4 THE BASIC CHANNEL TABLE
A channel number #n indexes the SuperBASIC channel table. Each entry in the
table is of length CH_LENCH ($28) bytes. The base of the table is at
BV(CHBAS(A6) and the top at BV_CHP(A6). So the base for entry #n is at (
BV_CHBAS(A6) + CH_LENCH*n ) (A6)
Each entry is of format:
$00.L The channel ID
$04.F Current graphics cursor x
$0A.F Current graphics cursor y
$10.F Turtle angle (degrees)
$16.B Pen status
$20.W Character position on line for PRINT and INPUT
$22.W WIDTH of page
The table has as many entries as the number of the current highest-numbered
channel: an un-opened channel either has a number greater than that, OR has
a negative channel ID.
QDOS MEMORY MAP
---------------
Hardware map
$FFFFF +--------------------------+
| Add-on ROM (up to 128kb) |
$E0000 +--------------------------+
| 8x16kb device slots |
$C0000 +--------------------------+
| Up to 512kb add-on RAM | } See } Top actual
$40000 +--------------------------+ } next } address goes
| 96kb on-board user RAM | } diagram } in SV_RAMT
$28000 +--------------------------+
| 32KB screen RAM |
$20000 +--------------------------+
| On-board IO (partially | $1806?3 = master chip status reg: bit 0=1 blanks display:
| decoded) | bit 0=0 enables display. ALSO??!! POKE 98403,2 to blank
$10000 +--------------------------+ screen, POKE..,2 to restore monitor mode.
| 16kb plug-in ROM |
$0C000 +--------------------------+
| 48kb on-board ROM |
$00000 +--------------------------+
Ram map
SV_RAMT +----------------+
SV_RESPR | Resident proc- | When not jobs present, QDOS can allocate &
| edure area | totally-deallocate space: no other QDOS ops.
+vvvvvvvvvvvvvvvv+
SV_TRNSP | Transient | Code/data/stack area per relocatable job.
| program area | Not normally re-entrant, but can be made so.
+vvvvvvvvvvvvvvvv+
SV_BASIC | SuperBASIC | Basic program, variables, its IO channels.
| area | See BV_ definitions: all pointers A6-relative.
+vvvvvvvvvvvvvvvv+ [Top regions grow down.]
SV_FREE | Free memory | Used by the filing
| area | system for slave blocks.
+^^^^^^^^^^^^^^^^+ [Common heap grows up]
SV_HEAP | Common heap | Channel definitions, workstore for IO & programs.
| area | MT_ALCHP & _RECHP. Auto RECHP at end of job.
+----------------+
| System manage- | Various. Info for joblist, etc. Also the
| ment tables | Supervisor Stack.
+----------------+
| System |
| variables SV_ |
$28000* +----------------+ Base of system variables. $28000 or MT_INF: see below
| Display RAM |
$20000 +----------------+ Base of RAM
* System variables start at $28000 in ROMs up to JS: in Minerva (up to 1.92
at least) running in two-screen mode they start at $30000 because of the
second screen's-worth of display ram. IN ANY ROM it is prudent to use MT_INF
to locate the base of the SVs.
NB: $28000 = 163840
$20000 = 196608
Allocation and release
Allocate Release
Res. procedure areaMT_ALRES MT_RERES [total release
only]
Trans. program area~MT_CJOB ~MT_FRJOB
[for heap
--------"-------- MM_ALLOC MM_LINKFR allocation within
the jobs own data
area.]
SuperBASIC area MT_ALBAS MT_REBAS [for interpreter
only]
------"------ BV_CHRIX automatic [space in RI stack]
[in other
------"------ [see "BASIC SuperBASIC
interpreter"]
areas]
Free memory area [not directly used
by normal jobs]
- also released
Common heap area MT_ALCHP MT_RECHP when owner job is
deleted
[from dev.drivers]
------"------ MM_ALCHP MM_RECHP - also released
when owner job is
deleted
QDOS Register conventions
-------------------------
EXEC and MT_CJOB
Each EXEC/MT_CJOB transient program area is activated in the state:
(A6,A5.L) +-------------------+
high | Command string | } If A6+A5>A7, parameters from
address+-------------------+ }
| .L Channel ID | } the jobs parent job.
| ... | }
| .L Channel ID | }
+-------------------+ } (EXEC/EXEC_W leave A6+A5=A7.)
| .? Number of | }
(A7) i.e.USP| Channel IDs | }
+-------------------+
| Stack area/ | The jobs stack is the top
(A6,A4.L) | Data area |
+-=-=-=-=-=-=-=-=-=-+ part of the data area.
| Code area |
Even address+-------------------+
| .Bs Job Name | If the job name has an odd number
| .W #chars in j.n. |
| .W $4AFB | of characters, it's followed by
low | JMP.L start |
(A6) address+-------------------+ an (ignored) 'pad' character.
The stack usually runs from the top of the data area downwards, except that
the various ways of loading can imply differing numbers of zeros already on
the stack when the program is started.
TALENT WORKBENCH does not appear to implement the A4 and A5 conventions.
The A6 convention is of great use to circumvent the problem that
instructions that store to memory may not have PC-related addresses, i.e.
may not have addresses of either of the forms:
* d16(PC) or
* d8(PC,R)
Instead, one can use d16(A6) and d8(A6,R) - provided that one does not
change A6, of course!
Basic extensions
Defining extra routines
Call BP_INIT (qv) to link in the new routine(s).
1. The SuperBASIC program area can be moved at any time, so all references
in the area must be A6- or A7-relative: don't save A6 or A7 except in
arithmetic or address calculations: don't alter them (except A7 by
PUSHes and POPs). [But can use TRAP#0 to go into supervisor mode to
make following code uninteruptable - this is not a normal practice.]
2. Don't use more than 128 bytes of user stack.
3. D0.L must be returned as an error code.
4. D1-5 and A0-5 can be spoilt: DO NOT SPOIL D6 D7 A6 or A7.
PARAMETER PASSING
...is by substitution:
1. The interpreter evaluates any expression parameters;
2. Each actual is then given a new entry at the top of the name table - if
the routine is written in SuperBASIC, any missing actual gets a null
entry;
3. The interpreter then swaps the new name table entries with the old
entries for the actuals;
4. If the routine is written in machine code, it is CALLed with A3->NTE of
first parameter in the list, and A5->[?just after] the NTE of the last
parameter. [So there will be (A5-A3)/8 parameters.]
5. If a LOCal statement is found, the NTE is copied to the top of the name
table, and the original NTE is replaced by an empty entry.
6. At the end of SuperBASIC routine, the parameter enties are copied back
and local entries removed. The parameter NTEs and any temporary storage
in the variable value area are then removed for all routines.
GETTING SCALAR ACTUALS BY VALUE
Use CA_GTINT (.W integer) CA_GTFP (f p) CA_GTSTR (string) CA_GTLIN (f p
converted to .L integer). Each needs A3 to base of & A5 to end of the NTEs
of the parameters, assumes the parameters are of the same type, and returns
the # of parameters fetched, with their values on the RI stack. Separator
flags are spoilt.
For unquoted strings (i.e. SuperBASIC names to be used literally - e.g. as
file names) the caller of CA_GTSTR must do as follows:
1. Inspect the name to see if it is a valid set string variable.
2. If so, fetch it with CA_GTSTR;
3. otherwise, fetch the parameter's name itself from the name list,
converting to string form by changing the word count from byte to word,
and realigning the string if necessary.
RETURNED VALUES ON THE ARITHMETIC (RI) STACK
Entries on the stack must be word-aligned. So for a string
1. the character count must be on a word boundary; and
2. odd-length strings have a final padding byte, whose value is ignored.
GENERAL
TOS is usually pointed to by A1. Space can be allocated by BV_CHRIX. The
vectored routines for getting results to RI stack do their own
space-allocation. RI stack is automatically tidied after procedures and
after errors in functions.
On return from a function the returned value should be the topmost (i.e.
lowest address) with nothing below it, and both (A6,A1.L) and BV_RIP(A6)
pointing to it. The result type should be in D4 (1=string, 2=fp, 3=.W
integer, with .L integers converted to f p before the RETurn).
Results can be passed back in parameters by pointing A3 to the NTE and
calling BP_LET. If the actual was an expression, BP_LET doesn't give an
error, and the result value is lost. The type of the result is given by the
NTE, and the value on the RI stack must be in the correct form for that
type.
CHANNEL- & SCR_-DEFINITION BLOCKS
---------------------------------
SV_CHBAS thru SV_CHMAX point to a table of longwords: each of those
longwords points to a CHANNEL DEFINITION BLOCK in the following offsets
format.
ALL CHANNELS:
$00.LCH__LEN Length of channel definition block
$04.LCH__DRIVR Address of driver
$08.LCH__OWNER Owner Job
$0C.LCH__RFLAG Address to be set when space released
$10.WCH__TAG Channel ID (channel tag)
Status:
* = 0 OK
$12.BCH__STAT * = -1 (A1)
* = $80 (A1,A6.L)
* = -ve waiting
$13.BCH__ACTIN Stored action for waiting Job
$14.LCH__JOBWT ID of Job waiting on IO
$18 CH__END -- here on differs depending on the kind of channel --
EXTENDED CHANNEL DEFINITION FOR PLAIN SERIAL QUEUES:
$18.LCH__QIN pointer to input Q (or 0)
$1C.LCH__QOUT pointer to output Q (or 0)
$20 CH__QEND -- end --
EXTENDED CHANNEL DEFINITION FOR SCREEN DRIVER:
$18.WSD__XMIN Window top lefthand side
$1A.WSD__YMIN
$1C.WSD__XSIZE Window size
$1E.WSD__YSIZE
$20.WSD__BORWD Border width
$22.WSD__XPOS Cursor position
$24.WSD__YPOS
$26.WSD__XINC Cursor increment
$28.WSD__YINC
$2A.LSD__FONT Font address
$2E.L- Second font address
$32.LSD__SCRB Base address of screen ($20000 on QLs, differs on THOR)
$36.LSD__PMASK Paper colour mask
$3A.LSD__SMASK Strip colour mask
$3E.LSD__IMASK Ink colour mask
Character attributes:
* bit 0 - Underline bit
* bit 1 - Flash bit
* bit 2 - Transparent background
$42.BSD__CATTR * bit 3 - XOR characters/graphics
* bit 4 - Double height
* bit 5 - Extended width
* bit 6 - Double width
* bit 7 - Graphics positioned characters
$43.BSD__CURF Cursor flag, 0=suppressed, >0=visible
$44.BSD__PCOLR Paper colour byte
$45.BSD__SCOLR Strip colour byte
$46.BSD__ICOLR Ink colour byte
$47.BSD__BCOLR Border colour byte
$48.BSD__NLSTA New line status ( >0 implicit, <0 explict)
$49.BSD__FMOD Fill mode (0=OFF, 1=ON)
$4A.FSD__YORG Graphics window x origin (6 bytes)
$50.FSD__XORG Graphics window y origin (6 bytes)
$56.FSD__SCAL Graphics scale factor (6 bytes)
$5C.LSD__FBUF Pointer to fill buffer
$60.LSD__FUSE Pointer to user defined fill vectors
$64.WSD__LINEL Line length in bytes
$68 SD__END -- end --
I've used ".F" to mean "6-byte floating point". -- KL
QDOS Device Driver Headers
--------------------------
$00.L CH_NEXT Pointer to next driver
$04.L CH_INOUT Entry for input and output
$08.L CH_OPEN Entry for OPEN
$0C.L CH_CLOSE Entry for CLOSE
EXTENDED DEVICE HEADER FOR DIRECTORY DEVICES:
$10.L CH_SLAVE Entry for slaving blocks
$14.L CH_RENAM Entry for RENAME
$1C.L CH_FORMAT Entry for FORMAT
$20.L CH_DFLEN Length of physical definition block
$24 CH_DRNAM 2+n bytes drive name
QDOS Job Control Headers
------------------------
Base of the table is pointed to by SV_JBBAS: top by SV_JBTOP. Each entry in
the table is .L & points to $69 bytes as follows:
$00.LJB__LEN Total length of job control + Job area
$04.LJB__START Start address on activation
$08.LJB__OWNER Job ID of this Job's owner
$0C.LJB__HOLD Pointer to a byte which will be cleared when the scheduler
releases the job.
$10.WJB__TAG Tag for Job as allocated by MT.CJOB
Current accumulated priority: incremented when a job is
$12.BJB__PRIOR active but not executing. It is set to zero when the job is
executing. The scheduler allows the Job with the highest
accumulated priority to execute.
$13.BJB__PRINC This priority increment is the initial priority of the Job.
($20=>default: 0=>inactive)
Job status:
* =0 is not suspended
$14.WJB__STAT * >0 is number of frames before release
* -1 is suspended (IO or MT.SUSJB)
* -2 is waiting for another job to finish
$16.BJB__RELA6 MSB is set if next trap #2 or #3 has addressing relative to
A6 (as set by Trap #4)
$17.BJB__WFLAG Set if a job is waiting for this one
$18.LJB__WJOB ID of Job waiting for this to finish
$1C.LJB__TRAPV Pointer to trap redirection vectors
$20.LJB__D0 Saved value of D0
$24.LJB__D1 Saved value of D1
$28.LJB__D2 Saved value of D2
$2C.LJB__D3 Saved value of D3
$30.LJB__D4 Saved value of D4
$34.LJB__D5 Saved value of D5
$38.LJB__D6 Saved value of D6
$3C.LJB__D7 Saved value of D7
$40.LJB__A0 Saved value of A0
$44.LJB__A1 Saved value of A1
$48.LJB__A2 Saved value of A2
$4C.LJB__A3 Saved value of A3
$50.LJB__A4 Saved value of A4
$54.LJB__A5 Saved value of A5
$58.LJB__A6 Saved value of A6
$5C.LJB__A7 Saved value of A7
$60.WJB__SR Saved value of Status register
$62.LJB__PC Saved value of Program counter
$68 JB__END
QDOS Vectored Calls
--------------------
D1.L space
required. Returns
D1.L space actually
$0C0 MM_ALCHP Allocate on allocated, A0->base
common heap of area allocated.
Spoils D2-3 A1-3.
Error code ERR_OM
if out of memory.
Called in
supervisor modes,
A6->base of system
varaibles, A0->base
$0C2 MM_RECHP Release on of area to release,
common heap
& not from a task
that services an
interrupt. Spoils
D1-3 A0-3.
$0C4 UT_WINDW SET WINDOW
BY NAME
$0C6 UT_CON SET UP CON_
WINDOW
$0C8 UT_SCR SET UP SCR_
WINDOW
- - - Last 3: see OPIE
$0CA UT_ERR0 ERROR TO #0
$0CC UT_ERR ERROR TO #n
$0CE UT_MINT INT TO ISO
ON #n
$0D0 UT_MTEXT TEXT TO #n
- - - Last 4: see OPIE
A0->base of item
(with 4 bytes at
$0D2 UT_LINK Link item start for the
into a list
link), A1->prior
item.
A1 updated, others
$0D4 UT_UNLNK Unlink item preserved. To link
from a list to a new list, use
A1=0.
Allocate an
$0D8 MM_ALLOC area in a See TecRefMan 4.1
heap and p148.
MM_LINKFR
Link freeSee
$0DA space TecRefMan
back into4.1 and
heap p148.
} D1.L=queue length
$0DC IO_QSET Set up a or data, (A6,A2.L)
queue ->queue. Error code
in D0=ERR.NC (q
} full QIN; empty
QOUT,QTEST) ERR_EF
$0DE IO_QTEST Test status (end of file
of a queue
QOUT,QTEST).
Changes
Put a byte } D1 to data, ?D2
$0E0 IO_QIN into a becomes free space
queue if changed, A3
spoilt by QIN,QOUT,
Extract a
$0E2 IO_QOUT byte from a } QTEST,QSET. Data
q length<32767.
Put EOF
$0E4 IO_QEOF marker into
a q
$0E6 UT_CSTR COMPARE TWO
STRINGS
- - - : see OPIE
Direct } For IOSS
$0E8 IO_SERQ queue activities only.
handling See the
$0EA IO_SERIO General IO } Technical
handling Reference Manual.
} D1.L=internal
date/time,
$0EC CN_DATE GET (A1,A6)->tos.
DATE/TIME
Changes A1: puts
string of date or
} time onto stack.
$0EE CN_DAY GET DAY OF CN_Date needs 23
WEEK bytes of stack,
CN_DAY needs 7.
- - - Both: see OPIE
$0F0 CN_FTOD F.P. TO ISO } Convert value on
(A1,A6)->tos to
$0F2 CN_ITOD WORD INT TO } characters in
ISO (A0,A6)->buffer.
$0F4 CN_ITOBB BYTE TO ISO } Spoil D1-D3 A2
A3, change A0 A1.
$0F6 CN_ITOBW WORD TO ISO
$0F8 CN_ITOBL LONG TO ISO
$0FA CN_ITOHB BYTE TO
HEX-ISO
$0FC CN_ITOHW WORD TO
HEX-ISO
$0FE CN_ITOHL LONG TO
HEX-ISO
- - - All: see OPIE
} Convert
(A0,A6)->ISO chars
$100 CN_DTOF ISO TO F.P. in buffer to value
on (A1,A6)->tos. D7
is 0 or
(D7,A6)-> end of
$102 CN_DTOI ISO TO INT buffer. FP result
is 6-byte, others
4-byte, A1 left
-> last of
the result
$104 CN_BTOIB ISO BINARY % bytes. Error
TO BYTE code in D0.
Spoil D1 D2
D3 A1 A2,
change A0 A1
(unless
$106 CN_BTOIW ISO BINARY % error) to
TO WORD point after
consumed
characters,
and to new
tos. Use
$108 CN_BTOIL ISO BINARY % approx 30
TO LONG bytes of
stack. Those
marked '%'
are not in
$10A CN_HTOIB HEX-ISO TO % QDOS 1.03 or
BYTE
earlier.
$10C CN_HTOIW HEX-ISO TO %
WORD
$10E CN_HTOIL HEX-ISO TO %
LONG
- - - All: see OPIE
(A1,A6)->table -
add m/c see below. Spoils
$110 BP_INIT routines to A1, D2. Uses <
SuperBASIC 49bytes of
stack
(A3,A6)->nametable
Get .W entry of 1st param
$112 CA_GTINT ints->RI of list,
stack (A5,A6)->NTE of
last. Spoils
D1 D2 D4 D6 A0 A2 &
$114 CA_GTFP Get f p separator flags in
numbers NTEs. Error code to
D0 & CC.
Leaves D3 lsw =
#params fetched,
$116 CA_GTSTR Get strings params left on
arith stack with
1st
$118 CA_GTLIN Get long param top (ie
integers lowest addr). *
D0.L=#bytes to
reserve: reserves
space on arith
stack (A1,A6).
Reserve Spoils D1 D2 D3.
$11A BV_CHRIX space on RI Error code to D0.
stack May move whole
program, so save
arith stack pointer
in BV_RIP(A6),
retreive it after.
EXECUTE
$11C RI_EXEC SINGLE RIs
ARITH OP
EXECUTE
$11E RI_EXECB LIST OF
AR.OPS
- - : see OPIE
(A3,A6)->nte,
(A1,A6)->value to
assign: A3 & A1
even. Nte
$120 BP_LET Assign TOS determines type of
to variable
value, hence also
length. Spoils D1
D2 D3 A0 A1 A2.
Error code to D0. *
(A0)->device name
in STRING format *,
decoded result,
(A6)->base of
system variables:
device description
starts 6 bytes
after the call -
see below for
format and
examples. For each
numeric value in
the description,
the value given in
the device name is
returned, or the
$122 IO_NAME Decode a default; for each
device name
list of codes, the
position of the
code in the list is
returned, or zero.
Spoils D1-3 A1 A2,
preserves A0 A3,
error code in D0 =
ERR_NF (not
recognised) or
ERR_BN (recognized
but bad
parameters). If OK,
returns +4: if
ERR_BN, returns +2:
if ERR_NF, returns
+0.
$124 MD_READ Read a } A1->start of
sector buffer, A3=$18020.
$126 MD_WRITE Write a } Error ret WRITE
sector READ/VER SECTR
$128 MD_VERIN Verify a } +0 OK failed bad
sector medium
OK
File#->D1,
Block#->D2
(read/verify);
Sector#->D7
(read sec
head); Point to
end of $4000(An)
buffer->A1 [$18020 is
(all). All mdv control
Read a bad other registers register.]
$12A MD_SECTR sector } +2 OK sec +4 spoilt. Before All 4
header head MD_WRITE, A7 should be
must be to a called with
word with the interrupts
file number in off.
MSB and block
number in LSB.
All should be
called
-- MOVE.W
MD_xxxx,An
-- JSR
* value format - same as in the SuperBASIC variable values area.
$110 BP_INIT Table of form:
.W, approx # of procedures
.W, entry address - this address ) for
.B, length of name of procedure ) each
.. that number of bytes ) proc
.W, zero
.W, approx # of functions
.W, entry address - this address ) for
.B, length of name of function ) each
.. that number of bytes ) func
.W, zero
"approx#" is the number of procs/funcs, unless the average length of the
names is >7, in which case the approx# is (total number of characters+number
of funcs or procs+7)/8 $122 IO_NAME The device name is formed of 4 kinds of
element:
Name - ISO characters, usually letters, case ignored;
Separator - Single ISO character, case ignored.
Number - Decimal number > -1 and < 32768.
Code - One of a list of ISO characters.
The device description block has format:
.W #chars in dev name to check for
.Ws the chars
.W #params to check for
description per params
The format of each parameter description is
byte space, byte separator, word default value (numeric with separator);
word negative number, word default value (numeric with no separator);
word positive number of possible codes, bytes for the ISO char codes.
In the description block, letters must be upper case.
Example description blocks:
DC.W 3,'CON'
DC.W 5 parameters
DC.W '_',448 x-size | CON yeilds 0, 0, 128
448, 180,
DC.W 'X',180 y-size | CON_256 yeilds 0, 0, 128
256, 180,
DC.W 'A',32 x-origin | CON__60 yeilds 0, 0, 60
448, 180,
DC.W 'X',16 y-origin | CONa0x12 yeilds 0, 12,
448, 180, 128
DC.W '_',128 kb q length
DC.W 3,'SER'
DC.W 4
parameters
| SER
yeilds 1, 0, 0, 0
DC.W -1,1
port(dflt 1)
| SERe
yeilds 1, 1, 0, 0
DC.W 4,'OEMS'
parity
| SER2miz
yeilds 2, 3, 1, 2
DC.W 2,'IH'
h/shake
DC.W 3,RZC
raw/ctrlZ/CR
SUMMARY OF QDOS TRAPS and their parameters
Extended, revised and adapted from notes on Qdos supplied with the Public
Domain QDOS Emulator for the Commodore Amiga computer, supplied on disk by
Softville Ltd. (0705) 266509.
Supervisor TRAP #0
This is only mentioned for the sake of completeness, as it cannot be called
from SuperBasic - and should not, or problems are likely. The interpreter
is designed and expects to run in User Mode.
TRAP #0 enters Supervisor mode. This stops the job scheduler running, so
SuperBasic will not move until you return to user mode with the 68008
instruction AND #$D8FF,SR. While you are in Supervisor mode A7 points to
a fixed stack, not the user stack of the task (which can move, if the task
is SuperBasic). You are not expected to use more than 64 bytes on this SSP.
Manager TRAP #1
These calls are used to control or manage machine resources. The effect of
TRAP #1 depends on the value in register D0 at the time of the call. Some
parameters are passed in registers A0 to A3, D1, D2 and D3, depending on
the operation to be performed. Error codes are returned in D0; the operation
went wrong unless D0=0 on return (i.e. DATAREG=0). The table shows error
codes by two-letter mnemonics, e.g. OM = OUT OF MEMORY, OR = OUT OF RANGE,
NJ = No such Job (or no room in Job Table!), NC = NOT COMPLETE etc.
Register names marked .W expect or return 16 bit integer values in the 'low
word' of the register. .L marks a 32 bit long integer, or SuperBasic float.
Byte values 0 to 255 are indicated by .B. If a value is specified as a byte
or word the state of other bits in the register does not alter the effect.
MTRAP 0 MT.INF Provide current job and system information
No Call parameters Return parameters
D1 D1.L current Job ID
D2 D2.L ASCII version, e.g. "1.10"
D3 D3 preserved
A0 A0 pointer to system variables
A1 A1 preserved
A2 A2 preserved
A3 A3 preserved
No errors possible so no need to check DATAREG
MTRAP 1 MT.CJOB Create a job in the transient program area
Call parameters Return parameters
D1.L owner's Job ID D1.L ID of new Job
D2.L length of code(bytes) D2 preserved
D3.L length of data space D3 preserved
A0 A0 Start of memory for task code
A1 start address or 0 A1 preserved
A2 A2 preserved
A3 A3 preserved
Errors : OM, NJ
MTRAP 2 MT.JINF Provide information on a job
Call Return
D1.L Job ID D1.L next Job in tree
D2.L Job at top of tree D2.L owner of Job
D3 D3 MSB<0 if suspended, LSB=priority
A0 A0 base address of job
A1 A1 undefined
A2 A2 preserved
A3 A3 preserved
Errors : NJ
MTRAP 3 illegal system trap, original purpose unknown.
4 MT.RJOB Remove job from transient program area
Call Return
D1.L Job ID D1 undefined
D2 D2 undefined
D3.L Error code D3 undefined
A0 A0 undefined
A1 A1 undefined
A2 A2 undefined
A3 A3 undefined
Errors : NJ,NC
5 MT.FRJOB force remove job from transient program area
Call Return
D1.L Job ID D1 undefined
D2 D2 undefined
D3.L Error code D3 undefined
A0 A0 undefined
A1 A1 undefined
A2 A2 undefined
A3 A3 undefined
Errors : NJ
6 MT.FREE finds the maximum space free for a task
Call Return
D1 D1.L length of space
D2 D2 undefined
D3 D3 undefined
A0 A0 undefined
A1 A1 undefined
A2 A2 undefined
A3 A3 undefined
7 MT.TRAPV sets pointer to trap vectors for this job
Call Return
D1.L Job ID D1.L Job ID
D2 D2 preserved
D3 D3 preserved
A0 A0 base of job
A1 pointer to table A1 undefined
A2 A2 preserved
A3 A3 preserved
8 MT.SUSJB suspend a job
Call Return
D1.L Job ID D1.L Job ID
D2 D2 preserved
D3.W Timeout D3 preserved
A0 A0 base of job control area
A1 address of flag byte A1 preserved
A2 A2 preserved
A3 A3 preserved
Errors : NJ
9 MT.RELJB Release a job
Call Return
D1.L Job ID D1.L Job ID
D2 D2 preserved
D3 D3 preserved
A0 A0 base of job control area
A1 A1 preserved
A2 A2 preserved
A3 A3 preserved
Errors : NJ
10 MT.ACTIV activate a job
Call Return
D1.L Job ID D1.L Job ID
D2.B priority (0-127) D2 preserved
D3.W Timeout (-1,0) D3 preserved
A0 A0 base of job control area
A1 A1 preserved
A2 A2 preserved
A3 A3 preserved
Errors : NJ,NC
11 MT.PRIOR change a job's priority
Call Return
D1.L Job ID D1.L Job ID
D2.B priority (0-127) D2 preserved
D3 D3 preserved
A0 A0 base of job control area
A1 A1 preserved
A2 A2 preserved
A3 A3 preserved
Errors : NJ
12 MT.ALLOC allocate an area in a user heap
Call Return
D1.L required length D1.L allocated length
D2 D2 undefined
D3 D3 undefined
A0 pointer to pointer A0 base of area allocated
to free space
A1 A1 undefined
A2 A2 undefined
A3 A3 undefined
A6 base address A6 preserved
Errors : OM
13 MT.LNKFR link free space back into a user heap
Call Return
D1.L length to link in D1 undefined
D2 D2 undefined
D3 D3 undefined
A0 base of new space A0 undefined
A1 pointer to pointer A1 undefined
to free space
A2 A2 undefined
A3 A3 undefined
A6 base address A6 preserved
14 MT.ALRES allocate resident procedure area
Call Return
D1.L num of bytes required D1 undefined
D2 D2 undefined
D3 D3 undefined
A0 A0 base address of area
A1 A1 undefined
A2 A2 undefined
A3 A3 undefined
Errors : OM,NC
15 MT.RERES release resident procedure area
Call Return
D1 D1 undefined
D2 D2 undefined
D3 D3 undefined
A0 A0 undefined
A1 A1 undefined
A2 A2 undefined
A3 A3 undefined
Errors : NC
N.B. This only works on Minerva, and even then it is dangerous!
16 MT.DMODE Sets or reads the display mode
Call Return
D1.B -1 read mode D1.B display mode
0 : 512 * 256 (MODE 4)
8 : 256 * 256 (MODE 8)
12 : 256 * 256 (MODE 12)
D2.B -1 read display D2.B display type
0 : monitor
1 : TV
D3 D3 preserved
A0 A0 preserved
A1 A1 preserved
A2 A2 preserved
A3 A3 undefined
Mode 12 is only available on CST Thor XVI at the time of writing.
Minerva accepts extra DMODE parameters - see the manual for details.
17 MT.IPCOM Sends a command to the IPC
Call Return
D1 D1.B IPC return parameter
D2 D2 preserved
D3 D3 preserved
D5 D5 undefined
D7 D7 undefined
A0 A0 preserved
A1 A1 preserved
A2 A2 preserved
A3.L pointer to command A3 preserved
14 MT.BAUD sets the RS-232 baud rate
Call Return
D1.W baud rate D1 undefined
D2 D2 preserved
D3 D3 preserved
A0 A0 preserved
A1 A1 preserved
A2 A2 preserved
A3 A3 preserved
SMS-2 documentation calls this SMS.COMM.
19 MT.RCLCK reads the clock
Call Return
D1 D1.L time in seconds since 1961
D2 D2 undefined
D3 D3 preserved
A0 A0 undefined
A1 A1 preserved
A2 A2 preserved
A3 A3 preserved
20 MT.SCLCK sets the clock
Call Return
D1.L time in seconds D1.L time in seconds
D2 D2 undefined
D3 D3 undefined
A0 A0 undefined
A1 A1 preserved
A2 A2 preserved
A3 A3 preserved
21 MT.ACLCK adjust the clock
Call Return
D1.L adjustment in seconds D1.L time in seconds
D2 D2 undefined
D3 D3 undefined
A0 A0 undefined
A1 A1 preserved
A2 A2 preserved
A3 A3 preserved
22 MT.ALBAS allocate Basic program area
Call Return
D1.L num of bytes required D1.L number of bytes allocated
D2 D2 undefined
D3 D3 undefined
A0 A0 undefined
A1 A1 undefined
A2 A2 undefined
A3 A3 undefined
A6 base address A6 new base address
A7 User Stack Pointer A7 new USP (maybe!)
Errors : OM
SMS-2 documentation calls this MT.ALMPA (Movable program area).
23 MT.REBAS release Basic program area
Call Return
D1.L num of bytes D1.L number of bytes released
D2 D2 undefined
D3 D3 undefined
A0 A0 undefined
A1 A1 undefined
A2 A2 undefined
A3 A3 undefined
A6 base address A6 new base address
A7 USP A7 new USP
24 MT.ALCHP allocate common heap area
Call Return
D1.L num of bytes required D1.L number of bytes allocated
D2.L owner Job ID D2 undefined
D3 D3 undefined
A0 A0 base address of area
A1 A1 undefined
A2 A2 undefined
A3 A3 undefined
Errors : OM, NJ
25 MT.RECHP release common heap area
Call Return
D1 D1 undefined
D2 D2 undefined
D3 D3 undefined
A0.L base of area to free A0 undefined
A1 A1 undefined
A2 A2 undefined
A3 A3 undefined
26 MT.LXINT link in an external interrupt service routine
Call Return
D1 D1 preserved
D2 D2 preserved
D3 D3 preserved
A0.L address of link A0 preserved
A1.L entry address, 4(A0) A1 undefined
A2 A2 preserved
A3 A3 preserved
27 MT.RXINT remove external interrupt routine from list
Call Return
D1 D1 preserved
D2 D2 preserved
D3 D3 preserved
A0.L address of link A0 preserved
A1 A1 undefined
A2 A2 preserved
A3 A3 preserved
28 MT.LPOLL link in 50/60 Hz poll routine
Call Return
D1 D1 preserved
D2 D2 preserved
D3 D3 preserved
A0.L address of link A0 preserved
A1.L entry address A1 undefined
A2 A2 preserved
A3 A3 preserved
29 MT.RPOLL remove 50/60 Hz routine from list
Call Return
D1 D1 preserved
D2 D2 preserved
D3 D3 preserved
A0.L address of link A0 preserved
A1 A1 undefined
A2 A2 preserved
A3 A3 preserved
30 MT.LSCHD links in a scheduler loop task
Call Return
D1 D1 preserved
D2 D2 preserved
D3 D3 preserved
A0.L address of link A0 preserved
A1.L entry address A1 undefined
A2 A2 preserved
A3 A3 preserved
31 MT.RSCHD remove scheduler loop task from list
Call Return
D1 D1 preserved
D2 D2 preserved
D3 D3 preserved
A0.L address of link A0 preserved
A1 A1 undefined
A2 A2 preserved
A3 A3 preserved
32 MT.LIOD links in I/O device driver
Call Return
D1 D1 preserved
D2 D2 preserved
D3 D3 preserved
A0.L address of link A0 preserved
A1.L entry address A1 undefined
A2 A2 preserved
A3 A3 preserved
33 MT.RIOD remove I/O device driver from list
Call Return
D1 D1 preserved
D2 D2 preserved
D3 D3 preserved
A0.L address of link A0 preserved
A1 A1 undefined
A2 A2 preserved
A3 A3 preserved
34 MT.LDD links in directory device driver
Call Return
D1 D1 preserved
D2 D2 preserved
D3 D3 preserved
A0.L address of link A0 preserved
A1.L entry address A1 undefined
A1 -> 4(A0)
A2 A2 preserved
A3 A3 preserved
35 MT.RDD remove directory device driver from list
Call Return
D1 D1 preserved
D2 D2 preserved
D3 D3 preserved
A0.L address of link A0 preserved
A1 A1 undefined
A2 A2 preserved
A3 A3 preserved
36 MT.TRA Set up Translate Tables (use TRA instead!)
I/O Allocation TRAP #2
This is only mentioned here for the sake of completeness, as it cannot be
called with DIY Toolkit QTRAP calls.
TRAP #2 calls have parameters in D0 between 1 and 4. They should be accessed
through normal OPEN, CLOSE. FORMAT and DELETE commands, or Toolkit variants.
I/O utilisation TRAP #3
Like TRAP #1 calls, these expect an operation code in D0. They also use
a channel ID (returned by OPEN, or read with BPEEK_L or CHANNEL_ID) in A0,
generated by QTRAP and BTRAP from a SuperBasic Channel number.
Use QTRAP by default; use BTRAP only when the buffer or data addressed by
A1 is inside the SuperBasic task memory area.
Register values that are 'undefined' after a call may have interesting
values in them, but you should not expect these to be consistent between
ROM versions. It is best only to use results that are explicitly documented
here; they should not change as Qdos develops.
The type of the channel determines the operations that may be performed.
If an operation is not defined for a particular device, all these routines
can return ERR.BP (Bad parameter, DATAREG = -15 after the call). The code
in DATAREG after a call depends entirely on the parameters and the channel
or device in use; new devices could potentially return ANY error code.
QTRAP 0 IO.PEND Checks for pending input
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO,EF
Beware: this is not reliable if used to check for console
input on early Qdos versions (such as "JM" or "AH" ROMs).
QTRAP 1 IO.FBYTE Fetch a byte
Parameters Results
D1 D1.B byte fetched
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO,EF
2 IO.FLINE Fetch a line of characters
Parameters Results
D1 D1.W number of bytes (inc. LF)
D2.W length of buffer D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1.L base of buffer A1 updated pointer to buffer
A2 A2 preserved
Errors : NC,NO,EF,BO
3 IO.FSTRG Fetches a string of bytes
Parameters Results
D1 D1.W number of bytes fetched
D2.W length of buffer D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1.L base of buffer A1 updated pointer to buffer
A2 A2 preserved
Errors : NC,NO,EF
4 IO.EDLIN edit a line of characters
Parameters Results
D1.H cursor position D1.W Line length
D1.W current length (including terminator)
D2.W length of buffer D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1.L pointer to EOL A1 pointer to end of line
A2 A2 preserved
Errors : NC,NO,BO
5 IO.SBYTE sends a byte
Parameters Results
D1.B byte to be sent D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO,DF,OR
6 Unused System call (IO.SLINE, redundant; ERR.BP)
7 IO.SSTRG sends a string of bytes
Parameters Results
D1 D1.W number of bytes sent
D2.W number of bytes D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1.L base of buffer A1 updated pointer to buffer
A2 A2 preserved
Errors : NC,NO,DF
8 Unknown unimplemented System call, reports Bad parameter
9 IO.EXTOP invoke extra code as part of SCR/CON/MEM driver
Parameters Results
D1 Passed to extension D1 Passed back by extension
D2 Passed to extension D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 Passed to extension A1 Passed back by extension
A2 Start of extension A2 preserved
Errors : NC,NO,BP or potentially ANYTHING returned by code at A2!
10 SD.PXENQ Results window size and cursor position in pixels
Parameters Results
D1 D1 preserved
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1.L base of buffer A1 undefined
A2 A2 preserved
Errors : NC,NO
PXENQ and CHENQ store four words in a buffer addressed by parameter A1:
0(A1) = X-dimension of window
2(A1) = Y-dimension of window
4(A1) = X-position of cursor
6(A1) = Y-position of cursor
11 SD.CHENQ Find window size and cursor position in characters
Parameters Results
D1 D1 preserved
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1.L base of buffer A1 undefined
A2 A2 preserved
Errors : NC,NO
12 SD.BORDR sets the border width and colour
Parameters Results
D1.B colour D1 undefined
D2.W width D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 preserved
A2 A2 preserved
Errors : NC,NO
13 SD.WDEF redefines a window's position & border
Parameters Results
D1.B border colour D1 undefined
D2.W border width D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1.L base of buffer A1 undefined
A2 A2 preserved
Errors : NC,NO,OR
WDEF expects parameters in a buffer of 8 bytes addressed by A1:
0(A1) = X-dimension of window
2(A1) = Y-dimension of window
4(A1) = X-origin
6(A1) = Y-origin
14 SD.CURE Enable the cursor
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
15 SD.CURS Turn off the cursor
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
16 SD.POS Position cursor at character row & column
Parameters Results
D1.W column number D1 undefined
D2.W row number D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO,OR
17 SD.TAB Position cursor at column
Parameters Results
D1.W column number D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO,OR
18 SD.NL Position cursor on new line
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO,OR
19 SD.PCOL Position cursor on previous column
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO,OR
20 SD.NCOL Position cursor on next column
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO,OR
21 SD.PROW Position cursor on previous row
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO,OR
22 SD.NROW Position cursor on next row
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO,OR
23 SD.PIXP Position cursor using pixel coordinates
Parameters Results
D1.W X-coordinate D1 undefined
D2.W Y-coordinate D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO,OR
24 SD.SCROL Scroll entire window
Parameters Results
D1.W distance to scroll D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
25 SD.SCRTP Scroll the top of a window
Parameters Results
D1.W pixels to scroll D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
26 SD.SCRBT Scroll the bottom of a window
Parameters Results
D1.W distance to scroll D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
27 SD.PAN Pans all of a window
Parameters Results
D1.W distance to pan D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
28 SD.PANTOP, unimplemented system call
29, SD.PANBOT, unimplemented system call
30 SD.PANLN pans cursor line
Parameters Results
D1.W distance to pan D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
31 SD.PANRT pans right side of cursor line
Parameters Results
D1.W distance to pan D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
32 SD.CLEAR clears all of a window
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
33 SD.CLRTP clears the top of a window
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
34 SD.CLRBT clears the bottom of a window
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
35 SD.CLRLN clears the cursor line
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
36 SD.CLRRT clears the right side of the cursor line
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
37 SD.FOUNT sets or resets the character founts
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 base of fount 0 A1 undefined
A2 base of fount 1 A2 preserved
Errors : NC, NO
38 SD.RECOL recolours a window
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 ptr to colour list A1 undefined
A2 A2 preserved
Errors : NC,NO
The colour list consists of 8 bytes which contain the new colour for
each old colour, in order from 0 to 7, or 16 bytes for Argos MODE 12.
39 SD.SETPA sets the Paper colour
Parameters Results
D1.W colour D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
The SuperBasic PAPER command sets both PAPER and STRIP, but this call
sets only the PAPER colour used beneath characters printed with OVER 0.
Thor XVI MODE 12 intensity is controlled by bits 14 & 15 of D1.W
40 SD.SETST sets the Strip colour
Parameters Results
D1.W colour D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
41 SD.SETIN sets the ink colour
Parameters Results
D1.W colour D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
42 SD.SETFL sets MODE 8 flashing on or off
Parameters Results
D1.B flash flag (0 or 1) D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
43 SD.SETUL sets Underlining on or off
Parameters Results
D1.B UNDER flag, 0 or 1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
44 SD.SETMD sets text and graphics OVER mode
Parameters Results
D1.W OVER flag 0, 1 or -1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
45 SD.SETSZ set character size and spacing
Parameters Results
D1.W text width, 0-3 D1 undefined
D2.W text height, 0 or 1 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
46 SD.FILL fills a rectangular block within a window
Parameters Results
D1.W colour D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 ptr to block def A1 undefined
A2 A2 preserved
Errors : NC,NO
Thor XVI MODE 12 intensity is controlled by bits 14 & 15 of D1.W.
A1 points to four word parameters in a buffer:
0(A1) = width in pixels
2(A1) = height in pixel
4(A1) = X origin (relative to window)
6(A1) = Y origin
47 SD.DONL Perform a pending newline, if any
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
48 SD.POINT plots a graphics point
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 arithmetic stack ptr A1 undefined
A2 A2 preserved
Errors : NC,NO
This expects two floating point parameters, passed on the maths stack:
0(A1) = Y coordinate
6(A1) = X coordinate
49 SD.LINE plots a graphics line
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 arithmetic stack ptr A1 undefined
A2 A2 preserved
Errors : NC,NO
This expects four floating point parameters, passed on the maths stack:
0(A1) = Y coordinate end of line
6(A1) = X coordinate end of line
12(A1) = Y start
18(A1) = X start
50 SD.ARC plots a graphics arc
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 arithmetic stack ptr A1 undefined
A2 A2 preserved
Errors : NC,NO
This expects five floating point parameters, passed on the maths stack:
0(A1) = angle subtended, in radians
6(A1) = Y end
12(A1) = X end
18(A1) = Y start
24(A1) = X start
51 SD.ELLIPS plots an ellipse
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 arithmetic stack ptr A1 undefined
A2 A2 preserved
Errors : NC,NO
This expects five floating point parameters, passed on the maths stack:
0(A1) = orientation in radians
6(A1) = radius
12(A1) = eccentricity
18(A1) = Y centre
24(A1) = X centre
52 SD.SCALE sets window scale
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 arithmetic stack ptr A1 undefined
A2 A2 preserved
Errors : NC,NO
This expects three floating point parameters, passed on the maths stack:
0(A1) = Y coordinate of the bottom line
6(A1) = Leftmost pixel X coordinate
12(A1) = length of Y axis in your units
53 SD.FLOOD turns area filling on and off
Parameters Results
D1.L Flag, 0/1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
54 SD.GCUR sets graphics cursor position
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 arithmetic stack ptr A1 undefined
A2 A2 preserved
Errors : NC,NO
This expects four floating point parameters, passed on the maths stack:
0(A1) = graphics X coordinate
6(A1) = graphics Y coordinate
C(A1) = pixel offset to the right
12(A1) = pixel offset downwards
55, 56, 57 unimplemented/unknown system calls
58 SD.TOPW Moves a Thor window to top of the pile
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
This Thor windowing TRAP also directs keyboard input to the window.
59, 60, 61, 62, 63 unimplemented/unknown system calls
64 FS.CHECK checks all pending operations on a file
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
65 FS.FLUSH flushes buffer for file
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO
66 FS.POSAB Move file pointer to absolute position
Parameters Results
D1.L position in file D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO,EF
67 FS.POSRE position file pointer relative
Parameters Results
D1.L offset to file ptr D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO,EF
68 Unimplemented system call, once reserved for RENAME
69 FS.MDINF Gets information about storage medium
Parameters Results
D1 D1.H Unused sectors
D1.W Usable sectors
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 10 byte name buffer A1 past end of medium name
A2 A2 preserved
Errors : NC,NO
70 FS.HEADS sets start of a file header
Parameters Results
D1 D1 length of header set
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 base of header block A1 end of header definition
A2 A2 preserved
Errors : NC,NO
Please see DIY Toolkit volume F for further details of file headers.
71 FS.HEADR reads a 64 byte file header
Parameters Results
D1 D1 undefined
D2.W buffer length D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 ptr to read buffer A1 undefined
A2 A2 preserved
Errors : NC,NO,BO
72 FS.LOAD loads a file into memory
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout (use -1) D3 preserved
A0.L Channel ID A0 preserved
A1 EVEN load address A1 top address after load
A2 A2 preserved
Errors : NO
Some books say D2 is 'length of file' but existing drivers load the
entire file regardless of the parameter value, unfortunately.
73 FS.SAVE saves a file from memory
Parameters Results
D1 D1 undefined
D2.L length of file D2 preserved
D3.W Timeout (-1) D3 preserved
A0.L Channel ID A0 preserved
A1 EVEN address of data A1 Just past end of data
A2 A2 preserved
Errors : DF,NO
This is the end of the calls implemented on standard QL systems.
Others need Toolkit 2, CST Thors, Minerva or hard disks to work.
74 FS.RENAM Changes the name of a file
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 address of new name A1 undefined
A2 A2 preserved
Errors : NC,NO,NF,EX,IU,DF,BN,RO
75 FS.TRUNC Truncate file to current position
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,NO,RO
76 FS.DATE Set or read file dates
Parameters Results
D1.L Date/-1=READ/0=SET D1 undefined
D2.W 0-2 Update/Ref/Backup D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NO,NC
77 FS.MKDIR Makes a file into a sub-directory
Parameters Results
D1 D1 undefined
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NC,IU,BN,RO,DF,NO
78 FS.WATER Read CST Thor watermark
Parameters Results
D1.W Field 0 or 1 D1 Length of field read
D2 Buffer length D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 Base of buffer A1 Top of buffer
A2 A2 preserved
Errors : NO,NC,BO,OR
78 FS.VERS Set or read Miracle file version number
Parameters Results
D1.W Number/0=Read/-1=Bump D1 Version number, 1-65535
D2 D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 A1 undefined
A2 A2 preserved
Errors : NO,NC
79 FS.XINF Interrogate the file system
Parameters Results
D1.W Flag: 0 = everything D1 undefined
D2 Buffer length D2 preserved
D3.W Timeout D3 preserved
A0.L Channel ID A0 preserved
A1 Ptr to result buffer A1 undefined
A2 A2 preserved
Errors : NC,IU,BN,RO,DF,NO
D1=0 to read all the information. Set bits in D1 request specific fields
e.g. D1=7 for a 32 bit MDINF equivalent, D1=57344 for the full name, etc.
The exact contents of the buffer may vary, depending on the system you are
using and its age; CST (Argos 6.37), Miracle and Rebel implement FS.XINF.
SuperBasic A6 relative TRAP #4
This makes the next TRAP #2 or TRAP #3 call relative to A6, for SuperBASIC.
Use BTRAP instead of QTRAP to get the effect of calling TRAP #4 directly.
               (
geocities.com/siliconvalley/pines/Pines)                   (
geocities.com/siliconvalley/pines)                   (
geocities.com/siliconvalley)