	incdir  "dh1:code/include/"
	include	"lvo3.0/dos_lib.i"
	include	"lvo3.0/exec_lib.i"
	include "lvo3.0/dreamdoor_lib.i"
	include	"exec/ports.i"
	include "dos/dos.i"
	include "dos/dostags.i"
	include "utility/tagitem.i"
	include "daydream.i"

	STRUCTURE	Globals,0
	ULONG		DosBase
	ULONG		DDBase
	ULONG		Buffer
	ULONG		Buffer2
	ULONG		cmdlin
	ULONG		UserInfo
	ULONG		DayDreamDat
	ULONG		ConfDat
	ULONG		Contype
	ULONG		CurrConf
	ULONG		CurrBase
	ULONG		DisplayDat
	ULONG		Conflength
	ULONG		Baselength
	ULONG		Ximmessage
	ULONG		Ximport
	ULONG		Dif
	ULONG		LongVal
	UBYTE		Sigbit
	UBYTE		Exitflag
	STRUCT		Returncommand,200
	STRUCT		Ximname,30
	STRUCT		DoorName,80
	STRUCT		NodeText,6
	STRUCT		Doorparams,80
	STRUCT		Pointers,dp_SIZEOF
	LABEL		Memsize

		Move.L	A0,A4
		Move.L	D0,D4

		Move.L	$4.W,A6
		Move.L	#Memsize+1024+1024,D0
		Move.L	#$10001,D1
		Jsr	_LVOAllocMem(A6)
		Move.L	D0,A5
		Tst.L	D0
		Beq	CleanUp
		Add.L	#Memsize,D0
		Move.L	D0,Buffer(A5)
		Add.L	#1024,D0
		Move.L	D0,Buffer2(A5)

		Tst.L	D4
		Beq	CleanUp

		Clr.B	-1(A4,D4.L)
		Move.L	A4,cmdlin(A5)

		Lea	NodeText(A5),A1
CopyPort2	Move.B	(A4)+,(A1)+
		Cmp.B	#' ',(A4)
		Bne	CopyPort2
		Move.B	#0,(A1)

		Add.L	#1,A4
		Lea	DoorName(A5),A1
CopyDoor1	Move.B	(A4)+,(A1)+
		Bne	CopyDoor1

		Lea	DosName(PC),A1
		Moveq	#0,D0
		Jsr	_LVOOpenLibrary(A6)
		Move.L	D0,DosBase(A5)
		Beq	CleanUp

		Lea	DDName(PC),A1
		Moveq	#1,D0
		Jsr	_LVOOpenLibrary(A6)
		Move.l	D0,DDBase(A5)
		Beq	CleanUp

		Move.L	DosBase(A5),A6
		Lea	VerName(PC),A0
		Move.L	A0,D1
		Move.L	#MODE_OLDFILE,D2
		Jsr	_LVOOpen(A6)
		Move.L	D0,D4
		Beq	CleanUp
		Move.L	D0,D1
		Move.L	Buffer(A5),D2
		Moveq	#100,D3
		Jsr	_LVORead(A6)
		Move.L	D4,D1
		Jsr	_LVOClose(A6)

		Move.L	Buffer(A5),A0
		Moveq	#0,D0
		Move.W	38(A0),D0
		Move.L	D0,Baselength(A5)
		Move.W	36(A0),D0
		Move.L	D0,Conflength(A5)

		Move.l 	DDBase(A5),A6
		Lea	NodeText(A5),A0
		Jsr	_LVOInitDoor(A6)
		Move.L	D0,Dif(A5)
		Bne	DifOk

		Lea	NoXim(PC),A0
		Bsr	DpyMsg
		Bra	CleanUp

DifOk		Lea	Pointers(A5),A0
		Jsr	_LVOInquirePointers(A6)
		Move.L	Pointers+dp_DoorParams(A5),A0

		Lea	Doorparams(A5),A1
CpyDParams	Move.B	(A0)+,(A1)+
		Bne	CpyDParams

		Move.B	#1,Exitflag(A5)

		Move.L	$4.W,A6
		Jsr	_LVOCreateMsgPort(A6)
		Move.L	D0,Ximport(A5)
		Beq	CleanUp
		Move.L	D0,A2

		Move.B	MP_SIGBIT(A2),Sigbit(A5)
		Lea	Ximpname(PC),A0
		Lea	NodeText(A5),A1
		Move.L	A1,D0
		Bsr	FmtStr
		Move.L	Buffer(A5),A0
		Lea	Ximname(A5),A1
