If you find any errors below, then please email me with details of what is wrong and what I can do to fix it.
The following table gives details of the vectors that fitted into the first half of the QL ROM. They can all be accessed by code, similar to the following :
start move.w UT_CON,a2 ; Fetch the routine address from the vector table ; ; Set parameter registers etc here jsr (a2) ; Call the routine tst.l d0 ; Set the Z flag if all ok beq.s ok ; All worked ok oops ; ; Process errors here ; ; Exit or carry on appropriately ok ; ; Carry on processing here
Vector | QDOS Mnemonic | SMS Mnemonic | Description |
---|---|---|---|
$C0 | MM_ALCHP | MEM_ACHP | Allocate space in the common heap |
$C2 | MM_RECHP | MEM_RCHP | Release space in the common heap |
$C4 | UT_WINDW | OPW_WIND | Create a window channel |
$C6 | UT_CON | OPW_CON | Create a console channel |
$C8 | UT_SCR | OPW_SCR | Create a screen channel |
$CA | UT_ERR0 | UT_WERSY | Print error message on #0 |
$CC | UT_ERR | UT_WERMS | Print error message to any channel |
$CE | UT_MINT | UT_WINT | Print a decimal number to any channel |
$D0 | UT_MTEXT | UT_WTEXT | Send a message to a channel |
$D2 | UT_LINK | MEM_LLST | Link an item into a list |
$D4 | UT_UNLNK | MEM_RLST | Unlink an item from a list |
$D6 | UT_CRASH | CV_DATIL | QDOS - Crashes the QL. SMS - Convert date & time (6 words) into a long integer |
$D8 | MM_ALCHP | MEM_ALHP | Allocate space from a user heap |
$DA | MM_LNKFR | MEM_REHP | Release space back into a user heap |
$DC | IO_QSET | IOQ_SETQ | Set up a queue header |
$DE | IO_QTEST | IOQ_TEST | Test a queue's status |
$E0 | IO_QIN | IOQ_PBYT | Put a byte into a queue |
$E2 | IO_QOUT | IOQ_GBYT | Get a byte from a queue |
$E4 | IO_QEOF | IOQ_SEOF | Put EOF marker into a queue |
$E6 | UT_CSTR | UT_CSTR | Compare two strings |
$E8 | IO_SERQ | IOU_SSQ | Direct queue handling |
$EA | IO_SERIO | IOU_SSIO | General I/O handling |
$EC | CN_DATE | CV_ILDAT | Get date as a string |
$EE | CN_DAY | CV_ILDAY | Get day as a string |
$F0 | CN_FTOD | CV_FPDEC | Convert a floating point number to ASCII |
$F2 | CN_ITOD | CV_IWDEC | Convert an integer to ASCII |
$F4 | CN_ITOBB | CV_IBBIN | Convert binary byte (8 bits) to ASCII |
$F6 | CN_ITOBW | CV_IWBIN | Convert binary word (16 bits) to ASCII |
$F8 | CN_ITOBL | CV_ILBIN | Convert binary long word (32 bits) to ASCII |
$FA | CN_ITOHB | CV_IBHEX | Convert hex byte (8 bits) to ASCII |
$FC | CN_ITOHW | CV_IWHEX | Convert hex word (16 bits) to ASCII |
$FE | CN_ITOHL | CV_ILHEX | Convert hex long word (32 bits) to ASCII |
$100 | CN_DTOF | CV_DECFP | Convert ASCII to floating point |
$102 | CN_DTOI | CV_DECIW | Convert ASCII to word integer |
$104 | CN_BTOIB | CV_BINIB | Convert ASCII to binary byte (8 bits) |
$106 | CN_BTOIW | CV_BINIW | Convert ASCII to binary word (16 bits) |
$108 | CN_BTOIL | CV_BINIL | Convert ASCII to binary long word (32 bits) |
$10A | CN_HTOIB | CV_HEXIB | Convert ASCII to hex byte (8 bits) |
$10C | CN_HTOIW | CV_HEXIW | Convert ASCII to hex word (16 bits) |
$10E | CN_HTOIL | CV_HEXIL | Convert ASCII to hex long word (32 bits) |
$110 | BP_INIT | SB_INIPR | Add new SuperBasic procedures & functions |
$112 | CA_GTINT | SB_GTINT | Fetch word integer parameters |
$114 | CA_GTFP | SB_GTFP | Fetch floating point parameters |
$116 | CA_GTSTR | SB_GTSTR | Fetch string parameters |
$118 | CA_GTLIN | SB_GTLIN | Fetch long integer parameters |
$11A | BV_CHRIX | QA_RESRI | Reserve space on the maths stack |
$11C | RI_EXEC | QA_OP | Perform a single maths operation |
$11E | RI_EXECB | QA_MOP | Perform a list of maths operations |
$120 | BP_LET | SB_PUTP | Return a result into a parameter |
$122 | IO_NAME | IOU_DNAM | Decode a device name |
The following table gives details of the vectors that didn't fit into the first half of the QL ROM. They can all be accessed by code, similar to the following :
start move.w MD_READ,a2 ; Fetch the routine address from the vector table ; ; Set parameter registers etc here jsr $4000(a2) ; Call the routine in the second half of the ROM bra.s oops ; Routine returns here on error. Ignore D0 on return bra.s ok ; Routine returns here on ok. oops ; ; Process errors here ; ; Exit or carry on appropriately ok ; ; Carry on processing here
Vector | QDOS Mnemonic | SMS Mnemonic | Description |
---|---|---|---|
$124 | MD_READ | MD_READ | Read a microdrive sector |
$126 | MD_WRITE | MD_WRITE | Write a microdrive sector |
$128 | MD_VERIN | MD_VERIF | Verify a microdrive sector |
$12A | MD_SECTR | MD_RDHDR | Read a microdrive sector header |
The following are not, to my knowledge, documented anywhere else. I have found these undocumented vectors in various places, not least being a DEA dissassembly of the Superbasic ED command (pre SBasic as ED is different in SBasic). The mnemonics are my own and unless someone complains, I shall not change them.
They can all be accessed by some code, similar to the following :
start move.w SB_SNTX,a2 ; Fetch the routine address from the vector table ; ; Set parameter registers etc here jsr $4000(a2) ; Call the routine in the second half of the ROMBeware : I am not sure about the return mechanism. It could be an error code in D0.L or it could be a bra.s pair of instructions similar to the MD_XXXX routines. More investigation is required.
Vector | My Mnemonic | Description |
---|---|---|
$12C | SB_SNTX | SuperBasic syntax analyser |
$12E | SB_FSTFC | First syntax table for SuperBasic commands |
$130 | SB_SSTFC | Second syntax table for SuperBasic commands |
$132 | SB_FPCBL | Format a pre-compiled SuperBasic line |
$134 | SB_CMPER | Error when pre-compiling a SuperBasic line |
$136 | SB_SPFBL | Store a pre-compiled SuperBasic line |
$138 | SB_CCBTA | Convert pre-compiled SuperBasic line to ASCII |
There is always one awkward one isn't there ? The following vectored routine is difficult. If the QDOS version is 1.03 or less then call it like this :
start move.w SB_INSTK,a2 ; Fetch the routine address from the vector table ; ; Set parameter registers etc here jsr $4318(a2) ; Call the routine in the second half of the ROM
and if it is greater than 1.03, call it like this :
start move.w SB_INSTK,a2 ; Fetch the routine address from the vector table ; ; Set parameter registers etc here jsr $4000(a2) ; Call the routine in the second 16K of ROMBeware : I am not sure about the return mechanism. It could be an error code in D0.L or it could be a bra.s pair of instructions similar to the MD_XXXX routines. More investigation is required.
Vector | My Mnemonic | Description |
---|---|---|
$13A | SB_INSTK | Initialise SuperBasic internal stacks |