;-------- asm800.m -- source for asm800 symbol init. file ----------
;
;	This file is processed with m4 to get asm/asm800.
;


;------ special pseudo-ops ------------------
;	(used in making definitions)

$'pvar:	70 0 71 ; xopPVAR
$'2case:73 0 72 ; xop2CASE
$'prec:	70 0 73 ; xopPREC
	$'2case $'2case $'pvar $'prec

macro:	80 0 94 ; xopMACRO
endm:	81
	$'2case macro endm

;------ expression operators ----------------

:(	31 	0	33 ; xopNOP
:)	32

:<	33 	8001h	70 ; xopREL
:>	34 	8001h	33 ; xopNOP
:[	35	8002h	39 ; xopINDEX
:]	34	8002h	33 ; xopNOP

:high	50	1	29 ; xopHI
:low	50	1	30 ; xopLO
:highw	50	1	31 ; xopHIW
:loww	50	1	32 ; xopLOW
	$'2case high low highw loww

:.high.	50	1	29 ; xopHI
:.low.	50	1	30 ; xopLO
:.highw. 50	1	31 ; xopHIW
:.loww.	50	1	32 ; xopLOW
	$'2case .high. .low. .highw. .loww.

:+	50	2	33 ; xopNOP
:res	50	2	33 ; xopNOP
:.res.	50	2	33 ; xopNOP
:-	50	2	34 ; xopNEG
:\	50	2	35 ; xopNOT
:not	50	2	35 ; xopNOT
:fwd	50	2	36 ; xopFWD
:ext	50	2	37 ; xopEXT
	$'2case not res fwd ext
:.not.	50	2	35 ; xopNOT
:.fwd.	50	2	36 ; xopFWD
:.ext.	50	2	37 ; xopEXT
	$'2case .not. .res. .fwd. .ext.

:**	40	3	49 ; xopEXP

:*	40	4	41 ; xopMLT
:/	40	4	42 ; xopDIV
:mod	40	4	43 ; xopMOD
:shl	40	4	47 ; xopSHL
:shr	40	4	48 ; xopSHR
	$'2case mod shl shr 
:.mod.	40	4	43 ; xopMOD
:.shl.	40	4	47 ; xopSHL
:.shr.	40	4	48 ; xopSHR
	$'2case .mod. .shl. .shr.

:+	40	5	38 ; xopPLUS
:-	40	5	40 ; xopMINUS
:cat	40	5	60 ; xopCAT
:.cat.	40	5	60 ; xopCAT
	$'2case cat .cat.

:and	40	6	44 ; xopAND
:.and.	40	6	44 ; xopAND
:&	40	6	44 ; xopAND

:or	40	7	45 ; xopOR
:.or.	40	7	45 ; xopOR
:^	40	7	45 ; xopOR
:xor	40	7	46 ; xopXOR
:.xor.	40	7	46 ; xopXOR
	$'2case and or xor .and. .or. .xor.

:eq	40	8	50 ; xopEQ
:.eq.	40	8	50 ; xopEQ
:=	40	8	50 ; xopEQ
:ne	40	8	51 ; xopNE
:.ne.	40	8	51 ; xopNE
:<>	40	8	51 ; xopNE
:gt	40	8	52 ; xopGT
:.gt.	40	8	52 ; xopGT
:>	40	8	52 ; xopGT
:lt	40	8	53 ; xopLT
:.lt.	40	8	53 ; xopLT
:<	40	8	53 ; xopLT
:ge	40	8	54 ; xopGE
:.ge.	40	8	54 ; xopGE
:>=	40	8	54 ; xopGE
:le	40	8	55 ; xopLE
:.le.	40	8	55 ; xopLE
:<=	40	8	55 ; xopLE
:ugt	40	8	56 ; xopUGT
:.ugt.	40	8	56 ; xopUGT
:ult	40	8	57 ; xopULT
:.ult.	40	8	57 ; xopULT
:uge	40	8	58 ; xopUGE
:.uge.	40	8	58 ; xopUGE
:ule	40	8	59 ; xopULE
:.ule.	40	8	59 ; xopULE
:seq	40	8	61 ; xopSEQ
:.seq.	40	8	61 ; xopSEQ
:sne	40	8	62 ; xopSNE
:.sne.	40	8	62 ; xopSNE
	$'2case eq ne gt lt ge le ugt ult uge ule seq sne
	$'2case .eq. .ne. .gt. .lt. .ge. .le. .ugt. .ult. .uge. .ule.
	$'2case .seq. .sne.