CPyRPN		Move.B	(A0)+,(A1)+
		Bne	CPyRPN
		Lea	Ximname(A5),A0
		Move.L	A0,LN_NAME(A2)
		Move.B	#10,LN_PRI(A2)
		Move.L	Ximport(A5),A1
		Jsr	_LVOAddPort(A6)

		Lea	DoorName(A5),A0
		Move.L	A0,D0
		Lea	NodeText(A5),A0
		Move.L	A0,D1
		Lea	Launchtxt(PC),A0
		Bsr	FmtStr

		Move.L	DosBase(A5),A6
		Move.L	Buffer(A5),D1
		Lea	STLTags(PC),A0
		Move.L	A0,D2
		Jsr	_LVOSystemTagList(A6)

Ximloppp2	Moveq	#0,D0
		Moveq	#0,D1
		Move.B	Sigbit(A5),D1
		Bset	D1,D0
		Bset	#12,D0
		Move.L	$4.W,A6
		Jsr	_LVOWait(A6)
		Btst	#12,D0
		Bne	CleanUp

XimLoop		Move.L	Ximport(A5),A0
		Jsr	_LVOGetMsg(A6)
		Tst.L	D0
		Beq	Ximloppp2

		Move.L	D0,Ximmessage(A5)

		Move.L	D0,A0
		Lea	MN_SIZE(A0),A0
		Move.L	204(A0),D0

		Cmp.L	#0,D0
		Beq	JH_LI

		Cmp.L	#2,D0
		Beq	JH_SHUTDOWN

		Cmp.L	#3,D0
		Beq	JH_WRITE

		Cmp.L	#4,D0
		Beq	JH_SM

		Cmp.L	#5,D0
		Beq	JH_PM

		Cmp.L	#6,D0
		Beq	JH_HK

		Cmp.L	#7,D0
		Beq	JH_SG

		Cmp.L	#8,D0
		Beq	JH_SF

		Cmp.L	#10,D0
		Beq	JH_SM

		Cmp.L	#11,D0
		Beq	JH_BBSNAME

		Cmp.L	#12,D0
		Beq	JH_SYSOP

		Cmp.L	#13,D0
		Beq	JH_FLAGFILE

		Cmp.L	#100,D0
		Beq	DT_NAME

		Cmp.L	#101,D0
		Beq	DT_PASSWORD

		Cmp.L	#102,D0
		Beq	DT_LOCATION

		Cmp.L	#103,D0
		Beq	DT_PHONENUMBER

		Cmp.L	#105,D0
		Beq	DT_ACCESSLEVEL

		Cmp.L	#106,D0
		Beq	DT_RATIOTYPE

		Cmp.L	#107,D0
		Beq	DT_RATIO

		Cmp.L	#109,D0
		Beq	DT_MESSAGESPOSTED

		Cmp.L	#110,D0
		Beq	DT_UPLOADS

		Cmp.L	#111,D0
		Beq	DT_DOWNLOADS

		Cmp.L	#112,D0
		Beq	DT_TIMESCALLED

		Cmp.l	#113,D0
		Beq	DT_TIMELASTON

		Cmp.L	#115,D0
		Beq	DT_TIMELIMIT

		Cmp.L	#116,D0
		Beq	DT_TIMETOTAL

		Cmp.L	#117,D0
		Beq	DT_BYTESUPLOAD

		Cmp.L	#118,D0
		Beq	DT_BYTEDOWNLOAD

		Cmp.L	#122,D0
		Beq	DT_LINELENGTH

		Cmp.L	#126,D0
		Beq	BB_CONFNAME

		Cmp.L	#131,D0
		Beq	BB_MAINLINE

		Cmp.L	#136,D0
		Beq	RETURNCOMMAND

		Cmp.l	#137,D0
		Beq	ZMODEMSEND

		Cmp.L	#138,D0
		Beq	ZMODEMRECEIVE

		Cmp.L	#149,D0
		Beq	BB_NODEID

		Cmp.L	#152,D0
		Beq	EXPRESS_VERSION

		Cmp.L	#508,D0
		Beq	PRV_COMMAND

		Cmp.L	#510,D0
		Beq	BB_CONFNUM

		Cmp.L	#511,D0
		Beq	BB_DROPDTR

		Cmp.L	#516,D0
		Beq	NODE_BAUDRATE


