*  Re-write of SET_PRIORITY to fix certain bugs
*  Namely that the existing v3.22 code does not allow you to set the
*  priority of Job 0 to 127, but lets you set it to zero, and also,
*  limits priority range to 0...127 rather than -128...127
*  (the latter being needed by Minerva Roms to allow background tasks)
*
*  Contrary to the Turbo manual this commands format is:
*  SET_PRIORITY [taskno%,tasktag%],priority%
*  If only one parameter, priority of current task is altered.
*
*  TYPE_IN altered to remove a bug which meant that it did
*  not always find the correct queue to use
*
*  COMMAND_LINE has also been amended to allow it to access #0 in
*  SuperBasic (or a MultiBasic) and even where #0 has been re-opened
*
*  All of the commands, BASIC_POINTER, BASIC_B%, BASIC_L, BASIC_W%
*  BASIC_F, BASIC_NAME$, BASIC_INDEX% and BASIC_TYPE% have been
*  altered to ensure that they will work on MultiBasics on Minerva v1.80+
*  provided that they are used from the MultiBasic, or from a task which
*  is owned by a MultiBasic (NB. EX and EXEC from Toolkit II do not allow
*  this - use EXECUTE).

Start       LEA LabSBDEF,A1
            MOVE.W $0110,A2
            JSR (A2)
            RTS
*  SB Keywords definition table
LabSBDEF
*  PROCedures
            DC.W 4
            DC.W Tab0000-*
            DC.B 12,'SET_PRIORITY',0
            DC.W TYPER-*
            DC.B 7,'TYPE_IN'
            DC.W COMM_LIN-*
            DC.B 12,'COMMAND_LINE',0
            DC.W 0
*  FuNctions
            DC.W 8
            DC.W Lab0004-*
            DC.B 13,'BASIC_POINTER'
            DC.W Lab0001-*
            DC.B 8,'BASIC_B%',0
            DC.W Lab0003-*
            DC.B 7,'BASIC_L'
            DC.W Lab0002-*
            DC.B 8,'BASIC_W%',0
            DC.W Lab0013-*
            DC.B 11,'BASIC_NAME$'
            DC.W Lab0059-*
            DC.B 7,'BASIC_F'
            DC.W Lab0018-*
            DC.B 12,'BASIC_INDEX%',0
            DC.W Lab0029-*
            DC.B 11,'BASIC_TYPE%'
            DC.W 0

* SET_PRIORITY
Tab0000     BSR        Lab0034
            SUBQ.W     #1,D3
            BNE.S      Tab0001
            MOVEQ      #-$01,D1              Set this Job's priority
*                                            Find out who we are?
            MOVEQ      #0,D0
            TRAP       #1
            BRA.S      Tab0002
Tab0001
            SUBQ.W     #2,D3
            BNE        Lab0037
            MOVE.L     $00(A1,A6.L),D1       Get Job number
            SWAP       D1
            ADDQ.L     #4,A1                 D1=0 for SuperBasic
Tab0002     MOVE.W     $00(A1,A6.L),D2
            CMP.W      #$007F,D2
            BGT        Lab0037
            CMP.W      #$FF80,D2
            BLT        Lab0037
            TST.W      D2
            BNE.S      Tab0003
            TST.L      D1                    If ID=0 and PRIOR=0 return
*                                            with bad parameter!
            BEQ        Lab0037
Tab0003     MOVEQ      #$0B,D0
            TRAP       #1
            RTS

*  TYPE_IN
TYPER       BSR        Lab0045
            LEA        $00(A1,A6.L),A5
            MOVE.W     (A5)+,D5
            BEQ        Exit0
            MOVEA.W    $00E0,A4
No_time     MOVEQ      #5,D3
            MOVEQ      #-1,D1            Suspend this Job
            SUBA.L     A1,A1
            MOVEQ      #$08,D0
            TRAP       #1
            MOVE.L     D1,D7
            MOVEQ      #$00,D0
            TRAP       #1
            MOVE.L     $4C(A0),A2
Get_que     MOVE.B     (A5),D1           ---  This had to be moved from
            TST.L      D7                     v3.22 toolkit as it was
            BEQ.S      Job_ok                 being destroyed when the
            TRAP       #0                     TRAP #1 was executed
            ORI.W      #$0700,SR
            JSR        (A4)
            ANDI.W     #$D8FF,SR
            BRA.S      Stop_job

Job_ok      JSR        (A4)
Stop_job    TST.L      D0
            BNE.S      No_time
            SUBQ.W     #1,D5
            ADDQ.L     #1,A5
            BNE.S      Get_que
            RTS

