|$00||Long||CH_ID||QDOS internal channel id|
|$04||Float||CH_CCPX||Graphics cursor X position|
|$0A||Float||CH_CCPY||Graphics cursor Y position|
|$16||Byte||CH_PEN||Pen status (0 = up or 1 = down)|
|$20||Word||CH_CHPOS||Character position on line for PRINT and INPUT etc|
|$22||Word||CH_WIDTH||Width of the channel. Set by WIDTH command in SuperBasic but defaults to 80 when OPEN is called.|
|$24||Long||CH_SPARE||Spare - currently unused|
The following code shows how to convert from a SuperBasic channel number, #3 for example, into the actual channel id that QDOS/SMS uses internally to access the channel to the device/file. This would be the code used in a machine code extension to SuperBasic which needs to deal with channels.
channel_id mulu #$28,d0 ; Offset into channel table add.l $30(a6),d0 ; Add table start address cmp.l $34(a6),d0 ; Valid ? bge.s ch_bad ; No, channel # off end of table move.l 0(a6,d0.l),d0 ; Channel id bmi.s ch_bad ; Channel closed move.l d0,a0 ; We need id in A0 moveq #0,d0 ; No errors rts ; Finished ch_bad moveq #-6,d0 ; Channel not open (ERR_NO/ERR_ICHN) rts ; Bale out
The code assumes that D0 holds the SuperBasic channel number and after the call to 'channel_id', if the Z flag is set, then A0 holds the actual QDOS/SMS channel id. If the Z flag is not set then the channel number passed in D0 was either invalid (off the end of the table) or the channel is actually closed.
get_chan3 moveq #3,d0 ; Channel #3 is desired bsr channel_id ; Call the routine bne no_chan3 ; It failed ! ; Process channel 3 via its id in A0.L here no_chan3 ; Process errors etc here. Channel #3 is invalid/closed.