ReplyIt		Move.L	$4.W,A6
		Move.L	Ximmessage(A5),A1
		Jsr	_LVOReplyMsg(A6)
		Bra	XimLoop

CleanUp		Move.L	$4.W,A6
		Tst.B	Exitflag(A5)
		Beq	NoExit

		Move.L	DDBase(A5),A6
		Tst.B	Returncommand(A5)
		Beq	.ok

		Move.L	Dif(A5),D0
		Lea	Returncommand(A5),A0
		Jsr	_LVODDCommand(A6)

.ok		Move.L	Dif(A5),D0
		Jsr	_LVOCloseDoor(A6)
		Move.L	$4.W,A6
		
NoExit		Tst.L	Ximport(A5)
		Beq	NoXimp
		Move.L	Ximport(A5),A1
		Jsr	_LVORemPort(A6)
		Move.L	Ximport(A5),A0
		Jsr	_LVODeleteMsgPort(A6)

NoXimp		Tst.L	DosBase(A5)
		Beq	Nodos
		Move.L	DosBase(A5),A1
		Jsr	_LVOCloseLibrary(A6)

Nodos		Tst.L	DDBase(A5)
		Beq	Noddl
		Move.L	DDBase(A5),A1
		Jsr	_LVOCloseLibrary(A6)

Noddl		Move.L	A5,A1
		Move.L	#Memsize+1024+1024,D0
		Jsr	_LVOFreeMem(A6)

Nostart		Moveq	#0,D0
		Rts	

JH_LI		Move.L	A0,A2
		Tst.B	(A0)
		Beq	.null

		Move.L	Buffer(A5),A1
.copy		Move.B	(A0)+,(A1)+
		Bne	.copy
		Move.L	Buffer(A5),D3

.hooh		Move.L	200(A2),D1
		Move.L	A2,A0
		Moveq	#0,D2
		Move.L	Dif(A5),D0
		Move.L	DDBase(A5),A6
		Jsr	_LVOPrompt(A6)

		Cmp.L	#0,D0
		Beq	.clost
		Move.L	#1,200(A2)
		Bra	ReplyIt
.clost		Move.L	#-1,200(A2)
		Bra	ReplyIt

.null		Moveq	#0,D3
		Bra	.hooh

JH_SHUTDOWN	Move.L	$4.W,A6
		Move.L	Ximmessage(A5),A1
		Jsr	_LVOReplyMsg(A6)
		Bra	CleanUp

JH_WRITE	Move.L	Dif(A5),D0
		Move.L	DDBase(A5),A6
		Jsr	_LVOSendString(A6)
		Bra	ReplyIt

JH_SM		Move.L	200(A0),D2
		Move.L	Dif(A5),D0
		Move.L	DDBase(A5),A6
		Jsr	_LVOSendString(A6)
		Tst.L	D2
		Beq	ReplyIt
		Move.L	Dif(A5),D0
		Lea	LF(PC),A0
		Jsr	_LVOSendString(A6)
		Bra	ReplyIt		

JH_PM		Move.L	A0,A2
		Move.L	Dif(A5),D0
		Move.L	DDBase(A5),A6
		Jsr	_LVOSendString(A6)

		Move.L	200(A2),D1
		Move.L	A2,A0
		Moveq	#0,D2
		Moveq	#0,D3
		Move.L	Dif(A5),D0
		Jsr	_LVOPrompt(A6)

		Cmp.L	#0,D0
		Beq	.clost
		Move.L	#1,200(A2)
		Bra	ReplyIt
.clost		Move.L	#-1,200(A2)
		Bra	ReplyIt


JH_HK		Move.L	A0,A2
		Move.L	Dif(A5),D0
		Move.L	DDBase(A5),A6
		Jsr	_LVOSendString(A6)
		
		Moveq	#0,D1
		Move.L	Dif(A5),D0
		Move.L	DDBase(A5),A6
		Jsr	_LVOGetKey(A6)
		Tst.L	D0
		Beq	.clost
		Move.B	D0,(A2)
		Move.B	#0,1(A2)
		Move.L	#1,200(A2)
		Bra	ReplyIt
