	;
	; Unit CRT
	;
	; Himpelsoft 05.08.90
	;

	globl   Crt__init, Crt_KeyPressed, Crt_WaitForKey
	globl   Crt_ReadKey, Crt_CrtRastPort, Crt_CrtUserPort
	globl   Crt_CrtWindow, Crt_NameOfProgram, Crt_MessageReceived
	globl   Crt_SetIDCMP, Crt_AddIDCMP, Crt_SubIDCMP
	globl   Crt_CrtMessage, Crt_WindowClosed
	globl   Crt_CrtConsole, Crt_WindowTitles
	globl   Crt_WhereX, Crt_WhereY, Crt_TextLines, Crt_TextColms

	globl   _amigalibbase

OffsFromWB	=	-86
OffsStartupMessage	=	-106
LibOffs	=	-28

execbase	=	4
FindTask	=	-294
Wait	=	-318
GetMsg	=	-372
ReplyMsg	=	-378
CheckIO	=	-468

SetWindowTitles	=	-276
ModifyIDCMP	=	-150
OpenWindow	=	-204
WBenchToFront	=	-342

MaxNameLen	=	32

Crt__init:	move.l	execbase.s,a6
	sub.l	a0,a0
	jsr	FindTask(a6)
	move.l	d0,a0
	move.l	$AC(a0),d0              ; pr_CLI
	beq.s	FromWB
	; Start vom CLI
	asl.l	#2,d0                   ; Zeiger auf CLI
	move.l	d0,a0
	move.l	16(a0),d0               ; cli_CommandName
	beq.s	FromSystem
	asl.l	#2,d0
	move.l	d0,a0
	move.b	(a0)+,d1                ; Namenslänge
	cmp.w	#MaxNameLen,d1
	blo.s	FromCLI
	moveq	#MaxNameLen-1,d1
FromCLI:	lea	WindowName(pc),a1
	subq.l	#1,d1
 copycli:	move.b	(a0)+,(a1)+
	dbeq	d1,copycli
	clr.b	-(a1)
	bra.s	FensterÖffnen

FromWB:	; Start von Workbench
	move.l	(a5),a0
	tst.b	OffsFromWB(a0)
	beq.s	FromSystem
	move.l	OffsStartupMessage(a0),d0
	beq.s	FromSystem
	move.l	d0,a0
	move.l	$24(a0),d0              ; sm_ArgList
	beq.s	FromSystem
	move.l	d0,a0
	move.l	(a0),a0                 ; wa_Name
	bsr.s	copyname
	bra.s	FensterÖffnen

FromSystem:	; Start aus Pascal-System, das von Workbench gestartet wurde
	lea	defaultname(pc),a0
	bsr.s	copyname
	bra.s	FensterÖffnen

copyname:	; Namen von a0 nach "Windowname"
	moveq	#MaxNameLen-1,d1
	lea	WindowName(pc),a1
 cpnm1:	move.b	(a0)+,(a1)+
	dbeq	d1,cpnm1
	clr.b	-(a1)
	rts

FensterÖffnen:
	jsr	_amigalibbase+56        ; GetIntBase
	jsr	WBenchToFront(a6)
	clr.l	Con
	clr.l	MsgClass
	clr.l	Msg
	move.l	#$200, IDCMP
	lea	_amigalibbase+16,a0     ; Close_Window
	jsr	LibOffs-28(a5)          ; AllocRemember
	move.l	a0,-(a7)
	jsr	_amigalibbase+56        ; GetIntBase
	move.l	60(a6),a1               ; FirstScreen
	lea	NewWindow(pc),a0
	move.w	12(a1),4(a0)
	move.w	14(a1),6(a0)
	jsr	OpenWindow(a6)
	move.l	d0,Win
	move.l	(a7)+,a0
	move.l	d0,12(a0)               ; in Remember eintragen
	beq.s	intuerr
	move.l	d0,-(a7)
	jsr	_amigalibbase+36        ; OpenConsole
	move.l	d0,Con
	move.l	d0,a0
	move.l	16+24(a0),CU            ; ReadIO.io_Unit
	move.l	d0,(a7)
	jsr	_amigalibbase+52        ; SetStdIO
	addq.l	#4,a7
	lea	CloseCrt(pc),a0
	jsr	LibOffs-28(a5)          ; AllocRemember
	move.l	#'HIMP',12(a0)
	rts

intuerr:	pea	defaultname
	jmp	LibOffs-88(a5)          ; Error


