eminform.s 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  1. /
  2. / (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
  3. /
  4. / This product is part of the Amsterdam Compiler Kit.
  5. /
  6. / Permission to use, sell, duplicate or disclose this software must be
  7. / obtained in writing. Requests for such permissions may be sent to
  8. /
  9. / Dr. Andrew S. Tanenbaum
  10. / Wiskundig Seminarium
  11. / Vrije Universiteit
  12. / Postbox 7161
  13. / 1007 MC Amsterdam
  14. / The Netherlands
  15. /
  16. /
  17. /------------------------------------------------------------------------------
  18. /
  19. indir = 0
  20. exit = 1
  21. fork = 2
  22. read = 3
  23. write = 4
  24. open = 5
  25. close = 6
  26. creat = 8.
  27. unlink = 10.
  28. break = 17.
  29. alarm = 27.
  30. pause = 29.
  31. sleep = 35.
  32. signal = 48.
  33. iot = 4
  34. /------------------------------------------------------------------------------
  35. / External references
  36. /------------------------------------------------------------------------------
  37. .globl _end
  38. /
  39. /------------------------------------------------------------------------------
  40. / Now the real program starts
  41. /------------------------------------------------------------------------------
  42. startoff:
  43. mov sp,memlim
  44. mov $ldfail,r5
  45. mov $emfile,forward+2
  46. sys indir;forward
  47. jes badruninf;
  48. mov r0,saver0;
  49. mov $rhfail,r5;
  50. sys read;header;34.
  51. jes badruninf;
  52. cmp $34.,r0
  53. jne badruninf
  54. mov $rtfail,r5
  55. mov $_end,loadstart
  56. mov option,r1
  57. bit $17774,r1
  58. bne 1f
  59. mov tblmax,globmax
  60. 1:
  61. bit $1,r1
  62. beq 1f
  63. mov saver0,r0
  64. sys read;lasttab;98.
  65. jes badruninf;
  66. 1: bit $2,r1
  67. beq 1f
  68. mov saver0,r0
  69. sys read;opfrb;512.
  70. jes badruninf
  71. mov saver0,r0
  72. sys read;opfra;512.
  73. jes badruninf
  74. mov saver0,r0
  75. sys read;opfrc;640.
  76. jes badruninf
  77. 1: bit $4,r1
  78. beq 1f
  79. mov saver0,r0
  80. sys read;lcount;4
  81. jes badruninf
  82. 1: bit $8.,r1
  83. beq 1f
  84. mov saver0,r0
  85. sys read;lflow;4
  86. jes badruninf
  87. 1: bit $16.,r1
  88. beq 1f
  89. mov saver0,r0
  90. sys read;ltime;4
  91. jes badruninf
  92. 1:
  93. mov tblmax,r3
  94. sub pd,r3
  95. sub ml,r3
  96. mov $_end,sybreak+2
  97. add r3,sybreak+2;
  98. sys indir;sybreak
  99. mov r3,lblread+4
  100. mov $_end,lblread+2;
  101. mov saver0,r0
  102. sys indir;lblread;
  103. jes badruninf
  104. mov saver0,r0
  105. sys close
  106. sys unlink;emfile
  107. lbladj:
  108. add $header,linused
  109. sub header,linused
  110. mov pd,filext
  111. sub loadstart,filext
  112. mov filext,filarg
  113. add ml,filarg
  114. sub tblmax,filarg
  115. lbllast:
  116. bit $1,option /test for last
  117. beq 2f / no last table jump
  118. sys creat;emlast;666
  119. bcs 2f
  120. cmp linused,$lasttab
  121. bhis 3f
  122. mov $yetmsg,lblwri+2
  123. mov $40.,lblwri+4
  124. sys indir;lblwri
  125. br 2f
  126. 3: mov r0,saver0
  127. cmp linused-2,$-1
  128. bne 6f
  129. mov $linused-2,linused
  130. clr linused-2
  131. 6: jsr pc,slilast
  132. inc r2
  133. jsr pc,nexttab
  134. tst (r5)
  135. beq 3f
  136. sub $2,linused
  137. cmp eb,(r5)
  138. blo 3f
  139. 7: cmp r2,$lnend
  140. blt 1f
  141. jsr pc,slnlast
  142. 1: jsr pc,lnrnxt
  143. bne 7b
  144. 3: jsr pc,sfllast
  145. bne 6b
  146. mov saver0,r0
  147. sys close
  148. 2:
  149. lblopfreq:
  150. bit $2,option
  151. beq 9f
  152. sys creat;emopf;666
  153. bcs 9f
  154. mov r0,saver0
  155. mov $opcode,r3
  156. mov $104.,r4
  157. mov $counttab,r5
  158. 0: mov $lnlast,r2
  159. mov $8.,r0
  160. 2: movb (r3)+,(r2)+
  161. sob r0,2b
  162. add $8,r2
  163. mov r2,-(sp)
  164. jsr pc,ltoa
  165. mov (sp)+,r2
  166. add $5,r2
  167. mov $8.,r0
  168. 2: movb (r3)+,(r2)+
  169. sob r0,2b
  170. add $8,r2
  171. mov r2,-(sp)
  172. jsr pc,ltoa
  173. mov (sp)+,r2
  174. add $5,r2
  175. mov $8.,r0
  176. 2: movb (r3)+,(r2)+
  177. sob r0,2b
  178. add $8,r2
  179. mov r2,-(sp)
  180. jsr pc,ltoa
  181. mov (sp)+,r2
  182. add $5,r2
  183. mov $8.,r0
  184. 2: movb (r3)+,(r2)+
  185. sob r0,2b
  186. add $8,r2
  187. mov r2,-(sp)
  188. jsr pc,ltoa
  189. mov (sp)+,r2
  190. mov r3,-(sp)
  191. jsr pc,slnlast
  192. mov (sp)+,r3
  193. sob r4,0b
  194. mov saver0,r0
  195. sys close
  196. 9:
  197. lblcount:
  198. clr filb
  199. bit $4,option
  200. beq 9f
  201. sys creat;emcount;666
  202. bcs 9f
  203. mov r0,saver0
  204. mov lcount,r5
  205. add $4,r5
  206. sub filext,r5
  207. jsr pc,procrun
  208. mov saver0,r0
  209. sys close
  210. 9:
  211. lblprof:
  212. bit $16.,option
  213. beq 9f
  214. sys creat;emprof;666
  215. bcs 9f
  216. mov r0,saver0
  217. mov ltime,r5
  218. sub filext,r5
  219. mov $profmsg,lblwri+2
  220. mov $29,lblwri+4
  221. mov $profmsg+27,r2
  222. jsr pc,ltoa
  223. mov saver0,r0
  224. sys indir;lblwri
  225. jsr pc,procrun
  226. mov saver0,r0
  227. sys close
  228. 9:
  229. lblflow:
  230. mov $1,filb
  231. bit $8.,option
  232. beq 9f
  233. sys creat;emflow;666
  234. bcs 9f
  235. mov lflow,r5
  236. mov $-1,flowsiz
  237. sub filext,r5
  238. jsr pc,procrun
  239. mov saver0,r0
  240. sys close
  241. 9:
  242. clr r0
  243. sys exit
  244. badruninf:
  245. mov $0f,lblwri+2
  246. mov $21.,lblwri+4
  247. mov $2,r0
  248. sys indir;lblwri
  249. mov r5,lblwri+2
  250. mov $23.,lblwri+4
  251. mov $2,r0
  252. sys indir;lblwri
  253. iot /force core dump
  254. .data
  255. lblwri:
  256. sys write;0;0
  257. forward:
  258. sys open;0;0
  259. sybreak:
  260. sys break;0;
  261. lblread:
  262. sys read;0;0
  263. 0: <em_runinf load error,\0>
  264. ldfail: < open runinf failed \n\0>
  265. rhfail: < read header failed \n\0>
  266. rtfail: < read tables failed \n\0>
  267. msgto: <to>
  268. emlast: <em_last\0>
  269. emcount:<em_count\0>
  270. emfile: <em_runinf\0>
  271. emopf: <em_opfreq\0>
  272. emprof: <em_profile\0>
  273. emflow: <em_flow\0>
  274. yetmsg: <no line or file message processed yet \n\n\0>
  275. unknown:<with unknown filename\0>
  276. lilast: <\nlines \0>
  277. lnlast: < >
  278. < >
  279. lnend: < \0>
  280. fllast: < of file >
  281. < \0>
  282. profmsg:<\ninitialization \n\0>
  283. sep: <\n\0>
  284. /----------------------------------------------------------------------------
  285. opcode:
  286. <loc.0 loc.1 loc.2 loc.3 loc.4 loc.5 loc.6 loc.7 >
  287. <loc.8 loc.9 loc.10 loc.11 loc.12 loc.13 loc.14 loc.15 >
  288. <loc.16 loc.17 loc.18 loc.19 loc.20 loc.21 loc.22 loc.23 >
  289. <loc.24 loc.25 loc.26 loc.27 loc.28 loc.29 loc.30 loc.31 >
  290. <loc.32 loc.33 aar.1W adf.s0 adi.1W adi.2W adp.l adp.1 >
  291. <adp.2 adp.s0 adp.s_1 ads.1W and.1W asp.1W asp.2W asp.3W >
  292. <asp.4W asp.5W asp.w0 beq.l beq.s0 bge.s0 bgt.s0 ble.s0 >
  293. <blm.s0 blt.s0 bne.s0 bra.l bra.s_1 bra.s_2 bra.s0 bra.s1 >
  294. <cal.1 cal.2 cal.3 cal.4 cal.5 cal.6 cal.7 cal.8 >
  295. <cal.9 cal.10 cal.11 cal.12 cal.13 cal.14 cal.15 cal.16 >
  296. <cal.17 cal.18 cal.19 cal.20 cal.21 cal.22 cal.23 cal.24 >
  297. <cal.25 cal.26 cal.27 cal.28 cal.s0 cff.z cif.z cii.z >
  298. <cmf.s0 cmi.1W cmi.2W cmp.z cms.s0 csa.1W csb.1W dec.z >
  299. <dee.w0 del.w_1 dup.1W dvf.s0 dvi.1W fil.l inc.z ine.lw >
  300. <ine.w0 inl._1W inl._2W inl._3W inl.w_1 inn.s0 ior.1W ior.s0 >
  301. <lae.l lae.w0 lae.w1 lae.w2 lae.w3 lae.w4 lae.w5 lae.w6 >
  302. <lal.p lal.n lal.0 lal._1 lal.w0 lal.w_1 lal.w_2 lar.1W >
  303. <ldc.0 lde.lw lde.w0 ldl.0 ldl.w_1 lfr.1W lfr.2W lfr.s0 >
  304. <lil.w_1 lil.w0 lil.0 lil.1W lin.l lin.s0 lni.z loc.l >
  305. <loc._1 loc.s0 loc.s_1 loe.lw loe.w0 loe.w1 loe.w2 loe.w3 >
  306. <loe.w4 lof.l lof.1W lof.2W lof.3W lof.4W lof.s0 loi.l >
  307. <loi.1 loi.1W loi.2W loi.3W loi.4W loi.s0 lol.pw lol.nw >
  308. <lol.0 lol.1W lol.2W lol.3W lol._1W lol._2W lol._3W lol._4W >
  309. <lol._5W lol._6W lol._7W lol._8W lol.w0 lol.w_1 lxa.1 lxl.1 >
  310. <lxl.2 mlf.s0 mli.1W mli.2W rck.1W ret.0 ret.1W ret.s0 >
  311. <rmi.1W sar.1W sbf.s0 sbi.1W sbi.2W sdl.w_1 set.s0 sil.w_1 >
  312. <sil.w0 sli.1W ste.lw ste.w0 ste.w1 ste.w2 stf.l stf.1W >
  313. <stf.2W stf.s0 sti.1 sti.1W sti.2W sti.3W sti.4W sti.s0 >
  314. <stl.pw stl.nw stl.0 stl.1W stl._1W stl._2W stl._3W stl._4W >
  315. <stl._5W stl.w_1 teq.z tgt.z tlt.z tne.z zeq.l zeq.s0 >
  316. <zeq.s1 zer.s0 zge.s0 zgt.s0 zle.s0 zlt.s0 zne.s0 zne.s_1 >
  317. <zre.lw zre.w0 zrl._1W zrl._2W zrl.w_1 zrl.nw escape1 escape2 >
  318. <aar.l aar.z adf.l adf.z adi.l adi.z ads.l ads.z >
  319. <adu.l adu.z and.l and.z asp.lw ass.l ass.z bge.l >
  320. <bgt.l ble.l blm.l bls.l bls.z blt.l bne.l cai.z >
  321. <cal.l cfi.z cfu.z ciu.z cmf.l cmf.z cmi.l cmi.z >
  322. <cms.l cms.z cmu.l cmu.z com.l com.z csa.l csa.z >
  323. <csb.l csb.z cuf.z cui.z cuu.z dee.lw del.pw del.nw >
  324. <dup.l dus.l dus.z dvf.l dvf.z dvi.l dvi.z dvu.l >
  325. <dvu.z fef.l fef.z fif.l fif.z inl.pw inl.nw inn.l >
  326. <inn.z ior.l ior.z lar.l lar.z ldc.l ldf.l ldl.pw >
  327. <ldl.nw lfr.l lil.pw lil.nw lim.z los.l los.z lor.s0 >
  328. <lpi.l lxa.l lxl.l mlf.l mlf.z mli.l mli.z mlu.l >
  329. <mlu.z mon.z ngf.l ngf.z ngi.l ngi.z nop.z rck.l >
  330. <rck.z ret.l rmi.l rmi.z rmu.l rmu.z rol.l rol.z >
  331. <ror.l ror.z rtt.z sar.l sar.z sbf.l sbf.z sbi.l >
  332. <sbi.z sbs.l sbs.z sbu.l sbu.z sde.l sdf.l sdl.pw >
  333. <sdl.nw set.l set.z sig.z sil.pw sil.nw sim.z sli.l >
  334. <sli.z slu.l slu.z sri.l sri.z sru.l sru.z sti.l >
  335. <sts.l sts.z str.s0 tge.z tle.z trp.z xor.l xor.z >
  336. <zer.l zer.z zge.l zgt.l zle.l zlt.l zne.l zrf.l >
  337. <zrf.z zrl.pw dch.z exg.s0 exg.l exg.z lpb.z gto.l \0\0>
  338. .even
  339. .text
  340. /------------------------------------------------------------------------------
  341. / General subroutines
  342. /------------------------------------------------------------------------------
  343. wrdoff: movb (r3)+,r0 /get first byte
  344. swab r0 /put it in high byte
  345. clrb r0 /clear low byte of r0
  346. bisb (r3)+,r0 /"or" second byte in
  347. rts pc /done
  348. /------------------------------------------------------------------------------
  349. nexttab: mov linused,r5;
  350. add $2,r5 / increment lasttab
  351. cmp r5,$linused / top of table reached?
  352. blo 1f
  353. sub $96.,r5
  354. 1: mov r5,linused
  355. rts pc
  356. slilast: mov $lnlast,r2
  357. mov $6,r0
  358. mov $lilast,r3
  359. 2: movb (r3)+,(r2)+
  360. sob r0,2b
  361. rts pc
  362. slnlast: mov $lnlast,lblwri+2
  363. mov r2,r3
  364. sub $lnlast,r3
  365. beq 3f
  366. inc r3
  367. movb sep,(r2)
  368. 1: mov r3,lblwri+4
  369. mov saver0,r0
  370. sys indir; lblwri
  371. mov $lnlast,r2
  372. 2: movb $' ,(r2)+
  373. sob r3,2b
  374. 3: mov $lnlast,r2
  375. rts pc
  376. lnrnxt: jsr pc,nexttab
  377. tst (r5)
  378. ble 0f
  379. mov (r5),r1
  380. clr (r5)
  381. add $6,r2
  382. mov r2,r0
  383. jsr pc,itoa
  384. 0: rts pc
  385. sfllast:jsr pc,nexttab
  386. tst (r5)
  387. bne 0f
  388. clr linused
  389. mov eb,-(sp)
  390. sub filext,(sp)
  391. add $4,(sp)
  392. mov *(sp),(sp)
  393. mov (sp)+,(r5)
  394. 0: jsr pc,slnlast
  395. jsr pc,filadj
  396. mov $14.,r3
  397. mov $fllast+14.,r2
  398. mov (r5),r0
  399. 3: inc r3
  400. movb (r0)+,(r2)+
  401. bne 3b
  402. movb sep,-(r2)
  403. mov $fllast,lblwri+2
  404. mov r3,lblwri+4
  405. mov saver0,r0
  406. sys indir;lblwri
  407. mov $fllast+14.,r2
  408. sub $10.,r3
  409. 2: movb $' ,(r2)+
  410. sob r3,2b
  411. clr (r5)
  412. tst linused
  413. beq 2f
  414. jsr pc,slilast
  415. 2: rts pc
  416. filadj:
  417. cmp ml,(r5)
  418. bhi 8f
  419. sub filarg,(r5)
  420. br 7f
  421. 8: cmp eb,(r5)
  422. bhi 7f
  423. sub filext,(r5)
  424. 7: rts pc
  425. procrun:
  426. mov firstp,r4
  427. sub filext,r4
  428. 0:
  429. tst 4(r4)
  430. beq 8f
  431. jsr pc,msgfile
  432. mov r4,-(sp)
  433. mov countsiz,r4
  434. 7: cmp r2,$lnend+10
  435. blo 6f
  436. jsr pc,slnlast
  437. mov $lnlast,r2
  438. 6: tst filb
  439. bne 3f
  440. add $11.,r2
  441. mov r2,-(sp)
  442. jsr pc,ltoa
  443. mov (sp)+,r2
  444. br 4f
  445. 3:
  446. jsr pc,bittoa
  447. add $4,r2
  448. 4: sob r4,7b
  449. jsr pc,slnlast
  450. mov (sp)+,r4
  451. 8: mov 8.(r4),r4
  452. beq 8f
  453. sub filext,r4
  454. br 0b
  455. mov r0,saver0
  456. sys write;sep;1
  457. 8: rts pc
  458. msgfile:
  459. jsr pc,slilast
  460. add $6,r2
  461. mov 6(r4),r1
  462. mov r2,r0
  463. jsr pc,itoa
  464. add $4,r2
  465. movb msgto,(r2)+
  466. movb msgto+1,(r2)+
  467. add $6,r2
  468. mov 8.(r4),r1
  469. 3: bne 1f
  470. mov maxcount,r1
  471. br 2f
  472. 1: sub filext,r1
  473. tst 4(r1)
  474. beq 1f
  475. mov 4(r1),r1
  476. br 2f
  477. 1: mov 8.(r1),r1
  478. br 3b
  479. 2: sub 4(r4),r1
  480. mov r1,countsiz
  481. dec r1 / is this a bug?
  482. add 6(r4),r1
  483. mov r2,r0
  484. jsr pc,itoa
  485. mov $fllast,r3
  486. mov $14,r1
  487. 2: movb (r3)+,(r2)+
  488. sob r1,2b
  489. mov 10.(r4),r3
  490. bne 6f
  491. mov $unknown,r3
  492. br 5f
  493. 6: cmp ml,r3
  494. bhi 4f
  495. sub filarg,r3
  496. br 5f
  497. 4: cmp eb,r3
  498. bhi 5f
  499. sub filext,r3
  500. 5:
  501. lblmsgf:
  502. 2: movb (r3)+,(r2)+
  503. bne 2b
  504. jsr pc,slnlast
  505. rts pc
  506. itoa:
  507. mov r5,-(sp)
  508. mov r0,r5
  509. 1: clr r0
  510. div $10.,r0
  511. add $'0,r1
  512. movb r1,-(r5)
  513. mov r0,r1
  514. bne 1b
  515. mov r5,r0
  516. mov (sp)+,r5
  517. rts pc
  518. rts pc
  519. ltoa:
  520. 0: mov (r5),r1
  521. clr r0
  522. div $10.,r0
  523. mov r0,(r5)
  524. swab r1
  525. clr r0
  526. bisb 3(r5),r1
  527. div $10.,r0
  528. movb r0,3(r5)
  529. clr r0
  530. swab r1
  531. bisb 2(r5),r1
  532. div $10.,r0
  533. add $'0,r1
  534. movb r1,-(r2)
  535. movb r0,2(r5)
  536. bne 0b
  537. tst (r5)
  538. bne 0b
  539. add $4,r5
  540. rts pc
  541. bittoa:
  542. mov (r5),r1
  543. mov flowsiz,r0
  544. ash r0,r1
  545. bit $1,r1
  546. beq 0f
  547. movb $'1,(r2)
  548. br 1f
  549. 0: movb $'0,(r2)
  550. 1: dec r0
  551. cmp $-16.,r0
  552. beq 2f
  553. mov r0,flowsiz
  554. br 3f
  555. 2: clr flowsiz
  556. add $2,r5
  557. 3: rts pc
  558. /------------------------------------------------------------------------------
  559. / Leftover data
  560. /------------------------------------------------------------------------------
  561. .bss
  562. filb: .=.+2
  563. loadstart: .=.+2
  564. saver0: .=.+2
  565. filarg: .=.+2
  566. filext: .=.+2
  567. memlim: .=.+2
  568. header:
  569. bstrt: txtsiz: .=.+2
  570. bend: ndatad: .=.+2
  571. nprocs: .=.+2
  572. option: entry.: .=.+2
  573. nlines: .=.+2
  574. szdata: .=.+2
  575. firstp: .=.+2
  576. maxcount: .=.+2
  577. argc: .=.+2
  578. argv: .=.+2
  579. environ:
  580. .=.+2
  581. pb: .=.+2
  582. pd: .=.+2
  583. eb: .=.+2
  584. globmax: .=.+2
  585. tblmax: .=.+2
  586. ml: .=.+2
  587. lasttab:.=.+96. / 16 descriptors of integers + index at the end
  588. linused:.=.+2
  589. counttab:
  590. opfra: .=.+512.
  591. opfrb: .=.+512.
  592. opfrc: .=.+640.
  593. lcount: .=.+2
  594. countsiz:.=.+2
  595. lflow: .=.+2
  596. flowsiz:.=.+2
  597. ltime: .=.+2
  598. profsiz:.=.+2