*  COMMAND_LINE
COMM_LIN    TRAP       #0
            ORI.W      #$0700,SR
            BSR        Lab0015       Get Basic Variables for interpreter
            moveq      #0,d0         in A0
            add.l      $30(a0),d0    Convert #0 to channel ID for
            move.l     0(a0,d0.l),a3 Interpreter's Job 0
            bmi.s      Force_zero    There is no channel 0 - so try 00000000
call_que
            andi.w     #$d8ff,sr
            move.l     a3,a0
            MOVEQ      #9,D0
            MOVEQ      #-1,D3        A timeout of -1 MUST be used if this
            LEA        chan_ext,A2   is to work at all!
            TRAP       #3
            BRA.S      Exit0

Force_zero  suba.l     a3,a3         This will only work if #0 has not
            bra.s      call_que      been re-opened!

chan_ext    MOVE.L     $4C(A6),D0
            BEQ.S      Exit0
            MOVEA.L    D0,A2
            LEA        $68(A0),A1
            MOVE.W     #$0150,D4
chan_loop   CMPA.L     A0,A2
            BLS.S      next_chan
            CMPA.L     A1,A2
            BLS.S      queue0
next_chan   MOVEA.L    (A2),A2
            CMP.L      A2,D0
            DBEQ       D4,chan_loop
            BRA.S      Exit0
queue0      MOVE.L     A2,$4C(A6)
Exit0       MOVEQ      #$00,D0
            RTS

Lab0000     MOVEA.W    $0118,A2
            JSR        (A2)
            BNE        Lab0036
            RTS
* BASIC_B%
Lab0001     MOVEQ      #$00,D5
            BRA.S      Lab0005
* BASIC_W%
Lab0002     MOVEQ      #$01,D5
            BRA.S      Lab0005
* BASIC_L
Lab0003     MOVEQ      #-$01,D5
            BRA.S      Lab0005

* BASIC_POINTER
Lab0004     MOVEQ      #-$02,D5

Lab0005     BSR.S      Lab0000
            SUBQ.W     #1,D3
            BNE        Lab0037
            MOVE.L     $00(A1,A6.L),D3
            ADDQ.L     #4,A1
            MOVE.L     A1,$58(A6)
            TRAP       #0
            ORI.W      #$0700,SR
            BSR        Lab0015
            TST.L      D5
            BEQ.S      Lab0006
            BTST       #$00,D3
            BNE.S      Lab0008
            TST.L      D5
            BMI.S      Lab0011
Lab0006     SUBQ.L     #2,A1
            BEQ.S      Lab0009
            MOVE.W     $00(A0,D3.L),$00(A1,A6.L)
            BRA.S      Lab0010
Lab0007     ADDQ.L     #4,A7
Lab0008     MOVEQ      #-$0F,D0
            ANDI.W     #$D8FF,SR
            RTS
Lab0009     CLR.B      $00(A1,A6.L)
            MOVE.B     $00(A0,D3.L),$01(A1,A6.L)
Lab0010     ANDI.W     #$D8FF,SR
            BRA        Lab0051
Lab0011     MOVE.L     $00(A0,D3.L),D0
            ADDQ.L     #1,D5
            BMI.S      Lab0012
            SUBA.L     A0,A0
Lab0012     LEA        $00(A0,D0.L),A0
            ANDI.W     #$D8FF,SR
            MOVE.L     A0,D5
            BRA        Lab0053
* BASIC_NAME$
Lab0013     BSR        Lab0034
            SUBQ.W     #1,D3
            BNE        Lab0037
            MOVE.W     $00(A1,A6.L),D3
            TRAP       #0
            ORI.W      #$0700,SR
            BSR        Lab0016
            BSR        Lab0017
            MOVE.L     A0,A4
            MOVEQ      #$00,D1
            MOVE.B     (A0),D1
            MOVEQ      #-1,D2
            MOVEQ      #$18,D0
            TRAP       #1
            MOVEA.L    A0,A3
            MOVE.B     (A4),D6
move_bytes  MOVE.B     (A4)+,(A0)+
            DBF        D6,move_bytes
            MOVE.L     A3,A0
            MOVE.B     (A0)+,D6
            BPL.S      Lab0014
            MOVEQ      #$00,D6
Lab0014     ANDI.W     #$D8FF,SR
            EXT.W      D6
            move.l     a3,-(a7)
            Bsr        Lab0039
            move.l     (a7)+,a0
            moveq      #-1,d2
            moveq      #$19,d0
            trap       #1
            clr.l      d0
            rts
