ddt 20 august 1966

/DHP/ changes to get listing to assemble:
/DHP/
/DHP/ put pages together; put carriage returns where page breaks would be
/DHP/ everything after the first tab is ignored, so I had to split lines
/DHP/ removed first = definition of est (I don't yet understand how MACRO
/DHP/   handles =)
/DHP/ replaced "char" operations with numeric literals
/DHP/ replaced "flex" operations as constants with numeric constants
/DHP/ capitalized dummy symbols in macro defs. (the original MACRO requires
/DHP/   this; evidently MIT changed theirs later; I'm not sure if the cross-
/DHP/   assembler version requires it though)
/DHP/ moved all macro headers to the same lines as "define"
/DHP/ replaced times symbol by ^
/DHP/   this affects the senseswitch macro which is untested
/DHP/   it also affects the disp macro which I had to totally rewrite
/DHP/     (because the cross-assembler carries out operations from left
/DHP/     to right); I created a symbol "dto" (which is luckily a constant
/DHP/     once lse is defined) and rearranged the arithmetic in the macro
/DHP/   rearranging the arithmetic mostly involved making sure left-to-right
/DHP/     execution order gives the correct result, but also subtracting 1
/DHP/     as a fudge factor; I think ^ overflow sets carry which the real
/DHP/     PDP-1 doesn't do
/DHP/   "dto" = "dispatch table offset"
/DHP/ the original MACRO doesn't support brackets or multipliation; evidently
/DHP/   MIT changed theirs later
/DHP/ reformatted dispatch and feed macro definitionss to look like the
/DHP/   standard ones at the beginning of the file
/DHP/ replaced "term" with "termin" since the cross-assembler requires it;
/DHP/   this is not compatible with any version of MACRO; pseudo-ops are only
/DHP/   significant to four characters
/DHP/ changed "dispatch" and "initialize" to "disp" and "init"; they are
/DHP/   defined with 6 characters but called with 4; I don't know the rules
/DHP/   in the original MACRO for significance; in this MIT version charac-
/DHP/   ters after the 4th are ignored; in the cross-assembler all up to the
/DHP/   6th (?) are significant
/DHP/ removed extra slash in one comment
/DHP/ removed extra spaces in another comment
/DHP/ this version of MACRO defines "nop" by default; I had to define it
/DHP/ changed "ex," to "eix," (I think the listing is wrong)
/DHP/ changed first character after number in "repeat" statements from tab
/DHP/   to comma (original MACRO required comma; evidently MIT changed
/DHP/   theirs later)
/DHP/ added character list comments to dispatch table and title font table;
/DHP/   erased existing "0" and "40" comments
/DHP/ moved "disp l, dec" line to column where I think it belongs
/DHP/ put comments in dispatch table on a separate line from macro calls
/DHP/   (the cross-assembler seems to require this; it's certainly wrong)
/DHP/ replaced "jmp .-3" in "tou" with "nop"; I think the original tried to
/DHP/   make use of a MIT hardware feature which the emulator doesn't have
/DHP/ changed 602700 (title font for "W") to 603700 (I think the listing
/DHP/   is wrong)

6000/
xx=0
nsy=113
low=.-nsy-nsy-1
tst=.-2
low/	
	746172
		ac
	747172
		io
	744372
		msk
	710000
		10000

	flex and
		020000
	flex ior
		040000
	flex xor
		060000
	flex xct
		100000
	flex jfd
		120000
	flex cal
		160000
	flex jda
		170000
	flex lac
		200000
	flex lio
		220000
	flex dac
		240000
	flex dap
		260000
	flex dip
		300000
	flex dio
		320000
	flex dzm
		340000
	flex add
		400000
	flex sub
		420000
	flex idx
		440000
	flex isp
		460000
	flex sad
		500000
	flex sas
		520000
	flex mus
		540000
	flex dis
		560000
	flex imp
		600000
	flex jsp
		620000

	flex skp
		640000
	flex szs
		640000
	flex szf
		640000

	flex sza
		640100
	flex spa
		640200
	flex sma
		640400
	flex szo
		641000
	flex spi 
		642000

	flex ral
		661000
	flex ril
		662000
	flex rcl
		663000
	flex sal
		665000
	flex sil
		666000
	flex scl
		667000
	flex rar
		671000
	flex rir
		672000
	flex rcr
		673000
	flex sar
		675000
	flex sir
		676000
	flex scr
		677000

	flex law
		700000
	flex iot
		720000
	flex tyi
		720004
	flex rrb
		720030
	flex cks
		720033
	flex lsm
		720054
	flex esm
		720055

	flex cbs
		720056
	flex eem
		724074
	flex lem
		720074
	flex rpa
		730001
	flex rpb
		730002
	flex tyo
		730003
	flex ppa
		730005
	flex ppb
		730006
	flex dpy
		730007

	flex clf
		760000
	flex nop
		760000
	flex opr
		760000

	flex lap
		760500
	flex stf
		760010
	flex cla
		760200

	flex hlt
		760400
	flex cma
		761000
	flex clc
		761200
	flex lat
		762200
	flex cli
		764000
est,	low

lap=cla 100
ioh=iot i
clo=651600
spq=650500
szm=640500
nop=760000

define	senseswitch A
	szs 10^A
	termin

define	init A,B
	law B
	dap a
	termin

define	index A,B,C
	idx A
	sas B
	jmp C
	termin

define	listen
	cla+cli+clf 1-opr-opr
	szf i 1
	jmp .-1
	tyi
	termin

define	swap
	rcl 9s
	rcl 9s
	termin

define	load A,B
	lio (B
	dio A
	termin

define	setup A,B
	law i B
	dac A
	termin

define	count A,B
	isp A
	jmp b
	termin

define	move A,B
	lio A
	dio B
	termin

define	clear A,B
	init . 2, A
	dzm
	index .-1, (dzm B 1, .-1
	termin

	dto=1001^lse
define	disp L,U
	1000^U+L-dto-1
	termin

lis,	lio bk1
bk1,	dio ch		/or break addr
	jsp sbc

lse,	jsp lcc
lss,	clc
	dac chi

lsp,	dzm wrd
	lac cun
ssn,	dip sgn
	dzm dnm
	dzm syl
n2,	dzm sym
	clc
	dac let

lsr,	lio sk1
	dio wea
	init bax, lwt
	listen
ps1,	dio ch
	law dtb
	add ch
	dap .+1
	lac .
cas,	xx		/rar 9s or cli
	and (777
cad,	add tls
	dap lsx
	sub ar1		/last no-eval routine
	spq
	jmp i lsx
	law syl
	lio let
	spi i
	jsp evl
	jmp ev4
	lac (742472
	jda tys
	jmp lsp

evl,	dap evx
evc,	lac est
	dap ev2

ev2,	lac .
	sad sym
	jmp ev3		/match found
	idx ev2
	index ev2, evc, ev2
	idx evx
ev3,	idx ev2
evx,	jmp .

ev4,	dap sgn
	lac wrd
sgn,	xx		/operator and syllable addr.
	dac wrd
	lio chi
	spi
	lac lwt
lsx,	jmp .

n,	rir 5s		/number routine
	lac syl
	ral 3s
	spi i
cun,	ior ch
	dac syl
	lac dnm
	ral 2s
	add dnm
	ral 1s
	spi i
	add ch
	dac dnm
	jmp l1

l,	dzm let		/letter routine
l1,	lac sym
	ral 6s
	add ch
	dac sym
	dzm chi
	jmp lsr

uc,	lio rc		/upper case
	jmp .+2
lc,	lio ps1		/lower case
	dio cas
	jmp lsr

sqo,	lac dnm		/' means take decimal number
	jmp n1+1

quo,	lac sym		/" means take as flexo codes
	jmp n1

a,	law ac		/A means accumulator
	jmp n1

ir,	law io		/I means i-o
	jmp n1

m,	law msk		/M means mask register
	jmp n1

q,	lac lwt		/Q means last quantity
	jmp n1

f,	law est		/F means lowest register
n1,	dzm chi
	dac syl
	jmp n2

err,	lac (743521	/?
er1,	jda tys
	law 7234		/lc, blk
	jda tys
	jmp lsr

daq,	law 7777		/} defines sym as address of
	and lwt
	jmp .+2

com,	lac loc		/comma defines sym as loc
	dac df1

def,	lac let		/define symbol
sk1,	sza
	jmp err
	law pn2

de,	dap dex
	lio df1
	jsp evl
	jmp df2
	law i 1
	add est
	dap est
	dio i est
	sub one
	dap est
	lio sym
	dio i est
	jmp dex

df2,	dio i ev2
dex,	jmp .
del,	jmp pn2		/end of no-eval routines, delete

val,	dac df1		/open paren, sets up value for define
	jmp lss

eql,	dac lwt		/print octal integer
	jsp lct
	jda opt
pn2,	jsp lct
	jmp lss

arw,	dac lwt		/print as instruction
	jsp lct
	jda pi
ar1,	jmp del

oct,	law odv		/octal-decimal switch setup
	jmp .+2
dec,	law ddv
	dap ops
	jmp lse

smb,	law pi
	jmp .+2
cns,	law opt		/symbolic-constant switch setup
	dap pns
	jmp lse

oad,	law pvl
	jmp .+2
rad,	law pev		/octal-relative switch setup
	dap pa1
tls,	jmp lse

pls,	lac cad
	jmp ssn

min,	lac csu
	jmp ssn

uni,	jmp ssn-1

isc,	lac can
	jmp ssn

dot,	lac loc
	jmp n1

tab,	spi i		/tab
tas,	dac ch

ta3,	dac lwt
	jsp lcc
	jda pad
	law 7221
	jda tys

ta5,	dzm loc
	dap loc
ta6,	dap tas
	jsp lct
	lac i tas
	dac lwt
bax,	jda .		/pi, opt or lwt
	jmp pn2

bs,	spi i		/backspace
bs1,	dac i tas		/used as dac i
	idx loc
	jmp ta3

fs,	spi i		/arrow up (forward space)
	dac i tas
	law i 1
	add loc
	dap loc
	jmp ta3

bac,	law opt		/open bracket (bar-constant)
	jmp .+2
bas,	law pi		/closed bracket (bar-symbolic)
	dap bax
bar,	lac lwt
	spi
	jmp ta6
	lac wrd
	jmp ta5

uc8,	spi i		/> means make corr. and open register
	dac i tas
	jmp ta6

cr,	spi i
	dac i tas
	dac lwt
	law 72
	jda tys
	init tas, ch
	jmp lss

bk,	spi		/break
	init bk1, ch
	jmp lse

tr,	0
	dap prc
	dap prd
	idx prd
	lac tr
	dac ac
	isp ch
	jmp pr2
	jsp tr1

tr2,	dap pra
	law i 1
	add prc
	jda pad		/print trap addr
	law 55
	jda tys
	law ac
	jmp ta5

tr1,	dac ovf
	dio io
	jsp sbc
	dzm fl1
	szf 1
	dac fl1
	move bki, i bk1
	lac bk1
	jmp i ovf

xe1,	xx
	nop
	dac ac
	jsp tr1
	jmp lss

pra,	lio .
	dio bix
	lio chi
	spi
pr1,	law 0
	cma
	dac ch
	jsp lcc
	cks
	ril 2s
	spi i
	jmp .-3
	lac sbi
	iot 56
	sza
	esm
pr3,	lac fl1
	sza i
	clf 1
	clo
	lac ovf
	add ovf
	lio i bk1		/get instr. at new brk addr.
	dio bki
	lio (jda tr
	dio i bk1
	lio io

pr2,	lac ac
bix,	xx
prc,	jmp .
prd,	jmp .

xec,	dac xe1		/execute
	law xe1

bgn,	spi		/begin
	jmp err
	dap bix
	lac prc
	dip bix
	jmp pr1

eas,	law ea1		/effective address search
	jmp ws

nws,	lac sk2		/not word search
	dac wea

wds,	law ws1		/word search
ws,	spi
	jmp err
	dap ws2
	jsp lcc
	dzm t2
	lac ll
	dac t

ws4,	dzm sym
	dap t2
	lac i t2
ws2,	jmp .		/ea1 or ws1

ea1,	and ci
	sza
	jmp ea2
	law 7777
	and i t2

ws1,	xor wrd
can,	and msk		/used as and
wea,	xx		/sza or sza i
	jmp ws3

ws6,	law lcc

pac,	dap pax
	lac t
	jda pad
	law 2136
	jda tys
	lac i t
	jda lwt
pax,	jsp .

ws3,	idx t		/index and skip over pgm
	sub ul
	szm
	jmp lse
	add ul
	sub est
	sma
	jmp lse
	lac t
	jmp ws4

ea2,	idx sym
	sad c77
	jmp ws3
	lac i t2
	jmp ws4+1

pbx,	dac lwt
	jsp lct		/print as bcd
	jda tys
	jmp pn2

vfy,	jsp lcc
	lac rb2
	jmp .+2
rd,	lac bs1
	dip vf4
	jsp soi

vf1,	lac t
	sub ll
	sub (dio
	spa
	jmp vf2
	add ll
	sub ul
	szm
	jmp vf2
	lac i la
vf4,	t		/dac i or sad i
	jmp vf2

vf3,	jsp pac
	jsp lct
	lac i la
	jda lwt
	jsp lcc

vf2,	idx t
	idx la
	sad rb1
	jsp rbk
	jmp vf1

lwt,	0
	dap pnx
	lac lwt
pns,	jda pi		/pi or opt
pnx,	jmp .

kil,	law low
	dac est
	jmp lse

tbl,	jsp soi		/symbol table reader

tb1,	lac i la
	and (202020	/permute zones
	ral 1s
	xor i la
	xor c4
	cli
	rcl 6s
	sza
	jmp .-2
	idx la
	sad rb1
	jmp tbn
	lac i la
	dac df1
	dio sym
	law i 1700
	and sym		/delete symbols of form 1s, 2s,...9s
	sas (000022
	jsp de
	idx la
	sad rb1
	jsp rbk
	jmp tb1

tbn,	jsp lct
	lac est
	jda opt

tbm,	jsp rbk		/skips rest of tape
	jmp tbm

define	feed N
	law i N
	jda fee
	termin

ttl,	jsp lcc		/title punch and punch format setup
	listen
	rcr 9s
rc,	rar 9s
	sad c77
	jmp pir
	sad (36
	jmp pri
	sad (75
	jmp pi2
	ral 1s
	add (ftp
	jda tt1
	idx tt1
	law ttl+1
	jmp tt1+1

jbk,	spi		/jump block
	jmp err
	add cj
	dac lwt
	feed 40
	lio lwt
	jsp pbw
	feed 240
	jmp lse

pul,	dap fa		/punch lower limit setup
	jmp lss

pwd,	spi i		/punch word
	dac i tas
	dac lwt
	lac tas
	dap fa

pun,	dap la		/punch any length block

pb5,	lac fa
	ior c77
	dac t
	sub la
	sma
	jmp pb6		/next hundred too high
	idx t

pb4,	jsp pbb		/pbb or pur
	lac t
	dap fa
	jmp pb5

pb6,	lac la
	dac t
	idx t
	xct pb4
	jmp pn2

zro,	law 7777
	spi		/zero registers beiow ddt
	dac wrd
	and fa
	spi
	cla
	dac t

zr1,	sub est
	sma
	jmp lse
	add est
	sub wrd
	szm
	jmp lse
	dzm i t
	idx t
	jmp zr1

fee,t2,	0		/feed subroutine and temp storage.
	dap fex
	cli
	ppa
	isp fee
	jmp .-2
fex,	jmp .

sbc,	dap sbx		/sequence break status check
	dac sbi
	cks
	ril 6s
	spi i
	dzm sbi
	lsm
sbx,	jmp .

pi,	xx		/print instruction
	dap px
	jsp pev
	sub ci
	spa
	jmp ppk
	dac pi
	law 72
	jda tys
	jsp tou
	law 71
	jda tys

ppk,	jsp tou
	law 72
	jda tys
	and (760000
	sad pr1		/law
	jmp plo
	rar 1s
	sza
csu,	sub (320000	/used as sub
	spa
	jmp plo

pvl,	lac pi
	jda opt
px,	jmp .		/exit

pev,	dap pex		/synbol lookup subr
	lac est
	dap ea
	clf 1

eal,	idx ea
ea,	lac .
	xor pi
	spa
	jmp eix
	lac pi
	sub i ea
	spa
	jmp eix
	szf i 1
	jmp psw
	lac i ea
	sub i ch
	szm
	jmp psw

eix,	index ea, evc, eal
	szf i 1
	jmp pvl
	lac pi
	sub i ch
	dac pi
	law i 1
	add ch
	dap ch
	lac i ch
	jda tys
	lac pi
sk2,	sza i
	jmp px
pex,	jmp .

pad,	0		/print address
	dap px
	law 7777
	and pad
	dac pi
pa1,	jsp pev		/pev or pvl
	lac (745472
	jda tys
	jmp pvl

tys,	0		/type symbol, etc.
	dap tyx
	setup opt,3

tyl,	lac tys
	ral 6s
	dac tys
	and c77
	sza i
	jmp tyc
	sad (72
	jmp dns
	sad (74
	jmp ups
	swap
tyb,	jsp tou
tyc,	count opt, tyl
	lac lwt
	cli
tyx,	jmp .

dns,	lac ps1		/redundant case shift filter
	lio (72
dn1,	sad cas
	jmp tyc
	dac cas
	jmp tyb

ups,	lac rc
	lio (74
	jmp dn1

lcc,	dap lcx
	law 7277
	jmp lc1

lct,	dap lcx
	law 7236
lc1,	jda tys
lcx,	jmp .

so1,	rpb		/skip over input routine
soi,	rpb		/enter here
	spi i
	jmp so1

rbk,	dap rbx		/read a block into buffer
	init rb1, buf
	dap la
	dzm chi
	rpb
	dio t2
	dio t
	spi
	jmp lse		/start block read
	rpb
	dio ch

rb0,	rpb
rb1,	dio .
	lac i rb1
	add chi
	dac chi
	idx rb1
	index t2, ch, rb0
	add chi
	add t
	rpb
	dio chi
rb2,	sad i .-1		/used as sad i

rbx,	jmp .
	hlt+clc-opr	/checksum error stop
	jmp rbk+1

tt1,	0		/title punch subroutine
	dap tt2
	lac i tt1
	repeat 3,cli	rcl 6s	ppa
tt2,	jmp .

pur,	dap pb2		/punch read-in mode blocks

pu1,	lio fa
	jsp pbw
	lio i fa
	jsp pbw
	index fa, t, pu1
	jmp pux

pbb,	dap pb2		/punch binary block format
	dzm t2
	lio fa
	jsp pbw
	lio t
	jsp pbw

pb1,	lio i fa
	jsp pbw
	index fa, t, pb1
	lio t2
	jsp pbw
pux,	feed 5
pb2,	jmp .

pir,	feed 40
	move 7754, t
	init fa, 7751
	jsp pur
pi2,	lio 7775		/jmp 7751
	jsp pbw
	law pbb
pi1,	dap pb4
	feed 30
	jmp lse

/combined octal-decimal print subroutine

opt,	0
	dap opx
ops,	init op1, odv	/odv or ddv
	setup op2, 6
	stf 1

opa,	dzm opd
	szf i 1
	jsp tou
	jmp opc

opb,	clf 1
	dac opt
	idx opd
opc,	lac opt
	lio opt
op1,	sub .
	spi i
	sma
	jmp opb

	lac opd
	lio opd
	sza i
	lio ddv+1
	idx op1
	count op2, opa
	jsp tou
opx,	jmp .

ddv,	decimal
	100000
	10000
	1000
	100
	10
	1
	octal

odv,	100000
ci,	10000
	1000
	100
	10
one,	1

/dispatch table

dtb,			/0  space
	disp pls, pls
			/1  1 "
	disp n, quo
			/2  2 '
	disp n, sqo
			/3  3 ~
	disp n, pbx
			/4  4 shoe
	disp n, daq
			/5  5 or
	disp n, uni
			/6  6 and
	disp n, isc
			/7  7 <
	disp n, pul
			/10 8 >
	disp n, uc8
			/11 9 up-arrow
	disp n, fs

wrd,	0
sym,	0
chi,	0
let,	0
ch,	0
loc,	0

			/20 0 right-arrow
	disp n, arw
			/21 / ?
	disp bar, err
			/22 S
	disp l, smb
			/23 T
	disp l, tbl
			/24 U
	disp l, dec
			/25 V
	disp l, vfy
			/26 W
	disp l, wds
			/27 X
	disp l, xec
			/30 Y
	disp l, rd
			/31 Z
	disp l, zro

syl,	0

			/33 , =
	disp com, eql

t,	0
la,	dio

			/36 tab
	disp tab, tab

fa,	dio

			/40 @ _
	disp pwd, err
			/41 J
	disp l, jbk
			/42 K
	disp l, kil
			/43 L
	disp l, ttl
			/44 M
	disp l, m
			/45 N
	disp l, nws
			/46 O
	disp l, oad
			/47 P
	disp l, pra
			/50 Q
	disp l, q
			/51 R
	disp l, rad

bki,	opr
sbi,	-0

			/54 - +
	disp min, pls
			/55 ) ]
	disp def, bas
			/56 overbar |
	disp err, err
			/57 ( [
	disp val, bac

fl1,	0

			/61 A
	disp l, a
			/62 B
	disp l, bk
			/63 C
	disp l, cns
			/64 D
	disp l, pun
			/65 E
	disp l, eas
			/66 F
	disp l, f
			/67 G
	disp l, bgn
			/70 H
	disp l, oct
			/71 I
	disp l, ir
			/72 lower-case
	disp lc, lc
			/73 . times
	disp dot, del
			/74 upper-case
	disp uc, uc
			/75 backspace
	disp bs, bs

df1,	0

			/77 carriage-return
	disp cr, cr

/title punch table

ftp,	0		/0  space
		0
	004277		/1  1
c4,		400000
	625151		/2  2
		514600
	224145		/3  3
		453200
	141211		/4  4
		771000
	274545		/5  5
		453100
	364545		/6  6
		453000
	010171		/7  7
		050300
	324545		/10 8
		453200
	065151		/11 9
		513600

tou,	dap tox		/typeout subroutine
	dio tot
	cks
	ril 2s
	spi i
	nop
	lio tot
	tyo-i
tox,	jmp .

op2,	0
opd,dnm,	0
tot,	0

	364141		/20 0
		413600
c77,	000077		/21 / (indistinguishable from overbar)
		000000
	224545		/22 S
		453000
	010177		/23 T
		010100
	374040		/24 U
		403700
	073060		/25 V
		300700
	376014		/26 W
		603700
	412214		/27 X
		224100
	010274		/30 Y
		020100
	615141		/31 Z
		454300

plo,	jsp pev
	jmp pa1+i

	141414		/33 = (comma is not available)
		141400

pbw,	dap pby		/punch 1 word
	ppb
	rcl 6s
	ppb
	rcl 6s
	ppb
	rcl 6s
	add t2
	dac t2
pby,	jmp .

	204040		/41 J
		403700
	771014		/42 K
		224100
	774040		/43 L
		404000
	770214		/44 M
		027700
	770214		/45 N
		207700
	364141		/46 O
		413600
	771111		/47 P
		110600
	364151		/50 Q
		215600
	771111		/51 R
		314600

psw,	lio ea
	dio ch
	stf i
	jmp eix

	101010		/54 - (for + use overbar)
		101000
	000041		/55 )
		221400
	101074		/56 + (overbar and | are not available)
		101000
	001422		/57 (
		410000

pri,	law pur
	jmp pi1

	761111		/61 A
		117600
	774545		/62 B
		453200
	364141		/63 C
		412200
	774141		/64 D
		413600
	774545		/65 E
		414100
	770505		/66 F
		010100
	364151		/67 G
		513000
	771010		/70 H
		107700
	004177		/71 I
		410000
	000001		/72 close quote (everything is upper case)
		030000
	000060		/73 . (times is not available)
cj,		600000
	000003		/74 open quote (everything is upper case)
		020000

buf,	buf+100/
ovf,	0
ac,	0
io,	0
msk,	-0
ll,	0
ul,	7777

constants

start lis
