OBJECT	equ	1

Program:
	move.l	sp,stack

	lea	dosname(pc),a1
	move.l	4.w,a6
	jsr	-408(a6)
	move.l	d0,dosbase

	IF OBJECT

	move.l	276(a6),a3
	tst.l	172(a3)
	bne.s	fromCLI
fromWB
	lea	92(a3),a0		; get wb msg
	jsr	-384(a6)
	move.l	4.w,a6
	lea	92(a3),a0
	jsr	-372(a6)
	move.l	d0,wbmsg

	move.l	wbmsg(pc),a0
	move.l	$24(a0),a0
	beq.b	fromcli

	move.l	(a0),d1
	move.l	dosbase(pc),a6
	jsr	-126(a6)
fromcli:
	ENDIF

	move.l	4,a6
	lea	intname(pc),a1
	jsr	-408(a6)
	move.l	d0,intbase
	lea	dosname(pc),a1
	jsr	-408(a6)
	move.l	d0,dosbase
	lea	gadtoolsname(pc),a1
	cmp.w	#36,20(a6)
	bge.s	os20
	lea	gadtools13name(pc),a1
os20:
	jsr	-408(a6)
	move.l	d0,gadtoolsbase
	tst.l	d0
	beq.b	quit

	bsr.w	openwindow

	move.l	window(pc),a0
	lea	winname(pc),a1
	lea	scrtitle(pc),a2
	move.l	intbase(pc),a6
	jsr	-276(a6)

	bsr.w	setmenu

message:
	move.l	dosbase(pc),a6
	moveq	#5,d1
	jsr	-198(a6)

	move.l	window(pc),a0
	move.l	86(a0),a0
	move.l	4.w,a6
	jsr	-372(a6)
	tst.l	d0
	beq.s	message
	move.l	d0,a1
	move.l	20(a1),d2
	move.w	24(a1),d3

	move.l	4.w,a6
	jsr	-378(a6)

	cmp.l	#256,d2
	bne.b	nomenu
	cmp.w	#-1,d3
	beq.b	nomenu

	move.w	d3,menunum
	bsr.w	executeitem

nomenu:
	cmp.l	#512,d2
	bne.s	message

quit:
	move.l	stack(pc),sp

	tst.l	window
	beq.s	nowindow

	move.l	window(pc),a0
	move.l	intbase(pc),a6
	jsr	-54(a6)	

	bsr.w	closewindow

nowindow:
	move.l	intbase(pc),a1
	move.l	4.w,a6
	jsr	-414(a6)

	move.l	dosbase(pc),a1
	move.l	4.w,a6
	jsr	-414(a6)

	tst.l	gadtoolsbase
	beq.s	notopened

	tst.l	menu
	beq.s	nofreemenu

	move.l	menu(pc),a0
	move.l	gadtoolsbase(pc),a6
	jsr	-54(a6)

nofreemenu:
	move.l	gadtoolsbase(pc),a1
	move.l	4.w,a6
	jsr	-414(a6)

notopened:
	tst.l	fileadr
	beq.s	notallocated
	move.l	fileadr(pc),a1
	move.l	filesize(pc),d0
	move.l	4.w,a6
	jsr	-210(a6)

notallocated:

	tst.l	newmenu
	beq.s	notallocated2
	move.l	newmenu(pc),a1
	move.l	itemsize(pc),d0
	move.l	4.w,a6
	jsr	-210(a6)

notallocated2:

	move.l	wbmsg(pc),d2
	beq.s	nowb
	move.l	4.w,a6
	jsr	-132(a6)
	move.l	d2,a1
	move.l	4.w,a6
	jsr	-378(a6)
nowb:
	clr.l	d0
	rts

setmenu:
	bsr.w	readsetup
	bsr.w	createnewmenu
	bsr.w	addmenu
	rts

executeitem:
	move.l	adresses(pc),a0
	move.w	menunum(pc),d0
search_loop:
	move.w	(a0)+,d1
	bpl.s	ex_end
	move.l	(a0)+,a1
	cmp.w	d0,d1
	bne.s	search_loop

	move.l	a1,-(sp)
	move.l	#output,d1
	move.l	#1004,d2
	move.l	dosbase(pc),a6
	jsr	-30(a6)
	move.l	(sp)+,a1
	tst.l	d0
	beq.b	ex_end

	move.l	dosbase(pc),a6
	move.l	a1,d1
	move.l	d0,d2
	move.l	d0,d3
	jsr	-222(a6)

	move.l	d2,d1
	jsr	-36(a6)
ex_end:
	rts

menunum:
	dc.l	0

; a0 - filename

; d0 - size