.clost		Move.L	#-1,200(A2)
		Bra	ReplyIt

JH_SG		Moveq	#1,D1
		Move.L	Dif(A5),D0
		Move.L	DDBase(A5),A6
		Jsr	_LVODisplayFile(A6)

		Bra	ReplyIt

JH_SF		Moveq	#0,D1
		Move.L	Dif(A5),D0
		Move.L	DDBase(A5),A6
		Jsr	_LVODisplayFile(A6)
		Bra	ReplyIt

JH_BBSNAME	Move.L	Pointers+dp_DayDream(A5),A1
.copy		Move.B	(A1)+,(A0)+
		Bne	.copy
		Bra	ReplyIt

JH_SYSOP	Move.L	Pointers+dp_DayDream(A5),A1
		Lea	CFG_SYSOPNAME(A1),A1
.copy		Move.B	(A1)+,(A0)+
		Bne	.copy
		Bra	ReplyIt

JH_FLAGFILE	Move.L	Pointers+dp_CurrConf(A5),A1
		Moveq	#0,D1
		Move.B	CONF_NUMBER(A1),D1
		Move.L	#0,A1
		Move.L	#0,A2
		Move.L	Dif(A5),D0
		Move.L	DDBase(A5),A6
		Jsr	_LVOScanFileDirs(A6)
		Bra	ReplyIt

DT_NAME		Move.L	Pointers+dp_CurrUser(A5),A1
		Lea	USER_HANDLE(A1),A1
SNak		Tst.L	200(A0)
		Bne	.cpy
		Exg	A1,A0
.cpy		Move.B	(A1)+,(A0)+
		Bne	.cpy
		Bra	ReplyIt

DT_PASSWORD	Move.L	Pointers+dp_CurrUser(A5),A1
		Lea	USER_PASSWORD(A1),A1
		Bra	SNak

DT_LOCATION	Move.L	Pointers+dp_CurrUser(A5),A1
		Lea	USER_ORGANIZATION(A1),A1
		Bra	SNak

DT_PHONENUMBER	Move.L	Pointers+dp_CurrUser(A5),A1
		Lea	USER_VOICEPHONE(A1),A1
		Bra	SNak

DT_ACCESSLEVEL	Move.L	Pointers+dp_CurrUser(A5),A1
		Tst.L	200(A0)
		Bne	.joo
		Bsr	Convnumb
		Move.B	D0,USER_SECURITYLEVEL(A1)				
		Bra	ReplyIt

.joo		Moveq	#0,D0
		Move.B	USER_SECURITYLEVEL(A1),D0
		Bsr	FmtAS
		Bra	ReplyIt


DT_RATIOTYPE	Tst.L	200(A0)
		Beq	ReplyIt
		Move.B	#'0',(A0)+
		Move.B	#0,(A0)
		Bra	ReplyIt

DT_RATIO	Move.L	Pointers+dp_CurrUser(A5),A1
		Tst.L	200(A0)
		Bne	.joo
		Bsr	Convnumb
		Move.B	D0,USER_BYTERATIO(A1)				
		Bra	ReplyIt

.joo		Moveq	#0,D0
		Move.B	USER_BYTERATIO(A1),D0
		Bsr	FmtAS
		Bra	ReplyIt

DT_MESSAGESPOSTED
		Move.L	Pointers+dp_CurrUser(A5),A1
		Tst.L	200(A0)
		Bne	.joo
		Bsr	Convnumb
		Move.W	D0,USER_PUBMESSAGES(A1)				
		Bra	ReplyIt

.joo		Moveq	#0,D0
		Move.W	USER_PUBMESSAGES(A1),D0
		Bsr	FmtAS
		Bra	ReplyIt

DT_UPLOADS	Move.L	Pointers+dp_CurrUser(A5),A1
		Tst.L	200(A0)
		Bne	.joo
		Bsr	Convnumb
		Move.W	D0,USER_ULFILES(A1)				
		Bra	ReplyIt

.joo		Moveq	#0,D0
		Move.W	USER_ULFILES(A1),D0
		Bsr	FmtAS
		Bra	ReplyIt