:!	50	9	63 ; xopLNOT

:&&	40	9	64 ; xopLAND

:||	40	10	65 ; xopLOR

:$'index 24 0 39 ; xopINDEX	;temporary crock
	$'2case $'index

;------ pseudo-ops: relocation  -------------

org:	70	0	74 ; xopORG
align:	70	0	76 ; xopALIGN
	$'2case org align

;------ pseudo-ops: sections -----------------

module:	74	0	79 ; xopMODULE
name:	74	0	79 ; xopMODULE
section: 73	0	77 ; xopSEC
	$'2case module name section 
$'section: 73 0	77 ; xopSEC	;for mac80 mode
	$'2case $'section

code:	macro
	$'section code x
	endm
data:	macro
	$'section data
	endm
bss:	macro
	$'section bss b c w
	endm
abs:	macro
	$'section abs a
	endm
	$'2case code data bss abs

cseg:	macro
	$'section code x
	endm
dseg:	macro
	$'section data
	endm
	$'2case cseg dseg

common:	macro #1
	cond	('#1'[0])<>'/'
	$'section #1, m
	else		;kludge to eliminate slashes
$''c1 	set	$'macbeg
$''c2 	set	$'macend
$'macbeg set	'/'
$'macend set	'/'
	common	#1
$'macbeg set	$''c1
$'macend set	$''c2
	endc
	endm
	$'2case common

;------ pseudo-ops: label definition --------

equ:	70	0	86 ; xopEQU
defl:	70	0	85 ; xopSET
.common:70	0	87 ; xopCOMM
;set:	70	0	85 ; xopSET	;overloaded: actually done in opcode table
	$'2case equ defl .common ;set

global:	73	0	88 ; xopGLOBL
public:	73	0	88 ; xopGLOBL
entry: 	73	0	88 ; xopGLOBL
external: 73	0	89 ; xopEXTRN
extrn:	73	0	89 ; xopEXTRN
ext:	73	0	89 ; xopEXTRN
	$'2case global public entry external extrn ext

;------ pseudo-ops: conditional assembly

cond:	70	0	90 ; xopCOND
cond:	84
if:	70	0	90 ; xopCOND
if:	84
else:	70	0	91 ; xopELSE
else:	85
endc:	70	0	92 ; xopENDC
endc:	86
endif:	70	0	92 ; xopENDC
endif:	86
	$'2case if endif cond else endc

;------ pseudo-ops: data definition ---------

.data:	70	0	1 ; xopDD
.byte:	70	0	97 ; xopDB
.word:	70	0	99 ; xopDW
.long:	70	0	100 ; xopDL
.quad:	70	0	101 ; xopDQ
.quint:	70	0	102 ; xopD5
.ascii:	70	0	97 ; xopDB
.ascic:	70	0	104 ; xopDC
.ascil:	70	0	103 ; xopDT
.asciz:	70	0	105 ; xopDZ
	$'2case .data .byte .word .long .quad .quint
	$'2case .ascii .ascic .ascil .asciz

dd:	70	0	1 ; xopDD
db:	70	0	97 ; xopDB
dw:	70	0	99 ; xopDW
dl:	70	0	100 ; xopDL
dq:	70	0	101 ; xopDQ
d5:	70	0	102 ; xopD5
dt:	70	0	103 ; xopDT
dc:	70	0	104 ; xopDC
dz:	70	0	105 ; xopDZ
	$'2case dd db dw dl dq d5 dt dc dz

defd:	70	0	1 ; xopDD
defm:	70	0	97 ; xopDB
defb:	70	0	98 ; xopDBB
defw:	70	0	99 ; xopDW
deflw:	70	0	100 ; xopDL
defqw:	70	0	101 ; xopDQ
def5w:	70	0	102 ; xopD5
	$'2case defd defm defb defw deflw defqw def5w

defc:	70	0	104 ; xopDC
deft:	70	0	103 ; xopDT
defz:	70	0	105 ; xopDZ
	$'2case deft defc defz

;------ pseudo-ops: space allocation -------

