		
filesize	macro
		addrtxin	<\1>,a0
		jsr	sizecode(pc)
		ifnd	Dfilesize
		bra	fsizeover
sizecode	movem.l	d2-d7/a2-a6,-(sp)
		move.l	a0,a2
		moveq	#0,d3
		move.l	_DosBase(a4),a4
		move.l	#260,d0		;fib_size_of
		moveq	#1,d1
		move.l	4,a6
		jsr	-198(a6)	;_LVOAllocMem(a6)
		move.l	d0,d7		mem for fib
		beq	nomemz
		move.l	a2,d1
		moveq	#-2,d2
		move.l	a4,a6		;_DosBase
		jsr	-84(a6)		;_LVOLock(a6)
		move.l	d0,d6		lock
		beq	freememo
		move.l	d6,d1		;lock
		move.l	d7,d2		file block
		move.l	a4,a6
		jsr	-102(a6)	;_LVOExamine(a6)
		tst.l	d0
		beq	freelock
		move.l	d7,a0
		move.l	124(a0),d3	size of bytes
freelock	move.l	d6,d1		;lock_
		move.l	a4,a6
		jsr	-90(a6)		;_LVOUnLock(a6)
freememo	move.l	d7,a1
		move.l	#260,d0
		move.l	4,a6
		jsr	-210(a6)	;_LVOFreeMem(a6)
nomemz		move.l	d3,d0
endsize		movem.l	(sp)+,d2-d7/a2-a6
		rts
fsizeover
Dfilesize	equ	1
		endc

		endm

AllocMem	macro		;<bytes>,<mode>
		varin 	\1,d0
		varin	\2,d1
		move.l	4,a6		;execbace
		jsr	-198(a6)	;_LVOAllocMem(a6)    
		endm


FreeMem		macro	*freemem <addressplace>,<bytes>
		varin	\2,d0
		addrin	\1,a1
		move.l	4,a6
		jsr	-210(a6)	;_LVOFreeMem(a6)
		endm
		
	#define	MODE_NEW,1006
	#define	MODE_OLD,1005
	#define	NULL,0
	#define LF,10
fopen		macro
mdflg	set	0
		addrtxin	<\1>,a0	
		move.l	a0,d1
		ifc	'\2','"w"'
		move.l	#1006,d2
mdflg	set	1
		endc
		ifc	'\2','"r"'
		move.l	#1005,d2
mdflg	set	1
		endc
		ifeq	mdflg
		varin	\2,d2		;mode
		endc
		move.l	_DosBase(a4),a6
		jsr	-30(a6)		;open
		endm

fclose		macro
		varin	\1,d1		;file handle
		move.l	_DosBase(a4),a6
		jsr	-36(a6)		;close
		endm

fread		macro
		addrin	\1,a0
		move.l	a0,d2		;destination
		varin	\2,d0		;the size of the structure
		varin	\3,d3		;the number of the structure
		mulu	d0,d3
		addrin	\4,d1		;the filehandle
		move.l	_DosBase(a4),a6
		jsr	-42(a6)		;read
		endm

fwrite		macro
		addrin	\1,a0
		move.l	a0,d2		;source
		varin	\2,d0		;the size of the structure
		varin	\3,d3		;the number of the structure
		mulu	d0,d3
		addrin	\4,d1		;the filehandle
		move.l	_DosBase(a4),a6
		jsr	-48(a6)		;write
		endm
		

savefile	macro	*save <filename>,<addressplace>,<bytes>
		movem.l	d2-d5/a3/a6,-(sp)
		varin	\3,d3			;bytes
		addrin	\2,d5		;address
		addrtxin	<\1>,a3
		jsr	sfilecode(pc)
		movem.l	(sp)+,d2-d5/a3/a6
		ifnd	Dsfile
		bra	savefileover