DT_DOWNLOADS	Move.L	Pointers+dp_CurrUser(A5),A1
		Tst.L	200(A0)
		Bne	.joo
		Bsr	Convnumb
		Move.W	D0,USER_DLFILES(A1)
		Bra	ReplyIt

.joo		Moveq	#0,D0
		Move.W	USER_DLFILES(A1),D0
		Bsr	FmtAS
		Bra	ReplyIt

DT_TIMESCALLED	Move.L	Pointers+dp_CurrUser(A5),A1
		Tst.L	200(A0)
		Bne	.joo
		Bsr	Convnumb
		Move.W	D0,USER_CONNECTIONS(A1)				
		Bra	ReplyIt

.joo		Moveq	#0,D0
		Move.W	USER_CONNECTIONS(A1),D0
		Bsr	FmtAS
		Bra	ReplyIt

DT_TIMELASTON	Move.L	Pointers+dp_CurrUser(A5),A1
		Tst.L	200(A0)
		Bne	.joo
		Bsr	Convnumb
		Move.W	D0,USER_LASTCALL(A1)				
		Bra	ReplyIt

.joo		Moveq	#0,D0
		Move.W	USER_LASTCALL(A1),D0
		Bsr	FmtAS
		Bra	ReplyIt

DT_TIMELIMIT	Move.L	Pointers+dp_CurrUser(A5),A1
		Tst.L	200(A0)
		Bne	.joo
		Bsr	Convnumb
		Divu	#60,D0
		Move.W	D0,USER_DAILYTIMELIMIT(A1)
		Bra	ReplyIt

.joo		Moveq	#0,D0
		Move.W	USER_ULFILES(A1),D0
		Mulu	#60,D0
		Bsr	FmtAS
		Bra	ReplyIt

DT_TIMETOTAL
		Move.L	Pointers+dp_CurrUser(A5),A1
		Tst.L	200(A0)
		Bne	.joo
		Bsr	Convnumb
		Divu	#60,D0
		Move.W	D0,USER_TIMEREMAINING(A1)
		Bra	ReplyIt

.joo		Moveq	#0,D0
		Move.W	USER_TIMEREMAINING(A1),D0
		Mulu	#60,D0
		Bsr	FmtAS
		Bra	ReplyIt

DT_BYTESUPLOAD	Move.L	Pointers+dp_CurrUser(A5),A1
		Tst.L	200(A0)
		Bne	.joo
		Bsr	Convnumb
		Move.L	D0,USER_ULBYTES(A1)				
		Bra	ReplyIt

.joo		Moveq	#0,D0
		Move.L	USER_ULBYTES(A1),D0
		Bsr	FmtAS
		Bra	ReplyIt

DT_BYTEDOWNLOAD
		Move.L	Pointers+dp_CurrUser(A5),A1
		Tst.L	200(A0)
		Bne	.joo
		Bsr	Convnumb
		Move.L	D0,USER_DLBYTES(A1)				
		Bra	ReplyIt

.joo		Moveq	#0,D0
		Move.L	USER_DLBYTES(A1),D0
		Bsr	FmtAS
		Bra	ReplyIt

DT_LINELENGTH
		Move.L	Pointers+dp_CurrUser(A5),A1
		Tst.L	200(A0)
		Bne	.joo
		Bsr	Convnumb
		Move.B	D0,USER_SCREENLENGTH(A1)				
		Bra	ReplyIt

.joo		Moveq	#0,D0
		Move.B	USER_SCREENLENGTH(A1),D0
		Bsr	FmtAS
		Bra	ReplyIt

BB_CONFNAME	Move.L	Pointers+dp_CurrConf(A5),A1
		Lea	CONF_NAME(A1),A1
		Bra	SNak

BB_MAINLINE	Lea	Doorparams(A5),A1
.loop		Move.B	(A1)+,(A0)+
		Bne	.loop
		Bra	ReplyIt

RETURNCOMMAND	Lea	Returncommand(A5),A1
.loop		Move.B	(A0)+,(A1)+
		Bne	.loop
		Bra	ReplyIt

ZMODEMSEND	Move.L	A0,A2
		Move.L	Buffer2(A5),A1
