SuperBASIC Channel Table

The SuperBASIC channel table has the following layout.

Offset Size Mnemonic Description
$00 Long CH_ID QDOS internal channel id
$04 Float CH_CCPX Graphics cursor X position
$0A Float CH_CCPY Graphics cursor Y position
$10 Float CH_ANGLE Turtle angle
$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.