.block:	70	0	75 ; xopBLOCK
ds:	70	0	75 ; xopBLOCK
defs:	70	0	75 ; xopBLOCK
	$'2case .block ds defs

;------ pseudo-ops: assembler control -------

end:	70	0	106 ; xopEND
title:	76	0	80 ; xopTITLE
subttl:	76	0	81 ; xopSUBTTL
error:	70	0	82 ; xopERROR
page:	70	0	83 ; xopPAGE
ocomment: 70	0	84 ; xopOCOMM
	$'2case end title subttl error page ocomment 
include:76	0	93 ; xopINCLUDE
maclib:	76	0	93 ; xopINCLUDE
$''incl: 76	0	93 ; xopINCLUDE	;for use in *I in z80 mode
	$'2case include maclib $''incl

.radix	macro	#n
 $'base: set	 #n
	endm
	$'2case	.radix

$'lmac	macro	#var,#op		;list control macro
	cond	('#op'='ON')^('#op'='on')
	   #var:   set  #var^1
 	else
	cond	('#op'='OFF')^('#op'='off')
	   #var:   set	#var&-2
 	else
	cond	('#op'='PUSH')^('#op'='push')
	   #var:   set	#var+#var+(#var&1)
 	else
	cond	('#op'='POP')^('#op'='pop')
	   #var:   set	#var/2
	else
	   #var:   set  #var^1	;default: on
	endc
	endc
	endc
	endc
	endm
	$'2case	$'lmac

list	macro	#1
	$'lmac	$'list,#1
	endm
wlist	macro	#1
	$'lmac	$'wlist,#1
	endm
clist	macro	#1
	$'lmac	$'clist,#1
	endm
mlist	macro	#1
	$'lmac	$'mlist,#1
	endm
xlist	macro	#1
	$'lmac	$'xlist,#1
	endm
	$'2case	list wlist clist mlist xlist

.list:	macro
	$'list: 	set	$'list^1
	endm
.xlist:	macro
	$'list: 	set	$'list&(-2)
	endm
.lfcond:	macro
	$'clist:	set	$'clist^1
	endm
.sfcond:	macro
	$'clist:	set	$'clist&(-2)
	endm
.tfcond:	macro
	$'clist:	set	($'clist)xor(1)
	endm
	$'2case	.list .xlist .lfcond .sfcond .tfcond

.lall:	macro
	$'mlist:	set	$'mlist^1
	$'xlist:	set	$'xlist^1
	endm
.sall:	macro
	$'mlist:	set	$'mlist&(-2)
	$'xlist:	set	$'xlist&(-2)
	endm
.xall:	macro
	$'mlist:	set	$'mlist&(-2)
	$'xlist:	set	$'xlist^1
	endm
	$'2case .lall .sall .xall

;------ RIO assembler directive -------------

$''star	macro	#1,#2,#3,#4,#5,#6,#7,#8,#9
$''op	set	'#1'[0]^20h
	cond	$''op='e'
	  page
	else
	cond	$''op='h'
	  subttl "#2 #3 #4 #5 #6 #7 #8 #9"
	  page
	else
	cond	$''op='l'
	  list	#2
	else
	cond	$''op='m'
	  mlist	#2
	else
	cond	$''op='c'
	  clist	#2
	else
	cond	$''op='w'
	  wlist	#2
	else
	cond	$''op='i'
	  $''incl "#2"
	endc
	endc
	endc
	endc
	endc
	endc
	endc
	endm

:*	macro	#1,#2,#3,#4,#5,#6,#7,#8,#9
$''star1	set	$'blanksep
$'blanksep	set	1	;in case not RIO
	$''star	#1 #2 #3 #4 #5 #6 #7 #8 #9
$'blanksep	set	$''star1
	endm

;------ pseudo-vars -------------------------

$:		$'pvar	0	112 ; xopLOC
$'pass:		$'pvar	0	114 ; xopPASS
$ym:		$'pvar	2 	0
	$'2case $'pass $ym

$'list:		$'pvar	3 	110 ; xopPVLST
$'wlist:	$'pvar	4 	110 ; xopPVLST
$'clist:	$'pvar	5 	110 ; xopPVLST
$'mlist:	$'pvar	6 	110 ; xopPVLST
$'xlist:	$'pvar	7 	110 ; xopPVLST
	$'2case $'list $'wlist $'clist $'mlist $'xlist