Lab0015     MOVEQ      #$00,D0
            TRAP       #1
            TST.L      D1
            BEQ.S      Sab0018    (Job 0 anyway)
            LSR.L      #8,D2      Check for Minerva v1.80+
            CMPI.B     #$38,D2
            BLT.S      Sab0018
            LSR.L      #8,D2
            LSR.L      #8,D2
            CMPI.B     #$31,D2
            BNE.S      Sab0018    Non-Minerva
            MOVE.L     D1,D2      D1 is current Job ID
            MOVE.L     A0,A4      Store address of system variables
Sab0016     MOVE.L     A4,A0
            MOVE.L     $68(A0),A0         Job Table base
            MOVE.L     D2,D1
            LSL.W      #2,D1
            MOVE.L     0(A0,D1.W),A0
            BTST       #6,$16(A0)         Test for Interpreter
            BNE.S      Sab0017            Yes - this is interpreter
            MOVE.L     D2,D1
            movem.l    d3/a1,-(a7)
            MOVEQ      #$00,D2            We do not have interpreter
            MOVEQ      #$02,D0            therefore work back up Job
            TRAP       #1                 Tree until one is found!
            movem.l    (a7)+,d3/a1
            BRA.S      Sab0016
Sab0017     TST.L      D2
            BEQ.S      Basic_Job          Main Job is SuperBasic
            LEA        $80(A0),A0         Job is a MultiBasic
            RTS
Basic_Job   MOVE.L     A4,A0
Sab0018     MOVEA.L    $10(A0),A0
            LEA        $68(A0),A0
            RTS

Lab0016     BSR.S      Lab0015
            MOVEA.L    $18(A0),A2
            ADDA.L     A0,A2
            LSL.W      #3,D3
            LEA        $00(A2,D3.W),A3
            SUBA.L     A0,A3
            CMPA.L     $1C(A0),A3
            BPL        Lab0007
            RTS
Lab0017     MOVEA.L    $20(A0),A3
            ADDA.L     A0,A3
            MOVE.W     $02(A2,D3.W),D3
            move.w     d3,d1
            addq.w     #1,d1
            beq        Lab0007
            LEA        $00(A3,D3.W),A0
            RTS
* BASIC_INDEX%
Lab0018     BSR        Lab0045
            TRAP       #0
            BSR.S      Lab0019
            MOVE.W     D1,$00(A1,A6.L)
            BRA        Lab0010
Lab0019     ORI.W      #$0700,SR
            LEA        $02(A1,A6.L),A5
            BSR        Lab0015
            MOVE.B     (A5)+,D1
            MOVEA.L    $20(A0),A3
            ADDA.L     A0,A3
            MOVEA.L    $24(A0),A4
            ADDA.L     A0,A4
            MOVE.B     (A4),D7
            CLR.B      (A4)
            MOVE.W     $00(A1,A6.L),D0
            BEQ.S      Lab0022
            LEA        $01(A1,D0.W),A1
            MOVE.L     A1,D4
            BCLR       #$00,D4
            MOVEA.L    D4,A1
            MOVE.W     D0,D4
            SUBQ.W     #2,D4
            MOVE.B     (A3)+,D3
Lab0020     EXT.W D3
            CMP.B D0,D3
            BEQ.S Lab0023
Lab0021     ADDA.W D3,A3
            MOVE.B (A3)+,D3
            BNE.S Lab0020
Lab0022     MOVEQ #-$0C,D1
            BRA.S Lab0028
Lab0023     CMP.B (A3),D1
            BNE.S Lab0021
            LEA $0001(A3),A2
            MOVEA.L A5,A0
            MOVE.W D4,D5
            BMI.S Lab0025
Lab0024     CMPM.B  (A0)+,(A2)+
            DBNE D5,Lab0024
            BNE Lab0021
Lab0025     BSR Lab0015
            MOVEA.L A0,A2
            SUBA.L A2,A3
            SUBA.L $20(A2),A3
            MOVE.W A3,D4
            SUBQ.W #1,D4
            MOVEA.L $18(A2),A0
            MOVE.L $1C(A2),D1
            SUB.L A0,D1
            ASR.L #3,D1
            MOVE.W D1,D5
            LEA $02(A2,A0.L),A0
Lab0026     CMP.W (A0),D4
            ADDQ.L #8,A0
            DBEQ D5,Lab0026
            BEQ.S Lab0027
            MOVEQ #-$07,D1
            BRA.S Lab0028
Lab0027     SUB.W D5,D1
Lab0028     MOVE.B D7,(A4)
            MOVE.W D1,D0
            EXT.L D0
            RTS
