; File name:	URAn_DOS.S	Revised:	1991.05.07
; Creator:	U.R.Andersson	Created:	1991.01.02
; (c)1991 by:	U.R.Andersson	All rights reserved
; Released as:	FREEWARE	(NB: commercial sales forbidden!)
;
;
;	GEMDOS DEFINITIONS
;
Pterm0		=	$100000
Cconin		=	$100001
Cconout		=	$110002
Cauxin		=	$100003
Cauxout		=	$110004
Cprnout		=	$110005
Crawio		=	$110006
Crawcin		=	$100007
Cnecin		=	$100008
Cconws		=	$111009
Cconrs		=	$11100A
Cconis		=	$10000B
Dsetdrv		=	$11000E
Cconos		=	$100010
Cprnos		=	$100011
Cauxis		=	$100012
Cauxos		=	$100013
Dgetdrv		=	$100019
Fsetdta		=	$11101A
Super		=	$111020
Tgetdate	=	$10002A
Tsetdate	=	$11002B
Tgettime	=	$10002C
Tsettime	=	$11002D
Fgetdta		=	$10002F
Sversion	=	$100030
Ptermres	=	$120131
Dfree		=	$121036
Dcreate		=	$111039
Ddelete		=	$11103A
Dsetpath	=	$11103B
Fcreate		=	$12103C
Fopen		=	$12103D
Fclose		=	$11003E
Fread		=	$13423F
Fwrite		=	$134240
Fdelete		=	$111041
Fseek		=	$130142
Fattrib		=	$131043
Fdup		=	$110045
Fforce		=	$120046
Dgetpath	=	$121047
Malloc		=	$110148
Mfree		=	$111049
Mshrink		=	$13244A
Pexec		=	$14E04B
Pterm		=	$11004C
Fsfirst		=	$12104E
Fsnext		=	$10004F
Frename		=	$136056
Fdatime		=	$131057
;
;
;	BIOS DEFINITIONS
;
Getmpb		=	$D11000
Bconstat	=	$D10001
Bconin		=	$D10002
Bconout		=	$D20003
Rwabs		=	$D52004
Setexc		=	$D22005
Tickal		=	$D00006
Getbpb		=	$D10007
Bcostat		=	$D10008
Mediach		=	$D10009
Drvmap		=	$D0000A
Kbshift		=	$D1000B
;
;
;	XBIOS DEFINITIONS
;
Initmous	=	$E36000
Ssbrk		=	$E20001
Physbase	=	$E00002
Logbase		=	$E00003
Getrez		=	$E00004
Setscreen	=	$E33005
Setpallete	=	$E11006
Setcolor	=	$E20007
Floprd		=	$E71208
Flopwr		=	$E71209
Flopfmt		=	$E71F0A
;; CLR_D0		=	$E0000B
Midiws		=	$E2200C
Mfpint		=	$E2200D
Iorec		=	$E1000E
Rsconf		=	$E6000F
Keytbl		=	$E37010
Random		=	$E00011
Protobt		=	$E41212
Flopver		=	$E71213
Scrdmp		=	$E00014
Cursconf	=	$E20015
Settime		=	$E10116
Gettime		=	$E00017
Bioskeys	=	$E00018
Ikbdws		=	$E22019
Jdisint		=	$E1001A
Jenabint	=	$E1001B
Giaccess	=	$E2001C
Offgibit	=	$E1001D
Ongibit		=	$E1001E
Xbtimer		=	$E4801F
Dosound		=	$E11020
Setprt		=	$E10021
Kbdvbase	=	$E00022
Kbrate		=	$E20023
Prtblk		=	$E11024
Vsync		=	$E00025
Supexec		=	$E11026
Puntaes		=	$E00027
Floprate	=	$E20029     ;STE & Rainbow TOS
Blitmode	=	$E10040     ;all late TOS
Monopack	=	$E1004F     ;MONOPACK patch (actually, full code = $4D4F)
;
;
;	Pointer indirection flag
;
_IND	=	$40000000
;
;
;	Boot sector offsets
;
bs_codebra	=  0	;$00  w $60xx
bs_filler	=  2	;$02 6b
bs_serial	=  8	;$08 3b
bs_sectbytes	= 11	;$0b iw
bs_clust_sects	= 13	;$0d  b
bs_boot_sects	= 14	;$0e iw
bs_disk_FATs	= 16	;$10  b
bs_root_files	= 17	;$11 iw
bs_disk_sects	= 19	;$13 iw
bs_media	= 21	;$15  b
bs_FAT_sects	= 22	;$16 iw
bs_track_sects	= 24	;$18 iw
bs_disk_sides	= 26	;$1a iw
bs_hide_sects	= 28	;$1c iw
;	next follows the part used only by executable boots
bs_execflg	= 30	;$1e   w
bs_ldmode	= 32	;$20   w
bs_ssect	= 34	;$22   w
bs_sectcnt	= 36	;$24   w
bs_ldaddr	= 38	;$26   L
bs_fatbuf	= 42	;$2a   L
bs_fname	= 46	;$2e 11b
bs_fname_end	= 57	;$39   b
bs_bootprog	= 58	;$3a ...
;
;
;	BPB offsets
;
		rsreset
