
Midas assembler=part 1

dsm|			|Dummy symbols
dsm+nds+nds|	dsp,	|Argument pointers
dsp+ndp+ndp+lpa-1|	pd1,	|Public pushdown list
pd1+1|		rqs,	|Repeat character storage
rqs++nrc+lpb-1|	pd2,	|Second public pushdown list
pd2+1|		rce,	|Read character endcheck
rce+1|		tvn,	|Transfer vector origins
tvn+ntv|		cor,	|Constant origins
cor+ncn+ncn+ncn|	vor,	|Variables origins
vor+nvo+nvo|	org,	|Block origin
org+1|		loc,	|Location counter and punch buffer
loc+113|		flx,	|Input character storage
flx+nfw|		ftp,	|Title punch constants
ftp+200|		crl,	|Constant relocation data
crl+ncr|		dsv,	|Argument character storage
dsv+nac+ncc-1|	con,	|Constant list
con+1|		mai,	|Macro storage and index
enm|		low,	|Symbol table end and index

20|

|Start over entry

	tac
	trn so1
	clc
sov,	xx

so1,	ldx (-4

so2,	cyl
	llr one
	trn .+2
	llr mze
	slx tit
	tix so2
	cyl
	com
	trn .+2
	tsx res
	lda inp
	trn .+3
	lda rlp
	sto inp
	llr npa
	tplr np2
	lda pss
	tze ps1
	tra ps4

|Load symbol table

ls,	tac
	llr (4000
	ana
	tze .+2
	tsx res
	tsx rbk
	tsx rbk

ls1,	tsx gwd
	slr sym l
	sto tsm l
	tsx gwd
	slr sym r
	sto tsm r
	tze ls2
	tsx gwd
	sto tvl
	lda tsm l
	trn ls3
	cyl
	trn ls3
	lda tvl		|macro
	add mai
	add (-mai
	sto tvl
ls3,	tsx qq5
	tra ls1

ls2,	tsx rbk

ls4,	tsx gwd
	alr
	ado mai
	axr
	slx 0
	tra ls4

gwd,	sxa gwx
gw2,	ldx t1
	tix gw1
	tsx rbk
	tra gw2

gw1,	sxa t1
	ado gwg
gwg,	lda
	llr (-opr
	anl
gwx,	tra .

rbk,	sxa rbx
	init rbs, loc
	sxa gwg
	r3c
	trn ps3
	r3c+cyl-opr
	alr+xro-opr
	add mon
	sto t1

rbl,	ado rbs
	r3c
rbs,	sto
	lad
	alr
	tix rbl
	r3c+lad-opr
rbx,	tze .
	clc
	alr+hlt-opr
	tra rbk+1

|Restore

res,	sxa rey
	clc
	sto low
	load mai, sto mai
	ldx (dsm-ist-1

re3,	stz sym l
	load tsm l, trn
	llr (-opr
	xac
	add (-nis-nis+1
	tze re4
	trn re2
	lax ist-2
	sto tsm l
	ana
	sto sym l
re4,	tix .+1
re2,	lax ist
	sto tsm r
	ana
	sto sym r
	lax ist+1
	sto tvl
	sxa t0
	tsx vsm
	ldx t0
	tix .+1
	tix re3
rey,	tra .

|Set and reset terminators and indicators

sts,	llx 0
	slr ct
	llx 1
	slr tt
	load bt, tsx ilf
	slr qt
	trx 2

rst,	ldx (rr
	sxa rsx
	load ct, tra c
	load tt, tra tab
	load bt, tra b
	load qt, tra q
	load lt, tra lp
	load rt, tsx ilf
	load bs, tra rsw
	tra rsw+2

rsw,	ldx (rr
	sxa rsx
	stz wrd
	stz amn
	stz asa l
	stz asa r
	stz rlc
	clc
	sto nsm
	move one, def
	move mon, syl
	load psn, lac
	tra rsp+2

rsp,	ldx (rr
	sxa rsx
	stz fct
	stz fcr
	clc
	sto fci
	load fcn, opr
	tra rss+2

rss,	ldx (rr
	sxa rsx
	stz num
	stz dnm
	stz nmr
	stz sym l
	stz sym r
	stz fsm
	stz chc
	move mon, let
	slr liu
rsx,	tra .

|Read and write characters for macro definitions

rr,	tsx rch
cfr,	lda lch
	tsx sqz
	cyl
	add cas
	axo
	lax dtb
	sto cfn
	trn cf1
	add (slr
	trn ich
	add (slr
	trn cf2
	lda mdi		|letters and numbers
	tze cf0
	tsx wch-1
	tsx csk
cf0,	lda cfn
	tra ln

cf2,	lda mdi		|ignored characters
	tze rr
	tsx wch-1
	tsx csk
	tra rr

cf1,	lda mdi		|delimiter
	tze cfx
	lda chc
	tze cfm
	tsx es
	tze cfg
	lax low-1
	llr (opr
	ana
	add (-add
	tze .+2
	tra cfg
	lda num
	add (-tra-dfn
	tze cfd
	add (dfn-ter
	tze cft
	add (ter-ir
	tze cf3
	add (ir-ipe
	tze cf4
cfg,	ldx dsk
	tra cfa

cfb,	tix .+1		|search for dummy symbol
	llr sym l
	lax dsm l
	lpd
	tze cff
cfa,	tix cfb
cf9,	xx		|tra cfm or tsx ilf

cff,	llr sym r	|identify dummy symbol
	lax dsm r
	lpd
	tze .+2
	tra cfa
	load cf9, tra cfm
	xac
	shr
	add (2
cf5,	sto t
	tsx csu
	lda (444444
	tsx wch
	tsx csk
	lda t
	tsx str		|rite dsn
	tsx wch
	tsx csk

cfm,	lda mdi
	add mon
	tze .+2
	tra csx-3
	lda lch
	add (-444004
	tze csc
	add cas
	add (444004-040405	|1
	tze .+3
	tsx wch-1
	tsx csk
	ldx (tra rsw

csx,	sxa csy
	move wc1, wf1	|save indices
	lxr
	lax
	sto wf2
	move wcc, wf3
csy,	tra .

csu,	sxa csv
	move wf1, wc1	|restore indices
	lxr
	lda wf2
	stx
	move wf3, wcc
csv,	tra .

csc,	move lch, t	|upper case
	tsx csx
	tsx rch
	add (-040404	|1
	tze csd
csl,	lda t
	tsx wch
	tsx csk
	tsx csx
	tsx rsw+1
	tra cfr

csd,	tsx rch
	add (-444404
	tze rsw
	tra csl

cfd,	ado mdi		|define
	tra cfm

cft,	lda mdi		|terminate
	add mon
	sto mdi
	tze te5
	tra cfm

csk,	sxa csm
	add low
	add (trn+low-2
	trn csm
	tsx gc
	ldx wc1
	sxa gkg
	xcc
	lad
	axr+com-opr
	add gcs
	sto gks
	tra gke

gkg,	lax
gks,	stx
gke,	tix gkg
	lcc
	add mai
	alr
	add wf1
	sto wf1
	lac
	add wc1
	sto wc1
csm,	tra .

cf3,	add mon
	load cf9, tsx ilf
cf4,	com
	move2 sym, api
	tra cf5

cfx,	clc
cfn,	xx

|Garbage collector

gc,	sxa gcx
	init gcs, mai
	sxa gcg

gc1,	ldx gcg
	xcc+lro-opr
	slr t0
	slr t1
	add mai
	trn gcd
	xcc
	add gcs
	add (-stx
	sto t3
	lax 3		|word count
	sto t2
	ldx low
	tra gcb

gcl,	aux (2
	lax low-1	|search symbol table
	lcd
	tze gca
gcb,	tix gcl

	ldx sbp
	aux (-rce
	llr (17777

gcq,	lax rce		|search pushdown list
	anc
	add t1
	add one
	trn gc3
gck,	tix gcq

	lda rc8
	anc
	add t1
	trn gc4
gc5,	lda t2
	add gcg
	sto gcg
	ldx t0
	tix gc1
	lda t2		|set up copy
	com
	axr+com-opr
	add gcs
	sto gcs
	tra gce

gc3,	add t2
	trn gck
	lda t3		|alter pushdown entry
	adx rce
	stx rce
	stz t0
	tra gck

gc4,	add t2
	trn gc5
	lda t3
	add rc8
	sto rc8
	stz t0
	tra gc5

gcg,	lax		|move macro
gcs,	stx
gce,	tix gcg
	tra gc1

gca,	lax low-3	|check symtab entry
	trn gcb
	cyl
	trn gcb
	stz t0
	lda t3
	adx low-1
	stx low-1
	tra gcb

gcd,	ldx gcs		|end of macros
	xcc
	add mai
	trn sce
	llr mai
	sxa mai
gcx,	tra .

|Dispatch table

i=llr	trr=add

dtb,	i	i	|blank tape
	i	i	|nu
	17	17	|e
	8	i	|8
	i	i	|nu
bt,	xx	i	||
	13	13	|a
	3	i	|3
	tra pls	tra pls	|space
qt,	xx	tra qt	|=:
	35	tra us	|s
four,	4	i	|4
	23	tra ui	|i
	tra pls	tra rr	|+/
	37	tra uu	|u
	2	i	|2
	trr	trr	|c. s.
	tra rl	rt,xx	|.)
	16	16	|d
	5	i	|5
	34	34	|r
	1	tra rr	|1
	24	24	|j
svn,	7	i	|7
thirty,	30	30	|n
ct,	xx	lt,xx	|,(
twenty,	20	20	|f
	6	tra rr	|6
	15	15	|c
	tra min	tra min	|-_
	25	25	|k
	i	i	|nu

	36	36	|t
	i	i	|nu
	44	44	|z
	i	i	|backsp
	26	26	|l
tt,	xx	tra tt	|tab
	41	41	|w
	i	i	|nu
	22	22	|h
crt,	tra tt	tra crt	|car ret
	43	43	|y
	i	i	|nu
	32	32	|p
	i	i	|nu
	33	33	|q
	i	i	|nu
	31	31	|o
	trr	trr	|stop
	14	14	|b
	i	i	|nu
twone,	21	21	|g
	i	i	|nu
	9	tra rr	|
	i	i	|nu
	27	27	|m
	tra rr	tra rr	|upper
	42	tra ux	|x
	i	i	|nu
forty,	40	40	|v
	tra rr	tra rr	|lc
	0	i	|0
	tsx se	tsx se	|argument

|Storage word termination characters (tab and carr ret)

tab,	lda syl
	add one
	add chc
	tze rsw
	tsx evl
	trn ust

tb3,	move mon, pci

tb4,	ado ts
	sto tbc
	lro
	lda pss
	tze tb5
	lda wrd
ts,	xx		|sto loc+
	tsx rck
	trn irw
tb5,	lda rli
	tze tb7
	lda rlm
	anl
	cyr
	cyr
	sto rlm
	trn srw
	lac
	add rlw
	sto rlw

tbn,	ado aml
	ado loc
	llr (77
	ana
	tze t9
	tra bs

tb7,	lac
	trn rci
	tra tbn

pub,	sxa bs		|dump punch buffer
t9,	move rli, syl
	move loc, wrd
	tra pun

tbc,	0

srw,	lac
	add rlw
srt,	xx		|sto loc
	stz rlw
	ado ts
	sto srt
	tra tbn

|Relocation check subroutine.

rck,	sxa rcy
	ldx rlc
	tix .+1
	tix rci
rcr,	ldx rlc
	llx rct
	cla
rcy,	tra .

rci,	clc+lro-opr
	stz rlc
	tra rcy

mze,	-0
rct,	0
	525252

|Location assignment termination character (|).

b1,	move rli, syl
	lda pss
	llr (trn
	tze b3
	tra usb

b,	lda syl
	add one
	add chc
	tze itc
	tsx evl
	lda wrd
	com
	amz
	llr (-17777
	orc
	sto wrd
	stz asm r
	lda nsm
	trn ba2
	move2 asa, asm
	move amn, aml

ba2,	lda def
	tze b1

ba1,	tsx rck
	cry
	trn irb
	move rlc, syl

b5,	llr loc
	lcc
	add wrd
	tze .+2
	tra pun
	lda rli
	com
	add syl
	tze bs

|Punch binary block.

pun,	lda pss
	tze bnp
	lda pch
	tze bnp
	lda tbc
	com
	add rli
	add (sto loc
	tze bnp
	llr loc
	lcc
	sto loc
	lda rli
	tze pu1
	ldx srt
	lda rlw
	stx 0

pu1,	p6s
	lda rim
	llr (lda loc+1
	trn .+2
	load pu2, lda org
	slr pu3
	ado loc
	p6b+com-opr
	p6s+alr-opr
	stz t1

pur,	lda rim
	com
	trn pu2
	lda org
	punch
	ado org

pu2,	xx		|lda loc+
	punch
pu3,	xx
	add t1
	sto t1
	ado pu2
	sto pu3
	com
	add (lda-sto+trn
	add tbc
	trn pur
	lda rim
	trn puc
	lda t1
	com
	punch
puc,	p6s
	p6s

|Form origin for next block

bnp,	lda wrd
	llr (417777
	anl

b3,	slr loc
	stz rlw
	lda syl
	sto rli
	tze .+4
	add (slr-1
	lad
	alo
	slr org
	lda rli
	add (sto loc
	sto ts
	sto srt
	sto tbc
	load rlm, opr
bs,	xx

|Multiply subroutine

mpy,	sxa mpx
	ldx twone
	sto t1
	cla

mp1,	ill
	trn mpa
	ill
mp2,	tix mp1
	cyr
mpx,	tra .

mpa,	ill
	add t1
	tra mp2

|Syllable separation characters

uu,	lda (ora-ana
ui,	add (ana-lpd
us,	add (lpd-tsx-mpy
ux,	add (tsx mpy
	sto t
	lda chc
	tze ilf
	tsx tsy
	lda t
	sto fcn
	move twenty, fci
	add (-add
	trn rss
	stz fci
	tra rss

pls,	lda (lac-lcc
min,	add (lcc
	sto t
	llr chc
	ial
	tze pm1
	tsx evl
	move t, psn
	tra rsp

pm1,	slr psn
	tra rr

|Evaluate product

evl,	sxa evx
	move psn, psa
	slr psb
	tsx tsy
psn,	xx		|product sign: lac or lcc
	add wrd
	sto wrd
psa,	xx
	add amn
	sto amn
	llr fcr
psb,	xx
	add rlc
	sto rlc
	llr pss
	lcc
	add def
	add one
evx,	tra .

|Terminate syllable subroutine

tsy,	sxa tsz
	lda chc
	tze fcn-1
	lda let
	trn es2
	tsx es
	tze tsu
	xac
	sto t2
	lax low-1
	trn esm
	move2 sym, api
	tsx rss+1
	ldx t2
	lax low-1
	add (-add+1
	trn mac
	clc
	trx low+1

esm,	add (-add
	trn tsj
	lda liu
	tze mdv

es1,	ldx t2
	lax low
	tsx erk

es2,	lda nmr
	llr fcr
	sto fcr
	lda fci
	trn ts2
	ldx fci
	lda nmr
	tze tk1
	tix irx
	ial
	tze .+2
	tra irx		|product relocation error
	lda fct
	tra tk3

tk1,	lac
	tze tk4
	tix irx
	llr num
tk3,	tsx mpy
tk4,	sto fcr

ts2,	stz syl
	lda num
	llr fct
fcn,	xx		|factor combination operator
	sto fct
	alr
tsz,	tra .

tsu,	lda liu		|undefined symbol
	trn tsn
	llr pss
	tplr tsn
	ado vct		|variable
	add mon
	sto tvl
	lda sym l
	add (opr
	sto tsm l
	lda sym r
	add (add
	sto tsm r
	tsx vsm

tsn,	move2 sym, lus
	stz def
	stz num
	stz nmr
	tra es2

tsj,	lax low
	trn es1
	cyl
	trn tsn
	tra es1

erk,	llr (opr
	ana-10
	trn .+3
erx,	sto nmr
	trx

	add (-trn
	com
	tra erx

|Relative address syllable (.)

rl,	lda chc
	tze rl1
	move dnm, num
	tra rr

rl1,	move loc, num
	move rli, nmr
	ado chc
	tra rr

|Evaluate symbol (logarithmic search)

es,	sxa esx
	load t2, 6000
	stz num
	ldx low
	aux one

elp,	lda (-opr
ea,	llx low-1	|llr symbol
	anc
	add sym l
	tze eqt
	trn edn

eup,	load e1, xad
	llr t2
	lac+shr-opr
	sto t2
	add mon
	trn esx
	add one
e1,	xx		|xad or xcd
	axr+com-opr
	add low
	com
	trn eup
	xac
	trn elp

edn,	llr (xcd
	tra eup+1

eqt,	llx low
	lda (-opr
	anc
	add sym r
	tze eq2
	trn edn
	tra eup

eq2,	lax low		|sym r
	llx low+1
	slr num
	llx low-1	|sym l
esx,	tra .

|Process alphabetic or numeric character

ln,	add (-12
	trn n
	stz let
	lda cas
	trn ln1
	stz liu

ln1,	ado chc
	add (-4
	tze ln2
	add (trn 4-7
	trn rr
ln4,	llr sym r
	lal
	cyl
	lad
	cyl
	cyl
	cyl
	add cfn
	sto sym r
	lda chc
	add (trn-4
	trn rr
	lda fsm
	cyr
	add lch
	sto fsm
	tra rr

ln2,	move sym r, sym l
	stz sym r
	tra ln4

n,	llr num
	lal
	cyl+lro-opr
	cyl
n1,	xx		|lad or opr
	add cfn
	sto num
	llr dnm
	lal
	cyl+lro-opr
	cyl
	lad
	add cfn
	sto dnm
	ado cfn
	tra ln1

|Parameter assignment routine (equal sign).

q,	lda syl
	tze ipa
	lda let
	trn ipa
	lda liu
	tze ipa
	move2 sym, tsm
	tsx sts
	tsx ilf
	tra qq
	move cas, tvl
	tra rsw

qq,	tsx evl
	trn usq
	lda def
qq9,	tze rst

q1,	tsx rck
	trn irq
	lac
	trn qq1
	add tvl
	cyr
	cyr
	tra qq2

qq1,	llr (opr
	ana
qq2,	move tsm r, sym r
	lad
	sto tsm r
	lda tsm l
	sto sym l
	add (trn
	sto tsm l
	llr wrd

qq4,	slr tvl		|define or redefine symbol
	ldx qq9
qq5,	sxa vsx
	tsx es
	tze vsm+1
	aux (5
	tra vs3

|Address tag routine.

c,	lda loc
	trn rsw
	sto tvl
	tsx ck
	tra rsw
	trn mdt
	tra rsw

|Tag check and define

ck,	sxa ckz
	aux one
	sxa cky
	lda syl
	tze ckp
	lda let		|monos
	trn ckp
	tsx es
	tze ckd
	lax low-1	|sym l
	trn ck1
ckk,	clc
cky,	tra .		|mdt

ck1,	add (-add
	trn ckk		|vari
	lax low+1
	sto wrd
	lax low
	tsx erk
	sto rlc
	tra ckt

ckp,	tsx evl		|polys
	tze usk
	lda def
ckz,	tze .		|polys, not mdt
ckt,	lda wrd
	com
	add tvl
	tze ckr
ckm,	lda syl		|mdt
	trn ckk
	stz sym l
	stz sym r	|kill symbol field in error print
	tra ckk

ckr,	lda rlc		|check reloc
	com
	add rli
	tze .+2
	tra ckm
	lda syl
	tze ckz
ckw,	stz aml
	move2 sym, asm
	cla
	tra cky

ckd,	lda rli		|define tag
	cyr
	add sym r
	sto tsm r
	lda sym l
	add (trn
	sto tsm l
	tsx vsm
	tra ckw

|Enter new symbol and value in symbol table

vsm,	sxa vsx
	lda low
	add (-3
	sto low
	add (low-1
	com
	add mai
	trn .+2
	tsx gc
	ldx low
	aux (3

vs1,	tix vs2
	ldx (3
vs3,	llr tsm l	|symbol with flag bits in tsm
	slx low-6
	llr tsm r
	slx low-5
	llr tvl
	slx low-4
vsx,	tra .

vs2,	aux (2
	lda (-opr
	llx low-3	|symbol
	anc
	add sym l	|no flag bits
	tze vs4
	trn vs3
vs5,	slx low-6
	llx low-2
	slx low-5
	llx low-1
	slx low-4
	tra vs1

vs4,	lda (-opr
	llx low-2
	anc
	add sym r
	trn vs3
	llx low-3
	tra vs5

|Conditionals

if1,	lda mon
if0,	sto npa
	tsx rch
	add (-char lv
	tze ifv
	tsx ilf

ifv,	tsx rch
	llr (tze ift
	add (-char lz
	tze iv1
	llr (trn ift
	add (char lz-char lp
	tze iv1
	tsx ilf

iv1,	slr ivs
	tsx svs
	tsx sts
	tra iv2
	tra iv2
	llr (tra iv3

ivx,	slr bt
	move rqz, ifx
	tra rsw

iv3,	move rqw, ifx
iv2,	tsx evl
	lda def
	tze usi
	lda wrd
	com+lro-opr
	amz
ivs,	xx

iff,	llr one
ift,	lda npa
	lpd+com-opr
	sto npa
	tsx uns
	tra svx
	tsx rss+1
	ado chc
	lda npa
	sto num
ifx,	xx		|tra cfr or rr

start
m