fsize:
	movem.l	d0-d7/a0-a6,-(sp)

	move.l	a0,d1
	moveq	#-2,d2
	move.l	dosbase(pc),a6
	jsr	-84(a6)
	tst.l	d0
	beq.b	loadend
	move.l	d0,d1

	move.l	d1,-(sp)
	move.l	#fileinfoblock,d2
	addq.l	#3,d2
	and.l	#$fffffffc,d2
	move.l	d2,fileinfoadr
	move.l	fileinfoadr(pc),d2
	move.l	dosbase(pc),a6
	jsr	-102(a6)
	move.l	fileinfoadr(pc),a0
	move.l	124(a0),filesize
	move.l	(sp)+,d1

	move.l	dosbase(pc),a6
	jsr	-90(a6)

loadend:
	movem.l	(sp)+,d0-d7/a0-a6
	move.l	filesize(pc),d0
	rts

filesize:
	dc.l	0
fileinfoadr:
	dc.l	0

readsetup:
	lea	setupname+2(pc),a0
	bsr.b	fsize
	tst.l	d0
	bne.b	ok

	lea	setupname(pc),a0
	bsr.b	fsize
	tst.l	d0
	beq.w	quit

ok:	move.l	a0,-(sp)
	add.l	#1,filesize
	add.l	#1,d0

	move.l	#$10001,d1
	move.l	4.w,a6
	jsr	-198(a6)
	tst.l	d0
	beq.w	quit

	move.l	d0,fileadr

	move.l	(sp)+,d1
	move.l	#1005,d2
	move.l	dosbase(pc),a6
	jsr	-30(a6)
	tst.l	d0
	beq.w	quit

	move.l	d0,-(sp)
	move.l	d0,d1
	move.l	fileadr(pc),d2
	move.l	filesize(pc),d3
	jsr	-42(a6)

	move.l	(sp)+,d1
	jsr	-36(a6)
	
	rts

wbmsg:	dc.l	0
fileadr:
	dc.l	0


allocforitems:
	moveq	#1,d0
	move.l	fileadr,a0
afi_count:
	move.b	(a0)+,d1
	beq.s	afi_end
	cmp.b	#10,d1
	bne.s	afi_count
	cmp.b	#9,(a0)
	beq.s	afi_count
	add.l	#1,d0
	bra.s	afi_count
afi_end:
	move.l	d0,d2
	mulu	#34,d0
	mulu	#28,d2
	move.l	d0,itemsize
	move.l	#$10001,d1
	move.l	4.w,a6
	jsr	-198(a6)
	tst.l	d0
	beq.w	quit
	move.l	d0,newmenu
	move.l	d0,adresses
	add.l	d2,adresses
	rts

createnewmenu:
	bsr.b	allocforitems

	move.l	newmenu(pc),a0
	move.l	fileadr(pc),a1
	move.l	adresses(pc),a2
	move.w	#%1111100000000000,d2
lineloop:
	moveq	#0,d1
tabloop:
	addq	#1,d1
	move.b	(a1)+,d0
	beq.w	quit
	cmp.b	#9,d0
	bne.s	nocommand
	move.w	d2,(a2)
	sub.w	#$21,(a2)+
	move.l	a1,(a2)+
cmd_cr_loop:
	move.b	(a1)+,d0
	beq.w	quit
	cmp.b	#10,d0
	bne.s	cmd_cr_loop
	cmp.b	#9,(a1)
	beq.s	cmd_cr_loop
	clr.b	-1(a1)
	tst.b	(a1)
	beq.w	menu_end
	bra.s	lineloop
nocommand:
	cmp.b	#' ',d0
	beq.s	tabloop

	suba.l	#1,a1
	cmp.b	#27,(a1)
	bne.s	nobar
	move.b	#2,(a0)+
	move.b	#0,(a0)+
	move.l	#-1,(a0)+
	move.l	#0,(a0)+
	move.w	#0,(a0)+
	move.l	#0,(a0)+
	move.l	#0,(a0)+
	add.w	#$20,d2
	bra.s	here
nobar:
	cmp.b	#1,d1
	beq.b	noch
	move.b	#2,d1
	add.w	#%100000,d2
ret:
	move.b	d1,(a0)+
	move.b	#0,(a0)+
	move.l	a1,(a0)+
	move.l	#0,(a0)+
	move.w	#0,(a0)+
	move.l	#0,(a0)+
	move.l	#0,(a0)+
here:
crloop:
	tst.b	(a1)
	beq.w	quit
	cmp.b	#9,(a1)
	bne.s	noletter
	clr.b	(a1)+
	move.l	a1,-14(a0)
noletter:
	cmp.b	#10,(a1)+
	bne.s	crloop
	clr.b	-1(a1)
	tst.b	(a1)
	bne.w	lineloop
menu_end:
	move.l	#0,(a0)+
	move.w	#-1,(a2)+
	rts

noch:
	and.w	#%1111100000011111,d2
	add.w	#1,d2
	bra.b	ret