.loop		Move.B	(A0)+,(A1)+
		Bne	.loop
		Move.B	#-1,(A1)

		Move.L	Dif(A5),D0
		Move.L	DDBase(A5),A6
		Move.L	Buffer2(A5),A0
		Move.L	Buffer(A5),A1
		Move.B	#0,(A1)
		Jsr	_LVOXprSend(A6)
		Move.L	#1,200(A2)
		Bra	ReplyIt

ZMODEMRECEIVE	Move.L	A0,A2
		Move.L	Dif(A5),D0
		Move.L	DDBase(A5),A6
		Jsr	_LVOXprSend(A6)
		Move.L	#1,200(A2)
		Bra	ReplyIt

BB_NODEID	Move.L	Pointers+dp_CurrentNode(A5),A1
		Moveq	#0,D0
		Move.B	14(A1),D0
		Bsr	FmtAS
		Bra	ReplyIt

EXPRESS_VERSION	Lea	verkka(PC),A1
.loop		Move.B	(A1)+,(A0)+
		Bne	.loop
		Bra	ReplyIt

PRV_COMMAND	Move.L	Dif(A5),D0
		Move.L	DDBase(A5),A6
		Jsr	_LVODDCommand(A6)

BB_CONFNUM	Move.L	Pointers+dp_CurrConf(A5),A1
		Moveq	#0,D0
		Move.B	CONF_NUMBER(A1),D0
		Bsr	FmtAS
		Bra	ReplyIt

BB_DROPDTR	Move.L	Dif(A5),D0
		Move.L	DDBase(A5),A6
		Jsr	_LVODisconnect(A6)
		Bra	ReplyIt

NODE_BAUDRATE	Move.L	Pointers+dp_BpsRate(A5),D0
		Bsr	FmtAS
		Bra	ReplyIt


FmtAS		Movem.L	D0-D7/A0-A3,-(SP)
		Move.L	A0,A3
		Lea	Numtxt(PC),A0
		Move.L	SP,A1
		Lea	PutChar(PC),A2
		Move.L	$4.W,A6
		Jsr	_LVORawDoFmt(A6)
		Movem.L	(SP)+,D0-D7/A0-A3
		Rts

		
FmtStr		Movem.L	D0-D7/A0-A3,-(SP)
		Move.L	SP,A1
		Lea	PutChar(PC),A2
		Move.L	Buffer(A5),A3
		Move.L	$4.W,A6
		Jsr	_LVORawDoFmt(A6)
		Movem.L	(SP)+,D0-D7/A0-A3
		Rts

DpyMsg		Movem.L	D0-D7/A0-A3,-(SP)
		Move.L	SP,A1
		Lea	PutChar(PC),A2
		Move.L	Buffer(A5),A3
		Move.L	$4.W,A6
		Jsr	_LVORawDoFmt(A6)
		Move.L	DosBase(A5),A6
		Jsr	_LVOOutput(A6)
		Move.L	D0,D1
		Beq.S	NofHandle
		Move.L	A3,D2
CountLength	Tst.B	(A3)+
		Bne	CountLength
		Subq.W	#1,A3
		Move.L	A3,D3
		Sub.L	D2,D3
		Jsr	_LVOWrite(A6)
NofHandle	Movem.L	(SP)+,D0-D7/A0-A3
		Rts
PutChar		Move.B	D0,(A3)+
		Rts

Convnumb	Move.L	DosBase(A5),A6
		Move.L	A0,D1
		Lea	LongVal(A5),A0
		Move.L	A0,D2
		Jsr	_LVOStrToLong(A6)
		Move.L	LongVal(A5),D0
		Rts


DosName		dc.b	'dos.library',0
DDName		dc.b	'dreamdoor.library',0

Portname	dc.b	'DD_DoorPort%s',0
Ximpname	dc.b	'AEDoorPort%s',0

Numtxt		dc.b	'%ld',0

Launchtxt	dc.b	'run <>nil: %s %s',0

LF		dc.b	10,0

VerName		dc.b	'DayDream:Data/Version.DAT',0

NoXim		dc.b	'AmiExpress BBS V5.0 By Joseph Hodge.',10,0

verkka		dc.b	'DayDream BBS XIM-Emulation V1.0!',0

		even

STLTags		dc.l	TAG_DONE
