
*
* Maxon C++:
*
* Library-Modul "dosbase"
*
* Jens Gelhar 19.03.93, 31.08.93, 08.04.94
*

	xdef	_INIT_1__Crunchy__fRoG,_EXIT_1__cRunchY__FrOg
	xdef	_DosBase,_DOSBase
	xdef	_exit,exit__i,abort__STANDARD,_errno
	xdef	_Filehandle__Std__Input,_Filehandle__Std__Output,_FileHandle__Std__Error
	xdef	_cout,_cin,_cerr,_clog
	xdef	_std__in,_std__out,_std__err
	xdef	__Writefile,__Writefile__NoBuf

	xref	__Writeflag,__CleanUp,main_,_wbmain

_SysBase	= 4

RemTask	= -288
CloseLibrary	= -414
OpenLibrary	= -552

Write	= -48
Input	= -54
Output	= -60

	; * stream:
	rsreset
str_fh:		rs.l	1	; 0 L Filehandle
str_ungetch:	rs.b	1	; 4 B Flag: Zeichen im "unget"-Buffer?
		rs.b	1	; 5 B ebenjenes Zeichen
str_mode:	rs.b	1	; 6 B Zugriffsmodus: 1 = read, 2 = write, 3 = rw
str_error:	rs.b	1	; 7 B str_error
str_bufptr:	rs.l	1	; 8 L Zeiger auf Buffer-Struct
str_flags:	rs.b	1	; 12 B Bit 7: freemem-Flag, 6: closefile-Flag

buf_write	= 16

_INIT_1__Crunchy__fRoG:
	moveq	#12,d0    ; Returncode + 2 Parameter-LW
	add.l	a7,d0
	movem.l	d1-d3/a0/a4/a6,-(a7)
	lea	_DosBase,a4
	move.l	d0,returnstack-_DosBase(a4)
	move.l	_SysBase.w,a6
	clr.l	_errno-_DosBase(a4)
	lea	DosLibName(pc),a1
	moveq	#0,d0
	jsr	OpenLibrary(a6)
	move.l	d0,(a4)
	beq	Panic
	move.l	d0,a6
	jsr	Input(a6)
	move.l	d0,_Filehandle__Std__Input-_DosBase(a4)
	clr.w	_std__in+str_ungetch-_DosBase(a4)
	clr.l	_std__in+str_bufptr-_DosBase(a4)
	jsr	Output(a6)
	move.l	d0,_Filehandle__Std__Output-_DosBase(a4)
	move.l	d0,_FileHandle__Std__Error-_DosBase(a4)
	clr.w	_std__out+str_ungetch-_DosBase(a4)
	clr.l	_std__out+str_bufptr-_DosBase(a4)
	clr.w	_std__err+str_ungetch-_DosBase(a4)
	clr.l	_std__err+str_bufptr-_DosBase(a4)
	movem.l	(a7)+,d1-d3/a0/a4/a6
	rts

_EXIT_1__cRunchY__FrOg:
	movem.l	d0-d1/a0-a1/a6,-(a7)
	move.l	_DosBase,d0
	beq.b	.exit
	move.l	_SysBase.w,a6
	move.l	d0,a1
	jsr	CloseLibrary(a6)
.exit	movem.l	(a7)+,d0-d1/a0-a1/a6
	rts

__Writefile:	; stream a0, Daten d2..d3, d0 <> 0 bei Fehler
	clr.w	str_ungetch(a0)
	tst.l	str_bufptr(a0)
	beq.b	__Writefile__NoBuf
	; in Puffer schreiben:
	move.l	str_bufptr(a0),a0
	move.l	buf_write(a0),a6
	jmp	(a6)
__Writefile__NoBuf:
	btst	#1,str_mode(a0)
	beq.b	wrMurx
	move.l	#__Writeflag,d0
	beq.b	wr2
	btst	#6,str_flags(a0)
	bne.b	wr2
	cmp.l	cerr_base,a0
	beq.b	wr1
	cmp.l	cout_base,a0
	bne.b	wr2
wr1	move.l	d0,a0
	jsr	(a0)
wrok	moveq	#0,d0
	rts
wr2	; "normale" Datei:
	; ganz brav in File schieben:
	move.l	(a0),d1
	beq.b	wrMurx
	move.l	_DosBase,a6
	jsr	Write(a6)
	tst.l	d0
	bpl.b	wrok
wrMurx	moveq	#-1,d0
	rts

Panic:	; Esoterischer Fall: dosbase konnte nicht geöffnet werden
	move.l	_SysBase.w,a6
	sub.l	a1,a1
	jmp	RemTask(a6)         ; Task entfernen

abort__STANDARD:
	moveq	#0,d0
	bra.b	cool_babe
_exit:
exit__i:
	jsr	__CleanUp
	move.l	4(a7),d0
cool_babe
	move.l returnstack,a7
	rts

DosLibName:	dc.b 'dos.library',0

	SECTION D,DATA

_DOSBase:
_DosBase:	dc.l 0
returnstack:	blk.l 1

_cin:	dc.l cin_base
	dc.b 1,0
cin_base:	dc.l _std__in
	dc.b 10,1,2,3
_std__in:
_Filehandle__Std__Input:	dc.l 0
	blk.w 1
	dc.b 1,0
	dc.l 0
	dc.b 0
	even

_cout:	dc.l cout_base
	dc.b 1,0
cout_base:	dc.l _std__out
	dc.b 10,1,2,3
_std__out:
_Filehandle__Std__Output:	dc.l 0
	blk.w 1
	dc.b 2,0
	dc.l 0
	dc.b 0
	even

_cerr:
_clog:	dc.l cerr_base
	dc.b 0,0
cerr_base:	dc.l _std__err
	dc.b 10,1,2,3
_std__err:
_FileHandle__Std__Error:	dc.l 0
	blk.w 1
	dc.b 2,0
	dc.l 0
	dc.b 0
	even

_errno:	blk.l 1

	end