bpb_sect_bytes	rs.w	1	;typ:  512
bpb_clust_sects	rs.w	1	;typ:    2
bpb_clust_bytes	rs.w	1	;typ: 1024
bpb_root_sects	rs.w	1	;typ:    7
bpb_FAT_sects	rs.w	1	;typ:    5
bpb_FAT2_start	rs.w	1	;typ:    6
bpb_data_start	rs.w	1	;typ:   18 = 2*5 + 7 + 1
bpb_data_clusts	rs.w	1	;typ:  711 = 720 - 18/2
bpb_flag	rs.w	1	;b0==16bit_FAT/12bit_FAT typ: 0
bpb_size	=	__RS
;NB: data_start = FAT_sects*2 + root_sects + 1  rounded up for clust_sects alignment
;NB: data_clusts= Total_clusts - data_start/clust_sect
;
;
;	Directory offsets
;
		rsreset
dir_fname	rs.b	8	;first char $00==unused $E5==erased
dir_fext	rs.b	3
dir_fattr	rs.b	1
dir_reserved	rs.b	10
dir_ftime	rs.w	1	;iw
dir_fdate	rs.w	1	;iw
dir_fcluster	rs.w	1	;iw
dir_fsize	rs.l	1	;il
dir_size	=	__RS
;
;
;	DTA offsets
;
		rsreset
dta_reserved	rs.b	21
dta_fattr	rs.b	1
dta_ftime	rs.w	1
dta_fdate	rs.w	1
dta_fsize	rs.l	1
dta_fname	rs.b	14
dta_size	=	__RS
;
;
;	Program file header offsets
;
		rsreset
ph_codebra	rs.w	1	;always $601A
ph_textlen	rs.l	1
ph_datalen	rs.l	1
ph_bss_len	rs.l	1
ph_symblen	rs.l	1
ph_res1		rs.l	1
ph_res2		rs.l	1
ph_res3		rs.w	1
ph_textbeg	=	__RS
ph_size		=	__RS
;
;
;	Basepage offsets
;
	rsreset
bp_selfbeg_p	rs.l	1
bp_selfend_p	rs.l	1
bp_textbeg_p	rs.l	1
bp_textlen	rs.l	1
bp_databeg_p	rs.l	1
bp_datalen	rs.l	1
bp_bss_beg_p	rs.l	1
bp_bss_len	rs.l	1
bp_dta_p	rs.l	1
bp_parent_p	rs.l	1
bp_reserved	rs.l	1
bp_environ_p	rs.l	1
bp_undef	rs.l	20
bp_arglen	rs.b	1
bp_argstring	rs.b	127
;
;
;	MACRO DEFINITIONS
;
gemdos	MACRO	op,v2,v3,v4,v5
	xbios	\1,\2,\3,\4,\5
	ENDM
;
sub_gemdos	MACRO	op,v2,v3,v4,v5
	zz_prep_trap	\1,\2,\3,\4,\5
	bsr	gemdos_sub
	IFNE	zzDOSAS>8
	add	#zzDOSAS,sp
	ELSEIF
	addq	#zzDOSAS,sp
	ENDC
	ENDM
;
bios	MACRO	op,v2,v3,v4,v5,v6
	xbios	\1,\2,\3,\4,\5,\6
	ENDM
