; ScriptTool V1.02  Tuesday 22-Jun-93
; (c) 1993 by Jan Hagqvist
;
; Scripts to Workbench's Tools-menu
;


MENUAMOUNT	equ 50
MENUTEXTSIZE	equ 50
SCRIPTTEXTSIZE	equ 100


 XREF _LVOOldOpenLibrary
 XREF _LVOCloseLibrary
 XREF _LVOOutput
 XREF _LVOWrite
 XREF _LVORead
 XREF _LVOOpen
 XREF _LVOClose
 XREF _LVOExecute
 XREF _LVOInput
 XREF _LVOCreateMsgPort
 XREF _LVOAddAppMenuItemA
 XREF _LVOWaitPort
 XREF _LVOGetMsg
 XREF _LVOReplyMsg
 XREF _LVORemoveAppMenuItem
 XREF _LVODeleteMsgPort
 XREF _LVOForbid
 XREF _LVOPermit
 XREF _LVOFindPort
 XREF _LVOAddPort
 XREF _LVORemPort

ScriptTool
  move.l  4,a6			; Exec base
  lea     DosName(pc),a1
  jsr     _LVOOldOpenLibrary(a6)
  move.l  d0,DosBase
  move.l  a6,a0
  add.l   #21,a0
  cmp.b   #36,(a0)		; Exec 36+?
  bpl.s   Dos2.04
  move.l  DosBase(pc),a6
  jsr     _LVOOutput(a6)
  move.l  d0,d1
  lea     No2.0(pc),a0
  move.l  a0,d2
  moveq.l #27,d3
  jsr     _LVOWrite(a6)
  bra     Exit1
Dos2.04
  jsr     _LVOForbid(a6)
  lea     PortName(pc),a1
  jsr     _LVOFindPort(a6)
  move.l  d0,d7
  jsr     _LVOPermit(a6)
  tst.l   d7
  bne     Exit4
  move.l  DosBase(pc),a6
  lea     ToolFile(pc),a0
  move.l  a0,d1
  move.l  #1005,d2
  jsr     _LVOOpen(a6)
  move.l  d0,ToolFileHandle
  cmp.l   #0,d0
  bne.s   FileOpened
  move.l  DosBase(pc),a6
  jsr     _LVOOutput(a6)
  move.l  d0,d1
  lea     NoFile(pc),a0
  move.l  a0,d2
  moveq.l #24,d3
  jsr     _LVOWrite(a6)
  bra     Exit1
FileOpened
  lea     CharRead(pc),a2
  move.l  a2,d2
  lea     Menutext,a3
  move.l  a3,a4
  moveq.l #0,d5
Menuload
  jsr     GetLine
  addq.l  #1,d5
  cmp.b   #MENUAMOUNT-1,d5
  bpl.s   Scriptload
  move.l  a3,a4
  move.l  d5,d6
  mulu    #MENUTEXTSIZE,d6
  add.l   d6,a4
  cmp.b   #0,d4
  bne.s   Menuload
Scriptload
  subq.l  #1,d5
  move.b  d5,Entries
  cmp.b   #0,d5
  bne.s   ScriptLoad1
  move.l  ToolFileHandle(pc),d1
  jsr     _LVOClose(a6)
  bra     Exit1
ScriptLoad1
  lea     CharRead(pc),a2
  move.l  a2,d2
  lea     Scripttext,a3
  move.l  a3,a4
  moveq.l #0,d5
Scriptload2
  jsr     GetLine
  addq.l  #1,d5
  cmp.b   #MENUAMOUNT-1,d5
  bpl.s   FileRead
  move.l  a3,a4
  move.l  d5,d6
  mulu    #SCRIPTTEXTSIZE,d6
  add.l   d6,a4
  cmp.b   #0,d4
  bne.s   Scriptload2
FileRead
  move.l  ToolFileHandle(pc),d1
  jsr     _LVOClose(a6)

  move.l  4,a6
  jsr     _LVOCreateMsgPort(a6)
  move.l  d0,STPort
  tst.l   d0
  bne.s   OpenWBLib
  move.l  DosBase(pc),a6
  jsr     _LVOOutput(a6)
  move.l  d0,d1
  lea     NoPort(pc),a0
  move.l  a0,d2
  moveq.l #25,d3
  jsr     _LVOWrite(a6)
  bra     Exit1
OpenWBLib
  move.l  d0,a4
  lea     PortName(pc),a0
  move.l  a0,10(a4)			; Name the port
  move.b  #0,9(a4)			; Priority = 0
  move.l  d0,a1
  jsr     _LVOAddPort(a6)		; Make port public system port
  lea     WorkbenchName(pc),a1
  jsr     _LVOOldOpenLibrary(a6)
  move.l  d0,WorkbenchBase
  move.l  d0,a6
  cmp.l   #0,d0
  bne.s   AddInit
  move.l  DosBase(pc),a6
  jsr     _LVOOutput(a6)
  move.l  d0,d1
  lea     NoWBLib(pc),a0
  move.l  a0,d2
  moveq.l #29,d3
  jsr     _LVOWrite(a6)
  bra     Exit2
AddInit
  moveq.l #1,d2
  lea     Scripttext,a3
  lea     Menutext,a4
  lea     AppMenuItem,a5
  move.b  Entries(pc),d3