CloseCrt:	; Exit-Handler
	bsr	ForgetMessage
	clr.l	-(a7)
	jsr	_amigalibbase+52        ; SetStdIO
	move.l	Con(pc),(a7)
	jsr	_amigalibbase+40        ; CloseConsole
	move.l	Win(pc),(a7)
	jsr	_amigalibbase+16        ; Close_Window
	addq.l	#4,a7
	rts

Crt_SetIDCMP:
	jsr	_amigalibbase+56        ; GetIntBase
	move.l	4(a7),d0
	move.l	d0,IDCMP
	move.l	Win(pc),a0
	jmp	ModifyIDCMP(a6)

Crt_AddIDCMP:
	move.l	IDCMP(pc),d0
	or.l	d0,4(a7)
	bra.s	Crt_SetIDCMP

Crt_SubIDCMP:
	not.l	4(a7)
	move.l	IDCMP(pc),d0
	and.l	d0,4(a7)
	bra.s	Crt_SetIDCMP

Crt_WindowTitles:
	jsr	_amigalibbase+56        ; GetIntBase
	move.l	Win(pc),a0
	move.l	8(a7),a1
	move.l	4(a7),a2
	jmp	SetWindowTitles(a6)

Crt_KeyPressed:
	move.l	MsgClass(pc),d0
	bne.s	kyp1
	move.l	Win(pc),a0
	move.l	86(a0),a0               ; UserPort
	move.l	execbase.s,a6
	jsr	GetMsg(a6)
	move.l	d0,Msg
	beq.s	kyp2
	; Message empfangen
	move.l	d0,a0
	move.l	20(a0),MsgClass
 kyp1:	moveq	#1,d0
	rts
 kyp2:	move.l	Con(pc),a1
	lea	16(a1),a1               ; ReadIO
	move.l	execbase.s,a6
	jsr	CheckIO(a6)
	tst.l	d0
	bne.s	kyp1
 kyp0:	moveq	#0,d0
	rts

Crt_MessageReceived:
	move.l	4(a7),d0
	and.l	MsgClass(pc),d0
	bne.s	kyp1
	rts

Crt_WindowClosed:
	move.l	#$200,-(a7)
	bsr.s	Crt_MessageReceived
	addq.l	#4,a7
	rts

Crt_CrtMessage:
	move.l	Msg(pc),d0
	rts

ForgetMessage:
	clr.l	MsgClass
	move.l	Msg(pc),d0
	beq.s	ret
	move.l	d0,a1
	move.l	execbase.s,a6
	jsr	ReplyMsg(a6)
 ret:	rts

Crt_WaitForKey:
	bsr.s	ForgetMessage
	bsr	Crt_KeyPressed
	tst.l	d0
	bne.s	kyp0
	moveq	#-1,d0
	move.l	execbase.s,a6
	jsr	Wait(a6)
	bra.s	Crt_WaitForKey

Crt_ReadKey:
	bsr.s	Crt_WaitForKey
	move.l	Con(pc),-(a7)
	jsr	_amigalibbase+44                ; ReadCon
	addq.l	#4,a7
	rts

Crt_CrtRastPort:
	move.l	Win(pc),a0
	move.l	50(a0),d0
	rts

Crt_CrtUserPort:
	move.l	Win(pc),a0
	move.l	86(a0),d0
	rts

Crt_CrtWindow:
	move.l	Win(pc),d0
	rts

Crt_CrtConsole:
	move.l	Con(pc),d0
	rts

Crt_NameOfProgram:
	move.l	#WindowName,d0
	rts

Crt_TextColms:
	move.l	CU(pc),a0
	move.w	42(a0),d0
	addq.w	#1,d0
	rts

Crt_TextLines:
	move.l	CU(pc),a0
	move.w	44(a0),d0
	addq.w	#1,d0
	rts

Crt_WhereX:
	move.l	CU(pc),a0
	move.w	62(a0),d0
	addq.w	#1,d0
	rts

Crt_WhereY:
	move.l	CU(pc),a0
	move.w	64(a0),d0
	addq.w	#1,d0
	rts

Win:	blk.l	1
Con:	blk.l	1
CU:	blk.l	1
Msg:	blk.l	1
MsgClass:	blk.l	1

NewWindow:	dc.w	0, 0, 640, 200, $0201
IDCMP:	dc.l	0, $140F, 0, 0, WindowName, 0, 0
	dc.w	240, 100, -1, -1, 1

defaultname:	dc.b	'Kickpascal',0
WindowName:	blk.b	MaxNameLen