sfilecode
		move.l	#1006,d2
		move.l	_DosBase(a4),a6
		move.l	a3,d1
		jsr	-30(a6)			;_LVOOpen(a6)
		move.l	d0,d4			;file handle
		beq	sferror
		move.l	d5,d2
		move.l	d4,d1
		jsr	-48(a6)			;_LVOWrite(a6)
		move.l	d4,d1
		jsr	-36(a6)			;_LVOClose(a6)
		moveq	#1,d0
		rts	
		
sferror
		moveq	#0,d0
		rts

Dsfile		equ	1
savefileover	
		endc
		endm

 
loadfile	macro	*load <filenameaddress>,<address place>
		movem.l	d2-d4/a3-a6,-(sp)
		addrin	\2,d3
		addrtxin	<\1>,a3		;pointer to address
		jsr	loadcode(pc)
		movem.l	(sp)+,d2-d4/a3-a6
		ifnd	Dloadfile
		bra	lfileover
loadcode
		move.l	#1005,d2
		move.l	_DosBase(a4),a6
		move.l	a6,a5
		move.l	a3,d1			;address of name
		jsr	-30(a6)			;_LVOOpen(a6)
		move.l	d0,d4			;filehandle
		beq	lferror
		move.l	d3,d2			;pointer to data area
		move.l	d4,d1
		move.l	#$ffffff,d3
		move.l	a5,a6
		jsr	-42(a6)			;_LVORead(a6)
		move.l	d0,d6			;mount of bytes
		move.l	d4,d1
		move.l	a5,a6
		jsr	-36(a6)			;_LVOClose(a6)
		move.l	d6,d0
		rts
lferror	
		moveq	#0,d0
		rts
lfileover
Dloadfile	equ	1
		endc
	
		endm

Delay		macro
		varin	\1,d1
		move.l	_DosBase(a4),a6
		jsr	-198(a6)	;_LVODelay(a6)
		endm

heksa		macro	
		varin	\1,d0
		jsr	heksaprint(pc)
		ifnd	Dheksa
		bra	heksaover
heksaprint	movem.l	d2-d7/a6,-(sp)
		sub.l	#10,sp
		move.l	#7,d7
		lea	10(sp),a0
		move.l	d0,d1
hloop		move.b	d1,d0
		and.b	#$0f,d0
		add.b	#$30,d0
		cmp.b	#$3a,d0
		bcs.s	11$
		add.b	#7,d0
11$		move.b	d0,-(a0)
		asr.l	#4,d1			
		dbf	d7,hloop
		move.w	#$2024,(sp)
		move.l	_stdout(a4),d1
		move.l	sp,d2
		move.l	#10,d3
		move.l	_DosBase(a4),a6
		jsr	-48(a6)		;_LVOWrite(a6)
12$		add.l	#10,sp
		movem.l	(sp)+,d2-d7/a6
		rts

heksaover
Dheksa		equ	1
		endc 
		endm

print	macro
		addrtxin	<\1>,a0
		jsr	printcode(pc)
		ifnd	Printch
		bra	_printover
printcode	movem.l	a0-a2/a6/d0-d3,-(sp)
		move.l	a0,a2
		move.l	_stdout(a4),d1
		move.l	a2,d2
primmloop1	tst.b	(a2)+
		bne.s	primmloop1
		move.l	a2,d3
		sub.l	d2,d3
		subq.l	#1,d3
		beq	primnloop2
		move.l	_DosBase(a4),a6
		jsr	-48(a6)		;_LVOWrite(a6)
primnloop2	movem.l	(sp)+,a0-a2/a6/d0-d3
		rts
	
Printch		equ	1
_printover
		endc
		endm

gets		macro
		getchar()	\1
		endm

getchar()	macro
		jsr	getcharcode(pc)
		ifnc	'\1',''
		lea	getbuf(a4),a0
		addrin	\1,a1
60$
		move.b	(a0)+,(a1)+
		bne	60$
		move.l	d1,d0
		endc	
		ifnd	Getchar
		bra	getcharcont
getcharcode	movem.l	d2-d4/a6,-(sp)
		move.l	_stdout(a4),d1
		lea	getbuf(a4),a0
		move.l	a0,a1
		move.l	#127,d0