addmenu:
	move.l	gadtoolsbase(pc),a6
	move.l	newmenu(pc),a0
	suba.l	a1,a1
	jsr	-48(a6)
	tst.l	d0
	beq.w	quit
	move.l	d0,menu

	move.l	actscreen(pc),a0
	suba.l	a1,a1
	jsr	-126(a6)
	tst.l	d0
	beq.w	quit
	move.l	d0,visualinfo

	move.l	menu(pc),a0
	move.l	visualinfo(pc),a1
	suba.l	a2,a2
	jsr	-66(a6)

	move.l	visualinfo(pc),a0
	jsr	-132(a6)

	move.l	window(pc),a0
	move.l	menu(pc),a1
	move.l	intbase(pc),a6
	jsr	-264(a6)

	rts

menu:
	dc.l	0
visualinfo:
	dc.l	0
intname:
	dc.b	'intuition.library',0
dosname:
	dc.b	'dos.library',0
gadtoolsname:
	dc.b	'gadtools.library',0
gadtools13name:
	dc.b	'gadtools13.library',0
	even

intbase:
	dc.l	0
gadtoolsbase:
	dc.l	0
dosbase:
	dc.l	0

openwindow:
	movem.l	d0-d3/a0,-(sp)

	move.w	#1,win_sizex
	move.w	#1,win_sizey
	move.w	#1,win_y
	move.w	#1,win_x

	bsr.w	open_window
	bsr.w	closewindow

	move.w	#20000,win_x
	move.w	addy(pc),win_y
	move.w	#150,win_sizex
	move.w	addy(pc),win_sizey

	move.w	win_y(pc),d0
	move.l	actscreen(pc),a0
	tst.w	d0
	bpl.s	nocentery
	move.w	$e(a0),d1
	move.w	win_sizey(pc),d0
	asr.w	#1,d0
	asr.w	#1,d1
	sub.w	d0,d1
	move.w	d1,win_y
nocentery:
	move.w	win_y(pc),d0
	move.w	$e(a0),d1
	add.w	win_sizey(pc),d0
	cmp.w	d0,d1
	bge.s	nomove
	sub.w	win_sizey(pc),d1
	move.w	d1,win_y

nomove:
	move.w	win_x(pc),d0
	tst.w	d0
	bpl.s	nocenterx
	move.w	$c(a0),d1
	move.w	win_sizex(pc),d0
	asr.w	#1,d0
	asr.w	#1,d1
	sub.w	d0,d1
	move.w	d1,win_x
nocenterx:
	move.w	win_x(pc),d0
	move.w	$c(a0),d1
	add.w	win_sizex(pc),d0
	cmp.w	d0,d1
	bge.s	nomove2
	sub.w	win_sizex(pc),d1
	move.w	d1,win_x
nomove2:
	bsr.s	open_window

	move.w	d2,win_y
	move.w	d3,win_x

	movem.l	(sp)+,d0-d3/a0
	rts

open_window:
	movem.l	d0-d7/a0-a6,-(sp)

	move.l	intbase(pc),a6
	lea	newwindow(pc),a0
	jsr	-204(a6)
	move.l	d0,window
	tst.l	d0
	beq.W	quit

	move.l	window(pc),a0
	move.l	$2e(a0),actscreen

	move.l	actscreen(pc),a0
	move.l	$28(a0),a0
	move.w	4(a0),addy
	add.w	#3,addy

	movem.l	(sp)+,d0-d7/a0-a6
	rts

closewindow:
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	intbase(pc),a6
	move.l	window(pc),a0
	jsr	-72(a6)
	movem.l	(sp)+,d0-d7/a0-a6
	rts

newwindow:
win_x:	dc.w	10000
win_y:	dc.w	0
win_sizex:
	dc.w	150
win_sizey:
	dc.w	0
	dc.b	0
	dc.b	1
win_idcmpflags:
	dc.l	512+8+$2000000+$200000+$400+256+4
win_flags:
	dc.l	2+4+8+$1000
	dc.l	0
	dc.l	0
win_title:
	dc.l	WINNAME
win_screen:
	dc.l	0
	dc.l	0
win_minsizex:
	dc.w	0
win_minsizey:
	dc.w	0
win_maxsizex:
	dc.w	463
win_maxsizey:
	dc.w	10
win_type:
	dc.w	1
addy:
	dc.w	0

actscreen:
	dc.l	0
window:
	dc.l	0
winname:
	dc.b	'ShortCut',0
scrtitle:
	dc.b	'ShortCut by PP/TERMOS/UNION',0
	dc.b	'$VER: ShortCut 1.0 (15.04.95)',0
output:
	dc.b	'NIL:',0
	even
stack:
	dc.l	0
newmenu:
	dc.l	0
adresses:
	dc.l	0
itemsize:
	dc.l	0

setupname:
	dc.b	'S:ShortCutPP.setup',0

	section	free,BSS

fileinfoblock:
	ds.b	262