AddMenuItems				; Add menu items
  move.l  d2,d0
  move.l  a3,d1
  move.l  a4,a0
  move.l  STPort(pc),a1
  move.l  #0,a2
  jsr     _LVOAddAppMenuItemA(a6)
  move.l  d0,(a5)+
  cmp.l   #0,d0
  beq     Exit3
  add.l   #SCRIPTTEXTSIZE,a3
  add.l   #MENUTEXTSIZE,a4
  addq.l  #1,d2
  cmp.b   d2,d3
  bpl.s   AddMenuItems

  move.l  #1234,d0			; Add Exit-item
  moveq.l #0,d1
  lea     ExitName(pc),a0
  move.l  STPort(pc),a1
  move.l  #0,a2
  jsr     _LVOAddAppMenuItemA(a6)
  move.l  d0,ExitItem

  move.l  4,a6
  moveq.l #1,d7
MainLoop
  tst.l   d7
  beq     Exit
  move.l  STPort(pc),a0
  jsr     _LVOWaitPort(a6)
MainLoop2

  move.l  STPort(pc),a0
  jsr     _LVOGetMsg(a6)		; Get message
  tst.l   d0
  beq.s   MainLoop			; No message?!

  move.l  d0,a1
  move.w  20(a1),d4			; AppMessage type
  move.l  22(a1),d5			; UserData
  move.l  26(a1),d6			; ID
  jsr     _LVOReplyMsg(a6)		; Reply
  cmp.b   #9,d4				; Menuitem?
  bne.s   MainLoop2			; No, get next message

  cmp.l   #1234,d6			; Exit-selected?
  bne.s   MainLoop3			; No
  moveq.l #0,d7
  bra     MainLoop2
MainLoop3
  move.l  DosBase(pc),a6
  jsr     _LVOOutput(a6)
  move.l  d0,d3
  jsr     _LVOInput(a6)
  move.l  d0,d2
  move.l  d5,d1				; UserData = Command string
  jsr     _LVOExecute(a6)
  move.l  4,a6
  bra     MainLoop2

Exit
  moveq.l #1,d2
  move.b  Entries(pc),d3
  lea     AppMenuItem,a2
  move.l  WorkbenchBase,a6
ExitLoop1
  move.l  (a2)+,a0
  jsr     _LVORemoveAppMenuItem(a6)	; Remove Menuitems
  addq.l  #1,d2
  cmp.b   d2,d3
  bpl.s   ExitLoop1

  move.l  ExitItem(pc),a0
  jsr     _LVORemoveAppMenuItem(a6)	; Remove Exit-item too

  move.l  4,a6
  move.l  STPort(pc),a1
  jsr     _LVORemPort(a6)		; No more public
  move.l  STPort(pc),a0
  jsr     _LVODeleteMsgPort(a6)		; Delete message port
  move.l  WorkbenchBase(pc),a1
  jsr     _LVOCloseLibrary(a6)

Exit1
  move.l  4,a6
  move.l  DosBase(pc),a1
  jsr     _LVOCloseLibrary(a6)
  moveq.l #0,d0
  rts

Exit2
  move.l  4,a6
  move.l  STPort(pc),a1
  jsr     _LVORemPort(a6)
  move.l  STPort(pc),a0
  jsr     _LVODeleteMsgPort(a6)
  bra.s   Exit1

Exit4
  move.l  DosBase(pc),a6
  jsr     _LVOOutput(a6)
  move.l  d0,d1
  lea     PortFound(pc),a0
  move.l  a0,d2
  moveq.l #27,d3
  jsr     _LVOWrite(a6)
  bra.s   Exit1

Exit3
  move.l  4,a6
  move.l  STPort(pc),a1
  jsr     _LVORemPort(a6)		; No more public
  move.l  STPort(pc),a0
  jsr     _LVODeleteMsgPort(a6)		; Delete message port
  move.l  DosBase(pc),a6
  jsr     _LVOOutput(a6)
  move.l  d0,d1
  lea     NoWB(pc),a0
  move.l  a0,d2
  moveq.l #41,d3
  jsr     _LVOWrite(a6)
  move.l  4,a6
  move.l  WorkbenchBase(pc),a1
  jsr     _LVOCloseLibrary(a6)
  bra.s   Exit1

GetLine
  moveq.l #1,d3
  moveq.l #0,d4
GetLine2
  move.l  ToolFileHandle(pc),d1
  jsr     _LVORead(a6)
  addq.l  #1,d4
  cmp.l   #-1,d0
  beq.s   GetLine3
  move.b  (a2),(a4)
  cmp.b   #10,(a4)+
  bne.s   GetLine2
GetLine3
  move.b  #0,-(a4)
  subq.l  #1,d4
  rts


DosBase		dc.l 0
ToolFileHandle	dc.l 0
STPort		dc.l 0
WorkbenchBase	dc.l 0
ExitItem	dc.l 0

Entries		dc.b 0
CharRead	dc.b 0
DosName		dc.b 'dos.library',0
ToolFile	dc.b 's:ToolScript',0
WorkbenchName	dc.b 'workbench.library',0

No2.0		dc.b 'Needs DOS V2.0 or greater',10
VERSION		dc.b '$VER: ScriptTool V1.02  Tuesday 22-Jun-93',10
NoFile		dc.b 'Can''t open s:ToolScript',10
NoWB		dc.b 'Can''t add menu items. Is workbench open?',10
NoWBLib		dc.b 'Can''t open workbench.library',10
ExitName	dc.b 'Exit Scripttool',0
NoPort		dc.b 'Can''t create message port',10
PortName	dc.b 'ScriptToolPort',0
PortFound	dc.b 'ScriptTool already running',10

 SECTION 2,BSS

AppMenuItem	ds.l MENUAMOUNT
Menutext	ds.b MENUAMOUNT*MENUTEXTSIZE
Scripttext	ds.b MENUAMOUNT*SCRIPTTEXTSIZE

  END
