qdosmsq:sbinternal:chantab

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

qdosmsq:sbinternal:chantab [2008/03/14 12:25] (current)
norman created
Line 1: Line 1:
 +====== The SuperBasic Channel Table ======
 +^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.
 +
 +<​code>​
 +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
 +</​code>​
 +
 +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.
 +
 +<​code>​
 +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.
 +</​code>​
 +
  
  • qdosmsq/sbinternal/chantab.txt
  • Last modified: 2008/03/14 12:25
  • by norman