;
sub_bios	MACRO	op,v2,v3,v4,v5,v6
	zz_prep_trap	\1,\2,\3,\4,\5,\6
	bsr	bios_sub
	IFNE	zzDOSAS>8
	add	#zzDOSAS,sp
	ELSEIF
	addq	#zzDOSAS,sp
	ENDC
	ENDM
;
xbios	MACRO	op,v2,v3,v4,v5,v6,v7,v8,v9,v10
	zz_prep_trap	\1,\2,\3,\4,\5,\6,\7,\8,\9,\a
	trap	#zzDOSTR
	IFNE	zzDOSAS>8
	add	#zzDOSAS,sp
	ELSEIF
	addq	#zzDOSAS,sp
	ENDC
	ENDM
;
sub_xbios	MACRO	op,v2,v3,v4,v5,v6,v7,v8,v9,v10
	zz_prep_trap	\1,\2,\3,\4,\5,\6,\7,\8,\9,\a
	bsr	xbios_sub
	IFNE	zzDOSAS>8
	add	#zzDOSAS,sp
	ELSEIF
	addq	#zzDOSAS,sp
	ENDC
	ENDM
;
zz_prep_trap	MACRO	op,v2,v3,v4,v5,v6,v7,v8,v9,v10
zzDOSIF	set	(\1)&_IND
zzDOSTR	set	((\1)>>20)&255
zzDOSAC	set	((\1)>>16)&15
zzDOSPF	set	((\1)>>12)&15
zzDOSLF	set	((\1)>>08)&15
zzDOSOP	set	(\1)&255
	IFNE	zzDOSOP=$4F
	IFNE	zzDOSTR=$0E
zzDOSOP	set	$4D4F
	ENDC
	ENDC
zzDOSAS	set	2
	IFNE	zzDOSAC>0
	IFNE	zzDOSAC>1
	IFNE	zzDOSAC>2
	IFNE	zzDOSAC>3
	IFNE	zzDOSAC>4
	IFNE	zzDOSAC>5
	IFNE	zzDOSAC>6
	IFNE	zzDOSAC>7
	IFNE	zzDOSAC>8
	IFNE	zzDOSLF=15
zzDOSLF	set	130
	ENDC
	DOSPUSH	8,\a
	ENDC
	DOSPUSH	7,\9
	ENDC
	DOSPUSH	6,\8
	ENDC
	DOSPUSH	5,\7
	ENDC
	DOSPUSH	4,\6
	ENDC
	DOSPUSH	3,\5
	ENDC
	DOSPUSH	2,\4
	ENDC
	DOSPUSH	1,\3
	ENDC
	DOSPUSH	0,\2
	ENDC
	MOVE	#zzDOSOP,-(sp)
	ENDM
;
;This macro handles all argument checking for bios, xbios & gemdos functions
;special argument cases are:
;no argument = FAIL error
;'()'	= Assumes argument is on stack already
;'!'	= Places 0 on stack using "clr"
;'?'	= Places -1 on stack
DOSPUSH	MACRO	v1,v2
zzDOSAS	set	zzDOSAS+2
	IFNE	(1<<\1)&(zzDOSPF!zzDOSLF)
zzDOSAS	set	zzDOSAS+2
	ENDC
	IFC	'()','\2'
	MEXIT
	ENDC
	IFC	'','\2'
	FAIL	Missing operand in system call
	MEXIT
	ENDC
	IFNE	(1<<\1)&zzDOSPF
	IFC	'!','\2'
	clr.l	-(sp)
	MEXIT
	ENDC
	IFC	'?','\2'
	move.l	#-1,-(sp)
	MEXIT
	ENDC
	IFEQ	zzDOSIF
	pea	\2
	MEXIT
	ENDC
	move.l	\2,-(SP)
	MEXIT
	ENDC
	IFNE	(1<<\1)&zzDOSLF
	IFC	'!','\2'
	clr.l	-(sp)
	MEXIT
	ENDC
	IFC	'?','\2'
	move.l	#-1,-(sp)
	MEXIT
	ENDC
	move.l	\2,-(SP)
	MEXIT
	ENDC
	IFC	'!','\2'
	clr	-(sp)
	MEXIT
	ENDC
	IFC	'?','\2'
	move	#-1,-(sp)
	MEXIT
	ENDC
	move	\2,-(SP)
	ENDM
;
zzDOSAS	set	0
;
; End of file:	URAn_DOS.S