clrinbuf	clr.w	(a1)+
		dbf	d0,clrinbuf
		move.l	a0,d2
		move.l	#255,d3
		move.l	_DosBase(a4),a6
		jsr	-42(a6)		;_LVORead(a6)
		lea	getbuf(a4),a0
		clr.b	-1(a0,d0.l)
		subq.l	#1,d0
		move.l	d0,d1
		moveq	#0,d0
		move.b	getbuf(a4),d0
getcharno	movem.l	(sp)+,d2-d4/a6
		rts
Getchar		equ	1
getcharcont
		endc
		endm

printf		macro
		addrtxin	<\1>,a0
		ifnc	'\2',''
		varin	\2,d0
		endc
		ifnc	'\3',''
		varin	\3,d1
		endc
		ifnc	'\4',''
		varin	\4,d2
		endc
		ifnc	'\5',''
		varin	\5,d3
		endc
		ifnc	'\6',''
		varin	\6,d4
		endc
		ifnc	'\7',''
		varin	\7,d5
		endc
		ifnc	'\8',''
		varin	\8,d6
		endc
		jsr	printdcode(pc)
		ifnd	_printd
		bra	Printdcont
printdcode	movem.l	d0-d7/a0-a3,-(sp)
		move.l	sp,a1
		lea	putchar(pc),a2
		lea	getbuf(a4),a3		;bufferaddress 
		move.l	4,a6
		jsr	-522(a6)		;_LVORawDoFmt(a6)
		move.l	_stdout(a4),d1
		move.l	a3,d2
endfind		tst.b	(a3)+
		bne	endfind
		subq	#1,a3
		move.l	a3,d3
		sub.l	d2,d3
		move.l	_DosBase(a4),a6
		jsr	-48(a6)			;_LVOWrite(a6)
outtzerou	movem.l	(sp)+,d0-d7/a0-a3
		rts
putchar		move.b	d0,(a3)+
		rts
_printd		equ	1
Printdcont
		endc
		endm

floatpoint	macro
		jsr	floatcode(pc)		
		ifnd	Floatpoint
		bra	floatcont
floatcode	movem.l	d1-d7/a3,-(sp)
		sub.l	#84,sp
		move.l	sp,a3
		moveq	#20,d0
		move.l	a3,a1
clrbuffl	clr.l	(a1)+
		dbf	d0,clrbuffl
		move.l	a3,a1
		moveq	#0,d1			;counter
		moveq	#0,d2			;desimalpoint
		moveq	#0,d4
		moveq	#0,d5			;exp valjue
		moveq	#0,d6
		moveq	#0,d7			;neg flag
		move.b	(a0)+,d0
		cmp.b	#'-',d0
		bne	nonegfn
		move.l	#128,d7			;set neg flag
nextflnum	move.b	(a0)+,d0
nonegfn		cmp.b	#'.',d0
		bne	nodespoint
		move.l	d1,d2
		moveq	#-1,d6
		bra	nextflnum
nodespoint	cmp.b	#'E',d0
		beq	expdigit
		cmp.b	#'e',d0
		beq	expdigit
		sub.b	#'0',d0
		cmp.b	#9,d0
		bhi	calcpoint
		addq.l	#1,d1
		cmp.l	#20,d1
		beq	calcpoint
		cmp.l	#12,d1
		bhi	nextflnum
		move.b	d0,(a1)+		digit buffer
		bra	nextflnum

expdigit	moveq	#0,d0
		moveq	#0,d4			;exp neg flag
		moveq	#0,d5			;exp valjue
nextexpw	move.b	(a0)+,d0
		cmp.b	#'-',d0
		bne	nonegexp
		moveq	#-1,d4
		bra	nextexpw
nonegexp	sub.b	#'0',d0
		cmp.b	#9,d0
		bhi	calcpoint
		muls.w	#10,d5
		add.w	d0,d5
		bra	nextexpw