$'dotsep:	$'pvar	11 	109 ; xopPVFLG
$'ucase:	$'pvar	9 	109 ; xopPVFLG
$'blanksep:	$'pvar	10 	109 ; xopPVFLG
$'x'		$'pvar	16 	109 ; xopPVFLG
$'stresc:	$'pvar	8 	108 ; xopPVNUM
$'base:		$'pvar	15 	108 ; xopPVNUM
$'zbase:	$'pvar	13 	108 ; xopPVNUM
$'sbase:	$'pvar	14 	108 ; xopPVNUM
$'symlen:	$'pvar	12 	108 ; xopPVNUM
	$'2case $'dotsep $'ucase $'blanksep $'stresc 
	$'2case $'base $'zbase $'sbase $'symlen

$'s1len:	$'pvar	22 	108 ; xopPVNUM
$'s1ord:	$'pvar	23 	108 ; xopPVNUM
$'s2len:	$'pvar	24 	108 ; xopPVNUM
$'s2ord:	$'pvar	25 	108 ; xopPVNUM
$'adrlen:	$'pvar	26  113 ; xopADSCR
$'adrord:	$'pvar	27  113 ; xopADSCR
$'align:	$'pvar	0	 111 ; xopVALIGN
$'secpg:	$'pvar	28 	 108 ; xopPVNUM
	$'2case $'s1len $'s1ord $'s2len $'s2ord 
	$'2case $'adrlen $'adrord $'align $'secpg

$'macbeg:	$'pvar	20  108 ; xopPVNUM
$'macend:	$'pvar	21  108 ; xopPVNUM
$'macquote:	$'pvar	17  108 ; xopPVNUM
$'maceval:	$'pvar	18  108 ; xopPVNUM
$'maccat:	$'pvar	19  108 ; xopPVNUM
	$'2case $'macbeg $'macend $'macquote $'maceval $'maccat

$'z80:		$'pvar	29  109 ; xopPVFLG	;set according to -r flag

;------ compatibility macros ----------------

.z800		macro		;normal mode

$'symlen	set	127
$'ucase		set	0
$'dotsep	set	0
$'blanksep	set	0
$'x'		set	0
$'stresc	set	05Cx
$'base		set	0Ax
$'zbase		set	0Ax
$'sbase		set	10x

$'s1len		set	10d
$'s1ord		set	'M'
$'s2len		set	10d
$'s2ord		set	'M'
$'adrlen	set	2
$'adrord	set	'L'

$'macbeg	set	'{'
$'macend	set	'}'
$'macquote	set	'!'
$'maccat	set	 0
$'maceval	set	'%'
		endm

.z80		macro		;RIO compat. mode

$'symlen	set	6
$'ucase		set	0
$'dotsep	set	1
$'blanksep	set	1
$'x'		set	0
$'stresc	set	0
$'base		set	0Ax
$'zbase		set	0Ax
$'sbase		set	0

$'s1len		set	2
$'s1ord		set	'L'
$'s2len		set	2
$'s2ord		set	'L'
$'adrlen	set	2
$'adrord	set	'L'

$'macbeg	set	"'"
$'macend	set	"'"
$'macquote	set	 0
$'maccat	set	 0
$'maceval	set	 0
		endm

.mac80		macro		;Macro 80 compat. mode

$'symlen	set	6
$'ucase		set	1
$'dotsep	set	0
$'blanksep	set	0
$'x'		set	1
$'stresc	set	0
$'base		set	0Ax
$'zbase		set	0Ax
$'sbase		set	0

$'s1len		set	2
$'s1ord		set	'M'
$'s2len		set	2
$'s2ord		set	'M'
$'adrlen	set	2
$'adrord	set	'L'

$'macbeg	set	"<"
$'macend	set	">"
$'macquote	set	"!"
$'maccat	set	"&"
$'maceval	set	"%"
		endm

		$'2case	.z800 .z80 .mac80

;------ initialization macro ----------------

$'init	macro
	.Z800
	endm

;------ Assertion macro for testing --------

$''assert macro #x, #m
	if !(#x)
	error	"#m"
	endif
	endm

;=========== end of initialization file =======