* BASIC_TYPE%
Lab0029     BSR Lab0034
            SUBQ.W #1,D3
            BNE Lab0037
            MOVE.W $00(A1,A6.L),D3
            TRAP #0
            ORI.W #$0700,SR
            BSR Lab0016
            MOVE.B $01(A2,D3.W),D0
            ANDI.B #7,D0
            BEQ.S Lab0031
            CMP.B #3,D0
            BNE.S Lab0030
            ADDQ.B #1,D0
Lab0030     MOVE.W D0,$00(A1,A6.L)
            BRA Lab0010
Lab0031     BSR Lab0017
            MOVE.B (A0),D0
            EXT.W D0
            ADD.W D0,D3
            MOVE.B $00(A3,D3.W),D1
            CMPI.B #$25,D1
            BNE.S Lab0032
            MOVEQ #4,D0
            BRA.S Lab0030
Lab0032     MOVEQ #1,D0
            CMPI.B #$24,D1
            BEQ.S Lab0030
            ADDQ.W #1,D0
            BRA.S Lab0030
Lab0033     MOVEA.W $0116,A2
            BRA.S Lab0035
Lab0034     MOVEA.W $0112,A2
Lab0035     MOVEQ #$0F,D6
            AND.B -$07(A6,A5.L),D6
            JSR (A2)
            MOVE.B D6,-$07(A6,A5.L)
            TST.L D0
            BEQ.S Lab0038
Lab0036     ADDQ.L #4,A7
Lab0037     MOVEQ #-$0F,D0
Lab0038     RTS
Lab0039     EXT.L D6
            BSR Lab0047
            SUBA.L D6,A1
            BTST #$00,D6
            BEQ.S Lab0040
            SUBQ.L #1,A1
Lab0040     LEA $00(A1,A6.L),A2
            MOVE.W D6,(A2)+
            SUBQ.W #1,D6
            BMI.S Lab0042
Lab0041     MOVE.B (A0)+,(A2)+
            DBF D6,Lab0041
Lab0042     BRA Lab0052
Lab0044     BRA Lab0036
Lab0045     BSR Lab0033
            BNE.S Lab0044
            SUBQ.W #1,D3
            BNE.S Lab0044
            RTS
Lab0046     MOVEQ #$06,D6
            MOVEA.L $0058(A6),A1
Lab0047     TST.B $0054(A6)
            BMI.S Lab0048
            MOVE.L D6,D1
            MOVE.L A1,$0058(A6)
            MOVEA.W $011A,A2
            JSR (A2)
            MOVEA.L $0058(A6),A1
            RTS
Lab0048     LEA -$0002(A1),A3
            SUBA.L D6,A3
            CMPA.L (A6),A3
            BPL.S Lab0050
            MOVEQ #-$03,D0
Lab0049     ADDQ.L #4,A7
Lab0050     RTS
Lab0051     MOVEQ #$03,D4
            BRA Lab0058
Lab0052     MOVEQ #$01,D4
            BRA.S Lab0058
Lab0053     BSR Lab0046
            MOVE.L D5,D4
            BEQ.S Lab0056
            MOVE.W #$081F,D4
            MOVE.L D5,D3
            ADD.L D3,D3
            BVS.S Lab0056
            SUBQ.W #1,D4
            MOVE.L D3,D5
            MOVEQ #$10,D2
Lab0054     MOVE.L D5,D3
            ASL.L D2,D3
            BVS.S Lab0055
            MOVE.L D3,D5
            SUB.W D2,D4
Lab0055     ASR.L #1,D2
            BNE.S Lab0054
Lab0056     SUBQ.L #6,A1
            MOVE.L D5,$02(A1,A6.L)
Lab0057     MOVE.W D4,$00(A1,A6.L)
            MOVEQ #$02,D4
Lab0058     MOVE.L A1,$0058(A6)
            MOVEQ #$00,D0
            RTS
* BASIC_F
Lab0059     MOVEQ #-$01,D5
Lab0060     BSR Lab0000
            SUBQ.W #1,D3
Lab0061     BNE Lab0037
            MOVE.L $00(A1,A6.L),D3
            BTST #$00,D3
            BNE.S Lab0061
            TST.L D5
            BEQ.S Lab0062
            TRAP #0
            ORI.W #$0700,SR
            BSR Lab0015
Lab0062     MOVE.W 0(A0,D3.L),D4
            MOVE.L 2(A0,D3.L),$00(A1,A6.L)
            SUBQ.L #2,A1
            ANDI.W #$0FFF,D4
            ANDI.W #$D8FF,SR
            BRA.S Lab0057

            END