calcpoint	
		tst.l	d6			;test desimalpoint flag
		bmi	despointfind
		move.l	d1,d2
despointfind	tst.l	d4			;is neg
		bpl	nonegexpf
		neg.l	d5
nonegexpf	add.l	d5,d2			;desimalpoint
		cmp.l	#19,d2
		bgt	overflowfl
		cmp.l	#-20,d2
		blt	overflowfl
		move.l	d1,d0			;number of digits
		sub.l	#1,d2
		lea 	1(a3,d1.l),a0		;last digit
		sub.l	d2,d1			;desimalpoint
		lea	32(a3,d1.l),a1
;		subq.l	#1,d0
loopxhg		move.b	-(a0),-(a1)
		clr.b	(a0)
		dbf	d0,loopxhg
		move.l	a3,d0

;positive bits
		moveq	#63,d2			;counter
loopckn	
		move.l	a3,a0
		moveq	#31,d1			;mount of digits
		moveq	#0,d0
loopckm		move.b	(a0),d0
		tst.l	d0
		bpl	noreflag
		add.b	#10,d0
noreflag	ror.l	#1,d0			;divide	two
		move.b	d0,(a0)+		;back to buffer
		dbf	d1,loopckm
		roxl.l	#1,d0
		roxr.w	64(a3)
		roxr.w	66(a3)
		roxr.w	68(a3)
		roxr.w	70(a3)
		dbf	d2,loopckn				
;desimal part
		moveq	#95,d4			;counter
loopztr	
		move.b	32(a3),d0
		cmp.b	#4,d0
		bhi	overtsi
		moveq	#0,d3			;zero bit
		
		bra	overtsm
overtsi		moveq	#1,d3			;one bit
		sub.b	#5,d0
		move.b	d0,20(a3)
overtsm		lea	64(a3),a0
		moveq	#31,d2			;count digits
		moveq	#0,d1
loopztp		move.b	-(a0),d0
		add.b	(a0),d0
		add.b	d1,d0			;add flag
		
		moveq	#0,d1
		cmp.b	#9,d0			;is overflow
		bls	overflos
		moveq	#1,d1
		sub.b	#10,d0
overflos	move.b	d0,(a0)
		dbf	d2,loopztp		
		roxr.w	#1,d3
		roxl.w	82(a3)
		roxl.w	80(a3)
		roxl.w	78(a3)
		roxl.w	76(a3)
		roxl.w	74(a3)
		roxl.w	72(a3)
		dbf	d4,loopztr
;floatnumber
		move.l	#128,d1
loopjyt		tst.l	64(a3)
		bmi	bitsfnd
		lea	84(a3),a0
		moveq	#9,d2
lopuik		roxl.w	-(a0)
		dbf	d2,lopuik
		dbf	d1,loopjyt
		moveq	#0,d0
		bra	readyendv
bitsfnd		move.l	64(a3),d0
		or.b	d7,d1
		move.b	d1,d0
		bra	readyendv		
overflowfl	moveq	#1,d0
readyendv	add.l	#84,sp
		movem.l	(sp)+,d1-d7/a3
		rts
Floatpoint	equ	1
floatcont
		endc
		endm		

longnumber	macro
		movem.l	d3/d4,-(sp)
		jsr	longnmcode(pc)
		movem.l	(sp)+,d3/d4
		ifnd	Longnumber
		bra	overlongnm
longnmcode
		moveq	#0,d0
		moveq	#0,d3
		move.b	(a0)+,d1
		cmp.b	#'-',d1
		bne	calclgnm
		moveq	#-1,d3
nxlongdg	move.b	(a0)+,d1
calclgnm	sub.b	#'0',d1
		cmp.b	#9,d1
		bhi	fnhlgnm
		move.l	d0,d2
	
		add.l	d0,d0
		bcs	overlgnm
		add.l	d0,d0			;a*4
		bcs	overlgnm
		add.l	d2,d0			;(a*4)+a
		bcs	overlgnm
		add.l	d0,d0			;(5*a)*2
		bcs	overlgnm
		ext.w	d1
		ext.l	d1
		add.l	d1,d0
		bcs	overlgnm
		bcc	nxlongdg
