home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
607.lha
/
PopUpMenu_v4.3
/
Source.LZH
/
Source
/
SelOptions.a
< prev
Wrap
Text File
|
1992-01-29
|
13KB
|
515 lines
opt l+,c+,d+,y+
opt ow1+,ow2+,ow3+,ow4+,ow5+,ow6+
INCDIR ":pspråk/asm/include/"
INCLUDE "exec/types.i"
INCLUDE "PopUpMenu.i"
xref @Mystrlen * In overlay root
xdef @GetCommandLine
xdef @GetWBCommandLine
xdef @MyWrite
section text,code
***********************************************************
* UWORD GetCommandLine(OldOptions, CommandLine, Length) *
* D3 A5 D2 *
* Input: *
* CommandLine - Pointer to command line *
* Length - Length of Command line *
* Output: *
* Selected options *
* *
***********************************************************
@GetCommandLine:
MOVEM.L D2-D4/A5/A6,-(SP)
****************************************
* D2 = Length A5 = Command line *
* D3.W = Selected *
****************************************
Start: TST.L D2
BEQ.W Done
MOVEQ.L #0,D0
* ------------ Find first non blank
1$ MOVE.B (A5)+,D0
SUBQ.L #1,D2
BEQ.W Done
CMP.B #' ',D0
BLE.B 1$
* ------------ Is it a '-' ?
CMP.B #'-',D0
BNE.B Help * No
* ------------ Get option
MOVEQ.L #' ',D1
MOVE.B (A5)+,D0
SUBQ.L #1,D2
BEQ.B 2$
* ------------ Is it followed by a '-'
MOVE.B (A5)+,D1
SUBQ.L #1,D2
* ------------ make option lowercase
2$ OR.B #$20,D0 * Make small char
SUB.B #'c',D0
BNE.B optH
* ------------ Option: ClickMenues
MOVEQ.L #CLICKMENUES+8,D0
BRA.B SetOption
optH: SUBQ.L #'h'-'c',D0
BNE.B optI
* ------------ Output Helptext
Help: MOVEQ.L #4,D2
JSR @MyWrite
MOVEQ.L #0,D3
BRA.W Done
optI: SUBQ.L #'i'-'h',D0
BNE.B optK
* ------------ Option: ITEMCENTERED
MOVEQ.L #ITEMSCENTERED+8,D0
BRA.B SetOption
optK: SUBQ.L #'k'-'i',D0
BNE.B optN
* ------------ Option: HotKey
* ------------ convert first digit
MOVE.B D1,D0
BSR.B Hex2Bin
MOVE.B D0,D4
BMI.B Help * Not hex
LSL.L #4,D4
* ------------ is there more digits ?
SUBQ.L #1,D2
BMI.B Help * No
MOVE.B (A5)+,D0
BSR.B Hex2Bin
OR.W D0,D4 * Must be word to set flags
BMI.B Help
* ------------ Save new HotKey
MOVE.B D4,D3
BRA.B Start
* ------------ Code to convert hex characters
Hex2Bin: OR.B #$20,D0
LEA HexChars(PC),A0
MOVEQ.L #15,D1
1$ CMP.B (A0)+,D0
DBEQ D1,1$
MOVE.W D1,D0
RTS
optN: SUBQ.L #'n'-'k',D0
BNE.B optO
* ------------ Option: POPUPNOQUAL
MOVEQ.L #POPUPNOQUAL+8,D0
BRA.B SetOption
optO: SUBQ.L #'o'-'n',D0
BNE.B optP
* ------------ Option: OPENWINDOW
MOVEQ.L #OPENWINDOW+8,D0
BRA.B SetOption
optP: SUBQ.L #'p'-'o',D0
BNE.B optQ
* ------------ Option: SUBITEMPOINTER
MOVEQ.L #SUBITEMPOINTER+8,D0
BRA.B SetOption
optQ: SUBQ.L #'q'-'p',D0
BNE.B optS
* ------------ Option: POPUPWITHQUAL
MOVEQ.L #POPUPWITHQUAL+8,D0
BRA.B SetOption
optS: SUBQ.L #'s'-'q',D0
BNE.B optX
* ------------ Option: SHOWSINGLEMENU
MOVEQ.L #SHOWSINGLEMENU+8,D0
BRA.B SetOption
optX: SUBQ.L #'x'-'s',D0
BNE.B Help
* ------------ Option: EXIT
MOVEQ.L #EXIT+8,D0
SetOption: MOVEQ.L #1,D4
ASL.L D0,D4
NOT.L D4
AND.L D4,D3
CMP.B #' ',D1
BGT.B 1$
NOT.L D4
OR.L D4,D3
BRA.W Start
1$ CMP.B #'-',D1
BNE.W Help
BRA.W Start
Done: MOVE.W D3,D0
MOVEM.L (SP)+,D2-D4/A5/A6
RTS
****************************************
* UWORD GetWBCommandLine(OldOptions) *
* D3 *
* Input: *
* Output: *
* Selected options *
****************************************
@GetWBCommandLine:
MOVEM.L D2-D3/D5-D6/A2-A3/A6,-(SP)
MOVEA.L (A4),A6
* ------------ Open icon.library
LEA ICONNAME(PC),A1
MOVEQ.L #LIBVERSION,D0
JSR _LVOOpenLibrary(A6)
MOVE.L D0,D6
BEQ.W NoIconLib
************************************
* D3 = Old Options A6 = ExecBase *
* D6 = IconBase *
************************************
* ------------ Set current directory { CurrentDir(WBenchMsg->sm_ArgList[0].wa_Lock) }
MOVEA.L _DOSBase(A4),A6
MOVE.L _WBenchMsg(A4),A0
MOVE.L sm_ArgList(A0),A2
MOVE.L A2,D0
BEQ.W NoArgList
MOVE.L wa_Lock(A2),D1
JSR _LVOCurrentDir(A6)
* ------------ Save old directory
MOVE.L D0,D5
***************************************
* D3 = Old options A2 = ArgList *
* D5 = old currentdir A6 = DOSbase *
* D6 = IconBase *
***************************************
* ------------ Get the icon. { GetDiskObject(WbenchMsg->sm_ArgList[0].wa_Name) }
MOVE.L wa_Name(A2),A0
MOVE.L D6,A6
JSR _LVOGetDiskObject(A6)
MOVE.L D0,A3
TST.L D0
BEQ.W NoDiskObject
*****************************************
* D3 = Old options A2 = ArgList *
* D5 = Old current dir A3 = DiskObject *
* D6 = DOSBase A6 = IconBase *
*****************************************
* ------------ Find the 'ARG=' string
MOVE.L do_ToolTypes(A3),A0
LEA ARGTEXT(PC),A1
JSR _LVOFindToolTypes(A6)
TST.L D0
BNE.B GetArgs
* ------------ Look for all Workbench commands
MOVE.L A4,-(SP)
MOVE.L A5,-(SP)
LEA WBArgList(PC),A4
MOVE.L do_ToolTypes(A3),A5
* ------------ FindToolTypes
0$ MOVEA.L (A4)+,A1
MOVEA.L A5,A0
JSR _LVOFindToolTypes(A6)
MOVE.W (A4)+,D1
TST.L D0
BEQ.B 1$
OR.W D1,D3
1$ MOVEA.L (A4)+,A1
MOVEA.L A5,A0
JSR _LVOFindToolTypes(A6)
MOVE.W (A4)+,D1
TST.L D0
BEQ.B 2$
AND.W D1,D3
2$ TST.W (A4)
BNE.B 0$
* ------------ Find the HotKey
LEA HOTKEYTEXT(PC),A1
MOVEA.L A5,A0
JSR _LVOFindToolTypes(A6)
TST.L D0
BEQ.B NoHotKey
* ------------ Convert hotkey
MOVE.L D0,A1
MOVE.B (A1)+,D0 * First digit
BEQ.B NoHotKey * empty string ?
BSR.W Hex2Bin
MOVE.B D0,D2
BMI.B NoHotKey * Not hex
LSL.L #4,D2 * First hex OK
MOVE.B (A1),D0 * Second digit
BEQ.B NoHotKey * no more digits ?
BSR.W Hex2Bin
OR.W D0,D2 * Must be word to set flags
BMI.B NoHotKey * Not hex
MOVE.B D2,D3 * Save into options
NoHotKey: MOVEA.L (SP)+,A5
MOVEA.L (SP)+,A4
BRA.B NoArgs
* ------------ GetCommandLine(OldOptions, CommandLine, strlen(CommandLine))
GetArgs: MOVE.L D0,A5
MOVE.L D0,A0
JSR @Mystrlen
MOVE.L D0,D2
JSR @GetCommandLine(PC)
TST.W D0
BEQ.B WrongOptions
MOVE.L D0,D3
*******************************************
* D5 = Old currentdir A2 = ArgList *
* D6 = DOSBase A3 = DiskObject *
* D3 = New options A6 = IconBase *
*******************************************
* ------------ Return the disk object
WrongOptions:
NoArgs: MOVEA.L A3,A0
JSR _LVOFreeDiskObject(A6)
* ------------ Restore current directory
NoDiskObject: MOVE.L _DOSBase(A4),A6
MOVE.L D5,D1
BEQ.B NoCurrentDir
JSR _LVOCurrentDir(A6)
* ------------ Close library
NoCurrentDir:
NoArgList: MOVE.L D6,A1
MOVEA.L (A4),A6
JSR _LVOCloseLibrary(A6)
NoIconLib: MOVE.L D3,D0
MOVEM.L (SP)+,D2-D3/D5-D6/A2-A3/A6
RTS
***********************************************************
* VOID MyWrite(TextNumber, Options) print text to stdout *
* D2 D3 *
* Input: *
* TextNumber 0 - Install *
* 1 - Options *
* 2 - Quit *
* 3 - Error *
* 4 - Help *
* Options only used if TextNumber = 1 *
***********************************************************
@MyWrite: MOVEM.L D2-D6/A6,-(SP)
MOVE.L D2,D4
MOVE.L D3,D5
* ------------ Find stdout
MOVEA.L _DOSBase(A4),A6
JSR _LVOOutput(A6)
MOVE.L D0,D6
BEQ.W NoStdout
* ------------ Output PopUpMenu text
MOVE.L D6,D1
LEA POPUPMSG(PC),A0
MOVE.L A0,D2
MOVEQ.L #POPUPMSG_sizeof,D3
JSR _LVOWrite(A6)
* ------------ Find what to print
SUBQ.L #1,D4
BMI.B InstallText * 0
BEQ.B OptionsText * 1
SUBQ.B #2,D4
BMI.W QuitText * 2
BEQ.W FailedText * 3
* ------------ print helptext
HelpText: LEA HELPMSG(PC),A0
MOVE.L #HELPMSG_sizeof,D3
BRA.W Print
* ------------ print installed
InstallText: LEA INSTALLMSG(PC),A0
MOVEQ.L #INSTALLMSG_sizeof,D3
BRA.W Print
* ------------ Build option string
OptionsText: LEA OptionBuffer2(PC),A0
MOVEQ.L #OptionBuffer2-OptionBuffer+1,D3 * 'Current options: ... \n'
BTST #CLICKMENUES+8,D5
BEQ.B 1$
MOVE.L #' -C ',(A0)+
ADDQ.L #4,D3
1$ BTST #SUBITEMPOINTER+8,D5
BEQ.B 2$
MOVE.L #' -P ',(A0)+
ADDQ.L #4,D3
2$ BTST #POPUPNOQUAL+8,D5
BEQ.B 3$
MOVE.L #' -N ',(A0)+
ADDQ.L #4,D3
3$ BTST #POPUPWITHQUAL+8,D5
BEQ.B 4$
MOVE.L #' -Q ',(A0)+
ADDQ.L #4,D3
4$ BTST #SHOWSINGLEMENU+8,D5
BEQ.B 5$
MOVE.L #' -S ',(A0)+
ADDQ.L #4,D3
5$ BTST #ITEMSCENTERED+8,D5
BEQ.B 6$
MOVE.L #' -I ',(A0)+
ADDQ.L #4,D3
6$ MOVE.W #'-K',(A0)+
LEA HexChars(PC),A1
MOVEQ.L #0,D0
MOVE.B D5,D0
LSR.B #4,D0
NEG.W D0
MOVE.B $0f(A1,D0.W),(A0)+
AND.W #$0f,D5
NEG.W D5
MOVE.B $0f(A1,D5.W),(A0)+
ADDQ.L #4,D3
MOVE.B #$0a,(A0)
LEA OptionBuffer(PC),A0
BRA.B Print
* ------------ print removed message
QuitText: LEA QUITMSG(PC),A0
MOVEQ.L #QUITMSG_sizeof,D3
BRA.B Print
* ------------ print failed message
FailedText: LEA ERRORMSG(PC),A0
MOVEQ.L #ERRORMSG_sizeof,D3
Print: MOVE.L D6,D1
MOVE.L A0,D2
JSR _LVOWrite(A6)
NoStdout: MOVEM.L (SP)+,D2-D6/A6
RTS
ICONNAME dc.b "icon.library",0
EVEN
ARGTEXT dc.b "ARG",0
EVEN
HexChars: dc.b "fedcba9876543210"
EVEN *0 2 4 6 8 0 2 4 6
OptionBuffer: dc.b " Current options ="
OptionBuffer2: dc.b " -C -S -N -Q -S -T -K##\n"
EVEN
POPUPMSG: dc.b $0a,$9b,"0;33m","PopUpMenu",$9b,"0m "
POPUPMSG_sizeof: EQU *-POPUPMSG
EVEN
INSTALLMSG: dc.b "ver 4.3 installed.",$0a,$a9," Martin Adrian 1992",$0a
INSTALLMSG_sizeof: EQU *-INSTALLMSG
EVEN
QUITMSG: dc.b "removed.",$0a
QUITMSG_sizeof: EQU *-QUITMSG
EVEN
ERRORMSG: dc.b "failed !!",$0a
ERRORMSG_sizeof: EQU *-ERRORMSG
EVEN
HELPMSG: dc.b " ver 4.3",$0a,$0a
dc.b "Usage: [Run] PopUpMenu [Options]",$0a
dc.b " -H Help (this text).",$0a
dc.b " -C[-] Clickmenues.",$0a
dc.b " -P[-] show sub-item Pointer. (default)",$0a
dc.b " -S[-] Show single menu.",$0a
dc.b " -I[-] display Items centered around menu.",$0a
dc.b " -N[-] pop-up menues when No qualifier pressed. (default)",$0a
dc.b " -Q[-] pop-up menues when Qualifier pressed.",$0a
dc.b " -O[-] Open options window. (default)",$0a
dc.b " -K## set hot-Key [Hex]. (default 19 = 'P')",$0a
dc.b " -X eXit PopUpMenu.",$0a
dc.b " '-' after option will disable it",$0a
HELPMSG_sizeof: EQU *-HELPMSG
CLICKTEXT: dc.b "CLICKMENUES",0
STDTEXT: dc.b "STDMENUES",0
DSHOWSUBTEXT: dc.b "DONT"
SHOWSUBTEXT: dc.b "SHOWSUB",0
DSHOWSINGTEXT: dc.b "DONT"
SHOWSINGTEXT: dc.b "SHOWSINGLE",0
ITEMSCENTTEXT: dc.b "ITEMSCENTERED",0
ITEMSTOPTEXT: dc.b "ITEMSTOP",0
DPOPWITHTEXT dc.b "DONT"
POPWITHTEXT dc.b "POPWITHQUAL",0
DPOPNOTEXT: dc.b "DONT"
POPNOTEXT: dc.b "POPNOQUAL",0
NOOPTWINTEXT: dc.b "NO"
OPTWINTEXT: dc.b "OPTIONWINDOW",0
HOTKEYTEXT: dc.b "HOTKEY",0
WBArgList: dc.l CLICKTEXT
dc.w $2000
dc.l STDTEXT
dc.w $dfff
dc.l SHOWSUBTEXT
dc.w $0200
dc.l DSHOWSUBTEXT
dc.w $fdff
dc.l SHOWSINGTEXT
dc.w $0100
dc.l DSHOWSINGTEXT
dc.w $feff
dc.l ITEMSCENTTEXT
dc.w $0400
dc.l ITEMSTOPTEXT
dc.w $fbff
dc.l POPWITHTEXT
dc.w $0800
dc.l DPOPWITHTEXT
dc.w $f7ff
dc.l POPNOTEXT
dc.w $1000
dc.l DPOPNOTEXT
dc.w $efff
dc.l OPTWINTEXT
dc.w $4000
dc.l NOOPTWINTEXT
dc.w $bfff
dc.w 0
END