overlgnm	moveq	#-1,d1
		rts
fnhlgnm		tst.l	d3
		bpl	nonglg
		neg.l	d0
nonglg		moveq	#0,d1
		rts		
Longnumber	equ	1
overlongnm
		endc
		endm
				


scanffl		macro
		jsr	scanfflcode(pc)
		varinout	d0,\1
		ifnd	Scanffl
		bra	scanfflcont
scanfflcode
		getchar()
		lea	getbuf(a4),a0
		floatpoint
		rts
Scanffl		equ	1
		
scanfflcont	endc
	
	
		endm

scanfint	macro
		jsr	scanflgcode(pc)
		varinout	d0,\1
		ifnd	Scanflg
		bra	scanflgcont
scanflgcode
		getchar()
		lea	getbuf(a4),a0
		longnumber
		rts
Scanflg		equ	1
scanflgcont	
		endc
		endm

atof		macro
		addrin	\2,a0
		floatpoint
		varinout	d0,\1
		endm

atol		macro
		addrin	\2,a0
		longnunber
		varinout	d0,\1
		endm	

ltoa		macro
		movem.l	d2-d7/a2/a3,-(sp)
		addrin	\1,a2	
		varin 	\2,d0
		jsr	printlgcode(pc)
		movem.l	(sp)+,d2-d7/a2/a3
		ifnd	Printlong
		bra	printlgcont
printlgcode	lea	getbuf+20(a4),a0
		moveq	#0,d4
		tst.l	d0
		bpl	nonglgm
		neg.l	d0
		moveq	#-1,d4
nonglgm		moveq	#0,d3			;counter
115$		moveq	#31,d7			;divice	by ten
		moveq	#0,d2
		moveq	#0,d1
113$		roxl.l	#1,d0
		roxl.l	#1,d1
		cmp.l	#9,d1
		bls	114$
		bset.l	d7,d2
		sub.l	#10,d1
114$		dbf	d7,113$
		move.l	d2,d0			;result
		add.b	#'0',d1
		move.b	d1,-(a0)
		addq	#1,d3
		tst.l	d0
		bne	115$
		tst.l	d4			;test neg
		bpl	116$
		move.b	#'-',-(a0)
		addq.l	#1,d3
116$		move.b	(a0)+,(a2)+
		bne	116$
		move.l	d3,d0
		move.b	#0,(a3)		
		rts
Printlong	equ	1
printlgcont
		endc
		endm
			
printfl		macro
		varin	\1,d0
		bsr	printflcode
		ifnd	Printfl
		bra	printflcont
printflcode	movem.l	d2-d7/a3,-(sp)
		sub.l	#84,sp
		move.l	sp,a3			;bufferbase
		moveq	#20,d1
		move.l	a3,a0
117$		clr.l	(a0)+
		dbf	d1,117$
		moveq	#0,d1			;exponent	
		tst.l	d0
		beq	zeroprint
		moveq	#0,d5			;neg flag
		move.b	d0,d1
		and.l	#$ffffff00,d0
		tst.b	d1
		bpl	118$			;no neg
		moveq	#-1,d5
118$		and.l	#127,d1
		subq.l	#1,d1
		move.l	d0,80(a3)
lophuk		asl.w	82(a3)
		lea	82(a3),a0
		moveq	#8,d2
lophju		roxl.w	-(a0)
		dbf	d2,lophju
		dbf	d1,lophuk
		tst.l	64(a3)
		bne	120$			;divice	
		tst.l	68(a3)
		beq	lessone1		;less than one
120$		lea	32(a3),a0			
		move.l	68(a3),d0
		move.l	64(a3),d1
divten64	moveq	#63,d7
		moveq	#0,d3
		moveq	#0,d4
		moveq	#0,d2
121$		asl.l	#1,d0
		roxl.l	#1,d1
		roxl.l	#1,d2
		asl.l	#1,d3
		roxl.l	#1,d4
		cmp.b	#9,d2
		bls	122$
		or.l	#1,d3
		sub.l	#10,d2
122$		dbf	d7,121$			;divice	until neg
		add.b	#'0',d2
		move.b	d2,-(a0)
		move.l	d3,d0
		move.l	d4,d1
		tst.l	d3
		bne	divten64
		tst.l	d4
		bne	divten64
		tst.l	72(a3)
		bne	lessone1
		tst.l	76(a3)
		bne	lessone1
		tst.l	80(a3)
		beq	formnmbr
lessone1	move.l	d5,-(sp)		;desimal
		lea	32(a3),a0
		moveq	#30,d7
		move.l	72(a3),d2
		move.l	76(a3),d1
		move.l	80(a3),d0
124$		move.l	d0,d4
		move.l	d1,d5
		move.l	d2,d6
		moveq	#0,d3
		bsr	twicedes		;2*
		bsr	twicedes		;4*
		add.l	d4,d0			;+1
		addx.l	d5,d1
		addx.l	d6,d2
		bcc	125$
		addq.l	#1,d3
125$		bsr	twicedes		;10*
		add.b	#"0",d3
		move.b	d3,(a0)+
		dbf	d7,124$
		move.l	(sp)+,d5
		bra	formnmbr		;desimal	
	
zeroprint	move.b	#'0',d0			;print	zero
		move.b	d0,31(a3)
formnmbr	lea	12(a3),a0
		moveq	#20,d1
126$		subq.l	#1,d1			;find first digit
		tst.b	(a0)+
		beq	126$
		sub.l	#1,a0
		lea	getbuf(a4),a1
		tst.l	d5			;test neg
		bpl	127$
		move.b	#'-',(a1)+
127$		cmp.l	#4,d1
		bgt	128$			;exponent form
		tst.l	d1
		bpl	98$
97$		subq.l	#1,d1
		cmp.b	#'0',(a0)+
		beq	97$
		sub.l	#1,a0
		addq.l	#1,d1
		bra	128$			;neg exponent			
98$		addq.l	#2,d1
		moveq	#7,d2			;count 8 digit
129$		tst.b	(a0)
		beq	99$			;end of string
		subq.l	#1,d1
		bne	130$			;desimal point
		move.b	#'.',(a1)+
130$		move.b	(a0)+,(a1)+
		beq	99$
		dbf	d2,129$
99$		move.b	#0,(a1)+
		bra	136$			;print	string		
128$		move.b	(a0)+,(a1)+
		move.b	#'.',(a1)+		;desimal point
		moveq	#6,d2
131$		tst.b	(a0)
		beq	132$			;exponent
		move.b	(a0)+,(a1)+			
		dbf	d2,131$
132$		move.b	#'e',(a1)+
		tst.l	d1
		bpl	133$			;pos
		move.b	#'-',(a1)+		;neg
		neg.l	d1
133$		cmp.b	#19,d1
		bls	134$
		move.b	#'2',(a1)+
		sub.b	#20,d1
		bra	135$
134$		cmp.b	#9,d1
		bls	135$
		move.b	#'1',(a1)+
		sub.b	#10,d1
135$		add.b	#'0',d1
		move.b	d1,(a1)+
		move.b	#0,(a1)+
136$		move.l	a1,d3
		move.l	_stdout(a4),d1
		lea	getbuf(a4),a0
		moveq	#-1,d3
		move.l	a0,d2
138$		addq.l	#1,d3
		tst.b	(a0)+
		bne	138$
		move.l	_DosBase(a4),a6
		jsr	-48(a6)		;_LVOWrite(a6)
137$		add.l	#84,sp
		movem.l	(sp)+,d2-d7/a3
		rts
twicedes	asl.l	#1,d0
		roxl.l	#1,d1
		roxl.l	#1,d2
		roxl.l	#1,d3
		rts		
Printfl		equ	1
printflcont
		endc
		endm

		